hacktricks/linux-hardening/bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ddexec.md

111 lines
7.2 KiB
Markdown
Raw Normal View History

# DDexec / EverythingExec
2022-05-07 13:38:40 +00:00
<details>
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-30 20:49:49 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-05-07 13:38:40 +00:00
</details>
2024-02-10 13:03:23 +00:00
## Contesto
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
In Linux, per eseguire un programma, deve esistere come file e deve essere accessibile in qualche modo attraverso la gerarchia del file system (questo è solo il funzionamento di `execve()`). Questo file può risiedere su disco o in RAM (tmpfs, memfd), ma è necessario un percorso del file. Questo ha reso molto facile controllare cosa viene eseguito su un sistema Linux, facilitando la rilevazione delle minacce e degli strumenti degli attaccanti o impedendo loro di eseguire qualsiasi cosa di loro (_ad esempio_ non consentendo agli utenti non privilegiati di posizionare file eseguibili ovunque).
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
Ma questa tecnica è qui per cambiare tutto questo. Se non puoi avviare il processo desiderato... **allora dirottane uno già esistente**.
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
Questa tecnica ti consente di **eludere le tecniche di protezione comuni come la modalità di sola lettura, noexec, whitelist dei nomi dei file, whitelist degli hash...**
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
## Dipendenze
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
Lo script finale dipende dai seguenti strumenti per funzionare, devono essere accessibili nel sistema che stai attaccando (di default li troverai ovunque):
2022-05-07 19:19:13 +00:00
```
dd
bash | zsh | ash (busybox)
head
tail
cut
grep
od
readlink
wc
tr
base64
```
2024-02-10 13:03:23 +00:00
## La tecnica
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
Se sei in grado di modificare arbitrariamente la memoria di un processo, puoi prenderne il controllo. Ciò può essere utilizzato per dirottare un processo già esistente e sostituirlo con un altro programma. Possiamo ottenere ciò utilizzando la chiamata di sistema `ptrace()` (che richiede di poter eseguire chiamate di sistema o di avere gdb disponibile nel sistema) o, in modo più interessante, scrivendo su `/proc/$pid/mem`.
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
Il file `/proc/$pid/mem` è una mappatura uno a uno dell'intero spazio degli indirizzi di un processo (ad esempio, da `0x0000000000000000` a `0x7ffffffffffff000` in x86-64). Ciò significa che leggere o scrivere su questo file in un offset `x` è lo stesso che leggere o modificare i contenuti all'indirizzo virtuale `x`.
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
Ora, abbiamo quattro problemi di base da affrontare:
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
* In generale, solo l'utente root e il proprietario del programma possono modificarlo.
2022-05-07 19:19:13 +00:00
* ASLR.
2024-02-10 13:03:23 +00:00
* Se proviamo a leggere o scrivere su un indirizzo non mappato nello spazio degli indirizzi del programma, otterremo un errore di I/O.
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
Questi problemi hanno soluzioni che, sebbene non siano perfette, sono buone:
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
* La maggior parte degli interpreti di shell consente la creazione di descrittori di file che verranno poi ereditati dai processi figlio. Possiamo creare un descrittore di file che punta al file `mem` della shell con permessi di scrittura... quindi i processi figlio che utilizzano quel descrittore di file saranno in grado di modificare la memoria della shell.
* ASLR non è nemmeno un problema, possiamo controllare il file `maps` della shell o qualsiasi altro file del procfs per ottenere informazioni sullo spazio degli indirizzi del processo.
* Quindi dobbiamo eseguire `lseek()` sul file. Dalla shell questo non può essere fatto a meno di utilizzare il famigerato `dd`.
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
### In dettaglio
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
I passaggi sono relativamente facili e non richiedono alcuna competenza particolare per comprenderli:
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
* Analizza il binario che vogliamo eseguire e il loader per scoprire quali mappature necessitano. Quindi crea un "shell"code che eseguirà, in generale, gli stessi passaggi che il kernel esegue ad ogni chiamata a `execve()`:
* Crea le suddette mappature.
* Leggi i binari in esse.
* Imposta i permessi.
* Infine, inizializza lo stack con gli argomenti per il programma e posiziona il vettore ausiliario (necessario per il loader).
* Salta nel loader e lascia che faccia il resto (carica le librerie necessarie per il programma).
* Ottieni dal file `syscall` l'indirizzo a cui il processo tornerà dopo la chiamata di sistema che sta eseguendo.
* Sovrascrivi quel punto, che sarà eseguibile, con il nostro shellcode (attraverso `mem` possiamo modificare pagine non scrivibili).
* Passa il programma che vogliamo eseguire allo stdin del processo (verrà `letto()` da detto "shell"code).
* A questo punto spetta al loader caricare le librerie necessarie per il nostro programma e saltare in esso.
2022-05-07 19:19:13 +00:00
2024-02-10 13:03:23 +00:00
**Controlla lo strumento su** [**https://github.com/arget13/DDexec**](https://github.com/arget13/DDexec)
2022-05-07 13:38:40 +00:00
## EverythingExec
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
Ci sono diverse alternative a `dd`, una delle quali, `tail`, è attualmente il programma predefinito utilizzato per eseguire `lseek()` attraverso il file `mem` (che era l'unico scopo per cui veniva utilizzato `dd`). Tali alternative sono:
```bash
tail
hexdump
cmp
xxd
```
2024-02-10 13:03:23 +00:00
Impostando la variabile `SEEKER` è possibile cambiare il seeker utilizzato, ad esempio:
```bash
SEEKER=cmp bash ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)
```
2024-02-10 13:03:23 +00:00
Se trovi un altro seeker valido non implementato nello script, puoi comunque utilizzarlo impostando la variabile `SEEKER_ARGS`:
```bash
SEEKER=xxd SEEKER_ARGS='-s $offset' zsh ddexec.sh ls -l <<< $(base64 -w0 /bin/ls)
```
2024-02-10 13:03:23 +00:00
Blocca questo, EDRs.
2024-02-10 13:03:23 +00:00
## Riferimenti
2024-02-07 04:06:18 +00:00
* [https://github.com/arget13/DDexec](https://github.com/arget13/DDexec)
<details>
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-05-07 13:38:40 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2023-12-30 20:49:49 +00:00
2024-02-10 13:03:23 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-05-07 13:38:40 +00:00
</details>