Discussione Hacking Challenges #1: risoluzione sfide (2/3)

0xbro

Moderatore
24 Febbraio 2017
3,539
137
2,203
1,360

Hacking Challenges #1: risoluzione sfide (2/3)​

Nel seguente topic verranno spiegate le metodologie, i procedimenti e i tools necessari per risolvere il primo gruppo di sfide della prima edizione delle Hacking Challenges (le sfide le potete trovare al link qua sotto).





[Crypto] Old but (not) gold (Easy)​

Niente di nuovo, lo risolviamo alla vecchia maniera
Hint: Problemi a trovare la chiave? Usa cewl!

La sfida si presenta con la seguente stringa:

QS{Yvv_upl_sfgyosvri_kre}

Analizzandola, a colpo d'occhio si può notare come abbia la stessa struttura 1:1 rispetto al fomato finale delle flag IF{...}. Questo significa che la flag iniziale è stata o encodada con un algoritmo a rotazione, oppure con un cifrario poli-alfabetico. Siccome provando le principali rotazioni per singolo numero non si riesce a recuperare la flag, significa che l'algoritmo utilizza una chiave composta da lettere diverse. Per comporci una possibile wordlist possiamo utilizzare cewl, un crawler di pagine web che estrapola le parole a partire da una determinata lunghezza e crea dei dizionari custom.

