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

125 lines
8.6 KiB
Markdown
Raw Normal View History

# Oracle za popunjavanje
2024-04-06 19:39:21 +00:00
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
2024-04-06 19:39:21 +00:00
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodičnu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
2024-04-06 19:39:21 +00:00
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
## CBC - Cipher Block Chaining
2024-04-06 19:39:21 +00:00
U CBC režimu se **prethodni šifrovani blok koristi kao IV** za XOR sa sledećim blokom:
2024-04-06 19:39:21 +00:00
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
Da bi se dešifrovao CBC, vrše se **suprotne operacije**:
2024-04-06 19:39:21 +00:00
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
Primetite kako je potrebno koristiti **ključ za šifrovanje** i **IV**.
## Popunjavanje poruke
2024-04-06 19:39:21 +00:00
Pošto se šifrovanje vrši u **fiksnim veličinama blokova**, obično je potrebno popunjavanje u **poslednjem bloku** da bi se kompletirala njegova dužina.\
Obično se koristi **PKCS7**, koji generiše popunjavanje **ponavljanjem** **broja** **bajtova** **potrebnih** da se **kompletira** blok. Na primer, ako poslednjem bloku nedostaju 3 bajta, popunjavanje će biti `\x03\x03\x03`.
2024-04-06 19:39:21 +00:00
Pogledajmo još primera sa **2 bloka dužine 8 bajtova**:
2024-04-06 19:39:21 +00:00
| 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** |
Primetite kako je u poslednjem primeru **poslednji blok bio pun pa je generisan još jedan samo sa popunjavanjem**.
2024-04-06 19:39:21 +00:00
## Oracle za popunjavanje
2024-04-06 19:39:21 +00:00
Kada aplikacija dešifruje šifrovane podatke, prvo će dešifrovati podatke; zatim će ukloniti popunjavanje. Tokom čišćenja popunjavanja, ako **neispravno popunjavanje pokrene detektibilno ponašanje**, imate **ranjivost orakla za popunjavanje**. Detektibilno ponašanje može biti **greška**, **nedostatak rezultata**, ili **sporiji odgovor**.
2024-04-06 19:39:21 +00:00
Ako otkrijete ovo ponašanje, možete **dešifrovati šifrovane podatke** i čak **šifrovati bilo koji čisti tekst**.
2024-04-06 19:39:21 +00:00
### Kako iskoristiti
2024-04-06 19:39:21 +00:00
Možete koristiti [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) da iskoristite ovu vrstu ranjivosti ili jednostavno 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=="
```
**Kodiranje 0** znači da se koristi **base64** (ali su dostupni i drugi, proverite meni pomoći).
2024-04-06 19:39:21 +00:00
Takođe možete **zloupotrebiti ovu ranjivost da biste šifrovali nove podatke. Na primer, zamislite da je sadržaj kolačića "**_**korisnik=MojeKorisničkoIme**_**", tada ga možete promeniti u "\_korisnik=administrator\_" i eskalirati privilegije unutar aplikacije. To takođe možete uraditi koristeći `paduster` navođenjem parametra -plaintext**:
2024-04-06 19:39:21 +00:00
```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 možete i navesti poruku o grešci koristeći parametar **-error**.
2024-04-06 19:39:21 +00:00
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
```
### Teorija
2024-04-06 19:39:21 +00:00
U **kratko**, možete početi dešifrovanje šifrovanih podataka pogađajući tačne vrednosti koje se mogu koristiti za kreiranje svih **različitih punjenja**. Zatim, napad padding orakl će početi dešifrovanje bajtova od kraja ka početku pogađajući koja će biti tačna vrednost koja **stvara punjenje od 1, 2, 3, itd**.
2024-04-06 19:39:21 +00:00
![](<../.gitbook/assets/image (561).png>)
2024-04-06 19:39:21 +00:00
Zamislite da imate neki šifrovan tekst koji zauzima **2 bloka** formirana bajtovima od **E0 do E15**.\
Da biste **dešifrovali** **poslednji blok** (**E8** do **E15**), ceo blok prolazi kroz "dešifrovanje blokova šifre" generišući **posredne bajtove I0 do I15**.\
2024-04-06 19:39:21 +00:00
Na kraju, svaki posredni bajt se **XORuje** sa prethodnim šifrovanim bajtovima (E0 do E7). Dakle:
* `C15 = D(E15) ^ E7 = I15 ^ E7`
* `C14 = I14 ^ E6`
* `C13 = I13 ^ E5`
* `C12 = I12 ^ E4`
* ...
Sada je moguće **modifikovati `E7` dok `C15` ne bude `0x01`**, što će takođe biti tačno punjenje. Dakle, u ovom slučaju: `\x01 = I15 ^ E'7`
2024-04-06 19:39:21 +00:00
Dakle, pronalaženjem E'7, moguće je **izračunati I15**: `I15 = 0x01 ^ E'7`
2024-04-06 19:39:21 +00:00
Š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 ovog puta forsujući punjenje `\x02\x02`.
2024-04-06 19:39:21 +00:00
Ovaj BF je jednako složen kao i prethodni jer je moguće izračunati `E''15` čija je vrednost 0x02: `E''7 = \x02 ^ I15` tako da je potrebno samo pronaći **`E'14`** koji generiše **`C14` jednako `0x02`**.\
Zatim, uradite iste korake za dešifrovanje C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
2024-04-06 19:39:21 +00:00
**Pratite ovaj lanac dok ne dešifrujete ceo šifrovani tekst.**
### Otkrivanje ranjivosti
2024-04-06 19:39:21 +00:00
Registrujte nalog i prijavite se sa tim nalogom.\
Ako se **prijavite mnogo puta** i uvek dobijete **isti kolačić**, verovatno postoji **nešto** **pogrešno** u aplikaciji. Kolačić koji se vraća trebao bi biti jedinstven svaki put kada se prijavite. Ako je kolačić **uvek** isti, verovatno će uvek biti validan i **neće biti načina da se on poništi**.
2024-04-06 19:39:21 +00:00
Sada, ako pokušate da **modifikujete** kolačić, videćete da dobijate **grešku** od aplikacije.\
Ali ako forsite punjenje (koristeći na primer padbuster) uspećete da dobijete drugi kolačić koji je validan za drugog korisnika. Ovaj scenario je vrlo verovatno ranjiv na padbuster.
2024-04-06 19:39:21 +00:00
### Reference
2024-04-06 19:39:21 +00:00
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
2024-04-06 19:39:21 +00:00
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
2024-04-06 19:39:21 +00:00
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
2024-04-06 19:39:21 +00:00
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>