elgio
(usa OpenSuSE)
Enviado em 16/01/2010 - 10:47h
Como já foi alertado, este teu programa em C seria de extremo PERIGO ao ser colocado no ar, pois se ele executar qualquer coisa como root, é um brecha tremenda.
Como uma resposta ao ataques de shell code, as chamadas de sistema estão muito mais seguras. Se tu executa um programa como root e este programa invoca outro programa, seja por system, exec, etc, ele não herda as permissões do root. Roda com teu usuário principal.
Só se tu realmente te logar como root para que isto funcione.
veja este pequeno programa usando a chamada execl:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *a=NULL;
if (argc > 2) a = argv[2];
if (argc >= 2){
execl (argv[1], argv[1], a, NULL);
printf("ERRO\n");
}
}
chamei ele de lixo:
elgio@didake:~> ls -la lixo
-rwxr-xr-x 1 elgio users 11181 2010-01-16 10:39 lixo
elgio@didake:~>
eu chamo ele como o usuário elgio:
elgio@didake:~> ./lixo /bin/cat /etc/passwd
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
elgio:x:1000:100:Elgio Schlemer:/home/elgio:/bin/bash
fulano:x:1006:100:Usuario Fulano:/home/fulano:/bin/bash
usuario:x:1005:100:Teste:/home/usuario:/bin/bash
...
elgio@didake:~>
FUNCIONOU. Claro que se for tentar ler o /etc/shadow não dá:
elgio@didake:~> ./lixo /bin/cat /etc/shadow
/bin/cat: /etc/shadow: Permissão negada
elgio@didake:~>
Primeira tentativa: ligando o bit suid no lixo:
chmod u+x lixo
elgio@didake:~> ls -la lixo
-rwsr-xr-x 1 elgio users 11181 2010-01-16 10:39 lixo
elgio@didake:~>
Agora o binário lixo será executado como root.
testando:
elgio@didake:~> ./lixo /bin/cat /etc/shadow
/bin/cat: /etc/shadow: Permissão negada
elgio@didake:~>
também não funcionou. Isto porque o binário lixo executa como root, mas qualquer outro binário que este venha e executar, como o cat, voltará a ser como usuário elgio!!
O mesmo se eu chamar o lixo como sudo:
elgio@didake:~> sudo ./lixo /bin/cat /etc/shadow
/bin/cat: /etc/shadow: Permissão negada
elgio@didake:~>
Então, se queres que um binário chame outro dentro dele mesmo, só se tu incorporar o sudo na chamada:
system("sudo comando");