Wie kann ein Prozess in der ps-Ausgabe einen anderen Namen haben?

8

Vor kurzem musste ich einen gehackten Server bereinigen. Der böswillige Prozess würde in der Ausgabe von "ps aux" als "who" oder "ifconfig eth0" oder so ähnlich erscheinen, selbst wenn die ausführbare Datei nur ein Durcheinander von Buchstaben war, das in / proc / [pid] / status angezeigt wurde.

Ich bin gespannt, wie der Prozess es geschafft hat, sich so zu maskieren.

Pentium100
quelle
Was ist die Art der ausführbaren?
Cuonglm
Es war binär, kein Shell-Skript, wenn Sie danach fragen.
Pentium100

Antworten:

4

Das Manipulieren des Namens in der Prozessliste ist eine gängige Praxis. ZB habe ich in meinem Prozess Folgendes aufgelistet:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot verwendet diesen Mechanismus, um einfach zu zeigen, was jeder Prozess tut.

Es ist im Grunde so einfach wie das Bearbeiten des argv[0]Parameters in C. Es argvhandelt sich um ein Array von Zeigern auf die Parameter, mit denen der Prozess gestartet wurde. Ein Befehl ls -l /some/directoryhat also:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

Durch Zuweisen von Speicher, Einfügen von Text in diesen Speicher und anschließendes Einfügen der Adresse dieses Speichers in argv[0]den angezeigten Prozessnamen wurde der neue Text geändert.

wurtel
quelle
2
So funktioniert das nicht. Das Zeigen argv[0]auf einen anderen Ort ändert nichts an der Darstellung des Prozesses ps. Der Kernel kümmert sich nicht um die Zeiger in argv. Vielmehr merkt sich der Kernel, in welchem ​​Speicherbereich sich die eigentlichen Argumente befinden, und macht dies für psandere Tools sichtbar . Diese Tools müssen dann die Grenzen zwischen den Argumenten identifizieren, indem sie nach der NUL-Terminierung zwischen den einzelnen Argumenten suchen.
Kasperd
4

Das Ändern von argv [] ist nicht portierbar. Unter Linux können Sie argv [0] nicht einfach so ändern, dass es auf eine längere Zeichenfolge verweist. Sie müssten die vorhandenen Argumente überschreiben und darauf achten, die im Adressraum folgenden Umgebungsvariablen nicht zu überschreiben.

libbsd bietet eine Implementierung von setproctitle (3) für Linux, die dies erheblich vereinfacht.

Alex Jasmin
quelle
3

In einer Sprache wie Ckann ein Prozess seinen Namen durch Ändern ändern argv[0].

Beispiel:

#include <stdio.h>

int main(int argc, char *argv[]) {
    argv[0][2] = 'A';
    sleep(10);
    return 0;
}

Dann kompiliere es:

$ gcc test.c
$ ls
a.out
$ ./a.out

In einem anderen Terminal:

$ ps -ef | grep '[a].out'
$ ps -ef | grep '[A].out'
cuonglm  17979 17569  0 14:51 pts/0    00:00:00 ./A.out

In einer höheren Sprache können Sie dies auch tun. Beispiel Perl: Sie können die Variable $ 0 ändern, um den Prozessnamen zu ändern.

cuonglm
quelle
1

Es gibt zwei Linux-Standardmethoden, von denen eine von glibc stammt und möglicherweise auf andere Nicht-Linux-Systeme portierbar ist:

Es ist möglich, dass das Ändern argv[0]früher funktioniert hat, aber zumindest auf meinem aktuellen Linux-System hat es nichts mit der Ausgabe in zu tun ps.

In dieser Antwort finden Sie weitere Details und ein Codebeispiel: https://stackoverflow.com/a/55584492/737303

Stickstoff-
quelle