7.6 KiB
{% hint style="success" %}
Ucz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Wesprzyj HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się sztuczkami hakerskimi, przesyłając PR-y do HackTricks oraz HackTricks Cloud na GitHubie.
CBC - Cipher Block Chaining
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 oraz IV.
Wypełnianie Wiadomości
Ponieważ szyfrowanie odbywa się w blokach o stałym rozmiarze, zazwyczaj potrzebne jest wypełnienie w ostatnim bloku, aby uzupełnić jego długość.
Zazwyczaj używany jest PKCS7, który generuje wypełnienie powtarzając ilość bajtów potrzebną do uzupełnienia bloku. Na przykład, jeśli brakuje 3 bajtów w ostatnim bloku, wypeł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 wypełnieniem.
Oracle Wypełnienia
Gdy aplikacja deszyfruje zaszyfrowane dane, najpierw odszyfrowuje dane; następnie usuwa wypełnienie. Podczas usuwania wypełnienia, jeśli nieprawidłowe wypełnienie wywołuje wykrywalne zachowanie, mamy podatność na oracle wypełnienia. 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 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źć, kiedy występuje 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 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ć bity 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 bity od E0 do E15.
Aby odszyfrować ostatni blok (E8 do E15), cały blok przechodzi przez "odszyfrowanie 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 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 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.