hacktricks/crypto-and-stego/padding-oracle-priv.md

8.8 KiB

Oracle z dopełnieniem

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

Inne sposoby wsparcia HackTricks:

CBC - Szyfrowanie blokowe w trybie łańcucha

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

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

Aby odszyfrować CBC, wykonuje się odwrotne operacje:

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

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

Dopełnienie wiadomości

Ponieważ szyfrowanie odbywa się w blokach o stałym rozmiarze, zazwyczaj potrzebne 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 brakuje 3 bajtów w ostatnim bloku, dopełnienie będzie \x03\x03\x03.

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

bajt #0 bajt #1 bajt #2 bajt #3 bajt #4 bajt #5 bajt #6 bajt #7 bajt #0 bajt #1 bajt #2 bajt #3 bajt #4 bajt #5 bajt #6 bajt #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 do czynienia z lukiem 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 użyj

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 jest używany 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źć błąd 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, zgadując poprawne wartości, które mogą być użyte do stworzenia wszystkich różnych dopełnień. Następnie atak padding oracle zacznie deszyfrowywać 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 szyfru blokowego", 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 możliwe jest zmodyfikowanie E7C15 będzie 0x01, co również będzie poprawnym dopełnieniem. 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 możliwe jest 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 ważne i nie będzie możliwości jego unieważnienia.

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: