使用Python开发的POC多线程批量执行小框架

因为代码量非常少,所以就叫“小框架”吧。

接口非常简陋,但是好处是适配POC脚本的时候很灵活,兼容性高,不需要任何研究成本。

简单来说,你按照自己的想法和习惯开发一个POC验证程序,它只要做到三点,即:

1. 接收一个目标地址字符串作为输入参数。

2. 定义一个名称为 "exploit" 的函数供小框架来调用。

3. 当验证成功时返回一个自定义的字符串作为标志。

就完全可以满足使用小框架的条件了。

针对以上条件再说一下细节。

小框架负责将字符串参数传递给POC程序,逻辑上讲最少要传递目标地址,想再接一些其他参数也完全可以,只要你的POC程序可以正确解析和处理就可以,完全由你自己来控制。

小框架在读取POC程序之后会调用名为 "exploit" 的函数,并获取返回结果,就好比操作系统载入一个PE程序之后会调用 "main()" 函数的道理一样,至于这个函数里面又调用了其他哪些函数,就完全是由你自己来自由定制了。

POC程序,或者说 "exploit" 函数验证成功的时候返回一个表示成功的自定义字符串,这个不必解释了,那么验证失败的时候呢?当然也可以返回另一个标志字符串,但是我个人一般习惯直接丢弃验证失败的目标结果不做记录,这个看个人需求了,也是自由定制的。

小框架使用Python来开发,Python 2 和 3 无缝兼容执行。

上代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse
import importlib
import sys
import threadpool

def main():
    parser = argparse.ArgumentParser(description="Multithreading Batch Processing Framework")
    parser.add_argument("-s", "--script", type=open, required=True, help="script file")
    parser.add_argument("-i", "--input", type=open, required=True, help="input file")
    parser.add_argument("-t", "--thread", default=1, type=int, help="number of threads")

    try:
        args = parser.parse_args()
    except IOError as e:
        print(e)
        sys.exit(1)

    poolsize = args.thread
    some_callable = get_some_callable(args.script)
    list_of_args = get_list_of_args(args.input)

    global log
    log = open("log_" + args.input.name, "w")

    pool = threadpool.ThreadPool(poolsize)
    reqs = threadpool.makeRequests(some_callable, list_of_args, callback)
    [pool.putRequest(req) for req in reqs]
    pool.wait()
    pool.dismissWorkers(poolsize)
    pool.joinAllDismissedWorkers()

    log.close()

def get_some_callable(script):
    try:
        script = importlib.import_module(script.name.split(".")[0])
        some_callable = script.exploit
    except (AttributeError, ImportError) as e:
        print(e)
        sys.exit(1)
    else:
        return some_callable

def get_list_of_args(input):
    list_of_args = list()
    list_of_temp = input.readlines()
    for i in list_of_temp:
        list_of_args.append(i.strip())
    return list_of_args

def callback(request, result):
    if result:
        log.write(result + "\n")
        print(result)

if __name__ == "__main__":
    main()

猜你喜欢

转载自www.cnblogs.com/f0rsaken/p/9244558.html