python小工具连载-poc模版-代理池版

admin 2022年2月15日01:02:17评论47 views字数 4543阅读15分8秒阅读模式


python小工具连载

poc模版-代理池版

应用场景

在之前我们完成了一个poc模版,可以批量的进行漏洞测试,并且将结果输出到文档中。但是最近在写爬虫,对一个网站的大量网页进行爬取时,往往会触发各种验证码机制或者造成ip被封禁,所以在写爬虫时,使用了代理池,让每一次访问时使用的ip都不同,来减少触发验证码或者ip被封禁的可能。于是在完成爬虫的代理池后,将代理池加入了poc模版中,也算是对poc模版的一个升级改进。

代理池

在升级我们的poc模版之前,为们首先要完成代理池。我这里使用的是github上的一个免费开源项目,下面是链接。

https://github.com/Python3WebSpider/ProxyPool

我们可以将其clone下来,然后下载docker版代理池

https://hub.docker.com/r/germey/proxypool

进入clone下的文件夹中使用命令将其开启

docker-compose up

此时我们使用浏览器访问http://localhost:5555/random就可以获得一个ip及端口,且我们每次访问获得的ip和端口都是不一样的。

python小工具连载-poc模版-代理池版

具体的其他配置方法,大家可以参照github项目中详细文档。

实现代码

现在我们已经完成了我们代理池的配置,我们还需要在我们的poc模版中增加使用代理池的代码。但是在这之前我们需要考虑一个问题,因为我们使用了代理池,而使用代理池后,我们的每一次攻击,可能由于代理的原理造成攻击失败,让我们原本可以实现的工具无法成功攻击,这就需要我们进行攻击的重放,而我们在之前的poc模版中也写了一个judge参数用来判断攻击是否成功,我们可以利用这个参数来判断我们的攻击时攻击成功了还是攻击失败了,或者是在访问这个ip时就失败了,而我们的python的多线程是无法去获取一个返回值的,这个该怎么解决呢?

我在这里的解决办法是,完成一个函数,用来处理代理池的地址,使用多线程开启这个函数,然后在这个函数中再去调用我们的攻击函数,并且将我们的代理地址传入我们的攻击函数。

代码如下,我们需要2个参数,一个我们目标的url,一个是攻击重放的次数,这个是我们在命令行中,输入-a参数后面的数字,同时假如我们输入了-a参数,就代表我们要使用代理池进行攻击,我在这里使用了一个全局变量,agents_judge用来判断是否使用代理池进行攻击,如果要使用brup代理抓包,那就将其设置为我们的brup的代理地址,如果使用代理池攻击,那么就首先调用get_random_proxy函数去获取一个代理池地址,并将其加入到我们的代理当中。然后还是进行判断,如果要使用代理池攻击,那么开启一个死循环,然后在死循环中判断是否攻击是否成功,如果不成功那么将失败的次数加1,等待2秒换一个ip重新进行攻击。

如果我们项目使用的是其他的代理池,那么我们也可以修改get_random_proxy函数中的代码,最后的返回值只要是ip+端口号即可。

def handle(url,retry_num):
"""
扫描前的处理函数
主要负责在使用代理时代理ip的配置
以及使用代理池时,因为代理池原因可能造成的访问失败时进行的重放攻击
"""

global proxies_judge
global agents_judge
proxies={}
if proxies_judge:
proxies = {
"http": 'http://127.0.0.1:8080',
"https": 'http://127.0.0.1:8080'
}
fail_num = 0
if agents_judge:
while True:
proxie = get_random_proxy()
proxies = {
'http':'http://'+proxie,
'https':'http://'+proxie
}
judge = exploit(url,proxies)
if judge != 3:
break
else:
fail_num+=1
time.sleep(2)
if fail_num > retry_num:
break
else:
exploit(url,proxies)

def get_random_proxy():
"""
从代理池获取一个代理ip
使用代理池项目:https://github.com/Python3WebSpider/ProxyPool
如需要使用其他代理池,请自行修改该函数,返回结果为一个可以用的代理ip及其端口
"""

return requests.get(proxypool_url).text.strip()

而在我们的攻击函数中我们之前写了一个判断是否使用代理进行攻击的代码,由于我们的代理ip的参数是通过我们上面的handler函数传递进去的,所以我们只需要在判断是否使用代理ip进行攻击的if判断语句中加上or agents_judge即可。最后将我们的攻击结果,也就是judge参数返回即可。

def exploit(url,proxies):
'''
poc函数
poc代码放在这里,这个函数的内容随便修改
可以使用接口output_to_file将信息输出到文件中
可以使用接口output将信息显示在命令行中(当print用就行)
output需要2个参数,一个为显示的信息,一个为信息的类型(int 0 1 2 3)
0 普通的信息
1 攻击成功的信息
2 攻击失败的信息
3 出现错误的信息
'''

global proxies_judge
global agents_judge
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
payload = "/xxx?=/etc/passwd"
exp = url + payload
try:
if proxies_judge or agents_judge:
re = requests.get(exp,headers=head,verify=False,timeout=5,proxies=proxies)
else:
re = requests.get(exp,headers=head,verify=False,timeout=5)
if re.status_code == 200:
msg = "存在任意文件读取漏洞 "+exp
judge = 1
output_to_file(msg)
else:
msg = '不存在任意文件读取漏洞'+url
judge = 2
except:
msg = 'error! 目标路径无法访问'
judge = 3
output(msg,judge)
return judge

最后呢,就是我们的主函数,我们加入了一个-a参数,并且其后面跟的数字是我们攻击重放的次数,并且修改我们的多线程函数,让其去调用handler函数,并且传入需要的url和重放的次数即可。

def main():
global proxies_judge
global result_file_path
global agents_judge
result_file_path = 'result.txt'
target_num = 50
target_file_path = ''
url = ''
msg = []
proxies_judge = False
agents_judge = False
retry_num = 5

poc_head()

try:
opts, args = getopt.getopt(sys.argv[1:],
"hf:r:t:u:pa:",
["help","target_file=","result_file=","thread_num=","url=","proxies",'agents='])
except getopt.GetoptError as err:
print(str(err))
help()

# 从opts中读取数据,o为参数,a为参数后带的值
for o,a in opts:
if o in ['-h','--help']:
help()
elif o in ['-u','--url']:
url = a
elif o in ['-f','--target_file']:
target_file_path = a
try:
f = open(target_file_path,'r')
msg = f.read().split('n')
except:
output('目标文件路径错误!' , 3)
elif o in ['-r','--result']:
result_file_path = a
elif o in ['-t',"--thread_num"]:
target_num = int(a)
elif o in ['-p',"--proxies"]:
proxies_judge = True
elif o in ['-a','--agents']:
agents_judge = True
if a != '':
retry_num = int(a)

i = 0
if url == '' and len(msg) != 0:
while True:
if threading.active_count()-1 < target_num and i < len(msg):
t = threading.Thread(target=handle,args=(msg[i],retry_num))
t.start()
i+=1
output_msg = '第'+str(i)+'个目标开始检查,还有'+str(len(msg)-i)+'个目标待检查!'
output(output_msg)
if i >= len(msg) and threading.active_count() == 1:
f = open(result_file_path,'r')
num = len(f.readlines())
output('finish! 共扫描'+str(len(msg))+'个网站,发现漏洞'+str(num)+'个!')
break
elif i>= len(msg) and threading.active_count() > 1:
output('正在检测最后'+str(threading.active_count()-1)+'个目标,请稍等...')
time.sleep(5)
os.rename(result_file_path,result_file_path+str(len(f.readlines())))
elif url != '' and len(msg) == 0:
handle(url,retry_num)

关注公众号并回复"新poc模版"获取该工具


python小工具连载-poc模版-代理池版



干货 | CS绕过vultr特征检测修改算法


 | GitLab未授权RCE(CVE-2021-22205)


 | Apache APISIX Dashboard-RCE工具






原文始发于微信公众号(渗透安全团队):python小工具连载-poc模版-代理池版

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月15日01:02:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   python小工具连载-poc模版-代理池版http://cn-sec.com/archives/778159.html

发表评论

匿名网友 填写信息