Bash:
$ cewl -m6 https://www.inforge.net/
CeWL 5.4.8 (Inclusion) Robin Wood ([email protected]) (https://digi.ninja/)
service
Please
inforge
security
protection
against
online
attacks
JavaScript
StackPath
Enable
requires
support
website
enable
browser
Reference
Address
Cookies
cookie
cookies
process
automatic
redirected
validation
complete
Protected

Ora che abbiamo un elenco di password possiamo cercare su google quali sono i principali algoritmi che implementano un cifrario poli-alfabetico. Tra i candidati troviamo vigenere, un cifrario molto vecchio e molto comune che sembra essere un ottimo candiadto (Niente di nuovo, lo risolviamo alla vecchia maniera).

Per lavorare su questo genere di cose si può utilizzare cyberchef, "A simple, intuitive web app for analysing and decoding data without having to deal with complex tools or programming languages. CyberChef encourages both technical and non-technical people to explore data formats, encryption and compression."
Siccome sappiamo già che la nostra flag dovrà avere la struttura IF{....}, possiamo provare tutte le combinazioni possibili per due lettere e vedere se qualcuna di esse, abbinate alla stringa iniziale, restituisce come risultato IF{...}.
a1.png

Siccome la combinazione "in" sembra essere un inizio di chiave corretto, possiamo provare tutte le password che iniziano con queste due lettere (in questo caso solo 'inforge') e vedere se riusciamo a ottenere la flag.
a2.png
Bingo!


[Misc] Il Segreto di Tom Marvolo Riddle (Easy)​

"Posso spostare gli oggetti senza toccarli, far fare delle cose agli animali senza addestrarli, far capitare brutte cose a quelli cattivi con me, farli soffrire... se voglio... Parlo anche con i serpenti, loro mi trovano, sussurrano cose, è normale? Per uno come me?"
Hint: Thanks me later: https://it.wikipedia.org/wiki/Oggetti_magici_di_Harry_Potter#Horcrux

Questa sfida comincia fornendoci 8 file con estensione .horcrux
b1.png

Analizzando il contenuto di uno dei file scopriamo che questi sono tutti pezzi di un unico file finale, e che esiste un tool apposta in grado di ricomporli.​

b2.png

Non ci resta altro da fare che scaricare il programma e unire nuovamente tutti i file in un unico file finale:

b3.png

ed estrarre la flag
b4.png

Anche senza analizzare il contenuto dei file era comunque possibile scoprire dell'esistenza di questo tool tramite una semplice ricerca su Google attraverso le keyword ".horcrux files".​


[Crypto] Gerione, custode dei fraudolenti (Medium)​

6c1f66e3e990b42ce4b7b1adf1adef1b.jpg

Hint:
«Luogo è in inferno detto Malebolge,
tutto di pietra di color ferrigno,
come la cerchia che dintorno il volge.
Nel dritto mezzo del campo maligno

...
così da imo de la roccia scogli
movien che ricidien li argini e ' fossi
infino al pozzo che i tronca e raccogli.»
(Inferno XVIII, 1-18)


La sfida inizia con una sequenza di caratteri molto strana che sembra non avere nè capo nè coda
Bash:
$ cat Gerione\ e\ i\ fraudolenti.txt
D'``@^o=}[email protected]>rNp^[email protected]?w`N)(xwvunVl21onmfN+ihgIed]#"!BXWV[ZSwQVOTSLp3ONMLEDh+*FE>=<`@?>=<;4X81w543,PONon&%I#"'~Ded"y~}|u;s987o5srqSonmf,jihgfH%]ba`_^W{[email protected][email protected]\[;{32V05.-2+O)o'&J$#GFEfeB"y~}v<;sr8vunml210nmfN+chg`_^$#"CB^W\UyYXW9ONMLpPOHGkKDIHAedcb%[email protected]?87[;:981w543,PONon&%I)('~f|B/

Facendo delle ricerche sull'immagine e aiutandoci anche con l'hint, scopriamo che l'immagine rappresenta Gerione, il custode delle Malebolge. Ricercando queste parole chiave, associate al termine "cryptography", scoprimo che esiste uno specifico linguaggio chiamato Malbolge, un particolare linguaggio di programmazione esoterico. Effettuando altre ricerche scopriamo che esistono degli interpreti online che permettono di eseguire del codice scritto in malbolge. Non ci resta altro da fare che eseguire il codice ed estrarre la flag!
c1.png

Mmm... ci siamo quasi! Non abbiamo ottenuto direttamente la flag, ma abbiamo una sequenza di valori che la ricorda in maniera molto forte.

444 333 { 6 999 4 666 3 999 666 88 2 777 33 222 777 2 9999 999 }

A colpo d'occhio sembra che ogni sequenza di numeri corrisponda a un simbolo della flag finale. Sebbene in questo caso non ci si trovi davani a nessun tipo di crittografia, con un po' di fantasia, elasticità mentale e ricerca si può arrivare a capire da dove provengano queste associazioni:
vecchio_cell.1020x680.jpg

Svelato il mistero non ci resta altro da fare che ricomporre la flag:
c2.png



[Crypto] Go Crazy || Go Home (Hard)​

Try Harder :)
(La chiave è la via del signore)
Hint 1: se cerchi una wordlist per ogni occasione, sappi che [seclists](https://github.com/danielmiessler/SecLists) è la scelta migliore! Ma attento: non limitarti alla monotonia, la parola del signore ti detterà la vera via!
Hint 2: a volte è importante pure ciò che non vedi. Un po' come il tempo: non lo vedi, ma ti scorre sempre davanti

La sfida inizia dandoci accesso a due file, entrambi criptati: un file .pdf e un file .zip. Anche se è ragionevole pensare che il file .pdf possa contenere informazioni utili per proseguire la sfida, non bisogna dare mai nulla per scontato e potrebbe anche essere solo un ostacolo per farci perdere tempo. Detto questo quindi procediamo di pari passo e cerchiamo di craccare entrambi i file. Per trovare la password del file .zip possiamo usare fcrackzip mentre per estrarre la password del file pdf possiamo affidarci all'utility pdf2john e usare poi john-the-ripper:​
Bash:
$ fcrackzip -D -u -p /usr/share/wordlists/rockyou.txt access.log.1.zip
------------------------------------------------------------
$ /usr/share/john/pdf2john.pl History.pdf > pdf.hash
$ john pdf.hash --wordlist=/usr/share/wordlists/rockyou.txt --fork=5

d1.png

Otteniamo così facendo la password del file pdf, dandoci in questo modo la possibilità di aprirlo e vederne il contenuto:

d2.png

Appena aperto il file salta subito all'occhio un codice morse, che se tradotto tramite un qualsiasi tool online ci rivelerà quella che sembra essere un'altra password, probabilemente quella del file .zip.​
d3.png

Provando a scompattare l'archivio zip con la password appena ottenuta, il risultato è negativo. Un secondo tentativo inserendo tutti i caratteri maiuscoli però rivelerà che la password è corretta e ci darà accesso al contenuto dell'archivio.​

d4.png

Dando un'occhiata al file appena ottenuto sembra che ci si trovi davanti a un file di log. In questi casi è sempre bene cercare di estrarre tutti gli url e gli IP contenuti nel file. Per farlo, è possibile concatenare un po' di comandi bash per riuscire nell'intento.
Siccome il file utilizza un separatore fisso (il carattere blank è il delimitatore di ogni colonna), possiamo utilizzare prima awk per estrarre le colonne che ci interessano, passare l'output del comando tramite il carattere | (pipe) al comando sort -u (ref) per ordinare i campi e rimuovere i duplicati e infine analizzare nuovamente i dati.​

Bash:
$ head access.log.1                            
1286536314.725    791 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536314.728    777 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536319.309    766 192.168.0.68 TCP_MISS/200 507 GET https://www.bing.com/images/search?q=gatti&form=HDRSC2&first=1&tsc=ImageBasicHover - DIRECT/10.10.10.208 text/html
1286536320.822    733 192.168.0.68 TCP_MISS/200 507 GET https://www.bing.com/images/search?q=cani&form=HDRSC2&first=1&tsc=ImageBasicHover - DIRECT/10.10.10.208 text/html
1286536315.044    750 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536315.118    754 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536315.235    746 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536319.309    766 192.168.0.68 TCP_MISS/200 507 GET https://www.bing.com/images/search?q=gatti&form=HDRSC2&first=1&tsc=ImageBasicHover - DIRECT/10.10.10.208 text/html
1286536315.389    723 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html
1286536315.460    724 192.168.0.68 TCP_MISS/200 507 GET https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx - DIRECT/10.10.10.208 text/html

$ cat access.log.1 | awk -F' ' '{print $3}' | sort -u
192.168.0.188
192.168.0.68

$ cat access.log.1 | awk -F' ' '{print $7}' | sort -u
https://github.com/MaOutis/CustomBackup
https://www.bing.com/images/search?q=cani&form=HDRSC2&first=1&tsc=ImageBasicHover
https://www.bing.com/images/search?q=gatti&form=HDRSC2&first=1&tsc=ImageBasicHover
https://www.bing.com/search?q=gatti&form=QBLH&sp=-1&pq=gat&sc=8-3&qs=n&sk=&cvid=9646BCB870214EB6B8FA5B80F979CD51
https://www.websense.com/content/support/library/web/v773/wcg_help/squid.aspx

Se dagli IP non abbiamo ottenuto informazioni utili, nel giro di pochi secondi siamo riusciti a trovare in mezzo a una moltitudine di righe di log un curioso file di backup hostato su github!
Scarichiamolo e osserviamone il contenuto:​

Bash:
$ unzip Backup.zip
Archive:  Backup.zip
extracting: hash
  inflating: code_backup.tar  

$ tar xvf code_backup.tar                     
code1.bak
code2.bak
code3.bak
code4.bak
code5.bak
code6.bak

$ ls -al hash code*               
-rwxr-xr-x 1 maoutis maoutis  1296 Feb  4 21:24 code1.bak
-rwxr-xr-x 1 maoutis maoutis   766 Feb  4 21:25 code2.bak
-rwxr-xr-x 1 maoutis maoutis   243 Feb  4 21:29 code3.bak
-rwxr-xr-x 1 maoutis maoutis   438 Feb  4 21:39 code4.bak
-rwxr-xr-x 1 maoutis maoutis   438 Feb  5 10:10 code5.bak
-rwxr-xr-x 1 maoutis maoutis   438 Feb  4 21:40 code6.bak
-rwxrwxrwx 1 maoutis maoutis 10240 Feb  5 10:12 code_backup.tar
-rwxrwxrwx 1 maoutis maoutis    33 Feb  5 10:17 hash

Sembra che al suo interno ci siano diversi file, tra cui un hash e dei file .bak che sembrano avere dimensioni diverse. Prima di procedere con l'analisi dei file .bak il nostro scopo è cercar di capire con quale tipologia di hash stiamo avendo a che fare e provare a ricavarne la password in backgound mentre facciamo altre analisi.
Per cercar di comprendere la tipologia di un hash è possibile utilizzare diversi tools come hashid o hash-identifier, il cui scopo è cercare di indovinare l'algoritmo utilizzato per genereare l'hash. Nel nostro caso, incrociando i risultati dei due tools, sembra che l'hash in questione sia md5.​
d5.png

Bene siamo pronti a craccare l'hash. Prendendo spunto dall'hint numero uno (se cerchi una wordlist per ogni occasione, sappi che seclists è la scelta migliore! Ma attento: non limitarti alla monotonia, la parola del signore ti detterà la vera via!) decidiamo di usare le password contenute all'interno dell'archivio "BiblePass" e istruiamo hashcat a fare il bruteforce dell'algoritmo md5 tramite il parametro -m0
Bash:
$ hashcat -h | grep -i md5
      0 | MD5                                              | Raw Hash
   5100 | Half MD5                                         | Raw Hash
     10 | md5($pass.$salt)                                 | Raw Hash, Salted and/or Iterated
     20 | md5($salt.$pass)                                 | Raw Hash, Salted and/or Iterated
   3800 | md5($salt.$pass.$salt)                           | Raw Hash, Salted and/or Iterated
   3710 | md5($salt.md5($pass))                            | Raw Hash, Salted and/or Iterated
...
$ hashcat hash /usr/share/seclists/Passwords/BiblePass/BiblePass_part05.txt -m0
...
Dictionary cache built:
* Filename..: /usr/share/seclists/Passwords/BiblePass/BiblePass_part05.txt
* Passwords.: 900000
* Bytes.....: 20331126
* Keyspace..: 900000
* Runtime...: 1 sec

eacd220705ca516ee711ad50c1cc02ab:IKingsONEFOURELEVEN
                                          
Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: eacd220705ca516ee711ad50c1cc02ab
Time.Started.....: Tue Mar  2 16:16:10 2021 (0 secs)
Time.Estimated...: Tue Mar  2 16:16:10 2021 (0 secs)
Guess.Base.......: File (/usr/share/seclists/Passwords/BiblePass/BiblePass_part05.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:    34760 H/s (0.42ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 4096/900000 (0.46%)
Rejected.........: 0/4096 (0.00%)
Restore.Point....: 0/900000 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: ikingsonefoureleven -> 1kingsOneFour:ONESIX!

Started: Tue Mar  2 16:15:36 2021
Stopped: Tue Mar  2 16:16:11 2021

Mentre hashcat lavora in background, possiamo adesso spostare le nostre analisi sui file .bak che abbiamo scoperto.

Sebbene a primo impatto ogni file sembri essere vuoto, abbiamo visto prima come la loro dimensione sia in verità differente. Ciò significa che comunque contengono qualcosa. Questo possiamo constatarlo anche osservando il dump di ogni file:​
Bash:
$ for file in $(ls *.bak); do echo $file; xxd $file |head; done                                                                                                                                                                    
code1.bak                                                                                                                                                                                                                            
00000000: 5361 7920 6865 6c6c 6f2e 2020 200a 2020  Say hello.
00000010: 2009 2020 0920 2020 0a09 0920 2020 2009   .  .   ...
00000020: 0a20 2020 0909 2020 0920 090a 0909 2020  .   ..  .
00000030: 2020 0920 0a20 2020 0909 2009 0920 200a    . .   .. ..
00000040: 0909 2020 2020 0909 0a20 2020 0909 2009  ..    ...   ..
00000050: 0920 200a 0909 2020 2020 0920 200a 2020  .  ...    .
00000060: 2009 0920 0909 0909 0a09 0920 2020 2009   .. .......
00000070: 2009 0a20 2020 0920 0909 2020 0a09 0920   ..   . ..
00000080: 2020 2009 0920 0a20 2020 0920 2020 2020     .. .
00000090: 0a09 0920 2020 2009 0909 0a20 2020 0909  ...    ....   ..
code2.bak
00000000: 2020 2009 0a0a 2020 2009 2020 2020 0909     ...   .    ..
00000010: 0a20 0a20 090a 2009 2020 2009 2009 200a  . . .. .   . . .
00000020: 090a 2020 2020 2009 0a09 2020 2020 0a20  ..     ...    .
00000030: 2020 2009 2009 090a 0920 2009 0a09 2020     . ....  ...
00000040: 0920 2020 0920 090a 0a20 0a20 0920 2020  .   . ... . .
00000050: 2009 090a 0a20 2020 0920 2020 0920 090a   ....   .   . ..
00000060: 200a 0a0a 0a0a 0a20 2020 0909 2020 2020   ......   ..
00000070: 0920 0909 2020 0920 2020 0909 2020 0920  . ..  .   ..  .
00000080: 200a 0920 2020 0a09 0a0a 2020 2009 0909   ..   ....   ...
00000090: 2009 0909 2009 0909 2020 0920 2009 0920   ... ...  .  ..
code3.bak
00000000: 2020 2009 2020 0909 0920 0a09 0a20 2020     .  ... ...
00000010: 2020 0909 2009 0909 090a 090a 2020 2020    .. .......
00000020: 2009 0909 2009 2020 0a09 0a20 2020 2020   ... .  ...
00000030: 2009 2020 2020 200a 090a 2020 2020 2009   .     ...     .
00000040: 0909 2020 0909 0a09 0a20 2020 2020 0909  ..  .....     ..
...
Sembra che ogni file contenga una serie indefinita di spazi e tabulazioni. Cercando su internet "whitespace file" scopriamo che esiste uno specifico linguaggio di programmazione chiamato appunto "Whitespace", i cui sorgenti sono composti da caratteri invisibili (a volte è importante pure ciò che non vedi). Utilizzando uno dei tanti interpreti online scopriamo che ognuno di questi file fa riferimento a differenti contenuti o url. Tra i tanti, un link in particolare attira la nostra attenzione: l'url del pastebin privato.​
d6.png


d7.png

Provando la password scoperta con hashcat riusciamo ad accere ed otteniamo il seguente messaggio:
You are almost there!

JTVDeDRlJTVDeDRiJTVDeDdiJTVDeDQ0JTBBJTVDeDc0JTVDeDdhJTVDeDU3JTVDeDc0JTBBJTVDeDY4JTVDeDcwJTVDeDIxJTVDeDU3JTBBJTVDeDZhJTVDeDc4JTVDeDc1JTVDeDZhJTBBJTVDeDY4JTVDeDc5JTVDeDRiJTVDeDc3JTBBJTVDeDc0JTVDeDcyJTVDeDM1JTVDeDYzJTBBJTVDeDY3JTVDeDc3JTVDeDc0JTVDeDdk

Sembra si tratti di un qualche tipo di encoding. Provando a decodificare da base64 riusciamo a superare il primo strato di encoding:
Bash:
$ echo "JTVDeDRlJTVDeDRiJTVDeDdiJTVDeDQ0JTBBJTVDeDc0JTVDeDdhJTVDeDU3JTVDeDc0JTBBJTVDeDY4JTVDeDcwJTVDeDIxJTVDeDU3JTBBJTVDeDZhJTVDeDc4JTVDeDc1JTVDeDZhJTBBJTVDeDY4JTVDeDc5JTVDeDRiJTVDeDc3JTBBJTVDeDc0JTVDeDcyJTVDeDM1JTVDeDYzJTBBJTVDeDY3JTVDeDc3JTVDeDc0JTVDeDdk" | base64 -d
%5Cx4e%5Cx4b%5Cx7b%5Cx44%0A%5Cx74%5Cx7a%5Cx57%5Cx74%0A%5Cx68%5Cx70%5Cx21%5Cx57%0A%5Cx6a%5Cx78%5Cx75%5Cx6a%0A%5Cx68%5Cx79%5Cx4b%5Cx77%0A%5Cx74%5Cx72%5Cx35%5Cx63%0A%5Cx67%5Cx77%5Cx74%5Cx7d
Questa volta, data la presenza di numerosi "%", sembra di trovarsi davanti a una stringa encodata tramite URL-encode. Effettuando l'operazione inversa riusciamo a superare il secondo strato di encoding:​
Bash:
$ echo "JTVDeDRlJTVDeDRiJTVDeDdiJTVDeDQ0JTBBJTVDeDc0JTVDeDdhJTVDeDU3JTVDeDc0JTBBJTVDeDY4JTVDeDcwJTVDeDIxJTVDeDU3JTBBJTVDeDZhJTVDeDc4JTVDeDc1JTVDeDZhJTBBJTVDeDY4JTVDeDc5JTVDeDRiJTVDeDc3JTBBJTVDeDc0JTVDeDcyJTVDeDM1JTVDeDYzJTBBJTVDeDY3JTVDeDc3JTVDeDc0JTVDeDdk" | base64 -d | sed 'y/+/ /; s/%/\x/g'
x5Cx4ex5Cx4bx5Cx7bx5Cx44x0Ax5Cx74x5Cx7ax5Cx57x5Cx74x0Ax5Cx68x5Cx70x5Cx21x5Cx57x0Ax5Cx6ax5Cx78x5Cx75x5Cx6ax0Ax5Cx68x5Cx79x5Cx4bx5Cx77x0Ax5Cx74x5Cx72x5Cx35x5Cx63x0Ax5Cx67x5Cx77x5Cx74x5Cx7d
Questa volta sembra di avere davanti un codice HEX (ogni valore è preceduto da 'x'). Rimuoviamo anche questo strato ampliando sembre di più il nostro comando:​
Bash:
$ echo "JTVDeDRlJTVDeDRiJTVDeDdiJTVDeDQ0JTBBJTVDeDc0JTVDeDdhJTVDeDU3JTVDeDc0JTBBJTVDeDY4JTVDeDcwJTVDeDIxJTVDeDU3JTBBJTVDeDZhJTVDeDc4JTVDeDc1JTVDeDZhJTBBJTVDeDY4JTVDeDc5JTVDeDRiJTVDeDc3JTBBJTVDeDc0JTVDeDcyJTVDeDM1JTVDeDYzJTBBJTVDeDY3JTVDeDc3JTVDeDc0JTVDeDdk" | base64 -d | sed 'y/+/ /; s/%/\x/g' | tr -d 'x' | xxd -r -p | tr -d '\\' | tr -d '\n'
NK{DtzWthp!WjxujhyKwtr5cgwt}
Ottimo, abbiamo raggiunto una stringa che è molto vicino alla struttura finale della flag. Dato l'abbinamento 1:1 tra i caratteri di questa stringa e la struttura della flag finale, possiamo supporre che i caratteri siano stati ruotati tramite qualche agoritmo come ROT o vigenere.
Siccome ROT non ha bisogno di una chiave per venir decodificato, è il primo che possiamo provare. Dopo qualche tentativo, scopriamo che il numero 21 (oppure -5) è il valore corretto di rotazione.​

d8.png

Abbiamo così completato anche questa sfida!