Padding Oracle

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

CBC - Cipher Block Chaining

U CBC modu prethodni enkriptovani blok se koristi kao IV za XOR sa sledećim blokom:

https://defuse.ca/images/cbc_encryption.png

Da bi se dekriptovao CBC, vrše se suprotne operacije:

https://defuse.ca/images/cbc_decryption.png

Primetite da je potrebno koristiti ključ za enkripciju i IV.

Message Padding

Kako se enkripcija vrši u fiksnim veličinama blokova, obično je potrebno paddovanje u poslednjem bloku da bi se završila njegova dužina.
Obično se koristi PKCS7, koji generiše padding ponavljajući broj bajtova potrebnih da se završi blok. Na primer, ako poslednjem bloku nedostaje 3 bajta, padding će biti \x03\x03\x03.

Pogledajmo više primera sa 2 bloka dužine 8 bajtova:

byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7
PASSWORD1234560x020x02
PASSWORD123450x030x030x03
PASSWORD1230x050x050x050x050x05
PASSWORD0x080x080x080x080x080x080x080x08

Primetite kako je u poslednjem primeru poslednji blok bio pun pa je generisan još jedan samo sa paddingom.

Padding Oracle

Kada aplikacija dekriptuje enkriptovane podatke, prvo će dekriptovati podatke; zatim će ukloniti padding. Tokom čišćenja paddinga, ako nevalidan padding izazove uočljivo ponašanje, imate padding oracle ranjivost. Uočljivo ponašanje može biti greška, nedostatak rezultata, ili sporiji odgovor.

Ako primetite ovo ponašanje, možete dekriptovati enkriptovane podatke i čak enkriptovati bilo koji čist tekst.

Kako iskoristiti

Možete koristiti https://github.com/AonCyberLabs/PadBuster da iskoristite ovu vrstu ranjivosti ili samo uraditi

sudo apt-get install padbuster

Da biste testirali da li je kolačić sajta ranjiv, možete pokušati:

bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="

Encoding 0 znači da se koristi base64 (ali su dostupni i drugi, proverite meni pomoći).

Takođe možete iskoristiti ovu ranjivost za enkripciju novih podataka. Na primer, zamislite da je sadržaj kolačića "user=MyUsername", tada ga možete promeniti u "_user=administrator_" i povećati privilegije unutar aplikacije. Takođe to možete uraditi koristeći padusterspecifikujući -plaintext parametar:

bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"

Ako je sajt ranjiv, padbuster će automatski pokušati da pronađe kada se javlja greška u punjenju, ali takođe možete naznačiti poruku o grešci koristeći -error parametar.

bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"

Teorija

U sažetku, možete početi dekriptovanje enkriptovanih podataka pogađanjem ispravnih vrednosti koje se mogu koristiti za kreiranje svih različitih paddinga. Tada će napad padding oracle početi dekriptovanje bajtova od kraja ka početku pogađajući koja će biti ispravna vrednost koja stvara padding od 1, 2, 3, itd.

Zamislite da imate neki enkriptovani tekst koji zauzima 2 bloka formirana bajtovima od E0 do E15.
Da biste dekriptovali poslednji blok (E8 do E15), ceo blok prolazi kroz "dekriptovanje blok cifre" generišući intermedijarne bajtove I0 do I15.
Na kraju, svaki intermedijarni bajt se XOR-uje sa prethodnim enkriptovanim bajtovima (E0 do E7). Tako:

  • C15 = D(E15) ^ E7 = I15 ^ E7
  • C14 = I14 ^ E6
  • C13 = I13 ^ E5
  • C12 = I12 ^ E4
  • ...

Sada, moguće je modifikovati E7 dok C15 ne bude 0x01, što će takođe biti ispravan padding. Dakle, u ovom slučaju: \x01 = I15 ^ E'7

Dakle, pronalaženjem E'7, moguće je izračunati I15: I15 = 0x01 ^ E'7

Što nam omogućava da izračunamo C15: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

Znajući C15, sada je moguće izračunati C14, ali ovaj put brute-forcing padding \x02\x02.

Ovaj BF je jednako složen kao prethodni jer je moguće izračunati E''15 čija je vrednost 0x02: E''7 = \x02 ^ I15 tako da je samo potrebno pronaći E'14 koji generiše C14 jednako 0x02.
Zatim, uradite iste korake da dekriptujete C14: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

Pratite chain dok ne dekriptujete ceo enkriptovani tekst.

Detekcija ranjivosti

Registrujte se i prijavite sa ovim nalogom.
Ako se prijavljujete više puta i uvek dobijate isti cookie, verovatno postoji nešto pogrešno u aplikaciji. Cookie koji se vraća treba da bude jedinstven svaki put kada se prijavite. Ako je cookie uvek isti, verovatno će uvek biti važeći i neće biti načina da se poništi.

Sada, ako pokušate da modifikujete cookie, možete videti da dobijate grešku iz aplikacije.
Ali ako BF-ujete padding (koristeći padbuster na primer) uspete da dobijete drugi cookie važeći za drugog korisnika. Ovaj scenario je veoma verovatno ranjiv na padbuster.

Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks