Padding Oracle

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

CBC - Szyfrowanie blokowe z łańcuchem

W trybie CBC poprzedni zaszyfrowany blok jest używany jako IV do operacji XOR z następnym blokiem:

Aby odszyfrować CBC, wykonuje się odwrotne operacje:

Zauważ, że potrzebne są klucz szyfrowania i IV.

Dopełnienie wiadomości

Ponieważ szyfrowanie jest wykonywane w blokach o stałym rozmiarze, zazwyczaj konieczne jest dopełnienie w ostatnim bloku, aby uzupełnić jego długość. Zazwyczaj używany jest PKCS7, który generuje dopełnienie powtarzając ilość bajtów potrzebną do uzupełnienia bloku. Na przykład, jeśli w ostatnim bloku brakuje 3 bajtów, dopełnienie będzie \x03\x03\x03.

Przyjrzyjmy się więcej przykładom z 2 blokami o długości 8 bajtów:

bajt #0bajt #1bajt #2bajt #3bajt #4bajt #5bajt #6bajt #7bajt #0bajt #1bajt #2bajt #3bajt #4bajt #5bajt #6bajt #7

P

A

S

S

W

O

R

D

1

2

3

4

5

6

0x02

0x02

P

A

S

S

W

O

R

D

1

2

3

4

5

0x03

0x03

0x03

P

A

S

S

W

O

R

D

1

2

3

0x05

0x05

0x05

0x05

0x05

P

A

S

S

W

O

R

D

0x08

0x08

0x08

0x08

0x08

0x08

0x08

0x08

Zauważ, jak w ostatnim przykładzie ostatni blok był pełny, więc wygenerowano kolejny tylko z dopełnieniem.

Oracle z dopełnieniem

Gdy aplikacja deszyfruje zaszyfrowane dane, najpierw odszyfrowuje dane; następnie usuwa dopełnienie. Podczas usuwania dopełnienia, jeśli nieprawidłowe dopełnienie wywołuje wykrywalne zachowanie, mamy lukę w oracle z dopełnieniem. Wykrywalne zachowanie może być błędem, brakiem wyników lub wolniejszą odpowiedzią.

Jeśli wykryjesz to zachowanie, możesz odszyfrować zaszyfrowane dane i nawet zaszyfrować dowolny tekst jawnie.

Jak wykorzystać

Możesz użyć https://github.com/AonCyberLabs/PadBuster, aby wykorzystać ten rodzaj podatności lub po prostu zrobić

sudo apt-get install padbuster

Aby sprawdzić, czy ciasteczko witryny jest podatne, możesz spróbować:

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

Kodowanie 0 oznacza, że używane jest base64 (ale inne są dostępne, sprawdź menu pomocy).

Możesz również wykorzystać tę podatność do szyfrowania nowych danych. Na przykład, wyobraź sobie, że zawartość ciasteczka to "user=MyUsername", wtedy możesz zmienić ją na "_user=administrator_" i eskalować uprawnienia wewnątrz aplikacji. Możesz to również zrobić, używając paduster i określając parametr -plaintext:

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

Jeśli witryna jest podatna, padbuster automatycznie spróbuje znaleźć moment wystąpienia błędu w dopełnieniu, ale możesz także wskazać komunikat o błędzie, używając parametru -error.

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

Teoria

W skrócie, możesz zacząć deszyfrować zaszyfrowane dane przez zgadywanie poprawnych wartości, które mogą być użyte do stworzenia wszystkich różnych dopełnień. Następnie atak padding oracle zacznie deszyfrować bajty od końca do początku, zgadując, jaka będzie poprawna wartość, która tworzy dopełnienie 1, 2, 3, itd.

Wyobraź sobie, że masz zaszyfrowany tekst zajmujący 2 bloki utworzone przez bajty od E0 do E15. Aby odszyfrować ostatni blok (E8 do E15), cały blok przechodzi przez "deszyfrowanie bloku szyfrującego" generując bajty pośrednie I0 do I15. W końcu, każdy bajt pośredni jest XORowany z poprzednimi zaszyfrowanymi bajtami (E0 do E7). Więc:

  • C15 = D(E15) ^ E7 = I15 ^ E7

  • C14 = I14 ^ E6

  • C13 = I13 ^ E5

  • C12 = I12 ^ E4

  • ...

Teraz jest możliwe zmodyfikowanie E7 aż do momentu, gdy C15 będzie 0x01, co również będzie poprawnym dopełnieniem. Więc, w tym przypadku: \x01 = I15 ^ E'7

Znalezienie E'7 pozwala obliczyć I15: I15 = 0x01 ^ E'7

Co pozwala nam obliczyć C15: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7

Znając C15, teraz jest możliwe obliczenie C14, ale tym razem metodą brute-force dla dopełnienia \x02\x02.

Ten BF jest równie skomplikowany jak poprzedni, ponieważ możliwe jest obliczenie E''15, którego wartość to 0x02: E''7 = \x02 ^ I15, więc wystarczy znaleźć E'14, który generuje C14 równy 0x02. Następnie wykonaj te same kroki, aby odszyfrować C14: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6

Podążaj tą ścieżką, aż odszyfrujesz cały zaszyfrowany tekst.

Wykrywanie podatności

Zarejestruj konto i zaloguj się na to konto. Jeśli logujesz się wiele razy i zawsze otrzymujesz ten sam ciasteczko, prawdopodobnie jest coś nie tak z aplikacją. Ciasteczko wysłane z powrotem powinno być unikalne za każdym razem, gdy się logujesz. Jeśli ciasteczko jest zawsze takie samo, prawdopodobnie zawsze będzie ono ważne i nie będzie możliwe jego unieważnienie.

Teraz, jeśli spróbujesz zmodyfikować ciasteczko, zobaczysz, że otrzymujesz błąd od aplikacji. Ale jeśli użyjesz BF do dopełnienia (korzystając na przykład z padbuster), uda ci się uzyskać inne ciasteczko ważne dla innego użytkownika. Ten scenariusz jest bardzo prawdopodobnie podatny na padbuster.

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated