Archief - [PROG][VB.NET] + [JAVA] Brute Force

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Install

Legacy Member
ik zou een bruteforce attack willen leren schrijven.
Ik ben begonnen met programmeren op school.
ik krijg VB.net en JAVA .
Toch de PRogrammeertaal maakt niet veel uit ik leer het wel :d
Nu ik heb geen idee wat ik het best kan gebruiken als programmeer taal.
Of hoe ik aan zoiets moet beginnen?

BartDP

Legacy Member
bedoel je brute force als in ik kraak uw paswoord op een jaar of 1000?

Install

Legacy Member
Ja dat bedoel ik .
het is niet zo belangrijk dat het een paswoord kraakt
het gaat om de code die erachter zit.

ArnoDF

Legacy Member
voor grote paswoorden best een taal kiezen waarmee ge de beste performance kunt halen.
Kijk ook eens naar de source van John the Ripper, die vindt ge wel erges.

killgore

Legacy Member
rofl :).

Gelijk welke taal gaat voor goede check algoritmes veel te traag zijn :p. En veel coding zit er niet aan hoor, gewoon
while(!try(pass++,beveiligdding));

Komt het op neer.

dJeez

Legacy Member
Tjah killgore, tegenwoordig is een (combinatie van) lus(sen) schrijven al een heksentoer waarvoor je magical pixie dust nodig hebt blijkbaar... :p.

Rainbow tables zijn trouwens (bij hashed passwords tenminste) veel handiger, doch dit volledig terzijde.

Install

Legacy Member
:D
kheb die John the ripper eens bekeken hoewel ik niet in de sourcecode geweest ben.
ziet er best nice uit maar kan het niet wat makkelijker?
als ik bv mijn router moet hacken hoe begin ik daar dan aan met een bruteforce?

killgore

Legacy Member
Install zei:
:D
kheb die John the ripper eens bekeken hoewel ik niet in de sourcecode geweest ben.
ziet er best nice uit maar kan het niet wat makkelijker?
als ik bv mijn router moet hacken hoe begin ik daar dan aan met een bruteforce?

Nja, een router is nog iets anders gezien je moet rekening houden met networking issues en zo. Hier kan je denk ik eerder proberen multithreaden, maar zelf heb ik dat nog niet geprobeerd :).

En natuurlijk kan je pure bruteforce verbeteren met rainbow tables, collision van specifieke zaken, ... .

De basis van bruteforce komt er echter gewoon op neer dat je alle mogelijkheden afgaat tot je een succes hebt.

Rainbow tables komen er op neer dat je je resultaten cached zodat je bij een volgende hack veel sneller al de vorige resultaten kan gaan aflopen.
Collision komt erop neer dat je door fouten in het algoritme door specifieke methoden het aantal mogelijkheden serieus kan uitdunnen. Maar dat is enorm afhankelijk van hashfuncties en zo.


Geen van die zaken lijken mij geen echte super oefening om programmeerinzicht te krijgen ofzo ...

RpR

Legacy Member
Denk eerder dat het probleem is. Hoe laat hij het wachtwoord testen. Denk dat hij wel loopjes kan schrijven.

Denk dat het probleem ligt om de normale menselijke interactie te laten doen.
Dus waar je normaal gebruiker en wachtwoord moet ingeven dat het programma dit doet.

killgore

Legacy Member
dat is puur implementatie-afhankelijk he

Nuja, als het voor sites is ben je goed af met de site-structuur (html) te leren lezen en dan eens het HTTP protocol onder de loep te nemen :).

Dan java & hun socket-api gebruiken, zal goed genoeg zijn if you ask me (c++ is nog iets beter, maar laat het ons simpel houden :p).

pieta

Legacy Member
gisteren eens beginnen te lezen over hash tabelsand stuff op wiki, ook rainbow tables en ngo wa varianten, toch een uurke gelezen, en tot de conclusie gekomen dta ik het wel 'snap' ma geen flauw heb hoe het allemaal inz n werk gaat, alee, tis zoals zeggen 1+1 = 2, ma ge weet nie echt wat de + betekent...

over een paar jaar nog eens lezen dnek ik:p

Install

Legacy Member
Same here pieta :d
ik ken ook maar basis van vb en java een loopje lukt nog wel :D
HTML ken ik maar kheb geen id hoe ik het zou moeten Maken in code dan

killgore

Legacy Member
Mja, kijk, uw vraag is hier ook zeer algemeen.

