因为代码量非常少,所以就叫“小框架”吧。
接口非常简陋,但是好处是适配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 try:
log = open("log_" + args.input.name, "w")
except IOError as e:
print(e)
sys.exit(1) 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()