POC-T源码分析
Posted 雷神众测
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POC-T源码分析相关的知识,希望对你有一定的参考价值。
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
前言
想找一个框架式的漏洞利用工具,但是一直没有找到好用的,正好最近有师傅推荐了POC-T,遂尝试使用并分析了下源代码。
No.1
https://github.com/Xyntax/POC-T
脚本调用框架,用于渗透测试中 采集|爬虫|爆破|批量PoC 等需要并发的任务。
No.2
整体结构如图所示,入口为 POC-T.py,在加载的时候会对python的版本进行检验 ,仅支持Python2且版本要求在2.7以上,相关代码可以在lib/utils/versioncheck.py文件中看到
import sys
PYVERSION = sys.version.split()[0]if PYVERSION >= "3" or PYVERSION < "2.7":
exit("[CRITICAL] incompatible Python version detected ('%s'). "
"For successfully running this project, you'll have to use version 2.7"
"(visit 'http://www.python.org/download/')" % PYVERSION)
接下来就是核心代码了,lib/cli.py,从加载的类开始看起
import os.pathimport tracebackfrom lib.parse.cmdline import cmdLineParserfrom lib.core.option import initOptionsfrom lib.controller.loader import loadModule, loadPayloadsfrom lib.core.common import setPaths, banner, systemQuit, openBrowserfrom lib.core.data import paths, conf, logger, cmdLineOptionsfrom lib.core.enums import EXIT_STATUSfrom lib.core.settings import IS_WINfrom lib.core.exception import ToolkitUserQuitExceptionfrom lib.core.exception import ToolkitMissingPrivilegesfrom lib.core.exception import ToolkitSystemExceptionfrom lib.controller.engine import runfrom thirdparty.colorama.initialise import init as winowsColorInit
traceback 模块是用于处理异常信息的
cmdline
看名字大概就知道是对命令行进行处理的

描述了怎么接收参数,当没有指定参数时会打印出 he l p 的内容,可通过
https://github.com/Xyntax/POC-T/wiki/02-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
更直观的看到这些参数的作用(ps:最新代码相较于图片多了些功能)

