护网行动中的小需求,这次是py3的并行处理--速度就是生命。

# python3 并行处理小结

缘由: 公安部组织的护网行动期间,蓝方攻击小队会透露已经搞定了某个机器,比如是通过某个特定的漏洞getshell~虽然自己对资产大概是有数的,但还是觉得慌。于是需要我们能快速定位暴露的端口,确认识别的组件漏洞,也没啥难度,就是要“快”。 大概思路为:

  • 该漏洞的利用特征,比如某个路径
  • 遍历请求所有端口,如http get请求
  • 从请求的状态以及特征判定

# python3 并行处理

python3 里面主要有下面两个库:

  • multiprocessing
  • threading

总结下这两个lib:

#基础例子
import multiprocessing as mp
import threading as td
def job(a,b):
    print(f"a:{a},b:{b}")
t1 = td.Thread(target=job,args=(1,2))
p1 = mp.Process(target=job,args=(1,2))
t1.start()
p1.start()
t1.join()
p1.join()

上面是事后补了下基础的用法,这两个lib用法类似。我当时花了10分钟,参考xunfeng (opens new window)里面的vulscan的代码,怼了个。

#实现的例子
THREAD_COUNT = 10 # 进程数量
ips = []#ip列表
ports= [80]#端口列表
class vulscan():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.start()
    def start(self):
        try:
            # url = 'http://secondary.meit.com.hk/axis/'#例子
            url = "http://%s:%d/axis/"%(self.ip,self.port)
            #print url
            r = requests.get(url, timeout=float(2))
            print("code:%d" % r.status_code)
            r.encoding = 'utf-8'
            res = (r.text)
            if 'axis' in res.lower() and r.status_code!= 404:
                print('ok')
        except Exception as e:
            pass
if __name__ =="__main__":
    for ip in ips:
        for port in ports:
            while True:
                if int(thread._count()) < THREAD_COUNT:
                    thread.start_new_thread(vulscan, (ip, port))
                    break
                else:
                    time.sleep(1)