Het probleem is: jij wilt gaan bruteforce leren. Dat op zich is easy als hell (zoals ik hier boven zei: basis komt neer op 1 lusje).

De code die je gebruikt om te hacken zelf is puur implementatie-afhankelijk. Wil jij een hash "decoden" of een pass bij een username raden of een bepaalde file op een server zoeken of ... .
Dit zijn zeer verschillende zaken die op een heel eigen manier geprogrammeerd worden en eigenlijk totaal niet onder het topic "hacken" vallen maar wel onder dat specifieke domein. Voor die hash zal je die specifieke hash functie moeten implementeren. Voor dat pass op een site zal je moeten networking (sockets) en wat HTTP-protocol gebruiken. Voor die file dan weer het FTP (of ook HTTP) protocol, ... .

Dit zijn dus zaken die op zich niets met hacking te maken hebben, je schrijft gewoon code die een pagina opvraagt ofzo. Het hacken zelf is dat je die code een 1000x per seconde ofzo laat uitvoeren om te proberen aan het pass te geraken.

Je kan dus niet zomaar algemeen leren bruteforcen :). Daarom dat het uit leeraspect vrij oninteressant is.

Rainbow table is gewoon een tabel waarin je alle voorgaande resultaten opslaat.

Stel je wilt een md5 hash raden, je begint bij "a", zo tot "z", dan "aa" tot "zz", enz. enz. (in het echt zal je meer tekens afgaan ofcourse, tis maar een vb.).

Nu ga je die allemaal aflopen en altijd die hash herberekenen, wat al een vrij zware functie is. Stel dat je dan bij "test" eindelijk de juiste sequentie hebt gevonden waren die vorige resultaten "nutteloos" en ga je die de volgende keer weer allemaal overlopen, verspilling dus.

Een rainbow table komt er in de basis op neer dat je gewoon de hash opslaat met de corresponderende tekst nadat je berekening hebt gedaan. De volgende keer dat je zoekt kan je dan eerst in die tabel kijken of je die hash al opgeslagen hebt. De kost die je hebt is dat je een opslag-algoritme extra hebt uit te voeren, dat echter vaak zeer snel is. De winst is dat je bij veelvuldig gebruik op den duur een zeer mooie tabel hebt aangelegd en hashes vrij snel kan vinden.
Voor zulke tabellen gebruikt men dan ook meestal speciale (zeer snelle) datastructuren, geen gewone arrays, maar daar ga ik niet verder op ingaan gezien je nog maar basis gezien hebt. Want zoiets op zich programmeren is nogal moeilijk als je niets ervan kent :). Maar hiervoor bestaan dan weer voorgeprogrammeerde containerclasses in de meeste populaire talen.

In zo een geval word het dus iets als (dit is pseudocode he)
Code:
bool correct = false;
gezochtemd5 = ...;
Table t = loadCalculatedMD5s();
String test= t["0"]!=NULL?t["0"]:"a";
if(t[gezochtemd5] != NULL) resultaat = t[gezochtemd5];
else while(!correct)
{
    resultaat = MD5(test);
    correct = (resultaat==gezochtemd5);
    t.add(resultaat,test++);
}
t.add("0",test);
saveCalculatedMD5s(t);
We initialiseren eerst een boolean voor onze loop (kan zonder ook, maar kwou het duidelijk houden). Dan hebben we natuurlijk nog de md5 die we willen "kraken".
Daarna maken we een tabel aan, hiervoor roepen we een functie aan die de reeds berekende md5's ophaalt (dat komt er gewoon op neer een tekstbestandje in te lezen in een tabel, zit in java e.d. std in).
Dan maken we de start-string. Hier heb ik deze opgeslagen in de tabel op positie ["0"] (omdat er geen enkele md5hash ooit "0" zal geven kan ik dat gebruiken). Immers, we willen niet weer alles van "a" herhalen, maar waar we laatste keer gestopt zijn (we slaan dit op in ["0"], zoals je later in code ziet). Natuurlijk, als dit niet bestaat (we hebben de code nog nooit uitgevoerd, er bestaat geen tabel), dan beginnen we gewoon op "a", x?y:z is gewoon gelijkaardig aan if(x) then y else z.
Daarna kijken we of die gezochte hash al in die tabel voorkomt (iets wat normaal zeer snel gaat). Zoja, dan steken we dit in het resultaat.
Zo nee, we komen in onze bruteforce loop terecht.
In deze loop berekenen we eerst de md5 van onze teststring. Dan kijken we of de md5 hiervan gelijk is aan de gezochte md5, dit resultaat steken we in de boolean resultaat.
En op het einde voegen we de berekende hash toe aan de tabel (eerste argument = hash = uw index, zoals de 0,1,2, ... in arrays; tweede argument = de tekst die met die hash overeenkomt).
In dat statement gebruik ik ook ++, dit wilt zeggen dat uw string naar de volgende waarde zal springen (bv. van a->b, z->aa, ...). Dat wordt normaal wel intern in de string klasse geïmplementeerd :).
Als resultaat gelijk is aan true stopt de lus, als ze vals is gaan we verder.

