Como pode um processo parecer ter um nome diferente na saída do ps?

5

Recentemente tive que limpar um servidor hackeado. O processo malicioso apareceria como "who" ou "ifconfig eth0" ou algo assim na saída "ps aux", mesmo que o executável fosse apenas um amontoado de letras, que foi mostrado em / proc / [pid] / status. / p>

Estou curioso para saber como o processo conseguiu se mascarar desse jeito.

    
por Pentium100 12.11.2014 / 08:19

3 respostas

3

Manipular o nome na lista de processos é uma prática comum. Por exemplo. Eu tenho no meu processo listando o seguinte:

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]

A Dovecot usa esse mecanismo para mostrar facilmente o que cada processo está fazendo.

É basicamente tão simples quanto manipular o parâmetro argv[0] em C. argv é uma matriz de ponteiros para os parâmetros com os quais o processo foi iniciado. Então, um comando ls -l /some/directory terá:

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

Alocando alguma memória, colocando algum texto nessa memória e, em seguida, colocando o endereço dessa memória em argv[0] , o nome do processo mostrado terá sido modificado para o novo texto.

    
por 12.11.2014 / 09:00
3

Em um idioma como C , um processo pode alterar seu nome alterando argv[0] .

Exemplo:

#include <stdio.h>

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

Depois compile:

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

No outro terminal:

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

Linguagem de nível superior também permite que você faça isso, por exemplo, em Perl , você pode modificar $ 0 variável para alterar o nome do processo.

    
por 12.11.2014 / 08:52
2

A mudança do argv [] não é portável. No Linux, você não pode simplesmente alterar o argv [0] para apontar para uma string mais longa. Você teria que sobrescrever os argumentos existentes e tomar cuidado para não sobrescrever as variáveis de ambiente que se seguem no espaço de endereço.

libbsd fornece uma implementação de setproctitle (3) para Linux que facilita muito isso.

    
por 08.03.2017 / 22:10

Tags