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 a win

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