___ ___ _____ ___ ___ / | \ / | | / | \ / ~ \/ | |_/ ~ \ \ Y / ^ /\ Y / \___|_ /\____ | \___|_ / \/ |__| \/ +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ |h|a|c|k|e|r|s| |4| |h|a|c|k|e|r|s| |1|2| +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ http://www.hackers4hackers.org '25-03-2003' Om je aan of af te melden bij de mailinglijst ga je naar www.hackers4hackers.org Artikelen en dergelijke kun je mailen naar artikel@hackers4hackers.org. Vragen kun je mailen naar de desbetreffende auteur of naar post@hackers4hackers.org. - H4H 12 - 00. Info....................................................... (Redactie) 01. Voorwoord.................................................. (Thijs Bosschert) 02. Outerbrains 2k2, En nu verder.............................. (Edward Moll) 03. Perl voor beginners - Deel 3............................... (Bas Bosschert) 04. Reguliere expressies - Deel 2.............................. (Bas Bosschert) 05. Webmail horror............................................. (Thijs Bosschert) 06. telnetd als OS fingerprinting medium....................... (Ilja) 07. IPSec VPN versus SSL VPN................................... (_Razor_) 08. OpenBSD Bridging Firewall.................................. (Laurens) 09. De geboorte van een netwerk:Internet (deel 3).............. (Rath) 10. Nawoord.................................................... (Thijs Bosschert) ------------------------------------------------------- 00. Info ------------------------------------------------------- ---------------------------- Quote ---------------------------- de donald duck komt tenminste elke week ---------------------------- ---------------------------- Disclaimer ---------------------------- Hackers 4 Hackers (H4H) is een onderdeel van stichting outerbrains. H4H of de stichting kunnen niet aansprakelijk gehouden worden voor datgene wat er met de informatie op deze site en andere van onze publicaties gedaan wordt. Wij streven een educatief doel na, bij gebruik van de door ons verstrekte informatie zijn de gevolgen voor eigen rekening. De meningen van auteurs hoeven niet hetzelfde te zijn als die van de redactie! ---------------------------- ---------------------------- Reclame ---------------------------- Op zoek naar een leuke Hbo-opleiding in de multimedia of communicatie branche? Het instituut voor Media en Informatie Management van de Hogeschool van Amsterdam biedt de enige studie in Nederland die je opleidt tot professional in de wereld van media, informatie èn uitgeverij. Je ontwikkelt jezelf tot een professional op het gebied van de productie, marketing, redactie en verkoop van media als boeken, tijdschriften, televisie, radio, website's en cd-rom's. Je leert te bepalen welk medium welke doelgroep het meest aanspreekt. Ook leer je de noodzakelijke informatie toegankelijk te maken binnen een bedrijf. Amsterdam is het centrum van de commerciële dienstverlening en er zijn dus veel uitgeverijen, reclamebureaus, televisie-, internet- en multimediabedrijven gevestigd waarmee het Instituut van Media en Informatie Management contacten heeft. Hierdoor zijn er veel leuke stageplekken beschikbaar. Voor meer informatie: www.mim.hva.nl --------------------------- ---------------------------- Colofon ---------------------------- Hoofdredacteur: Thijs Bosschert Eindredacteur: Bas Bosschert Website: Berry Contact gegevens: Redactie: redactie@hackers4hackers.org Artikelen Submit: artikel@hackers4hackers.org De rest van de H4H medewerkers zijn via de redactie te bereiken. ---------------------------- ------------------------------------------------------- 01. Voorwoord ------------------------------------------------------- Goedendag allemaal, Het was alweer een behoorlijke tijd geleden, maar hij is er dan toch gekomen. De nieuwe H4H. Op outerbrains was de laatste H4H uitgebracht en wel in papieren versie. Deze H4H is ondertussen online in PDF en TXT formaat te lezen. In de tussentijd tussen de laatste H4H en deze H4H heeft de redactie (niet helemaal) stil gezeten. Om H4H een betere toekomst te geven hebben we besloten wat dingen binnen H4H en de website te veranderen. Deze dingen zullen geleidelijk aan te zien zijn op de site en in de H4H's. Hopelijk kan ik in de volgende H4H wat duidelijker zijn over bepaalde veranderingen. We hopen in ieder geval dat jullie deze H4H weer leuk vinden om te lezen, want er is weer behoorlijk wat werk in gaan zitten voor de schrijvers en de redactie. Veel plezier met lezen, Thijs "N|ghtHawk" Bosschert Hoofdredacteur Hackers4Hackers redactie@hackers4hackers.org nighthawk@hackers4hackers.org ------------------------------------------------------- 02. Outerbrains 2k2, En nu verder ------------------------------------------------------- Outerbrains 2k2, En nu verder... Nadat we vorig jaar een groot evenement voor meer dan 300 personen in Etten-Leur hebben georganiseerd hebben we als organisatie behoorlijk bij moeten komen van alle indrukken die we hebben opgedaan... Gelukkig is wel te zeggen dat het evenement absoluut geslaagd is en voor herhaling vatbaar... Uiteraard hebben we het evenement geëvalueerd en conclusies getrokken hoe we onze lessen uit dingen die misgelopen zijn konden trekken. Zo hebben we een aantal tegenslagen gehad, zowel financieel doordat we te weinig bezoekers hadden maar ook technisch omdat de nieuw aangeschafte gigabit backbone nog wat koppeling probleempjes had... Gelukkig is de sponsor hier in tegemoet gekomen en hebben we nu een eigen ROM versie (outerbrains.rom ;) die deze problemen in de toekomst het hoofd moet bieden... Ook het afzeggen van de internet verbinding door een sponsor was een tegenslag, in toekomstige evenementen zal het aanwezig zijn van internet zelfs een voorwaarde worden om het evenement door te laten gaan of niet! Maar nu verder, we gaan dit jaar wederom 1 groot evenement opzetten en mogelijk zelfs nog een 2e groot evenement eind van het jaar... Afhankelijk of het 2e evenement ook plaats zal vinden en beschikbaarheid van de locatie zal de datum bepaald gaan worden... We zitten te denken aan de maanden juni / juli maar het kan ook pas augustus gaan worden... Kortom, we zullen er voor zorgen dat je op de hoogte gehouden blijft! De locaties voor de evenementen zullen ook iets anders er uit gaan zien... De regio waar Outerbrains dit jaar gehouden zal worden zal wat meer in het midden van Nederland liggen... We hebben op het moment contacten met grote sponsors die ons in huisvesting willen voorzien... Ook dit jaar hebben we weer de beschikking over een compleet computer netwerk en stroom voorzieningen tot 250 personen. Uiteraard zoeken we nog altijd mensen die eventueel servers of extra netwerk apparatuur ter beschikking willen stellen, maar ook mensen die willen meewerken aan het opzetten van competities zijn zeker welkom! Samengevat gaan wij ook dit jaar weer garant staan voor een leuk computer evenement met een aanvullende prettige sfeer! Tot zover, Edward Moll Stichting Outerbrains E: info@outerbrains.nl ------------------------------------------------------- 03. Perl voor beginners - Deel 3 ------------------------------------------------------- Perl voor beginners - deel 3 ---------------------------- --[ Inleiding Het moest er maar eens van komen, een derde artikel over perl. In het vorige artikel heb ik beloofd iets te vertellen over reguliere expressies. Aangezien dit best veelzijdig is heb ik hier een aparte serie artikelen aan gewijd. Dus voor dit artikel staat het nog helemaal open waarover ik het ga hebben. Na mijn vorige artikelen terug te hebben gelezen heb ik even een lijstje opgeschreven waar ik het nog allemaal over kan hebben: - subroutines - meer over files en directories - proces managment Deze punten zal ik ook in dit artikel behandelen. Dit is tevens het laatste 'beginners' artikel. Mochten er vragen zijn over bepaalde zaken of behoefte voor een Perl artikel drop even een mailtje op perl[at]hackers4hackers[dot]org. --[ Subroutines Je kan natuurlijk een programma schrijven waarin je alle code netjes onder elkaar zet en dat hij van boven tot beneden loopt. Maar stel nu dat je vaak hetzelfde moet uitvoeren, dan is het een stuk makkelijk als je dat in een functie kwijt kan. In perl gebruik je hiervoor het commando 'sub'. Zie het volgende voorbeeld. sub hoi { print "hallo\n"; } Voor de subname, in dit geval hoi kan je dezelfde naam gebruiken als voor je variabelen, dus $hoi, @hoi en %hoi kan allemaal tegelijk ook bestaan. Niet dat dit aan te raden is, of je moet juist onbegrijpbare code willen schrijven. Waar je je subroutines plaats maakt niet zoveel uit, of je het nu in het begin van je programma wilt plaatsen of juist op het eind is helemaal door jou te bepalen. Binnenin de subroutine kan je gewoon gebruik maken van de variabelen die ergens anders in het programma gedeclareerd zijn. Dus bijvoorbeeld: $fruit = "aardbei"; sub reclame { print "We hebben vandaag in de aanbieding: $fruit\n"; } Een subroutine kan je op verschillende manieren aanspreken en vanuit elke plek in de rest van het programma. Je kan een subroutine aanspreken door sub() of &sub te gebruiken. Zie de volgende voorbeelden: $a = 38 + &reken; reclame(); for($x=start();a$x<=end();$x++){ ... Nu zie je dat er in bovenstaande voorbeelden er wordt verwacht dat de functie een getal teruggeeft. Dit doe je met 'return'. Zie het volgende voorbeeld. sub optellen { return $x+$y; } $x = 8 ; $y=4; $som = optellen(); # $som wordt 12. Je kan behalve een scalar ook een array returnen. sub maak_lijst{ return($x,$y); } $x=8; $y=4; @lijst = maak_lijst(); # @lijst wordt (8,4) Het is ook mogelijk om argumenten mee te geven aan een functie. De argumenten die je meegeeft worden opgeslagen in de variabele @_ voor de duur van de subroutine. Zie het volgende voorbeeld. sub reclame { my $artikel = shift; print "In de aanbieding hebben we: $artikel; } reclame("fruit"); # geeft: In de aanbieding hebben we: fruit $y="wc-papier"; reclame($y); # geeft: In de aanbieding hebben we: wc-papier Je ziet dat we in bovenstaande sub routine de variabele $artikel uit de @_ halen met shift. Met het commando shift haal je de eerste waarde van een array af. Als je geen array opgeeft dan wordt er gebruik gemaakt van @_. De variabele $artikel bestaat alleen binnen de sub. Daarbuiten bestaat hij niet. --[ Globale en lokale variabelen Zoals we in voorgaande voorbeeld zagen, zagen we dat we met behulp van my een variabele lokaal declareerde. Dit wil zeggen dat de variabele alleen "leeft" in de sub zelf. Behalve in de sub kan je ook lokale variabelen declareren in loops, of if en else statements. Als je bestaande variabelen, zoals bijvoorbeeld $/ lokaal wilt gebruiken dien je 'local' te gebruiken. my $bla; # declareert $bla lokaal my $bla=1; # declareert $bla lokaal en geeft waarde 1 aan $bla my ($a, $b); # declareert $a en $b; Om een globale variabele te declareren gebruikt men ook my. Alleen dan in het begin van het programma, zodat de variabele in het hele programma te gebruiken is. Het is altijd verstandig om je variabelen te declareren. Het hoeft niet in perl, maar om te zorgen dat je geen problemen krijgt met je variabelen is het verstandig. Om te zorgen dat je er altijd gebruik van maakt en het ook gecontroleerd wordt kan je in het begin van je programma 'use strict;' tikken. Strict checkt op drie verschillende zaken: - refs (dit is iets wat je als beginner nog niet gebruikt, dus behandel ik nu niet) - vars (dit is de check of je alle variabelen hebt gedeclareerd) - subs (zorgt er voor dat je geen kale woorden als string invoert, vb $a=blaat) Een goede perl programmeur gebruikt altijd strict, voor meer info over een goede perl style coden, zie http://www.perldoc.com/perl5.8.0/pod/perlstyle.html. --[ meer over files en directories Behalve files openen en sluiten kan je nog meer in perl met bestanden en directories. Je kan bijvoorbeeld testen wat voor attributen er op een bestand gezet zijn, directories benaderen en lezen, bestanden en directories verwijderen, hernoemen, linken en het wijzigen van permissies en eigenaar. Allereerst uitleg over hoe we moeten testen: Als je bijvoorbeeld wilt weten of een bestand bestaat gebruik je het volgende: if (-e "bestand"){ print "bestand bestaat"; } Een volledige lijst van alle file tests is te vinden op: http://www.perldoc.com/perl5.8.0/pod/func/-X.html Nu lijkt het als je die lijst ziet alsof je alles kan controleren met behulp van file tests. Dit is helaas niet zo. Om toch alle beschikbare info te kunnen vergaren heeft perl de commando's stat en lstat. De stat functie levert een lijst van 13 elementen op als het bestand bestaat. ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat (file); Dus als je bijvoorbeeld het uid en gid van /etc/passwd wilt weten: ($uid, $gid) = (stat("/etc/passwd"))[4,5]; lstat doet precies hetzelfde als stat met als enige verschil dat het NIET symbolische links volgt. Behalve testen van bestanden en directories kan je directories ook openen en lezen. In perl gebruik je het commando chdir om de current directory te veranderen: chdir ("/tmp") || die "cannot change current directory to /tmp: $!\n"; Als je wilt weten welke bestanden er in een directory staan kan je dat op verschillende manieren doen. Via globbing of via directory handles. Globbing maakt gebruik van de speciale karakters van de shell om bestanden weer te geven. Deze karakters zijn de * en ?. $dir ="/etc"; @files = <$dir/*>; # or @files = glob("$dir/*"); Of als we gebruik maken van directory handles: opendir(ETC, "/etc") || die "Kan dir niet openen: $!\n"; while ($name=readdir(ETC)){ push @files, $name; } closedir(ETC); Bestanden verwijderen doe je met het commando unlink. Gewoon heel simpel: unlink("bestand"); unlink("bestand1", "bestand2"); unlink <*.mp3>; Bestanden hernoemen doe je met het commando rename: rename("aap", "banaan"); Linking doe je zo: link("aap","banaan"); en een softlink: symlink("aap","banaan"); Een directory maak je aan met mkdir en verwijderen doe je met rmdir. mkdir("test", 0777); rmdir("test"); Permissies wijzig je met chmod en de eigenaar verander je met chown. chmod(0666, "aardbei"); chown(0,0, "rootshell"); # geeft uid 0 en gid 0 --[ proces managment Ok, beetje overdreven titel, maar goed. In perl kan je ook andere programma's aanroepen. Dit kan op drie verschillende manieren. Via system, exec en backquotes. Het system commando erft al zijn eigenschappen van het perl programma zelf. Als je het system commando aanroept gebruikt hij dezelfde stdin, stdout en stderr. Het system commando gebruik je zo: system("ls -l"); system("whoami"); Als het system commando goed uitgevoerd wordt returned het een 0. En als het fout gaat een 1. Exec daarentegen doet dat niet. Die voert het commando gewoon uit en returned een 0. Exec roep je als volgt aan: exec '/bin/echo', 'Hallo Wereld'; exec "cat /etc/passwd | grep root"; Als je de waarde die uit het commando komt wilt opslaan in een variabele dan kan je gebruik maken van backquotes. Het aanroepen doe je met: $ip=`dig +short domein.com`; $name=`whoami`; --[ Conclusie Na het lezen van de drie perl artikelen heb je een goede basis liggen om met perl aan de slag te gaan. Mocht je nog vragen hebben of een behoefte aan een perl artikel, ik ben altijd bereid om mijn kennis te delen. Stuur gewoon een mailtje naar perl[at]hackers4hackers[dot]org en je ontvangt antwoord terug. Althans als je niet verdwijnt in mijn spamfilter, want die is soms erg enthousiast. Mocht je willen oefenen met perl en je hebt geen idee wat je zal programmeren, op http://acm.uva.es/problemset/ staan veel programmeer oefeningen. Ze zijn niet alleen leuk om te programmeren, maar ook erg leerzaam. Voor de rest zal ik in de toekomst een serie artikelen wijden aan Perl/tk, (want je kan ook grafisch programmeren met perl) en mijn serie over reguliere expressies afschrijven. ------------------------------------------------------- 04. Reguliere expressies - Deel 2 ------------------------------------------------------- --[ Reguliere expressies - the horror continues >>> Inleiding In het vorige artikel is de basis gelegd wat betreft reguliere expressies, maar er is meer. Ook dit keer gaan we gebruik maken van egrep. In dit artikel zal de nadruk liggen op het efficient gebruik maken van reguliere expressies. Hierbij letten we op twee dingen: - Reguliere expressies zijn afhankelijk van de data; - Reguliere expressies zijn hebberig. Het vorige artikel eindigde ik met een aantal opgaven. Deze opgaven zullen de leidraad vormen van dit artikel. Om jullie geheugen nog even op te frissen, hier nogmaals de opgaven: 1. Schrijf een regexp om uit een lijst met data ip-adressen te pakken. 2. Schrijf een regexp om uit een lijst met data alle datums uit januari te pakken. Januari word aangegeven als 'Jan' 3. Schrijf een regexp om drievoudige woorden weer te geven, zoals 'dat dat dat'. 4. Schrijf een regexp die zoekt naar regels die beginnen met Subject:, de rest van de regel moet in \1 komen. >>> Matchen van een IP-adres Als je de opgave leest is de eerste logische vraag wat je je zelf stelt: "Uit wat voor data moet ik het IP-adres zien te krijgen". Dit is ook het eerste waarbij je stil moet staan bij het in elkaar knutselen van een reguliere expressie, want soms kan het veel makkelijker. Stel je hebt een lijst met tekst waar de enige getallen die er in voorkomen een ip-adres is. In dit geval voldoet: $ egrep '[0-9]+' tekstfile Maar wil je nu bijvoorbeeld je eigen IP-adres weten door middel van ifconfig, dan krijg je een hoop data die je niet wilt hebben. Hier geven we aan dat een IP-adres bestaat uit een cijfer-punt-cijfer-punt-cijfer-punt-cijfer. En cijfer kan dan 1 of meerdere cijfers zijn: # ifconfig | egrep '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' Of korter: # ifconfig | egrep '[0-9]+(\.[0-9]+){3}' Voor de data die ifconfig geeft voldoet bovenstaande reguliere expressie, maar als je niet weet wat de ingevoerde data is, bijvoorbeeld iemand die een IP-adres invoert via een webformulier. In dat geval brengt bovenstaande reguliere expressie je al een heel eind, maar getallen zoals 88888.1.512.23 en 300.11.506.18 kunnen ook ingevoerd worden en zullen dan als geldig IP-adres gezien worden. Dus we moeten daar iets op verzinnen. Om het makkelijk te houden gaan we ervan uit dat een getal uit een IP-adres tussen de 0 en 255 ligt. Een beetje puzzelen brengt ons het volgende: # egrep '[012]?[0-9]{1,2}(\.[012]?[0-9]{1,2}){3}' /etc/network/interfaces Nu gebruik je natuurlijk egrep niet (vaak) voor het checken van een webinterface invoer, dus in dit geval pak ik een bestaand bestand met IP-adressen erin. Natuurlijk zie je niet in een oogopslag wat bovenstaande reguliere expressie doet, dus we zullen hem ontleden: [012]?[0-9]{1,2} - een 0, 1 of 2, die 0 of 1 keer voorkomt - gevolgd door 1 of 2 getallen (0 tot 9) (\.[012]?[0-9]{1,2}){3} - driemaal: - een punt - gevolgd door een 0, 1 of 2, die 0 of 1 keer voorkomt - gevolgd door 1 of 2 getallen (0 tot 9) Zo. Nu zijn we er. Of toch nog niet? Nee, want de gebruiker kan nog steeds 5211.11.1.10, 11.1.12.3333 of 257.11.1.10 invoeren. We zijn nog twee dingen vergeten mee te nemen. Allereerst geven we niet aan waar de reguliere expressie moet beginnen of eindigen, waardoor er getallen voor of na kunnen staan. DIt is simpel op te lossen door gebruik te maken van ^,$ of \< en \>. Dit is weer afhankelijk van de data. ^ en $ gebruik je als het ip-adres op een aparte regel staat en \< en \> gebruik je als het ip-adres midden in de tekst staat. In dit geval maak ik gebruik van \< en \>. # egrep '\<[012]?[0-9]{1,2}(\.[012]?[0-9]{1,2}){3}\>' /etc/network/interfaces Het tweede probleem waar we nog mee zitten is dat getallen zoals 256 of 299 ook geldig zijn, maar dit zijn geen geldige ip-adressen. Hiervoor breken we het getal 255 in kleine stukjes: - 000 - 199 [01]?[0-9]{1,2} - 200 - 249 2[0-4][0-9] - 250 - 255 25[0-5] En dit allemaal bij elkaar toegevoegd krijgen we het volgende: # egrep '\<([01]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])(\.([01]?[0-9]{1,2}|2[0-4][0-9] |25[0-5])){3}\>' \/etc/network/interfaces Voor de mensen die vinden dat 001.053.211.011 geen geldig ip-adres is, maar 1.53.211.11 wel: # egrep '\<([0-9]|[1-9][0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9] [0-9]|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])){3}\>' \/etc/network/interfaces Nu kan je dit natuurlijk zover mogelijk doortrekken als je zelf wil. Want 127.*.*.* en 192.168.*.* zijn bijvoorbeeld geen geldige IP-adressen. Maar voorlopig houden we het op bovenstaande reguliere expressie. >>> Matchen van een datum Ook een leuke reguliere expressie is het matchen van datums. Want ook hier zit je met het probleem dat bijvoorbeeld 31 wel geldig is, maar 32 weer niet. De opgave was in principe niet zo moeilijk, want je had een lijst met datums waar je alle datums uit januari aan moest geven. En januari zou geschreven worden als Jan. # egrep 'Jan' lijst_met_data Dat is in principe alles. Maar nu we toch bezig zijn met datums, er is vast wel wat leukers mee te doen. Zoals ik al zei zit je met datums ook met het probleem dat bepaalde datums dus niet kunnen. 32 januari heeft nog nooit iemand meegemaakt. Ook hier zal je dus de 31 weer moeten opdelen: 1-9 [1-9] 10-29 [12][0-9] 30-31 3[01] Totaal wordt het dus '([1-9]|[12[0-9]|3[01])', maar we kunnen het geheel ook anders opdelen. Teken hiervoor onderstaande tekening, altijd makkelijk om het eerst uit te tekenen bij complexere reguliere expressies. 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 26 27 28 29 30 31 Hier, zoals we het momenteel onderverdeeld hebben, dus '([1-9]|[12[0-9]|3[01])': ------------A------------- |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 26 27 28 29| ---------------B--------------- |30 31| ---C--- De vakken A, B en C komen overeen met de verschillende delen van de reguliere expressie: - vak A [1-9] - vak B [12][0-9] - vak C 3[01] Maar we kunnen het ook in andere vakken verdelen: ---------------------------- ___| 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 26 27 28 29| | |-----------A--------------- |30|31| -B---C- Per vak maak je dan een aparte regexp en die voeg je samen: - vak A [12]?[1-9] - vak B [123]0 - vak C 31 en dit levert ons totaal op: '([12]?[1-9]|[123]0|31)'. En als laatst heb je nog de volgende mogelijkheid: ---------------------------- _B_| 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 26 27 28 29| |--------------A--------------- |30 31| -----C- - vak A [12]?[1-9] - vak B [12]0 - vak C 3[01] en dit levert ons totaal op: '([12]?[1-9]|[12]0|3[01])'. Zo zie je dus dat je een reguliere expressie op verschillende manieren kan schrijven terwijl het toch hetzelfde zoekt. Om nu data uit januari te matchen en te kijken of het goede data zijn: # egrep 'Jan ([12]?[1-9]|[12]0|3[01])' mbox En voila al de data uit januari wanneer ik mail heb gehad. >>> Drievoudige woorden weergeven De volgende vraag was om drievoudige woorden te checken. Dit is op zich niet zo moeilijk lijkt het in de eerste plaats. Want hoe checken we een woord en kunnen we er later op terugkijken. Nou, een woord kan je bijvoorbeeld checken door: $ egrep '\<.+\>' bestand Althans dat lijkt logisch, maar wat gebeurt er nu in bovenstaand voorbeeld? De reguliere expressie engine is hebberig en pakt zoveel mogelijk tekst als hij kan. Stel dat we een regel 'Het konijn' hebben, om het duidelijk te maken bouwen we het om naar '^\ \$'. De machine gaat als volgt: ^ - begin van een regel, zijn we niet naar op zoek, dus we zoeken verder \< - begin van een woord, kijken of deze wordt gevolgd door een karakter H - een karakter, maar we willen er meer e - nog een karakter t - nog een \> - hej, einde van een woord.. doe ik niks mee, ik wil meer karakters - spatie, ook een karakter \< - nog een begin van een regel.. wat leuk... k - jammie, meer karakters o - nog meer karakters n - en nog meer i - en.. j - nog n - meer... \> - hej, einde van een woord, maar ik wil meer karakters, ik negeer deze even. $ - bah, regel is op... we gaan er eentje terug en gebruiken de laatste \> om de regexp te matchen Dus ook al denk je dat je eigenlijk 1 woord matched, je matched dus meerdere woorden. Dus we moeten iets anders verzinnen om 1 woord te matchen. Wat voor eigenschappen heeft een woord: - het bestaat uit letters - er zit geen spatie in Je kan dus bijvoorbeeld een woord matchen door '\<[A-Za-z]+\>' of \<[^ ]\>' te gebruiken. Maar nu willen we drie woorden hebben, dus maken we gebruik van back references. $ egrep '(\<[A-Za-z]+\>)\1\1' bestand Hej, dit werkt niet. Dat klopt, want geen enkel woord zal direct achter een ander woord staan, dus we plaatsen er spaties tussen. En om zeker van onze zaak te zijn willen we 1 of meerdere spaties. $ egrep '(\<[^ ]+\>) +\1 +\1' bestand En zo matchen we dus drie woorden. Althans we krijgen inderdaad drie woorden als we dit uitvoeren, maar ook zinnen zoals 'hoed hoed hoeden' pakt hij en het derde woord is toch net even anders. om dit weg te werken voegen we er nog een voorkant en achterkant aan de woorden toe. $ egrep '(\<[^ ]+\>) +\<\1\> +\<\1\>' bestand >>> Gebruik maken van de hebberigheid We kunnen natuurlijk ook gebruik maken van de hebberigheid van reguliere expressies engines. Bijvoorbeeld in de laatste opgave. We moesten een regexp bouwen die zocht naar alle regels die beginnen met een Subject en de rest moest in \1 komen. Dus een plus een is twee en levert ons het volgende op: $ egrep '^Subject:(.*)' mbox Nu, doen we op zich niks meer met \1, maar in perl zou je deze waarde kunnen gebruiken in de rest van je script. Nu geloven jullie me vast niet als ik zeg dat (.*) de rest van de regel bevat. Ok, dan show ik het met behulp van sed. $ egrep '^Subject:(.*)' mbox | sed -e 's/^Subject:\(.*\)/\1/' Hier pakken we eerst de regel met egrep en vervolgens sturen we de regel door naar sed. Je ziet dat om een reference te gebruiken in sed je gebruik moet maken van \( en \). In sed veranderen we de regel in datgene wat we in \1 stoppen. En dit levert inderdaad het onderwerp van de regel op. Zo zie je dat de hebberigheid aan de ene kant makkelijk is, maar aan de andere kant meestal lastig. Probeer daarom het ook zo makkelijk mogelijk te maken voor de reguliere expressie engine en gebruik zo min mogelijk '.*'. In plaats daarvan kan je vaak beter gebruik maken van een karakter class waarin je aangeeft wat je niet zoekt. Voorbeelden: - Ook een manier om IP-adressen te pakken te krijgen $ egrep '^[^.]\.[^.]\.[^.]\.[^.]$' bestand - Of om html te pakken te krijgen $ egrep '<[^>]>' bestand - Zoeken naar uid's of gid's 500-599 in de passwd file $ egrep ':5[0-9][0-9]:' /etc/passwd >>> Conclusie Reguliere expressies zijn afhankelijk van de invoer van en wat je er uiteindelijk uit wilt hebben. Als de data onbekend is probeer dan de grenzen van je reguliere expressie zo strak mogelijk te houden, zoals we hebben gedaan bij het matchen van een IP-adres. Tevens hebben we geleerd dat reguliere expressies hebberig zijn, ze willen zoveel mogelijk data hebben als mogelijk. Ook hiervoor zul je moeten proberen je grenzen zo strak mogelijk te houden. Mocht je nu denken dat je alles van reguliere expressies weet, nou mooi niet. In een volgend artikel zal ik wat dieper ingaan op de verschillende engines en vertellen hoe je je reguliere expressie sneller en nog meer efficient kunt krijgen. ------------------------------------------------------- 05. Webmail horror ------------------------------------------------------- Inleiding Naar aanleiding van mijn advisory over XSS/Cookie[1] problemen bij enkele grote websites schrijf ik nu dit artikel. Mijn advisory over de XSS/Cookie bugs bij Lycos[2] kwam uit op 4 November 2002 en mijn advisory van XSS/Cookie bugs bij Hotmail, Yahoo en Excite[3] kwam uit op 13 November 2002. Wanneer dit artikel in H4H gepubliceerd wordt zitten we al dik 4 maanden verder. De reden waarom ik dit artikel schrijf is onder andere omdat mijn vorige twee advisories door te weinig mensen werden begrepen, en omdat de sites er zelf ook weinig aan deden. Dit artikel zal duidelijker beschrijven hoe de bugs in elkaar zitten, hoe ze werken en waar de fouten eigenlijk echt zitten. Er zal een groot deel gebruikt worden wat in de advisories stond, maar dit keer met toevoegingen en dus een stuk uitgebreider. Ik hoop dat ik met dit artikel mensen een duidelijk voorbeeld kan geven wat het gevaar kan zijn van XSS. Voor de mensen die zich afvragen wat XSS precies is raad ik aan de link van de XSS-FAQ[1] eerst te lezen alvorens aan dit artikel te beginnen. Introductie webmail paswoorden en XSS Er zijn heel wat verschillende websites die een webmail dienst verlenen. De grootste en bekendste daarvan is natuurlijk Hotmail[4]. Op internet zijn heel wat vragen over hoe je nou hotmail moet hacken, tot grote ergenis van heel wat mensen die zich een stuk serieuzer met security bezighouden. Toch ga ik hier onder andere over het kraken van Hotmail schrijven, tenminste als je dat zo op wilt vatten. Na Hotmail zijn er nog een aantal andere grote sites zoals Yahoo[5], Lycos[6] en Excite[7] die deze dienst verlenen. Dit artikel zal vooral over deze vier webmail diensten gaan, daarnaast zullen er ook enkele andere genoemd worden. Al deze webmail diensten maken natuurlijk gebruik van paswoorden om de accounts van mensen te beschermen. Maar om niet de hele tijd bij elke pagina je paswoord in te hoeven vullen maken ze natuurlijk gebruik van cookies[8]. Iets wat kan betekenen dat als je iemand zijn cookie hebt, je je ook als diegene voor kan doen, en dus kan inloggen op zijn/haar account. Om iemand zijn cookie te pakken te krijgen kan je gebruik maken van een fout in de server of in de gebruiker zijn software. In dit artikel gaan we gebruik maken van de XSS fouten in een server. Fouten in de Websites Doordat de websites die webmail hebben meestal groot zijn en meerdere services bevatten, maken de verschillende services vaak gebruik van hetzelfde cookie. De cookies staan dan op (als voorbeeld yahoo) 'yahoo.com' en niet op '.yahoo.com' (vb. 'mail.yahoo.com'). Op deze manier kunnen alle sites die een vhost op '*.yahoo.com' hebben bij dezelfde cookie. Dat lijkt natuurlijk erg handig, maar het heeft een keerzijde. Bij het zoeken van een XSS bug hoeven we ons dus niet te beperken tot het 'mail.yahoo.com' domein, alles wat we kunnen vinden op een server van 'yahoo.com' kunnen we gebruiken. Alles kan immers bij de cookie om hem uit te lezen. Bij erg grote sites is dit een erg groot nadeel, want hoe groter de site; hoe meer verschillende pagina's of sub-sites er zijn, en ook vooral, des te meer verschillende mensen eraan werken. Aan de hand van voorbeelden zal ik enkele XSS bugs laten zien bij de verschillende webmail sites. XSS In Hotmail De XSS in hotmail die ik gebruikt heb in de advisory hierover was op 'www.accesshollywood.msn.com', hotmail heeft deze een paar weken na het uitbrengen van mijn advisory dicht gemaakt. Hier zijn ze overigens uniek in, want alle andere sites hebben de XSS gaten gewoon laten zitten, blijkbaar vonden ze het weinig van belang. Zoals het voorbeeld zal laten zien maakt hotmail gebruik van '*.msn.com' hosts, dus geen '*.hotmail.com'. De XSS-bug in 'www.accesshollywood.msn.com' was in hun 'article.asp' script. Dit script maakte gebruik van verborgen (hidden) velden in de html-source om het bericht te kunnen doormailen, deze velden konden worden ingegeven via de url. Vervolgens werden deze niet gefilterd, waardoor we dus zonder moeite een javascript injectie konden doen. De url waar gebruik van werd gemaakt was: http://www.accesshollywood.msn.com/news/article.asp?art=> Om deze url wat duidelijker te maken zal ik deze uitleggen zeer simpel in gedeeltes uitleggen: "http://www.accesshollywood.msn.com/" - De site waar de XSS zich bevindt. "news/article.asp" - De path naar en het script zelf. "?art=" - De query naar het script en de variable die we gebruiken voor onze XSS. ">" We sluiten het script weer af. Het script op de server, rompigema.pl[9], was het script dat gebruikt werd om vervolgens misbruik van de cookie te maken. Hier zal later in dit artikel meer over volgen. Maar zoals gezegd werkte deze XSS in hotmail niet langer, het is echter een kleine moeite om een nieuwe XSS mogelijkheid te vinden bij de MSN servers. Voor de eerste kunnen we zelfs gewoon blijven bij 'www.accesshollywood.msn.com' netzoals de vorige was. De volgende XSS werkt op het moment van schrijven van dit artikel: http://www.accesshollywood.msn.com/emailtoafriend.asp?head=';