PHP Nástroje pro zkoušení hesel

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Harvie
Datum: 2.3.2007
Hodnocení/Hlasovalo: 2.11/35

"Crackování" POP3 a FTP metodou zkoušení hesel.

V minulém díle jsem vám ukazoval, jak na generování BruteForce sledu, nyní si ukážeme, jak toho využít v praxi.

1. budeme potřebovat seznam zkoušených hesel:
Útok hrubou silou (BruteForce attack)
Slovníkový útok (Dictintionary attack)

2. program, který bude schopen hesla zkoušet:

K tomu, abychom takový program vytvořili, se budeme muset rozhodnout, co chceme napadnout, jestli šifru, autentifikační systém, nebo něco jiného.
Dále si musíme zjistit, jak daný systém funguje a potom naprogramovat podobný algoritmus jako používají uživatelé, kteří "luští" šifru pomocí svého fungujícího klíče, nebo přihlašovací rutinu, jakou používá klientský software, který legitimní uživatelé používají k přihlášení do tohoto systému.
Pokud jde o síťovou komunikaci, musíme si uvědomit, jak taková síťová komunikace probíhá, v našem případě jde o takovou, která používá řetězce ascii znaků, je tedy pro nás lépe čitelná a pochopitelná. Takovéto řídící příkazy jsou posílány způsobem podobným dálnopisu (to co já píšu tady, vidí tam a to co píšou tam, to vidím tady).

Pro náš příklad jsem vybral protokol POP3, tedy protokol používaný na práci s příchozí poštou na e-majlovém serveru. Ještě musíme vědět, že POP3 server naslouchá standartně na portu 110.
Nyní si ukážeme, jak taková komunikace vypadá v případě platného přihlášení:

+OK Hello, this is Seznam POP3 server 2.3.15.
USER fakemail@email.cz
+OK Enter your password please.
PASS secretpass
+OK 62 12011279
A v případě neplatného pokusu o přihlášení:
+OK Hello, this is Seznam POP3 server 2.3.15.
USER fakemail@email.cz
+OK Enter your password please.
PASS badpass
-ERR Invalid login.

to si můžeme vyzkoušet zadáním příkazu "telnet pop3.seznam.cz 110" do příkazového řádku a po zobrazení uvítací zprávy zadáním příkazů USER a PASS server donutíme ukončit spojení příkazem QUIT. A to je přesně to, co si budeme dnes automatizovat.

Ještě bych rád poznamenal, že servery většinou zatajují, že jste zadali neplatného uživatele, takže chyba vypsaná po zadání hesla se může vztahovat i ke jménu.

Ještě si zjistíme, že při chybě vrací server "-ERR" a při úspěchu "+OK" (vidíme nahoře).

Je sice více způsobů, jak toto pro daný protokol zjistit (sniffer, telnet, netcat,...), ale nejlepší způsob je použít google.

Teď, když jsme si zjistili, jak komunikace probíhá (tušíme také, jaký je formát hesla - tj.: žádné netisknutelné znaky, pravděpodobně písmena a číslice), napíšeme si program, který nám toto zautomatizuje a umožní tak vyzkoušet velké množství hesel rychleji, než kdybysme je ručně zadávali do inputboxu v outlooku, nebo podobném zařízení...

Náš program bude číst řádky ze standartního vstupu (příkazový řádek) a zkoušet je jako hesla. V případě, že server potvrdí platné heslo, program toto heslo vypíše a ukončí se.

Nejdříve zdrojový kód, potom komentáře:



Náš program načítá hesla z příkazového řádku a zkouší je. Myslím ale, že je stejně sotva budeme zkoušet ručně. Již ale máme solidní prostředek k testování s hackersky přívětivým interfacem.
Do toho můžeme pomocí nějakého triku posílat hesla ze souboru, nebo generátoru:
bfgen.php | pop3crack.php
pop3crack.php < wordlist.txt
Kde je získáte? viz.: nahoře... Případně za řetězec dáme ještě "> heslo.txt", pak můžeme jít spát a až se vzbudíme, bude heslo v tomto souboru.

Tipy:
- Rozdělit hesla na více částí a zkoušet je pomocí několika procesů najednou.
- Zjistit (pomocí telnet klienta), po kolika pokusech server zavře soket a soket otevírat znovu jen v případě potřeby (já počítám s tím, že server zavře spojení po každém pokusu, tak to ale není a může to urychlit skript)
- Automatizovat předchozí bod.
- Zajímavé může být také použití podobného skriptu ve webové aplikaci, která si ověří uživatele dotazem na pop3 server.

Vysvětlivky:
- Znovu: PHP není pouze jazyk pro psaní webových aplikací (stránek), ale normální skriptovací jazyk, který lze s výhodou používat v příkazovém řádku.
- Soket je jakási pomyslná roura, kterou proudí data mezi serverem a klientem (v našem případě), PHP se k němu chová stejně jako k souboru.
- ReadLine - moje funkce readline funguje tuším pouze v PHP5, pro starší PHP si napište vlastní, nebo googlujte.
- Autorovi je upřímě jedno, k čemu tento článek použijete a jestli z toho budete mít problémy, do ničeho mě netahejte, stejně nenesu žádnou zodpovědnost za vaše činy ;), pokud budete přetěžovat seznam, počítejte s problémy za strany ISP, seznamu a případně i policie, jste tu "prosebeasamizasebe". Když najdete kanystr benzínu, co uděláte?

Domácí úkol:
- Zjistit si, jak probíhá FTP komunikace a upravit si skript pro FTP
- Sehnat si dobrý wordlist
- Napsat si obdobu tohoto programu na jiný protokol - jaký chcete.
- Dokázat si schopnost používání googlu zjištěním významu čísel v řetězci "+OK 62 12011279".

Příště si ukážeme jak udělat podobný program na crackování MD5, hesel z etc/passwd nebo etc/shadow a prakticky libovolně (jakýkoli šifrovací algoritmus, který jsme schopni naprogramovat) šifrovaných dat...