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

看名字大概就知道是对命令行进行处理的

POC-T源码分析

描述了怎么接收参数,当没有指定参数时会打印出 he l p 的内容,可通过

https://github.com/Xyntax/POC-T/wiki/02-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B

更直观的看到这些参数的作用(ps:最新代码相较于图片多了些功能)

POC-T源码分析

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显示所有脚本

POC-T源码分析

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

POC-T源码分析

自写脚本

想要增加自定义脚本也非常简单,只需要在 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 的时候已经可以看到自写的脚本了

POC-T源码分析

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

POC-T源码分析

配置好 Fofa 后批量测试下漏洞

python POC-T.py -s bigip-filedownload -aF "app=F5-BIGIP && title=Redirect && country=KR"

POC-T源码分析

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源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Mesos源码分析

Mybatis源码分析

Spring源码分析专题——目录

ARouter源码分析

Handler源码分析

Eureka源码分析(六) TimedSupervisorTask