option
对传入的参数进行处理
initOptions
通过此函数调用各个函数
def initOptions(args):
checkUpdate(args) # update 函数在 lib/utils/update.py 中,此函数可以检测 github 中内容是否存在变化,若更新了则自动拉取最新版本
checkShow(args) # 显示在 script 目录下的文件名,即查看所有插件
EngineRegister(args) # 注册多线程
ScriptRegister(args) # 加载脚本
TargetRegister(args) # 多种方式导入目标
ApiRegister(args) # api 配置文件在 toolkit.conf
Output(args) # 结果输出处理
Misc(args)
loader
loadModule
def loadModule():
_name = conf.MODULE_NAME
msg = 'Load custom script: %s' % _name
logger.success(msg)
fp, pathname, description = imp.find_module(os.path.splitext(_name)[0], [paths.SCRIPT_PATH])
try:
th.module_obj = imp.load_module("_", fp, pathname, description)
for each in ESSENTIAL_MODULE_METHODS:
if not hasattr(th.module_obj, each):
errorMsg = "Can't find essential method:'%s()' in current script,Please modify your script/PoC."
sys.exit(logger.error(errorMsg))
except ImportError, e:
errorMsg = "Your current scipt [%s.py] caused this exception %s %s"
% (_name, '[Error Msg]: ' + str(e), 'Maybe you can download this module from pip or easy_install')
sys.exit(logger.error(errorMsg))
conf.MODULE_NAME值在option的ScriptRegister中获取,也就是要加载的脚本的名称。
imp 是一个可以灵活引用模块的模块,这里使用其加载了脚本文件并且检测了是否含有poc方(ESSENTIAL_MODULE_METHODS的值在lib/core/settings.py中,默认为 ['poc'])
loadPayloads
根据传递参数中加载目标的方式不同,从而选择不同的模式
common
setPaths
设置路径
root_path = paths.ROOT_PATH
paths.DATA_PATH = os.path.join(root_path, "data")
paths.SCRIPT_PATH = os.path.join(root_path, "script")
paths.OUTPUT_PATH = os.path.join(root_path, "output")
paths.CONFIG_PATH = os.path.join(root_path, "toolkit.conf")
if not os.path.exists(paths.SCRIPT_PATH):
os.mkdir(paths.SCRIPT_PATH)
if not os.path.exists(paths.OUTPUT_PATH):
os.mkdir(paths.OUTPUT_PATH)
if not os.path.exists(paths.DATA_PATH):
os.mkdir(paths.DATA_PATH)
paths.WEAK_PASS = os.path.join(paths.DATA_PATH, "pass100.txt")
paths.LARGE_WEAK_PASS = os.path.join(paths.DATA_PATH, "pass1000.txt")
paths.UA_LIST_PATH = os.path.join(paths.DATA_PATH, "user-agents.txt")
checkFile
检测文件是否存在
......
该模块提供的都是些常用函数,不再赘述。
engine
run
def run():
initEngine()
if conf.ENGINE is ENGINE_MODE_STATUS.THREAD:
for i in range(th.threads_num):
t = threading.Thread(target=scan, name=str(i))
setThreadDaemon(t)
t.start()
# It can quit with Ctrl-C
while 1:
if th.thread_count > 0 and th.is_continue:
time.sleep(0.01)
else:
break
elif conf.ENGINE is ENGINE_MODE_STATUS.GEVENT:
from gevent import monkey
monkey.patch_all()
import gevent
while th.queue.qsize() > 0 and th.is_continue:
gevent.joinall([gevent.spawn(scan) for i in xrange(0, th.threads_num) if
th.queue.qsize() > 0]
initEngine将前面获取到的数据送入多线程,之后进入scan执行POC,在这个过程中通过调用resultHandler输出结果
cli
回到cli的main函数
paths.ROOT_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
os.path.isdir(paths.ROOT_PATH)
setPaths()
cmdLineOptions.update(cmdLineParser().__dict__)
initOptions(cmdLineOptions)
banner()
loadModule()
loadPayloads()
run()
整体流程就是:
· 设置路径
· 读取参数
· 输出 banner
· 加载脚本
· 加载目标
· 执行 POC
No.3
python POC-T.py --show显示所有脚本

python POC-T.py -s test -iA 1-10调用test测试脚本,传入的值为1-10,如果生成的随机数大于5,返回当前传入的值,否则无返回值。

自写脚本
想要增加自定义脚本也非常简单,只需要在 script 目录下新建一个 Python 文件,并且给它一个 poc 方法即可
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# author = Noel
"""
Check Shiro
python POC-T.py -s shiro-check -iF domain.txt
"""
import requests
def poc(url):
heads = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'Cookie': 'rememberMe=1;'
}
if '://' not in url:
target = 'https://%s' % url if ':443' in url else 'http://%s' % url
else:
target = url
try:
res = requests.get(target,headers=heads,timeout=1)
except Exception,e:
return False
try:
if 'rememberMe=deleteMe' in ''.join(res.headers['Set-Cookie']):
return True
except Exception,e:
return False
再使用 show 的时候已经可以看到自写的脚本了

本地搭建一个环境测试看看 python POC-T.py -s shiro-check -iS http://127.0.0.1:8088/login成功检测出 shi ro

配置好 Fofa 后批量测试下漏洞
python POC-T.py -s bigip-filedownload -aF "app=F5-BIGIP && title=Redirect && country=KR"

PS: lib/api/fofa/pack.py 文件中判断 error 用的是 if resp["error"] is None ,测试的时候发现这样会一直判断为假,改为 if not resp["error"] 即可。
招聘启事
简历投递至 strategy@dbappsecurity.com.cn
设计师(实习生)
————————
【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。
【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;精通photoshop/illustrator/coreldrew/等设计制作软件;
3、有品牌传播、产品设计或新媒体视觉工作经历;
【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽
简历投递至 strategy@dbappsecurity.com.cn
安全招聘
————————
公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京
工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…
【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案
【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)
【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;
岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
岗位:红队武器化Golang开发工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)
【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。
【岗位要求】
1.掌握C/C++/Java/Go/Python/javascript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。
【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。
简历投递至 strategy@dbappsecurity.com.cn
专注渗透测试技术
全球最新网络攻击技术
END
以上是关于POC-T源码分析的主要内容,如果未能解决你的问题,请参考以下文章