mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without
This commit is contained in:
parent
dd4d282c20
commit
ab80f2466c
@ -4,19 +4,19 @@
|
|||||||
|
|
||||||
## Glavna ideja
|
## Glavna ideja
|
||||||
|
|
||||||
Aplikacije potpisane sa **entitlement `get_task_allow`** omogućavaju trećim aplikacijama da pokrenu funkciju nazvanu **`task_for_pid()`** sa ID-jem procesa inicijalne aplikacije kao argumentom kako bi dobile port zadatka nad njom (da bi mogle da je kontrolišu i pristupe njenoj memoriji).
|
Aplikacije potpisane sa **entitlement `get_task_allow`** omogućavaju trećim aplikacijama da pokrenu funkciju nazvanu **`task_for_pid()`** sa ID-jem procesa inicijalne aplikacije kao argumentom kako bi dobile port zadatka (da bi mogle da ga kontrolišu i pristupe njegovoj memoriji).
|
||||||
|
|
||||||
Međutim, nije tako lako kao samo preuzeti IPA, ponovo ga potpisati sa entitlement-om i vratiti ga na svoj uređaj. To je zbog FairPlay zaštite. Kada se potpis aplikacije promeni, DRM (Digital Rights Management) ključ je **nevažeći i aplikacija neće raditi**.
|
Međutim, nije tako lako kao samo preuzeti IPA, ponovo ga potpisati sa entitlement-om i vratiti ga na svoj uređaj. To je zbog FairPlay zaštite. Kada se potpis aplikacije promeni, DRM (Digital Rights Management) ključ je **nevažeći i aplikacija neće raditi**.
|
||||||
|
|
||||||
Sa starim jailbroken uređajem, moguće je instalirati IPA, **dekriptovati ga koristeći omiljeni alat** (kao što su Iridium ili frida-ios-dump), i preuzeti ga sa uređaja. Ipak, ako je moguće, preporučuje se da jednostavno pitate klijenta za dekriptovani IPA.
|
Sa starim jailbroken uređajem, moguće je instalirati IPA, **dekriptovati ga koristeći omiljeni alat** (kao što su Iridium ili frida-ios-dump), i preuzeti ga nazad sa uređaja. Ipak, ako je moguće, preporučuje se da jednostavno pitate klijenta za dekriptovani IPA.
|
||||||
|
|
||||||
|
|
||||||
## Dobijanje dekriptovanog IPA
|
## Dobijanje dekriptovanog IPA
|
||||||
|
|
||||||
### Preuzmite ga od Apple-a
|
### Preuzmite ga od Apple-a
|
||||||
|
|
||||||
1. Instalirajte aplikaciju koju želite da testirate na iPhone
|
1. Instalirajte aplikaciju koju želite da testirate na iPhone-u
|
||||||
2. Instalirajte i pokrenite [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) na vašem macos
|
2. Instalirajte i pokrenite [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) na vašem macOS-u
|
||||||
3. Otvorite `Terminal` na vašem Mac-u, i idite u `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. IPA će se kasnije pojaviti u ovoj fascikli.
|
3. Otvorite `Terminal` na vašem Mac-u, i idite u `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. IPA će se kasnije pojaviti u ovoj fascikli.
|
||||||
4. Trebalo bi da vidite svoj iOS uređaj. Dvaput kliknite na njega, a zatim kliknite na Dodaj + → Aplikacije iz gornjeg menija.
|
4. Trebalo bi da vidite svoj iOS uređaj. Dvaput kliknite na njega, a zatim kliknite na Dodaj + → Aplikacije iz gornjeg menija.
|
||||||
5. Nakon što kliknete na Dodaj, Configurator će preuzeti IPA sa Apple-a i pokušati da ga pošalje na vaš uređaj. Ako ste pratili moju preporuku ranije i već instalirali IPA, pojaviće se prozor koji vas pita da ponovo instalirate aplikaciju.
|
5. Nakon što kliknete na Dodaj, Configurator će preuzeti IPA sa Apple-a i pokušati da ga pošalje na vaš uređaj. Ako ste pratili moju preporuku ranije i već instalirali IPA, pojaviće se prozor koji vas pita da ponovo instalirate aplikaciju.
|
||||||
@ -54,7 +54,7 @@ Da biste ponovo potpisali aplikaciju sa `get-task-allow` entitlements, dostupni
|
|||||||
|
|
||||||
Što se tiče sertifikata i profila za potpisivanje, Apple nudi **besplatne profile za potpisivanje developera** za sve naloge putem Xcode-a. Samo kreirajte aplikaciju i konfigurišite jedan. Zatim, konfigurišite **iPhone da veruje aplikacijama developera** tako što ćete otići na `Settings` → `Privacy & Security`, i kliknite na `Developer Mode`.
|
Što se tiče sertifikata i profila za potpisivanje, Apple nudi **besplatne profile za potpisivanje developera** za sve naloge putem Xcode-a. Samo kreirajte aplikaciju i konfigurišite jedan. Zatim, konfigurišite **iPhone da veruje aplikacijama developera** tako što ćete otići na `Settings` → `Privacy & Security`, i kliknite na `Developer Mode`.
|
||||||
|
|
||||||
Sa ponovo potpisanim IPA, vreme je da ga instalirate na uređaj kako biste ga pentestovali:
|
Sa ponovo potpisanim IPA, vreme je da ga instalirate na uređaj da biste ga pentestirali:
|
||||||
```bash
|
```bash
|
||||||
ideviceinstaller -i resigned.ipa -w
|
ideviceinstaller -i resigned.ipa -w
|
||||||
```
|
```
|
||||||
@ -62,11 +62,11 @@ ideviceinstaller -i resigned.ipa -w
|
|||||||
|
|
||||||
### Omogućite režim programera (iOS 16+)
|
### Omogućite režim programera (iOS 16+)
|
||||||
|
|
||||||
Od iOS 16, Apple je uveo **Režim programera**: bilo koja binarna datoteka koja nosi `get_task_allow` *ili* je potpisana razvojnim sertifikatom odbiće da se pokrene dok se Režim programera ne omogući na uređaju. Takođe nećete moći da priključite Frida/LLDB osim ako je ova oznaka uključena.
|
Od iOS 16, Apple je uveo **Režim programera**: bilo koja binarna datoteka koja nosi `get_task_allow` *ili* je potpisana razvojnim sertifikatom odbiće da se pokrene dok se režim programera ne omogući na uređaju. Takođe nećete moći da priključite Frida/LLDB osim ako je ova oznaka uključena.
|
||||||
|
|
||||||
1. Instalirajte ili prenesite **bilo koji** IPA potpisan od strane programera na telefon.
|
1. Instalirajte ili prenesite **bilo koji** IPA potpisan od strane programera na telefon.
|
||||||
2. Idite na **Podešavanja → Privatnost i bezbednost → Režim programera** i uključite ga.
|
2. Idite na **Podešavanja → Privatnost i bezbednost → Režim programera** i uključite ga.
|
||||||
3. Uređaj će se ponovo pokrenuti; nakon unosa lozinke bićete upitani da **Uključite** Režim programera.
|
3. Uređaj će se ponovo pokrenuti; nakon unosa lozinke bićete upitani da **uključite** režim programera.
|
||||||
|
|
||||||
Režim programera ostaje aktivan dok ga ne onemogućite ili ne obrišete telefon, tako da ovaj korak treba izvesti samo jednom po uređaju. [Apple dokumentacija](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) objašnjava bezbednosne implikacije.
|
Režim programera ostaje aktivan dok ga ne onemogućite ili ne obrišete telefon, tako da ovaj korak treba izvesti samo jednom po uređaju. [Apple dokumentacija](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) objašnjava bezbednosne implikacije.
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ Za rutinske pentestove na trenutnim verzijama iOS-a, Alt/Side-Store su obično n
|
|||||||
|
|
||||||
### Hooking / dinamička instrumentacija
|
### Hooking / dinamička instrumentacija
|
||||||
|
|
||||||
Možete hook-ovati vašu aplikaciju tačno kao na uređaju sa jailbreak-om kada je potpisana sa `get_task_allow` **i** kada je Režim programera uključen:
|
Možete hook-ovati vašu aplikaciju tačno kao na jailbreak-ovanom uređaju kada je potpisana sa `get_task_allow` **i** kada je režim programera uključen:
|
||||||
```bash
|
```bash
|
||||||
# Spawn & attach with objection
|
# Spawn & attach with objection
|
||||||
objection -g "com.example.target" explore
|
objection -g "com.example.target" explore
|
||||||
@ -91,11 +91,11 @@ objection -g "com.example.target" explore
|
|||||||
# Or plain Frida
|
# Or plain Frida
|
||||||
frida -U -f com.example.target -l my_script.js --no-pause
|
frida -U -f com.example.target -l my_script.js --no-pause
|
||||||
```
|
```
|
||||||
Nedavne Frida verzije (>=16) automatski upravljaju autentifikacijom pokazivača i drugim iOS 17 mitigacijama, tako da većina postojećih skripti radi odmah.
|
Nedavne Frida verzije (>=16) automatski upravljaju autentifikacijom pokazivača i drugim mitigacijama iOS 17, tako da većina postojećih skripti radi odmah.
|
||||||
|
|
||||||
### Automatizovana dinamička analiza sa MobSF (bez jailbreak-a)
|
### Automatizovana dinamička analiza sa MobSF (bez jailbreak-a)
|
||||||
|
|
||||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) može instrumentisati dev-potpisanu IPA na pravom uređaju koristeći istu tehniku (`get_task_allow`) i pruža web UI sa pretraživačem datotečnog sistema, hvatanjem saobraćaja i Frida konzolom【】. Najbrži način je da pokrenete MobSF u Docker-u, a zatim povežete svoj iPhone putem USB-a:
|
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) može instrumentirati dev-potpisanu IPA na pravom uređaju koristeći istu tehniku (`get_task_allow`) i pruža web UI sa pretraživačem datotečnog sistema, hvatanjem saobraćaja i Frida konzolom【†L2-L3】. Najbrži način je da pokrenete MobSF u Docker-u, a zatim povežete svoj iPhone putem USB-a:
|
||||||
```bash
|
```bash
|
||||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||||
docker run -p 8000:8000 --privileged \
|
docker run -p 8000:8000 --privileged \
|
||||||
@ -107,8 +107,8 @@ MobSF će automatski implementirati binarni fajl, omogućiti Frida server unutar
|
|||||||
|
|
||||||
### iOS 17 & Lockdown Mode upozorenja
|
### iOS 17 & Lockdown Mode upozorenja
|
||||||
|
|
||||||
* **Lockdown Mode** (Podešavanja → Privatnost & Bezbednost) blokira dinamički linker da učitava nepodpisane ili spoljašnje potpisane dinamičke biblioteke. Kada testirate uređaje koji mogu imati ovaj režim omogućen, uverite se da je **onemogućen** ili će vaše Frida/objection sesije odmah prekinuti.
|
* **Lockdown Mode** (Podešavanja → Privatnost i bezbednost) blokira dinamički linker da učitava nesigned ili spolja potpisane dinamičke biblioteke. Kada testirate uređaje koji mogu imati ovaj režim omogućen, uverite se da je **onemogućen** ili će vaše Frida/objection sesije odmah prekinuti.
|
||||||
* Autentifikacija pokazivača (PAC) se sprovodi sistemski na A12+ uređajima. Frida ≥16 transparentno obrađuje PAC stripping — samo održavajte *frida-server* i Python/CLI alatke ažuriranim kada nova glavna verzija iOS-a bude objavljena.
|
* Pointer Authentication (PAC) se sprovodi sistemski na A12+ uređajima. Frida ≥16 transparentno obrađuje PAC stripping — samo održavajte *frida-server* i Python/CLI alatke ažuriranim kada nova glavna verzija iOS-a bude objavljena.
|
||||||
|
|
||||||
## Reference
|
## Reference
|
||||||
|
|
||||||
|
@ -2,6 +2,99 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Proverite post [https://portswigger.net/research/http-2-downgrades](https://portswigger.net/research/http-2-downgrades)**
|
HTTP/2 se generalno smatra imunim na klasično request-smuggling jer je dužina svakog DATA okvira eksplicitna. **Ta zaštita nestaje čim front-end proxy “downgrade”-uje zahtev na HTTP/1.x pre nego što ga prosledi back-end-u**. U trenutku kada dva različita parsera (HTTP/2 front-end i HTTP/1 back-end) pokušaju da se dogovore gde jedan zahtev završava, a drugi počinje, svi stari desync trikovi se vraćaju – plus nekoliko novih.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Zašto se downgrade-ovi dešavaju
|
||||||
|
|
||||||
|
1. Pregledači već govore HTTP/2, ali mnogo nasleđene infrastrukture još uvek razume samo HTTP/1.1.
|
||||||
|
2. Reverzni proxy-ji (CDN-ovi, WAF-ovi, load-balanceri) stoga završavaju TLS + HTTP/2 na ivici i **prepisuju svaki zahtev kao HTTP/1.1** za izvor.
|
||||||
|
3. Korak prevođenja mora da kreira *oba* `Content-Length` **i/ili** `Transfer-Encoding: chunked` zaglavlja kako bi izvor mogao da odredi dužinu tela.
|
||||||
|
|
||||||
|
Kad god front-end veruje u dužinu HTTP/2 okvira **ali** back-end veruje u CL ili TE, napadač može da ih primora da se ne slažu.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Dve dominantne primitivne klase
|
||||||
|
|
||||||
|
| Variant | Front-end length | Back-end length | Typical payload |
|
||||||
|
|---------|-----------------|-----------------|-----------------|
|
||||||
|
| **H2.TE** | HTTP/2 frame | `Transfer-Encoding: chunked` | Uključite dodatno chunked telo poruke čiji konačni `0\r\n\r\n` *nije* poslat, tako da back-end čeka na napadačem obezbeđen “sledeći” zahtev. |
|
||||||
|
| **H2.CL** | HTTP/2 frame | `Content-Length` | Pošaljite *manji* CL od stvarnog tela, tako da back-end čita preko granice u sledeći zahtev. |
|
||||||
|
|
||||||
|
> Ove su identične u duhu klasičnim TE.CL / CL.TE, samo sa HTTP/2 koji zamenjuje jedan od parsera.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Identifikacija downgrade lanca
|
||||||
|
|
||||||
|
1. Koristite **ALPN** u TLS rukovanju (`openssl s_client -alpn h2 -connect host:443`) ili **curl**:
|
||||||
|
```bash
|
||||||
|
curl -v --http2 https://target
|
||||||
|
```
|
||||||
|
Ako se pojavi `* Using HTTP2`, ivica govori H2.
|
||||||
|
2. Pošaljite namerno neispravan CL/TE zahtev *preko* HTTP/2 (Burp Repeater sada ima padajući meni za forsiranje HTTP/2). Ako je odgovor HTTP/1.1 greška kao što je `400 Bad chunk`, imate dokaz da je ivica konvertovala saobraćaj za HTTP/1 parser nizvodno.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Eksploatacija radnog toka (H2.TE primer)
|
||||||
|
```http
|
||||||
|
:method: POST
|
||||||
|
:path: /login
|
||||||
|
:scheme: https
|
||||||
|
:authority: example.com
|
||||||
|
content-length: 13 # ignored by the edge
|
||||||
|
transfer-encoding: chunked
|
||||||
|
|
||||||
|
5;ext=1\r\nHELLO\r\n
|
||||||
|
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
|
||||||
|
```
|
||||||
|
1. **front-end** čita tačno 13 bajtova (`HELLO\r\n0\r\n\r\nGE`), misli da je zahtev završen i prosleđuje toliko ka originu.
|
||||||
|
2. **back-end** veruje TE header-u, nastavlja da čita dok ne vidi *drugi* `0\r\n\r\n`, čime konzumira prefiks napadačevog drugog zahteva (`GET /admin …`).
|
||||||
|
3. Ostatak (`GET /admin …`) se tretira kao *novi* zahtev koji je u redu iza žrtvinog.
|
||||||
|
|
||||||
|
Zamenite prokrijumčaren zahtev sa:
|
||||||
|
* `POST /api/logout` da primorate fiksaciju sesije
|
||||||
|
* `GET /users/1234` da ukradete resurs specifičan za žrtvu
|
||||||
|
|
||||||
|
---
|
||||||
|
## h2c smuggling (nadogradnje u čistom tekstu)
|
||||||
|
|
||||||
|
Studija iz 2023. godine pokazala je da ako front-end prosledi HTTP/1.1 `Upgrade: h2c` header back-end-u koji podržava HTTP/2 u čistom tekstu, napadač može tunelovati *sirove* HTTP/2 okvire kroz ivicu koja je samo validirala HTTP/1.1. Ovo zaobilazi normalizaciju header-a, WAF pravila i čak TLS terminaciju.
|
||||||
|
|
||||||
|
Ključni zahtevi:
|
||||||
|
* Ivica prosleđuje **oba** `Connection: Upgrade` i `Upgrade: h2c` nepromenjena.
|
||||||
|
* Origin se povećava na HTTP/2 i zadržava semantiku ponovne upotrebe konekcije koja omogućava red čekanja zahteva.
|
||||||
|
|
||||||
|
Ublažavanje je jednostavno – uklonite ili hard-kodirajte `Upgrade` header na ivici osim za WebSocket.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Značajni stvarni CVE-ovi (2022-2025)
|
||||||
|
|
||||||
|
* **CVE-2023-25690** – Apache HTTP Server mod_proxy pravila prepravke mogla su se povezati za deljenje i prokrijumčarenje zahteva. (ispravljeno u 2.4.56)
|
||||||
|
* **CVE-2023-25950** – HAProxy 2.7/2.6 prokrijumčarenje zahteva/odgovora kada je HTX parser pogrešno obradio pipelined zahteve.
|
||||||
|
* **CVE-2022-41721** – Go `MaxBytesHandler` je uzrokovao da preostali bajtovi tela budu analizirani kao **HTTP/2** okviri, omogućavajući prokrijumčarenje između protokola.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Alati
|
||||||
|
|
||||||
|
* **Burp Request Smuggler** – od v1.26 automatski testira H2.TE/H2.CL i skrivenu ALPN podršku. Omogućite “HTTP/2 probing” u opcijama ekstenzije.
|
||||||
|
* **h2cSmuggler** – Python PoC od Bishop Fox-a za automatizaciju napada nadogradnje u čistom tekstu:
|
||||||
|
```bash
|
||||||
|
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
|
||||||
|
```
|
||||||
|
* **curl**/`hyper` – kreiranje ručnih payload-a: `curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Defensivne mere
|
||||||
|
|
||||||
|
1. **End-to-end HTTP/2** – potpuno eliminisati prevod nadogradnje.
|
||||||
|
2. **Jedinstveni izvor dužine istine** – prilikom snižavanja, *uvek* generišite validan `Content-Length` **i** **uklonite** sve korisnički dostavljene `Content-Length`/`Transfer-Encoding` header-e.
|
||||||
|
3. **Normalizujte pre rute** – primenite sanitizaciju header-a *pre* logike usmeravanja/prepravke.
|
||||||
|
4. **Izolacija konekcije** – ne ponovo koristite back-end TCP konekcije između korisnika; “jedan zahtev po konekciji” poražava eksploate zasnovane na redu.
|
||||||
|
5. **Uklonite `Upgrade` osim WebSocket** – sprečava h2c tunelovanje.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
* PortSwigger Research – “HTTP/2: The Sequel is Always Worse” <https://portswigger.net/research/http2>
|
||||||
|
* Bishop Fox – “h2c Smuggling: request smuggling via HTTP/2 clear-text” <https://bishopfox.com/blog/h2c-smuggling-request>
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user