Eenmaal de lus stopt slaan we op positie ["0"] op waar we gekomen zijn met de test-string (dit is dus waar we volgende keer verdergaan :)). Merk op dat dit door dat ++ statement de string is volgend op de laatste die we berekend hebben, zoals we willen :).
En natuurlijk slaan we dan de tabel nog ergens op in een tekstbestandje of zo zodat we volgende keer weer heel onze tabel kunnen inladen.

Dit is dus vrij basic & geschreven in de hoop dat jullie het kunnen begrijpen, in echte implementaties zal het ietsje sneller & technischer geschreven worden. En in heel realistische situaties zit je met netwerken van hackers die elk een deel berekenen (gedistribueerde programma's), maar dat is dan weer geadvanceerd gedoe :).

Je moet je gewoon leren inprenten dat hacking niet direct een kunst op zich is. Vele hackers zijn gewoon mensen die een bepaald systeem goed begrijpen en eigenlijk ook zo een systeem goed kunnen gebruiken of zelf schrijven. Je leert niet "hacken", je leert een systeem kennen en probeert in te zien waar de zwakheden zitten :).
En dan heb ik het over echte hackers, de mensen die de code schrijven. Geen scriptkiddies en attackers die gewoon tooltjes gebruiken.

[BAT] Hydra

Legacy Member
Ik zal ook eens proberen rainbow tables uit te leggen.

Eerst en vooral: wat kan je ermee doen? Dit ga ik uitleggen aan de hand van een voorbeeld. Stel dat je een bestand hebt waarin paswoorden van gebruikers staan dat van de volgende vorm is:

<gebruiker1> <versleuteld_paswoord1>
<gebruiker2> <versleuteld_paswoord2>
...

De paswoorden van de gebruikers staan dus versleuteld in het bestand! De versleuteling is gebeurd door het toepassen van een hash functie op het echte paswoord.

Wat is nu een hash functie? Een hash functie is een functie die een string neemt als input, een bepaalde bewerking erop toepast, en een andere string terug als output geeft. versleuteld_paswoord1 is niets minder dan de toepassing van de hash functie op het echte paswoord van gebruiker1. Een voorbeeld van een eenvoudige hash functie is bvb een functie die aan elk karakter van een gegeven string een nummer toekent, de som van al de nummers van de karakters van de gegeven string neemt, en dit als outputwaarde geeft. Een meer bekende en betere hash functie is MD5.

Je weet dat een hash functie een string neemt, en daar een andere string van maakt. Als "smiley" een string is, dan zal de hash functie daar bijvoorbeeld "dfG3lk" van maken. Dat duid ik als volgt aan:

hash(smiley) = dfG3lk

Als smiley het paswoord zou zijn van <gebruiker1>, dan zou er de volgende regel in het voorbeeldbestand staan:

<gebruiker1> dfG3lk

De sterkte van een goede hash functie is het feit dat je vanuit de string "dfG3lk" niet meer kan teruggaan naar "smiley". Anders gezegd, de hash functie is niet inverteerbaar.

Toch is dit net hetgene wat we willen bereiken, we willen vanaf "dfG3lk" (hetgene we weten) "smiley" (hetgene we zoeken) bekomen (in principe zoeken we niet enkel "smiley", maar eender welke andere string die gehasht "dfG3lk" oplevert)

Alvorens over te gaan naar rainbow tabellen definieren we nog een andere functie, gelijkaardig aan de hash functie, deze functie noemen we de reductie functie. De reductie functie neemt een string en zet deze ook om in een andere string. De reductie functie is eveneens niet inverteerbaar. Als de reductie functie "dfG3lk" omzet in "t45g%2N" dan duid ik dit als volgt aan:

