1. 威客安全首页
  2. 安全资讯

POC-T源码分析

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

前言

想找一个框架式的漏洞利用工具,但是一直没有找到好用的,正好最近有师傅推荐了POC-T,遂尝试使用并分析了下源代码。

No.1


工具介绍

脚本调用框架,用于渗透测试中 采集|爬虫|爆破|批量PoC 等需要并发的任务。

No.2


源码篇
POC-T源码分析

整体结构如图所示,入口为 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 exceptionn%sn%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值在optionScriptRegister中获取,也就是要加载的脚本的名称。

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”] 即可。


POC-T源码分析

注:本文由E安全编译报道,转载请注原文地址 

https://www.easyaq.com

推荐阅读:


▼点击“阅读原文” 查看更多精彩内容

POC-T源码分析

喜欢记得打赏小E哦!

原文始发于微信公众号(E安全):POC-T源码分析

本文转为转载文章,本文观点不代表威客安全立场。

发表评论

登录后才能评论