récemment, j'ai dû nettoyer un server piraté. Le process malveillant apparaîtrait comme "who" ou "ifconfig eth0" ou quelque chose comme ça dans la sortie "ps aux", même si l'exécutable était juste un fouillis de lettres, qui a été montré dans / proc / [pid] / status.
Je suis curieux de savoir comment le process a réussi à se masquer comme ça.
Manipuler le nom dans la list des process est une pratique courante. Par exemple, j'ai dans ma list de process ce qui suit:
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 utilise ce mécanisme pour montrer facilement ce que chaque process est en train de faire.
C'est fondamentalement aussi simple que de manipuler le paramètre argv[0]
dans C. argv
est un tableau de pointeurs vers les parameters avec lesquels le process a été démarré. Ainsi, une command ls -l /some/directory
aura:
argv[0] -> "ls" argv[1] -> "-l" argv[2] -> "/some/directory" argv[3] -> null
En allouant de la memory, en mettant du text dans cette memory, puis en mettant l'adresse de cette memory dans argv[0]
le nom du process affiché aura été modifié pour le nouveau text.
Dans un langage comme C
, un process peut changer son nom en changeant argv[0]
.
Exemple:
#include <stdio.h> int main(int argc, char *argv[]) { argv[0][2] = 'A'; sleep(10); return 0; }
Puis comstackz-le:
$ gcc test.c $ ls a.out $ ./a.out
Dans un autre terminal:
$ ps -ef | grep '[a].out' $ ps -ef | grep '[A].out' cuonglm 17979 17569 0 14:51 pts/0 00:00:00 ./A.out
Le langage de niveau supérieur vous permet également de le faire, par exemple en Perl
, vous pouvez modifier la variable $ 0 pour changer le nom du process.
Changer argv [] n'est pas portable. Sous Linux, vous ne pouvez pas simplement changer argv [0] pour pointer vers une string plus longue. Vous devez écraser les arguments existants et prendre soin de ne pas écraser les variables d'environnement qui suivent dans l'espace d'adressage.
libbsd fournit une implémentation de setproctitle (3) pour Linux qui rend cela beaucoup plus facile.