reduction(dfG3lk) = t45g%2N

Nu weten we genoeg om te spreken over rainbow tabellen. Een rainbow tabel bestaat uit enorm veel chains (kettingen). De kettingen bestaan uit enorm veel ringen. (denk aan een echte ketting) Versimpeld kan men stellen dat elke ring van een ketting een willekeurig paswoord en de hash van dat paswoord bevat. Bovendien zijn de kettingen zo gemaakt dat als we alle ringen van alle kettingen samennemen, (bijna) elk genereerbaar paswoord (dat bvb. kleiner is dan 9 karakters) wel ergens op een ring op een bepaalde ketting staat. Ook geldt dat de ringen van de kettingen zo gemaakt zijn, dat geen twee ringen dezelfde zijn (en dus hetzelfde paswoord en gehasht paswoord bevatten).

Deze kettingen worden gemaakt op je harde schijf. Natuurlijk hebben we niet genoeg ruimte op onze harde schijf om ALLE ringen van ALLE kettingen bij te houden. Dit zou immers neerkomen op ALLE mogelijke paswoorden kleiner dan 9 karakters bij te houden, wat immens veel ruimte vereist. Wat er echt bijgehouden wordt, is het begin en het einde van elke ketting ofte 2 ringen (de eerste en de laatste ring). De verzameling van begin en eindes van de kettingen is de rainbow tabel. En deze kan gebruikt worden om gegeven een hash van een string, de string zelf te weten te komen!

Hoe is dit mogelijk? Door op een slimme manier de kettingen op te bouwen!

We beginnen de kettingen op te bouwen door 100.000 willekeurige paswoorden als eerste ring van 100.000 kettingen te nemen.

eerste ring van de kettingen:
<willek. pasw. 1 voor ring 1>
<willek. pasw. 1 voor ring 2>
...
<willek. pasw. 1 voor ring 100.000>

Nu gaan we voor elke ketting 890.000 ringen maken, en wel zo:

<willek. pasw. 1 voor ring 1> --hash--> <hash van willek. pasw. 1 voor ring 1> --reduction--> <willek. pasw. 2 voor ring 1> --hash--> <hash van willek. pasw. 2 voor ring 1> --reduction--> <willek. pasw. 3 voor ring 1> --hash--> <hash van willek. pasw. 3 voor ring 1>.... (890 000 keer) --reduction--> <willek pasw. 890 000 voor ring 1>

Zoals eerder vermeld, houden we alleen <willek. pasw. 1 voor ring 1> en <willek pasw. 890 000 voor ring 1> bij als eerste ring en laatste ring van de ketting.

Op deze manier construeren we 100.000 kettingen, waarvan we nadat een ketting gemaakt is, telkens slechts het eerste en het laatste element van bijhouden! De begin en eindes van de 100.000 kettingen vormen de rainbow tabel.

Nu gaan we deze rainbow tabel gebruiken om vanaf een gehaste string de string zelf te weten te komen.

Dit doen we door te gokken.

De eerste keer gokken we dat de gehaste string <hash van willek. pasw. 889.999 voor ring n> is. Om ons vermoeden na te gaan, moeten we slechts 1x de reduction toepassen* op de gehaste string: Als onze gok juist was, staat het resultaat van zo'n reductie in de rainbow tabel!

Als onze gok fout was, gokken we dat de gehaste string <hash van willek. pasw. 889.998 voor ring n> is. Om ons vermoeden na te gaan, moeten we slechts 1x de hash en 1x de reduction toepassen** op het resultaat verkregen uit *: Als onze gok juist was, staat het resultaat van zo'n reductie in de rainbow tabel!

Als onze gok fout was, gokken we dat de gehaste string <hash van willek. pasw. 889.997 voor ring n> is. Om ons vermoeden na te gaan, moeten we slechts 1x de hash en 1x de reduction toepassen op het resultaat verkregen uit **: Als onze gok juist was, staat het resultaat van zo'n reductie in de rainbow tabel!

Uiteindelijk vinden we in welke ketting de gehaste string stond. Nu moeten we enkel de ketting reconstrueren om te het paswoord dat bij de gehaste string hoort te weten te komen!

Zie ook de figuurtjes op http://en.wikipedia.org/wiki/Rainbow_table

Install

Legacy Member
dat is goede info van jullie beide.
Er wordt al heel wat meer duidelijk voor me :d
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan