SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
‐ 1 -
Inhoud

 Pagina      Inhoud
 1           Kaft
 2           Inhoud
 3           Werkplan
 5           Inleiding hacking
 8           I am a JavaScript. Abuse me.
 9           It's simple if you see it.
 10          Don't look at me like this.
 12          Sir, could you pop me?
 13          Now, what is that really?
 14          What you mean it’s not THAT easy?
 16          Jedi mindtricks.
 17          Security through obscuration!
 18          Ok, finally it's secure. Or?
 19          Please don't let me forget it.
 20          Amazing Code
 23          Society matters
 24          The password is regular!
 26          Extra informatie
 28          Server installatie
 30          Logboek & resultaten
 31          Kaft


Attentie
De antwoorden van de challenges zijn vertrouwelijk. Ze mogen niet rechtstreeks worden
overgenomen.




                                              -2-
Werkplan
Het onderwerp van deze opdracht is Hacken. Als extra proberen we (ondergetekende en Idzard
Stoker) ook nog een server in te richten. Hacken doe ik op de site www.hackquest.de. Hierop staat
een aantal opdrachten (challenges). Je moet door te hacken een wachtwoord weten te bemachtigen.
Omdat er te veel verschillende soorten hacks op de site staan, specialiseer ik me op het hacken van
JavaScripts. Van elke opdracht maak ik een kort verslagje.

Eerst zetten we een besturingssysteem op de server en vervolgens maken we hem bereikbaar. Over
het opzetten van de server wordt naderhand ook een verslag gemaakt.


Leerdoelen
Ik weet door ervaring dat je veel meer kunt leren als je iets uit elkaar haalt, dan wanneer je alleen
naar de buitenkant kijkt. Zo heb ik vroeger bijna elk apparaat bij mij in huis wel een keer open
gemaakt en weet ik nu ook hoe bijna elk apparaat, in grote lijnen, werkt. Dit werkt hetzelfde als met
hacken. Omdat je dieper dan de interface moet kijken om ergens binnen te komen, moet je de
applicatie ook “openmaken”. Ik verwacht dan ook dat ik een hoop leer, maar wel over uiteenlopende
onderwerpen.

Over het inrichten van een server heb ik een wat objectiever doel. Ik heb het nog nooit gedaan en
ben wel benieuwt hoe het moet. Het uiteindelijke doel is gewoon de server aan de praat te krijgen en
bereikbaar te maken. Ik verwacht ook wel dat dit gaat lukken.




                                                -3-
-4-
Inleiding hacking
Een persoon die hackt is een hacker. Tegenwoordig heeft het woord hacker twee betekenissen.

Traditioneel is een hacker iemand die er van houdt om met software en andere elektronische
systemen te “prutsen”. Hackers houden ervan te ontdekken hoe computersystemen te werk gaan.
Door ze uit elkaar te halen proberen ze vaak nieuwe toepassingen te bedenken (letterlijk is een hack
het vinden van toepassingen, die niet door de maker van het middel bedoeld zijn). Er zijn ook hackers
die onder toezicht van de eigenaar in systemen proberen in te breken (penetration testing). Dit doen
ze om te kijken of er geen beveiligingsfouten zijn. Dit type hacker noemt men de ethische hacker.

Tegenwoordig heb je ook kwaadwillige hackers. Ze staan erom bekend in systemen in te breken. Ook
schrijven ze virussen en leggen ze met opzet systemen plat. Technisch gezien zijn dit geen hackers,
maar crackers (criminal hackers). Ze hacken voor persoonlijke baat, zonder echt naar de
consequenties te kijken. Vaak doen ze dit voor het geld dat ze ermee verdienen, maar het kan ook
om wraak draaien of soms doen ze het slechts voor de faam (zoals het ILOVEYOUR-virus uit 2000).
Een ander bekend voorbeeld van deze kwaadwillige acties is het verspreiden van spam (ongewenste
emails). Het verwijderen van spam kost de Amerikaanse economie meer dan 22 miljard dollar op
jaarbasis, dit terwijl het voor dat kleine groepje spammers maar net winstgevend is. De meeste
vormen van cracken zijn in Europa en de VS illegaal, toch zijn de crackers vaak slim genoeg om uit
handen van de politie te blijven. Tegenwoordig komen de meeste virussen en spam uit Afrika en
Rusland, dit vanwege de mildere wetgeving.

Omdat volgens woordenboeken elke hacker bij voorbaat een cracker is (Van Dale: hacker, iemand die
inbreekt in computers), hebben de hackers nieuwe benamingen bedacht. De crackers, degenen die
uit criminele oogmerk een systeem "kraken", worden ook wel black-hat hackers genoemd. De
traditionele hackers noemen zich white-hat hackers, analoog aan cowboyfilms waarin de "kwaden"
zwarte hoeden droegen en de "goeden" witte hoeden. Ook zijn er grey-hat hackers, een kruising
tussen crackers en hackers. Het komt voor dat crackers proberen hun activiteiten te verhullen door
zich als hacker voor te doen. Daarbuiten heb je ook nog crackbies, een combinatie van cracker en
newbie, die ook wel sk's (scriptkiddies) of n00bs (newbies) worden genoemd. Scriptkiddies zijn
crackers die er eigenlijk geen verstand van hebben. Ze hebben wat programma’s (scripts) en
daarmee cracken ze andere systemen. Het grote verschil is dat ze niet zo nieuwsgierig zijn als de
hackers en crackers. Newbies staan daar nog onder. Het zijn mensen die op fora vragen of iemand
“die en die wel even wil hacken”. Sommige beweren juist dat ze hele goede hackers zijn, dit terwijl ze
het verschil tussen Windows en Linux nog niet eens weten.




                                                 -5-
Geschiedenis
De geschiedenis en de term “hacken” is ontstaan op het Amerikaanse instituut MIT (Massachusetts
Institute of Technology). De eerste hackers waren scholieren uit een treinvereniging. Elke nieuwe
verbinding of verbetering in de treincircuits werd een hack genoemd. Toen de eerste computers
verschenen op het MIT waren zij een van de eerste personen die hiermee onofficieel studeerden.
Destijds werden computers bediend via gigantische stapels ponskaarten. Deze moesten met een
aparte machine (ponsmachine) gemaakt worden. Toen ze elkaars werk gingen verbeteren, door
bijvoorbeeld routines te schrijven die minder (pons)kaarten in beslag namen, is de term "hack" ook
overgenomen in het programmeren.

Omdat computers aanvankelijk nogal beperkt waren qua geheugen, gebeurde het dat programmeurs
stukken code moesten schrappen om een programma kleiner te maken. Volgens ingewijden werd dit
ook wel hacken genoemd, net als andere snelle, makkelijke of in ieder geval onverwachte
oplossingen voor computerproblemen. Hacker zou in deze eerste context zijn afgeleid van het Duitse
Hacker, als in “iemand die meubels maakt met een bijl”.

Op een dergelijke manier kan een hack slaan op een truc op een heel ander gebied. In de wiskunde
kan het slaan op een slimme oplossing voor een wiskundig probleem. De GNU Public License
(www.gnu.org) wordt door sommigen gezien als een hack, omdat het slim gebruik maakt van de wet
op de auteursrechten op een manier die de makers van die wetten niet konden voorzien. Ook het
gebruik in deze context heeft zich buiten MIT verspreid.

Denk aan elektronica hobbyisten die eenvoudige aanpassingen doen aan grafische calculators,
spelcomputers, elektronische instrumenten en dergelijke om ze aan te passen of uit te breiden met
(voor eindgebruikers) onbedoelde of verborgen functies. Een aantal techno muzikanten paste in de
jaren ‘80 hun Casio SK-1 keyboard aan door de bedrading van de gebruikte chips te veranderen om er
vreemde digitale klanken mee te kunnen maken. Die werden onderdeel van de typische techno
muziekstijl.

Bedrijven reageren zeer verschillend op dergelijke praktijken. Texas Instruments accepteert het
openlijk wat betreft zijn grafische calculators en Lego vindt het geen probleem wat betreft hun LEGO
Mindstorms technische speelgoed, maar Microsoft probeert het hacken van hun Xbox juist te
blokkeren met DRM software in Blu-ray Disc spelers, ontworpen om aangepaste spelers te
saboteren.




                           The Gilder, het onofficiële logo van de hackers




                                                -6-
Bij het hacken werk ik met Firefox 3.0.8 (behalve wanneer dit anders staat aangegeven). Sommige
toepassingen kunnen niet door Internet Explorer worden uitgevoerd, daarom raad ik je aan ook
Firefox te downloaden op http://www.mozilla-europe.org/nl/firefox/. Voor de rest gebruik ik
Polycrypt (http://www.net-force.nl/files/download/polycrypt.zip) en Notepad++ (http://notepad-
plus.sourceforge.net/nl/site.htm).


                                               -7-
Javascript 43. I’m a JavaScript. Abuse me.
We openen de pagina en zien een heel simpele login-pagina: alleen een wachtwoord is nodig.
Vervolgens klikken we rechts op Alleen dit deelvenster tonen. Hiervan openen we de bron. In de
eerste instantie zien we niets dat op een script lijkt; alleen het form. Maar als je naar de horizontale
scrollbar kijkt, zie je dat die wel iets langer is dan de paar zinnen die je ziet. Scroll flink naar rechts en
je ziet die script:

<script type="text/javascript" language="Javascript">
function PassConfirm() {
var x=document.LayoutBereich1FORM.Eingabefeld1.value;
if (x=="thisisnotthepassword") {
window.open("veryok.php","_self");
} else {
alert("Dooh, try again!")
}
}
</script>

Omdat dit de eerste quest is, verwacht ik niet veel en dat klopt ook. Er staat maar één ding in dat ook
maar op een wachtwoord lijkt: thisisnotthepassword. We vullen het in en blijkt het ook te zijn ook.




                                                     -8-
Javascript 44. It’s simple if you see.
Op het eerste gezicht zie we een simpel login scherm: een user-form, een pass-form en een submit-
knop. We moeten dus een gebruiker en wachtwoord vinden. Laten we beginnen. Eerst klikken we
rechts op Alleen dit deelvenster tonen. We krijgen nou alleen het inlogscherm te zien. Hiervan
bekijken we de bron. En hier halen we alleen de scripts uit:

<script type="text/javascript" language="javascript">
function noRightClick()
{
         if (event.button==2) {
         alert('You know the drill. But this time its different.')
         }
}
document.onmousedown=noRightClick
</script>

Dit script zou ervoor moeten zorgen dat mijn rechtermuisknop niet werkt. Merkwaardig, want ik had
hier geen probleem mee (werkt waarschijnlijk alleen bij Internet Explorer).

<script type="text/javascript" language="JavaScript">
<!----- Script CopyRight © 1996 - 1997 S.Chris Brown (Spikeman)
function Spikeman_password(form) {
if (form.Name.value=="BGates") {
if (form.Password.value=="moneymoneymoney") {
window.open ("dope.php","_self")
} else {
alert("Sorry " +form.Name.value+ ", wrong password.")
}
} else {
alert("Invalid Name")
}
}
</script>

Dit is het login-script. Geschreven in 1996; hadden ze toen al computers?! Hoe dan ook, ze waren
toen niet zo slim: de gebruiker en zijn wachtwoord staan duidelijk zichtbaar in het script.
Waarschijnlijk zie je het al: de gebruiker is BGates en het wachtwoord is moneymoneymoney. Even
invullen en klaar!




                                                     -9-
Javascript 45. Don't look at me like this.
Wederom een simpel login scherm: een user-form, een pass-form en een submit-knop. Wanneer je
rechts klikt en op Alleen dit deelvenster tonen klikt, krijg je een melding dat dit niet kan. Echter, het is
wel mogelijk om rechts te klikken en vervolgens op Deelvensterbron. Je krijgt dan een stuk broncode
te zien. Hieronder is alleen het belangrijkste te zien: de scripts.

<script type="text/javascript">
if (parent.location.href == self.location.href)
{
         window.location.href = 'framesonly.php'
}
</script>

Dit script zorgt ervoor dat ik het frame niet apart kon openen. Geluk valt de broncode bekijken daar
niet onder.

<script type="text/javascript" language="JavaScript">
<!--Hide
function ValidateEntry (){var y=document.e.u.value;var z=document.e.p.value;var x=0;if
(y=='User'){alert('Please complete this form');var x=1;}
if (z=='Password'){alert('Please complete this form');var x=1;};if (x==1){alert('Entry was not
successful');var xxx=0;}else{AreYouWho(y,z);}}
function LogIn (){document.e.u.value='Anonymous';document.e.p.value='Entry';};function
AreYouWho(z,y){var x=0;if (z=='Password'){var x=1;}
if (y=='User'){var q=x+1;};if (q==2){window.open("simple.php","_self");}else{alert('Incorrect Log-In,
Password or User Name invalid');var q=0;var x=0;}}
// Unhide-->
</script>

Bingo! Dit is het login-script. Vervolgens gaan we het wat leesbaarder neerzetten. We zetten wat
enters achter de puntkomma’s en nog wat extra enters op sommige andere plekken.




                                                   - 10 -
<script type="text/javascript" language="JavaScript">
<!--Hide
function ValidateEntry ()
{
var y=document.e.u.value;
var z=document.e.p.value;
var x=0;

if (y=='User'){
alert('Please complete this form');
var x=1;}

if (z=='Password'){
alert('Please complete this form');
var x=1;};

if (x==1){alert('Entry was not successful');
var xxx=0;}
else{AreYouWho(y,z);}
}


function LogIn ()
{
document.e.u.value='Anonymous';
document.e.p.value='Entry';
};

function AreYouWho(z,y)
{
var x=0;
if (z=='Password')
{var x=1;}
if (y=='User')
{var q=x+1;};

if (q==2)
{window.open("simple.php","_self");}
else{alert('Incorrect Log-In, Password or User Name invalid');
var q=0;var x=0;}}
// Unhide-->
</script>

Het script maakt drie waardes aan: wachtwoord (Z, haalt hij uit document.e.p.value), gebruiker (Y,
haalt hij uit document.e.u.value) en de X waarde (die is nul). Je kunt natuurlijk gaan puzzelen wat er
nou exact gebeurt, maar als je goed kijkt zie je dat hij in het laatste blokje een alert geeft als er foute
gegevens worden ingevuld. Dit doet hij bij else, dus bij if moet hij de goede gegevens krijgen. Het
enige wat hij daarna doet is naar de pagina simple.php gaan. We vullen dit dus in achter de
bestaande URL, je krijgt dan dit: http://hackquest.de/modules/HackQuest/hacking/185/simple.php.
En we zijn binnen!



                                                   - 11 -
Javascript 46. Sir could you pop me?
Eindelijk een wat moeilijkere challenge. Als we beginnen, krijgen we eerst een aantal popups die om
een gebruikersnaam en wachtwoord vragen. Dit weten we natuurlijk nog niet en als we doorklikken
gaat de pagina vanzelf weg. Hier kunnen we geen broncodes uit halen of je moet in die 0,2 seconde
vier keer klikken. Een probleem dus. Gelukkig is er (bijna) altijd wel een oplossing. We weten dat het
een JavaScript is wat die irritante popups veroorzaakt. Als we dat nou eens uitzetten. In Firefox is dat
bij instellingen zo gedaan (Extra -> Opties -> Inhoud -> Java en JavaScript uitvinken). Dan proberen
we het nog eens. De popups zijn weg en we zien alleen de tekst die we net ook al zagen, alleen
duurde hij toen slechts 0,2 seconde en blijft hij nou staan. Hiervan bekijken we de broncode door
rechts te klikken en dan op Deelvensterbron. Hier is gebruik gemaakt van een programma genaamd
HTML Source Code Hide V2.03. Het lijkt erop dat die programma zoveel witte regels in de broncode
zet, dat de browser het niet meer aankan. Jammer genoeg blijkt deze geniepige manier nog te
werken ook, zelfs als Firefox de hoogste processorprioriteit krijgt lijkt hij nog vast te lopen. We
moeten dus een andere manier vinden. We hebben een programma nodig dat stabiel genoeg is om
de bron te bekijken. Ik denk dat de DOM Inspector wel werkt. Dit is gratis te verkrijgen als Firefox
Add-on. Je moet wel eerst Firefox hebben (maar dat hoor je eigenlijk allang te hebben), vervolgens
download je DOM Inspector hier: https://addons.mozilla.org/nl/firefox/addon/6622 . Wanneer we
het deelvenster apart openen en daarin de DOM Inspector draaien kunnen we de broncode zonder
hapering bekijken. Vervolgens gaan we naar HTML -> BODY -> CENTER -> SCRIPT -> en een paar keer
naar beneden. Dit is de broncode:

var message1 = "Enter username";
var un = prompt (message1,"");
var password = "Reeves" ;
var message = "Enter password";
var incmess = "Incorrect username or password! Access denied!";
var minimizemsg = "The window will now minimize to prevent you peeking!"
var pw = prompt (message,"");

if (un == username) {
if (pw != password) {
alert (incmess);
window.open("../../../../modules.php?op=modload&name=HackQuest&file=challenges","_top")
} else {

window.open("film.php","_self")
}
}
if (un != username) {
alert (incmess);
window.open("../../../../modules.php?op=modload&name=HackQuest&file=challenges","_top")
}

Dat hele gedoe met die HTML Source Code Hide heeft me moe gemaakt; ik heb geen zin om nog naar
een wachtwoord te gaan zoeken. We vullen wel gewoon film.php achter de URL. Gaat stukken
sneller. De URL wordt dan: http://hackquest.de/modules/HackQuest/hacking/253/film.php. Ziezo
deze is af. Vergeet niet Java en JavaScript weer te activeren.




                                                 - 12 -
Javascript 47. Now, what is that really?
Eerst achterhalen we de broncode. Dit doen we op de gebruikelijke manier en hoef ik denk ik niet
meer uit te leggen. Dit is het script:

<script language="javascript">
function pw (form)
{
 var d1, d2, d3;
d1=window.document.bgColor;
d2=form.Name.value;
d3=form.Password.value;

 if (d2==d1.length) {
   if (d3==d1) {
     window.open (d1.substr(1, 10)+".php","_self")
   } else {
     alert("Sorry all wrong.")
   }
 } else {
   alert("Sorry all wrong.")
 }
}
</script>

Maar er valt me iets op in de regel die ervoor staat:

<body bgcolor="secret" topmargin="2" leftmargin="2" marginwidth="2" marginheight="2"
text="#FFFFFF" link="#00FFFF" vlink="#FF0000" alink="#00FFFF">

Hoe zou de achtergrondkleur secret eruit zien? Er staat toch echt dat de achtergrondkleur secret is.
En als we terugkijken: d1=window.document.bgColor; Het heeft dus iets met het wachtwoord te
maken. Als we goed kijken geeft hij succes wanneer d2 gelijk is aan de lengte van d1 en als d3 gelijk is
aan d1. Stel dat de achtergrondkleur zwart is, dan is de gebruikersnaam 5 en het wachtwoord zwart.
Alleen wat is die achtergrondkleur? Het simpelste lijkt mij dat de computer zelf te laten vertellen. We
slaan de pagina op door Dit deelvenster opslaan als… En we openen deze in Notepad++. We halen
het hele script weg en vervangen dat door:

<script language="javascript">
var d1;
d1=window.document.bgColor;
alert(d1);
</script>

Open de pagina en een popup verschijnt met deze tekst: #0ec0e0. Simpel toch? Als we tellen zien we
dat het zeven karakters heeft. D2 is dus 7 en d1 is #0ec0e0. Even invullen op de site et voila!




                                                 - 13 -
Javascript 48. What you mean it’s not THAT easy?
Zo te zien hebben we een pincode nodig. Eerst de broncode van het script bekijken:

<script type="text/javascript" language="JavaScript">
     <!-- Key-code script by Bart Jellema -->
  var usermulcode=10

  var code=0 // the entered code
  var mul=1 // the multiplied digits
  var digit=0 // number of digits entered so far
  var fails=0 // number of tries done
  function Clear_code()
  {
    document.codepad.thecode.value=''
    code=0
    mul=1
    digit=0
  }
  function Enter_code(number)
  {
    code=code*10+number
    mul=mul*number
    document.codepad.thecode.value=code
    digit++

      if (digit==4)
      {
        if (mul==120)
        {
          window.open (code+".php", "_self")
        }
        else
        {
          fails++
          code=0
          mul=1
          digit=0
          if (fails<3) {
             if(fails==1){
                document.codepad.thecode.value="Try again"
             }
             if(fails==2){
                document.codepad.thecode.value="Last time"
             }
          } else {
             document.codepad.thecode.value="Bye!"
          }
        }
      }
  }


                                                   - 14 -
function keycodepad(mulcode)
    {
     usermulcode=mulcode
     document.write("<table><tr><td><form name="codepad">");
     document.write("<input type="button" value=" 1 " onClick="Enter_code(1)">");
     document.write("<input type="button" value=" 2 " onClick="Enter_code(2)">");
     document.write("<input type="button" value=" 3 " onClick="Enter_code(3)">");
     document.write("<input type="button" value=" 4 " onClick="Enter_code(4)"><br />");
     document.write("<input type="button" value=" 5 " onClick="Enter_code(5)">");
     document.write("<input type="button" value=" 6 " onClick="Enter_code(6)">");
     document.write("<input type="button" value=" 7 " onClick="Enter_code(7)">");
     document.write("<input type="button" value=" 8 " onClick="Enter_code(8)"><br />");
     document.write("<input type="button" value=" 9 " onClick="Enter_code(9)">");
     document.write("<input type="button" value=" 0 " onClick="Enter_code(0)">");
     document.write("<input type="button" value=" C " onClick="Clear_code()"><br />");
     document.write("<input type="text" name="thecode" size=9 value=""><br />");
     document.write("</form></table>");
    }

    <!-- Key-codescriptbyBartJellema-->
  </script>

Het belangrijkste is natuurlijk kijken wanneer we succes hebben. In dit geval:

if (digit==4)
     {
 if (mul==120)
       {
         window.open (code+".php", "_self")
       }}

Hiervoor zagen we wat mul was. Mul is het product van de ingevoerde data. We hebben vier getallen
(digits) nodig die samen 120 worden. Nou, even mijn rekenknobbel activeren: 120/2=60 60/3=20
20/4=5 5/5=1. En omgekeerd 1*2=2 2*3=6 6*4=24 24*5=120. Waren al die wiskundeproefwerken
maar even makkelijk. We vullen (in willekeurige volgorde) 2, 3, 4 en 5 in en we zijn binnen. Of toch
niet. Het blijkt dat er slechts één code werkt. En omdat je niet kunt zien welke het is, moeten we
voor de code bruteforce gebruiken. We moeten alle mogelijkheden uitproberen (of tenminste tot er
eentje werkt). Er zijn 36 mogelijkheden om 120 te krijgen, namelijk: 2256 - 2265 - 2345 - 2354 - 2435
- 2453 - 2526 - 2534 - 2543 - 2562 - 2625 - 2652 - 3245 - 3254 - 3425 - 3452 - 3524 - 3542 - 4235 -
4253 - 4325 - 4352 - 4523 - 4532 - 5226 - 5234 - 5243 - 5262 - 5324 - 5342 - 5423 - 5432 - 5622 - 6225
- 6252 - 6522. Het simpelste is om ze maar gewoon uit te proberen, dit kost je 5 minuten, maar dan
merk je dat de echte code 3542 is.




                                                 - 15 -
Javascript 49. Jedi mindtricks
Hier zien we dat de bron op een bepaalde manier gecodeerd is. Om de bron te zien moeten we hem
dus decoderen. In dit geval is het een Unescape-codering. Dit decoderen we met het programma
PolyCrypt. Dit programma is hier: http://www.net-force.nl/files/download/polycrypt.zip te vinden.
Wanneer we de tekst in het URL-encoding vak zetten en op Decrypt drukken komt er een hele lap
code. Hieronder staat alleen het login-script.

<SCRIPT language=Javascript>
function PassConfirm() {

 var y="alphabravocharliedeltae";
 var x="lidocaineadrenalineekel";
 var z="sidewinderamraamphoenix";

 var s = "";
 for (Count=0; Count < y.length; Count++) {

                var t1 = y.substring (Count, Count+1);
                var t2 = z.substring (Count, Count+1);
                var t3 = x.substring (Count, Count+1);

                if (t1 * t2 * t3 >= 5 || t3^t1 >= 3)
         s=s+t1;
                else {
                if (t3 == t2)
                                   s=s+t3;
                if (t2 == t1)
                                   s=s+t2;
                if (t1 == t3)
                                   s=s+t3;
                }
 }

 var x=document.LayoutBereich1FORM.Eingabefeld1.value
 if (x==s) {
   y = s + ".php"
   window.open(y,"_self")
 } else {
   alert("Dooh, try again!")
 }
}
</SCRIPT>

Ik heb wederom geen zin om hier lang naar te kijken. We kopiëren de volledige broncode van
PolyCrypt naar Notepad++. Het enige wat we moeten veranderen is if (x==s) { hier staat als x gelijk is
aan s kom je binnen. Als we daar nou eens zorgen dat hij ons juist altijd binnen laat, behalve als x
gelijk is aan s. We veranderen de == door !=. We slaan het op en openen de pagina in Firefox en
vullen iets in (zou wel toevallig zijn dat het nou net toch het goede wachtwoord is) en warempel, er
komt iets bij de URL te staan. Dit zetten we ook achter de URL op de online pagina, die wordt dan:
http://hackquest.de/modules/HackQuest/hacking/916/ideaee.php en daar komt wat tevoorschijn.


                                                   - 16 -
Javascript 50. Security through obscuration!
Nou wordt het interessant. Dit ziet er al een stuk lastiger uit. Toch vind ik de slechtste tot nu toe. Dit
heeft eigenlijk niets met security te maken omdat dit gewoon niet realistisch is. Ik zou het maar
gewoon vertellen: open dit keer niet meteen alles in een aparte pagina, maar klik rechts op de
blauwe balk. Open hiervan de bron met Deelvensterbron bekijken. Er staat ergens: <a
href="welldone.php">. Zet dit achter de URL, je krijgt:
http://hackquest.de/modules/HackQuest/hacking/724/welldone.php. Dus...




                                                   - 17 -
Javascript 51. Ok, finally it's secure. Or?
Wederom een beetje een slechte quest. Als we de code tevoorschijn halen, is deze behoorlijk
ingewikkeld. Je kunt dat helemaal gaan decoderen, maar als je goed kijkt valt je iets op. Een normale
URL op Hackquest ziet er zo uit: http://hackquest.de/modules/HackQuest/hacking/164/164.php.
Maar de URL van deze specifieke quest zo:
http://hackquest.de/modules/HackQuest/hacking/274/octodron/274.php. Er staat dus nog wat
tussen. Als we nou dat laatste (274.php) weghalen komen we op een index. De rest spreekt voor zich,
klik op de onderste link (ClickThisHiddenFile.php) en je bent binnen.




                                                - 18 -
Javascript 52. Please don’t let me forget it.
En alweer een beetje een rare. Ik denk dat je over deze quests ook uren kunt nadenken hoe ze
werken en hoe je ze “eigenlijk” moet oplossen, maar wij doen het op de snelle manier. Als we het
script bekijken zien we dit:

<SCRIPT LANGUAGE="JavaScript">

function testEncode(form) {
        var dater = new Date();
        Day = dater.getDate();
        dater = null;
        var Ret = encode (form.inputbox1.value, Day)
        location = Ret + ".php"
}

function encode (OrigString, CipherVal) {
        Ref="0123456789abcdefghijklmnopqrstuvwxyz._~ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        CipherVal = parseInt(CipherVal)
        var Temp=""
        for (Count=0; Count < OrigString.length; Count++) {
                var TempChar = OrigString.substring (Count, Count+1)
                var Conv = cton(TempChar)
                var Cipher=Conv^CipherVal
                Cipher=ntoc(Cipher)
                Temp += Cipher
        }
        return (Temp)
}

function cton (Char) {
        return (Ref.indexOf(Char));
}

function ntoc (Val) {
        return (Ref.substring(Val, Val+1))
}

</SCRIPT>

Het heeft dus iets met de dag te maken. “Toevallig” staat er ook op de pagina: last edited
05.02.2008. Als we nou eens de computerklok terugzetten naar 5 februari 2008 (Javascript is een
client-side taal, het script kijkt dus naar de computerklok en niet naar de klok van de server). Als dat
gebeurt is vullen we het andere opvallende in, namelijk HackKing. En dan zijn we binnen. Vergeet
niet de datum weer goed te zetten!




                                                  - 19 -
Javascript 53. Amazing code
We zijn er bijna doorheen. Maar eerst deze nog. We openen alles in een deelvenster en bekijken de
bron. Nou is er iets opvallend:

<script src="www.hackquest.de/modules/HackQuest/hacking/475/stylesheet.css" />

Een .css is namelijk een stylesheet en zeker geen script, toch wordt hij zo benoemd. Een tweede ding
dat me opvalt is: <base target="_self">. Bij alle andere challenges is dit namelijk <base
target="_parent">. Dit zorgt ervoor dat de bovenstaande URL niet de volledige URL is, maar achter
de bestaande moet komen. Dus om het .css bestand te bekijken gaan we naar:
http://www.hackquest.de/modules/HackQuest/hacking/475/www.hackquest.de/modules/HackQues
t/hacking/475/stylesheet.css. Daar vinden we deze code:

function checkEntry(form) {
 var cryptpass = "Bbkwho";
 var cryptpass2 = "x67x6Cx71x42x6Ex6Ax65x57";
 var cryptpass3 = "156154162157151145157123166155";
 var challpass = "";
 var challpass2 = "";
 var challpass3 = "";
 for (i=0;i<=5;i++) {
  cryptchar = cryptpass.charCodeAt(i);
  cryptchar2 = cryptpass2.charCodeAt(i);
  if (i%2) {
   cryptchar--;
   cryptchar2++;
   cryptchar2++;
  }
  else {
   cryptchar++;
   cryptchar2--;
   cryptchar2--;
  }
  challpass = challpass + String.fromCharCode(cryptchar);
  challpass2 = String.fromCharCode(cryptchar2) + challpass2;
 }
 challpass2 = cryptpass2.charAt(7) + cryptpass2.charAt(6) + challpass2;
 for (i=1;i<=10;i++) {
  j = (7*i)%10;
  challpass3 = challpass3 + cryptpass3.charAt(j);
 }
 if ((form.pass.value === challpass) || (form.pass.value === challpass2) || (form.pass.value ===
challpass3)) {
  window.open(form.pass.value+ ".php","_self");
 }
 else
 {
  window.open("denied.php?Pass=" + form.pass.value,"_self");
 }
}


                                                - 20 -
Nou moeten we die drie variabelen eruit halen: challpass, challpass2 & challpass3. Deze zijn niet
afhankelijk van de input. Dus als we het script gaan omschrijven, zou die gegeven moeten worden.
We maken er dit van:

<html>
<head></head>
<body>
<script type="text/javascript">

var cryptpass = "Bbkwho";
var cryptpass2 = "x67x6Cx71x42x6Ex6Ax65x57";
var cryptpass3 = "156154162157151145157123166155";
var challpass = "";
var challpass2 = "";
var challpass3 = "";
for (i=0;i<=5;i++) {
 cryptchar = cryptpass.charCodeAt(i);
 cryptchar2 = cryptpass2.charCodeAt(i);
 if (i%2) {
  cryptchar--;
  cryptchar2++;
  cryptchar2++;
 }
 else {
  cryptchar++;
  cryptchar2--;
  cryptchar2--;
 }
 challpass = challpass + String.fromCharCode(cryptchar);
 challpass2 = String.fromCharCode(cryptchar2) + challpass2;
}
challpass2 = cryptpass2.charAt(7) + cryptpass2.charAt(6) + challpass2;
for (i=1;i<=10;i++) {
 j = (7*i)%10;
 challpass3 = challpass3 + cryptpass3.charAt(j);
}
alert(challpass+' | '+challpass2+' | '+challpass3);

</script>
</body>
</html>

Hieruit alert hij drie dingen: Calvin, WellDone & Silvermoon. Alle drie doen ze eigenlijk niets wanneer
je ze invult. Maar als we het derde in de URL invoeren, wordt het :
http://hackquest.de/modules/HackQuest/hacking/475/Silvermoon.php. Dit lijkt bijna exact op de
foutmelding die we krijgen wanneer we gewoon maar wat invullen (bijvoorbeeld ../ 475/iets.php).
Toch verandert er één letter: de T. Als we naar de bron kijken zien we dit:




                                                 - 21 -
</script>
<link rel="stylesheet" type="text/css" href="check.css" />
<script type="text/javascript" language="javascript">
function getQueryVariable(variable) {
        var query = window.location.search.substring(1);
         var vars = query.split("&");
         for (var i=0;i<vars.length;i++) {
                  var pair = vars[i].split("=");
                  if (pair[0] == variable) {
                           return pair[1];
                  }
          }
          return "Silvermoon";
}
</script>

Daar staat weer een vermelding naar zo’n nep stylesheet. Als we die openen krijgen we dit:

a:link { color:#000000; text-decoration:none; cursor:text }
a:visited { color:#000000; text-decoration:none; cursor:text }
a:hover { color:#000000; text-decoration:none; cursor:text }
a:active { color:#000000; text-decoration:none; cursor:text }
a:focus { color:#000000; text-decoration:none; cursor:text }

Er gebeurt dus iets als je over de link gaat. Als je even over de pagina gaat, merk je dat de cursor
verandert als je over de middelste zin heen gaat. Even klikken en je bent binnen.




                                                  - 22 -
Javascript 54. Society matters
Poeh hé, dit is me een script. Het gebruikt een wiskundig algoritme om een link weer te geven.
Hiervoor gebruikt hij het opgegeven wachtwoord. Dit wordt een heleboel rekenen dus, alleen is de
hint me iets te duidelijk. We weten dat het om een zin (Passphrase) gaat. En met een beetje
geschiedenisles weet je dat de piramide met het oog erin voor het oog van God staat. Een plek waar
dat teken ook op staat is de Amerikaanse dollar. Laten we die er eens bijpakken:




En laat er nou nét een zin onder de piramide staan: Novus Ordo Seclorum… Dit is een mooi voorbeeld
van social engineering. De zwakste schakel in deze challenge was de mens met haar (te) voor de hand
liggende wachtwoord.




                                               - 23 -
Javascript 55. The password is regular!
De op-één-na-laatste en de tot-nu-toe moeilijkste. De bron ophalen is geen probleem en ik denk niet
dat hier gemene truckjes worden gebruikt. We gaan het script regel voor regel analyseren.

<script type="text/javascript" language="Javascript">
function PassConfirm() {
         var chk = false;
         var x=document.myform.input1.value

Eerst wordt de variabele chk aangemaakt, waarschijnlijk afgeleid van het woord check (controleer).
Het staat op false (negatief) omdat het wachtwoord nog niet gecheckt is. Var x is hetgeen wat hij uit
het wachtwoordveld ophaalt. Tot nu toe niets moeilijks. Nou wordt er gebruik gemaakt van regular
expressions.

var re = new RegExp(".*[a-z]{2}[ ].*[d-i](?=.*)");
var m = re.exec(x);
if (m != null) {
                 re = new RegExp(".*[G-Z].*[A-Z].+[f-s](?=.*)");
                 m = re.exec(m[0]);

Een regular expressions is een manier om patronen te beschrijven waarmee een computer tekst kan
herkennen. Je stelt er als het ware voorwaardes mee op. In het begin wordt var re aangemaakt. Dat
is de expressie: .*[a-z]{2}[ ].*[d-i. Vervolgens wordt gekeken of het ingevoerde wachtwoord aan die
voorwaardes voldoet. In dit geval staat de .* voor een teken dat een x aantal keer voorkomt. Gevolgd
door een teken dat twee keer voorkomt en binnen de alfabetische reeks van a tot en met z valt,
enzovoort. Wanneer de variabele aan die voorwaardes voldoet, gaat hij naar de volgende expressie.
Dit gaat zo door tot de 15e expressie, dan zet hij er .php achter en opent hij deze URL. Eerst maken
we een mooie lijst van alle regulieren expressies. Op de pagina eronder staat een lijst met de
beschrijvingen van alle tekens.

<script type="text/javascript" language="Javascript">
.*[a-z]{2}[ ].*[d-i](?=.*)
.*[G-Z].*[A-Z].+[f-s](?=.*)
([^XazhY]|[^ijkW]).+[W][A-Z].+[^i](?=.*)
([^Xa-ehY]|[^f-zW]).+[W][A-Z].+[^f](?=.*)
([Zdf]|[pass]).+[s][D]+
([^spa])w+[ ].*[n-o][sigma]
([^f-iK-L]).*[^alamo][e-g]
.*([^76]|[^A-Za]).*[^a-z][^x]{3}
([^2]|[^D-Za]|[D-Ze-f]){2}[b-r].*[^a-z][A-Bhijk].*
([^2]|[^D-Za]|[D-Ze-f]){2}[^b-q].*[ ].*[^klmadj][^dkdcewl]{2}
.[3djes]([byxprln]).*[ ].*[^BhA][^dkdcewl]{2}
.*([m-r])[gDaSod].*s.*[g-n]*
([A]|[^A])*[amzrbrqw][^A-Za-dg]s[^A-V]+[g-n].*
[^d ] w+ [ ] [^XYZ ] w + [^ghijklm ] .{1}
.*e.*
</script>




                                                  - 24 -
Teken             Beschrijving
Normaal teken     Het opgegeven teken zelf wordt gezocht
[...]             Een van de tekens moet worden gevonden
[^...]            Een teken dat niet tussen de haakjes voorkomt
[A-Z]             Een teken van A tot Z
(...)             Een bereik waarmee je tekens groepeert
?                 Het voorafgaande teken of bereik is optioneel
+                 Het voorafgaande teken of bereik moet een of meerdere keren voorkomen
*                 Het voorafgaande teken of bereik kan een willekeurig aantal keren of helemaal niet voorkomen
{n,m}             Het voorafgaande teken of bereik moet n en hoogstens m keer gevonden worden
|                 Onderscheid tussen verschillende mogelijkheden
^                 Caret: het begin van de tekenreeks
$                 Dollar: het einde van de tekenreeks
                 : een backslash
                  /: een slash
                  w: een word karakter: [a-zA-Z0-9_]
                  W: geen word karakter: [^a-zA-Z0-9_]
                  d: digit - een cijfer [0-9]
                  D: geen cijfer [^0-9]
                  n: regelterugloop
                  t: tabsprong
                  b: woordgrens
                  B: geen woordgrens

Als we het analyseren merken we uit deze expressie: .*e.* dat er ergens een e in staat, en dat deze e
niet op de eerste en laatste plaats komt. In ([Zdf]|[pass]) en ([^2]|[^D-Za]|[D-Ze-f]){2} zien we dat
het wachtwoord met een Z, d, f, p, a, s, e of een letter tussen de D en Z begint. Maar door ([^spa]),
[^d ] en door ([^f-iK-L]) vallen de s, p, d, a, f en de K tot en met de L af. Wat we dan over houden zijn
de D tot en met de J en de M tot en met de Z. Op deze manier zou je de challenge moeten oplossen.
Dit is me tot op heden nog niet gelukt. Wel weet ik dus dat er een e in zit en dat het op ng eindigt.
Een andere tip is dat het een “geek”-woord is… Veel succes.




                                                  - 25 -
Extra informatie
Als je meer wilt weten over hacken en gerelateerde onderwerpen kun je dat hier doen:

http://www.hackquest.de
De site waar het hier om draait. Er staan challenges op waarbij je door het hacken van “puzzels”
meer leert.

http://www.net-force.nl
Een challenge site (net als HackQuest), er staan goede gidsen in de library.

http://www.security.nl
Blijf up-to-date over wat er in security-land gebeurt.

http://hacks.mit.edu
De eerste “hacks” van MIT.

http://www.remote-exploit.org/backtrack_download.html
Dé Linux-distro voor hackers en pen-testers.

http://www.w3schools.com
Leer elke gangbare internettaal.

http://www.ict.teno.be/oostende/vdabrefs/jsvdab/jsNaslag_Regexp.asp
Een goede gids in regular expressions.

http://www.ivobrugge.be/cursusweb
Een site met veel online cursussen.

http://www.google.nl
Google is a hacker’s best friend.

http://www.rickdriessen.eu
De mooiste website ooit!




                                                 - 26 -
Als extra opdracht hebben we (ik en Idzard Stoker) geprobeerd een server op te zetten. Op de
volgende pagina’s volgt een kort verslag.



                                               - 27 -
Debian
We kregen een lege bestandsserver. Het doel was om deze volledig bereikbaar te maken en
vervolgens te beveiligen. Hiervoor hadden we eerst een besturingssysteem nodig. Na meerdere
(gratis) besturingssystemen te hebben vergeleken, kwamen we uit op Debian. Debian is een gratis
distributie van Linux. Het staat bekent om zijn stabiliteit en veiligheid. Debian wordt standaard al
geleverd met een behoorlijk aantal programma’s, dit is ook de reden dat wij voor deze distributie
hebben gekozen. Omdat we allebei nog niet zo veel ervaring met Linux hadden werden we ervan
verzekerd ook niet zo veel te hoeven instaleren.

Het installeren van Debian is niet lastig. We downloaden een bestand
(http://cdimage.debian.org/debian-cd/5.0.0/i386/iso-cd/debian-500-i386-netinst.iso) en dit
brandden we op een CD-ROM. Deze versie bevat niet het gehele besturingssysteem, maar een
programma dat ervoor zorgt dat de rest vanzelf gedownload wordt. Dit scheelt een hoop tijd, want
hij downloadt en installeert het OS op deze manier tegelijk. Wanneer we de CD in de computer
stoppen en hem aanzetten doorlopen we een simpel installatiemenu, vervolgens installeert hij alles
en kunnen we Debian gebruiken.

Het eerste waar we tegenaan liepen was het gemis van Firefox. Normaal kun je dit gewoon via
pakketten instaleren, maar dit lukte niet. Toen we een CD met Windows Server 2003 aangeboden
kregen zijn we daar zonder te twijfelen op overgestapt.


Windows Server 2003
Het installeren van Windows is gemakkelijker dan dat van Debian. Windows is vaker gevisualiseerd
dan een Linux OS (dit vooral omdat er vele miljoenen dollars in gepompt zijn). Na wat updates en
programma’s als Firefox te hebben geïnstalleerd (hier lukt het wel!), hebben we Wamp geïnstalleerd.
Wamp (www.wampserver.com) is een server die Apache, PHP en MySQL ondersteunt. Als we een
site (HTML-bestand) in de aangewezen map zetten, kun je die site bekijken op localhost: 127.0.0.1.
Wanneer we dan het IP van de server (194.123.50.2) op een andere PC invullen, gaat hij automatisch
naar die site. We hebben dus een internetsite!

Vervolgens instaleren we een FTP server. We downloaden FileZilla (www.filezilla-project.org) en
daarvan de server-versie. Het installeren is niet moeilijk: gewoon de aanwijzingen volgen. Vervolgens
zijn de poorten 20 en 21 in de router opengezet. We maken een account aan en geven het rechten.
Als beveiliging stellen we in dat na tien mislukte pogingen het account voor een uur geblokkeerd
blijft. Op deze manier zijn brute force-aanvallen nutteloos. Nu kunnen we ook naar de server FTP’en.




                                          Linux Vs. Windows
                                                 - 28 -
- 29 -
Logboek
Bij dit verslag zit geen logboek waarin staat wat ik wanneer gedaan heb en hoelang ik daarover
gedaan heb. Ik was namelijk al op HackQuest (en de soortgelijke site netforce.nl) actief voordat ik
echt met de opdracht begon. Ik weet wel zeker dat ik meer dan de toegewezen studielasturen heb
gemaakt. Ook heb ik niet elke behaalde challenge besproken. Dit, omdat ik soms al vergeten was hoe
ik hem opgelost had voordat ik aan deze opdracht was begonnen. Hoe dan ook waren het er toch te
veel om te documenteren (62 op dit moment).


Resultaat
Uiteindelijk heb ik een hoop geleerd. Echt het hacken van computers niet, maar wel een hoop over
Javascript en algemene computerdingen. Zo weet ik wat meer over reguliere expressie,over aantal
encryptie-protocolen en hoe je een server moet opzetten. Wel merk ik hoe frustrerend het soms is
om met computers te werken. Vooral bij het hacken, wat eigenlijk puzzels zijn, kan het antwoord
soms in enkele minuten zijn gevonden, maar soms heb ik meer dan vijf uur naar de oplossing
gezocht. Ook heeft het configureren van de server (met name de DNS gegevens en de firewall) veel
tijd gekost.

Momenteel heb ik bij HackQuest 30 hacks opgelost. En bij Net-Force 32. Waarschijnlijk worden dit er
in de loop van de tijd nog wel meer. Mijn voortgang kun je volgen op
http://hackquest.de/user.php?op=userinfo&uname=Big-R (voor HackQuest) en op http://www.net-
force.nl/members/view/13254/ (voor Net-Force).Ik wil ook nog wel wat met de server mee
“spelen”. Ik wil vooral kijken of ik er, via FTP, een gameserver van kan maken en er het ouderwetse
spel Ravenshiel Rainbow 6 op kan draaien.

Wat ik wel mis bij deze opdracht, is toch wat extra begeleiding. Ik weet dat dit vaker niet mogelijk
was, je moet namelijk veel verstand van Javascript hebben om al die challenges op te lossen. En ook
was het jammer dat het zo lang duurde voor we alle DNS gegeven hadden. Al met al ben ik erg
tevreden over hetgeen ik bereikt en geleerd heb. Mijn kennis over computers is door de jaren heen
flink vergroot.




                                                - 30 -
- 31 -

Contenu connexe

Similaire à Hacking

Internetrechercheren marienburg
Internetrechercheren marienburgInternetrechercheren marienburg
Internetrechercheren marienburg
Sandor Lokenberg
 

Similaire à Hacking (20)

AI als creatieve partner
AI als creatieve partnerAI als creatieve partner
AI als creatieve partner
 
Internetrechercheren marienburg
Internetrechercheren marienburgInternetrechercheren marienburg
Internetrechercheren marienburg
 
Nagios Open Source Monitoring
Nagios Open Source MonitoringNagios Open Source Monitoring
Nagios Open Source Monitoring
 
De 10 geboden van WordPress Development
De 10 geboden van WordPress DevelopmentDe 10 geboden van WordPress Development
De 10 geboden van WordPress Development
 
Webtweepuntnulineducatie 270808
Webtweepuntnulineducatie 270808Webtweepuntnulineducatie 270808
Webtweepuntnulineducatie 270808
 
Web2.0 in de Blend Store
Web2.0 in de Blend StoreWeb2.0 in de Blend Store
Web2.0 in de Blend Store
 
Netwerken 5-netwerkbeveiliging
Netwerken   5-netwerkbeveiligingNetwerken   5-netwerkbeveiliging
Netwerken 5-netwerkbeveiliging
 
Leaflet secure coding in php
Leaflet secure coding in phpLeaflet secure coding in php
Leaflet secure coding in php
 
Over Naar (embedded) Linux
Over Naar (embedded) LinuxOver Naar (embedded) Linux
Over Naar (embedded) Linux
 
Digitale werkelijkheid: Feit? Fake? of Filter?
Digitale werkelijkheid: Feit? Fake? of Filter?Digitale werkelijkheid: Feit? Fake? of Filter?
Digitale werkelijkheid: Feit? Fake? of Filter?
 
Wachtwoorden in Linux
Wachtwoorden in LinuxWachtwoorden in Linux
Wachtwoorden in Linux
 
WordPress plugin development
WordPress plugin developmentWordPress plugin development
WordPress plugin development
 
Linux
LinuxLinux
Linux
 
OSS als serieus alternatief
OSS als serieus alternatiefOSS als serieus alternatief
OSS als serieus alternatief
 
Web2.0: Communnicatie2.0
Web2.0: Communnicatie2.0Web2.0: Communnicatie2.0
Web2.0: Communnicatie2.0
 
20070622 Exposure 2007
20070622 Exposure 200720070622 Exposure 2007
20070622 Exposure 2007
 
Het begint allemaal bij gezond verstand
Het begint allemaal bij gezond verstandHet begint allemaal bij gezond verstand
Het begint allemaal bij gezond verstand
 
Veilig programmeren intro
Veilig programmeren introVeilig programmeren intro
Veilig programmeren intro
 
IT Security in examineren
IT Security in examinerenIT Security in examineren
IT Security in examineren
 
In McAfee 2020, what's new?
In McAfee 2020, what's new? In McAfee 2020, what's new?
In McAfee 2020, what's new?
 

Hacking

  • 2. Inhoud Pagina Inhoud 1 Kaft 2 Inhoud 3 Werkplan 5 Inleiding hacking 8 I am a JavaScript. Abuse me. 9 It's simple if you see it. 10 Don't look at me like this. 12 Sir, could you pop me? 13 Now, what is that really? 14 What you mean it’s not THAT easy? 16 Jedi mindtricks. 17 Security through obscuration! 18 Ok, finally it's secure. Or? 19 Please don't let me forget it. 20 Amazing Code 23 Society matters 24 The password is regular! 26 Extra informatie 28 Server installatie 30 Logboek & resultaten 31 Kaft Attentie De antwoorden van de challenges zijn vertrouwelijk. Ze mogen niet rechtstreeks worden overgenomen. -2-
  • 3. Werkplan Het onderwerp van deze opdracht is Hacken. Als extra proberen we (ondergetekende en Idzard Stoker) ook nog een server in te richten. Hacken doe ik op de site www.hackquest.de. Hierop staat een aantal opdrachten (challenges). Je moet door te hacken een wachtwoord weten te bemachtigen. Omdat er te veel verschillende soorten hacks op de site staan, specialiseer ik me op het hacken van JavaScripts. Van elke opdracht maak ik een kort verslagje. Eerst zetten we een besturingssysteem op de server en vervolgens maken we hem bereikbaar. Over het opzetten van de server wordt naderhand ook een verslag gemaakt. Leerdoelen Ik weet door ervaring dat je veel meer kunt leren als je iets uit elkaar haalt, dan wanneer je alleen naar de buitenkant kijkt. Zo heb ik vroeger bijna elk apparaat bij mij in huis wel een keer open gemaakt en weet ik nu ook hoe bijna elk apparaat, in grote lijnen, werkt. Dit werkt hetzelfde als met hacken. Omdat je dieper dan de interface moet kijken om ergens binnen te komen, moet je de applicatie ook “openmaken”. Ik verwacht dan ook dat ik een hoop leer, maar wel over uiteenlopende onderwerpen. Over het inrichten van een server heb ik een wat objectiever doel. Ik heb het nog nooit gedaan en ben wel benieuwt hoe het moet. Het uiteindelijke doel is gewoon de server aan de praat te krijgen en bereikbaar te maken. Ik verwacht ook wel dat dit gaat lukken. -3-
  • 4. -4-
  • 5. Inleiding hacking Een persoon die hackt is een hacker. Tegenwoordig heeft het woord hacker twee betekenissen. Traditioneel is een hacker iemand die er van houdt om met software en andere elektronische systemen te “prutsen”. Hackers houden ervan te ontdekken hoe computersystemen te werk gaan. Door ze uit elkaar te halen proberen ze vaak nieuwe toepassingen te bedenken (letterlijk is een hack het vinden van toepassingen, die niet door de maker van het middel bedoeld zijn). Er zijn ook hackers die onder toezicht van de eigenaar in systemen proberen in te breken (penetration testing). Dit doen ze om te kijken of er geen beveiligingsfouten zijn. Dit type hacker noemt men de ethische hacker. Tegenwoordig heb je ook kwaadwillige hackers. Ze staan erom bekend in systemen in te breken. Ook schrijven ze virussen en leggen ze met opzet systemen plat. Technisch gezien zijn dit geen hackers, maar crackers (criminal hackers). Ze hacken voor persoonlijke baat, zonder echt naar de consequenties te kijken. Vaak doen ze dit voor het geld dat ze ermee verdienen, maar het kan ook om wraak draaien of soms doen ze het slechts voor de faam (zoals het ILOVEYOUR-virus uit 2000). Een ander bekend voorbeeld van deze kwaadwillige acties is het verspreiden van spam (ongewenste emails). Het verwijderen van spam kost de Amerikaanse economie meer dan 22 miljard dollar op jaarbasis, dit terwijl het voor dat kleine groepje spammers maar net winstgevend is. De meeste vormen van cracken zijn in Europa en de VS illegaal, toch zijn de crackers vaak slim genoeg om uit handen van de politie te blijven. Tegenwoordig komen de meeste virussen en spam uit Afrika en Rusland, dit vanwege de mildere wetgeving. Omdat volgens woordenboeken elke hacker bij voorbaat een cracker is (Van Dale: hacker, iemand die inbreekt in computers), hebben de hackers nieuwe benamingen bedacht. De crackers, degenen die uit criminele oogmerk een systeem "kraken", worden ook wel black-hat hackers genoemd. De traditionele hackers noemen zich white-hat hackers, analoog aan cowboyfilms waarin de "kwaden" zwarte hoeden droegen en de "goeden" witte hoeden. Ook zijn er grey-hat hackers, een kruising tussen crackers en hackers. Het komt voor dat crackers proberen hun activiteiten te verhullen door zich als hacker voor te doen. Daarbuiten heb je ook nog crackbies, een combinatie van cracker en newbie, die ook wel sk's (scriptkiddies) of n00bs (newbies) worden genoemd. Scriptkiddies zijn crackers die er eigenlijk geen verstand van hebben. Ze hebben wat programma’s (scripts) en daarmee cracken ze andere systemen. Het grote verschil is dat ze niet zo nieuwsgierig zijn als de hackers en crackers. Newbies staan daar nog onder. Het zijn mensen die op fora vragen of iemand “die en die wel even wil hacken”. Sommige beweren juist dat ze hele goede hackers zijn, dit terwijl ze het verschil tussen Windows en Linux nog niet eens weten. -5-
  • 6. Geschiedenis De geschiedenis en de term “hacken” is ontstaan op het Amerikaanse instituut MIT (Massachusetts Institute of Technology). De eerste hackers waren scholieren uit een treinvereniging. Elke nieuwe verbinding of verbetering in de treincircuits werd een hack genoemd. Toen de eerste computers verschenen op het MIT waren zij een van de eerste personen die hiermee onofficieel studeerden. Destijds werden computers bediend via gigantische stapels ponskaarten. Deze moesten met een aparte machine (ponsmachine) gemaakt worden. Toen ze elkaars werk gingen verbeteren, door bijvoorbeeld routines te schrijven die minder (pons)kaarten in beslag namen, is de term "hack" ook overgenomen in het programmeren. Omdat computers aanvankelijk nogal beperkt waren qua geheugen, gebeurde het dat programmeurs stukken code moesten schrappen om een programma kleiner te maken. Volgens ingewijden werd dit ook wel hacken genoemd, net als andere snelle, makkelijke of in ieder geval onverwachte oplossingen voor computerproblemen. Hacker zou in deze eerste context zijn afgeleid van het Duitse Hacker, als in “iemand die meubels maakt met een bijl”. Op een dergelijke manier kan een hack slaan op een truc op een heel ander gebied. In de wiskunde kan het slaan op een slimme oplossing voor een wiskundig probleem. De GNU Public License (www.gnu.org) wordt door sommigen gezien als een hack, omdat het slim gebruik maakt van de wet op de auteursrechten op een manier die de makers van die wetten niet konden voorzien. Ook het gebruik in deze context heeft zich buiten MIT verspreid. Denk aan elektronica hobbyisten die eenvoudige aanpassingen doen aan grafische calculators, spelcomputers, elektronische instrumenten en dergelijke om ze aan te passen of uit te breiden met (voor eindgebruikers) onbedoelde of verborgen functies. Een aantal techno muzikanten paste in de jaren ‘80 hun Casio SK-1 keyboard aan door de bedrading van de gebruikte chips te veranderen om er vreemde digitale klanken mee te kunnen maken. Die werden onderdeel van de typische techno muziekstijl. Bedrijven reageren zeer verschillend op dergelijke praktijken. Texas Instruments accepteert het openlijk wat betreft zijn grafische calculators en Lego vindt het geen probleem wat betreft hun LEGO Mindstorms technische speelgoed, maar Microsoft probeert het hacken van hun Xbox juist te blokkeren met DRM software in Blu-ray Disc spelers, ontworpen om aangepaste spelers te saboteren. The Gilder, het onofficiële logo van de hackers -6-
  • 7. Bij het hacken werk ik met Firefox 3.0.8 (behalve wanneer dit anders staat aangegeven). Sommige toepassingen kunnen niet door Internet Explorer worden uitgevoerd, daarom raad ik je aan ook Firefox te downloaden op http://www.mozilla-europe.org/nl/firefox/. Voor de rest gebruik ik Polycrypt (http://www.net-force.nl/files/download/polycrypt.zip) en Notepad++ (http://notepad- plus.sourceforge.net/nl/site.htm). -7-
  • 8. Javascript 43. I’m a JavaScript. Abuse me. We openen de pagina en zien een heel simpele login-pagina: alleen een wachtwoord is nodig. Vervolgens klikken we rechts op Alleen dit deelvenster tonen. Hiervan openen we de bron. In de eerste instantie zien we niets dat op een script lijkt; alleen het form. Maar als je naar de horizontale scrollbar kijkt, zie je dat die wel iets langer is dan de paar zinnen die je ziet. Scroll flink naar rechts en je ziet die script: <script type="text/javascript" language="Javascript"> function PassConfirm() { var x=document.LayoutBereich1FORM.Eingabefeld1.value; if (x=="thisisnotthepassword") { window.open("veryok.php","_self"); } else { alert("Dooh, try again!") } } </script> Omdat dit de eerste quest is, verwacht ik niet veel en dat klopt ook. Er staat maar één ding in dat ook maar op een wachtwoord lijkt: thisisnotthepassword. We vullen het in en blijkt het ook te zijn ook. -8-
  • 9. Javascript 44. It’s simple if you see. Op het eerste gezicht zie we een simpel login scherm: een user-form, een pass-form en een submit- knop. We moeten dus een gebruiker en wachtwoord vinden. Laten we beginnen. Eerst klikken we rechts op Alleen dit deelvenster tonen. We krijgen nou alleen het inlogscherm te zien. Hiervan bekijken we de bron. En hier halen we alleen de scripts uit: <script type="text/javascript" language="javascript"> function noRightClick() { if (event.button==2) { alert('You know the drill. But this time its different.') } } document.onmousedown=noRightClick </script> Dit script zou ervoor moeten zorgen dat mijn rechtermuisknop niet werkt. Merkwaardig, want ik had hier geen probleem mee (werkt waarschijnlijk alleen bij Internet Explorer). <script type="text/javascript" language="JavaScript"> <!----- Script CopyRight © 1996 - 1997 S.Chris Brown (Spikeman) function Spikeman_password(form) { if (form.Name.value=="BGates") { if (form.Password.value=="moneymoneymoney") { window.open ("dope.php","_self") } else { alert("Sorry " +form.Name.value+ ", wrong password.") } } else { alert("Invalid Name") } } </script> Dit is het login-script. Geschreven in 1996; hadden ze toen al computers?! Hoe dan ook, ze waren toen niet zo slim: de gebruiker en zijn wachtwoord staan duidelijk zichtbaar in het script. Waarschijnlijk zie je het al: de gebruiker is BGates en het wachtwoord is moneymoneymoney. Even invullen en klaar! -9-
  • 10. Javascript 45. Don't look at me like this. Wederom een simpel login scherm: een user-form, een pass-form en een submit-knop. Wanneer je rechts klikt en op Alleen dit deelvenster tonen klikt, krijg je een melding dat dit niet kan. Echter, het is wel mogelijk om rechts te klikken en vervolgens op Deelvensterbron. Je krijgt dan een stuk broncode te zien. Hieronder is alleen het belangrijkste te zien: de scripts. <script type="text/javascript"> if (parent.location.href == self.location.href) { window.location.href = 'framesonly.php' } </script> Dit script zorgt ervoor dat ik het frame niet apart kon openen. Geluk valt de broncode bekijken daar niet onder. <script type="text/javascript" language="JavaScript"> <!--Hide function ValidateEntry (){var y=document.e.u.value;var z=document.e.p.value;var x=0;if (y=='User'){alert('Please complete this form');var x=1;} if (z=='Password'){alert('Please complete this form');var x=1;};if (x==1){alert('Entry was not successful');var xxx=0;}else{AreYouWho(y,z);}} function LogIn (){document.e.u.value='Anonymous';document.e.p.value='Entry';};function AreYouWho(z,y){var x=0;if (z=='Password'){var x=1;} if (y=='User'){var q=x+1;};if (q==2){window.open("simple.php","_self");}else{alert('Incorrect Log-In, Password or User Name invalid');var q=0;var x=0;}} // Unhide--> </script> Bingo! Dit is het login-script. Vervolgens gaan we het wat leesbaarder neerzetten. We zetten wat enters achter de puntkomma’s en nog wat extra enters op sommige andere plekken. - 10 -
  • 11. <script type="text/javascript" language="JavaScript"> <!--Hide function ValidateEntry () { var y=document.e.u.value; var z=document.e.p.value; var x=0; if (y=='User'){ alert('Please complete this form'); var x=1;} if (z=='Password'){ alert('Please complete this form'); var x=1;}; if (x==1){alert('Entry was not successful'); var xxx=0;} else{AreYouWho(y,z);} } function LogIn () { document.e.u.value='Anonymous'; document.e.p.value='Entry'; }; function AreYouWho(z,y) { var x=0; if (z=='Password') {var x=1;} if (y=='User') {var q=x+1;}; if (q==2) {window.open("simple.php","_self");} else{alert('Incorrect Log-In, Password or User Name invalid'); var q=0;var x=0;}} // Unhide--> </script> Het script maakt drie waardes aan: wachtwoord (Z, haalt hij uit document.e.p.value), gebruiker (Y, haalt hij uit document.e.u.value) en de X waarde (die is nul). Je kunt natuurlijk gaan puzzelen wat er nou exact gebeurt, maar als je goed kijkt zie je dat hij in het laatste blokje een alert geeft als er foute gegevens worden ingevuld. Dit doet hij bij else, dus bij if moet hij de goede gegevens krijgen. Het enige wat hij daarna doet is naar de pagina simple.php gaan. We vullen dit dus in achter de bestaande URL, je krijgt dan dit: http://hackquest.de/modules/HackQuest/hacking/185/simple.php. En we zijn binnen! - 11 -
  • 12. Javascript 46. Sir could you pop me? Eindelijk een wat moeilijkere challenge. Als we beginnen, krijgen we eerst een aantal popups die om een gebruikersnaam en wachtwoord vragen. Dit weten we natuurlijk nog niet en als we doorklikken gaat de pagina vanzelf weg. Hier kunnen we geen broncodes uit halen of je moet in die 0,2 seconde vier keer klikken. Een probleem dus. Gelukkig is er (bijna) altijd wel een oplossing. We weten dat het een JavaScript is wat die irritante popups veroorzaakt. Als we dat nou eens uitzetten. In Firefox is dat bij instellingen zo gedaan (Extra -> Opties -> Inhoud -> Java en JavaScript uitvinken). Dan proberen we het nog eens. De popups zijn weg en we zien alleen de tekst die we net ook al zagen, alleen duurde hij toen slechts 0,2 seconde en blijft hij nou staan. Hiervan bekijken we de broncode door rechts te klikken en dan op Deelvensterbron. Hier is gebruik gemaakt van een programma genaamd HTML Source Code Hide V2.03. Het lijkt erop dat die programma zoveel witte regels in de broncode zet, dat de browser het niet meer aankan. Jammer genoeg blijkt deze geniepige manier nog te werken ook, zelfs als Firefox de hoogste processorprioriteit krijgt lijkt hij nog vast te lopen. We moeten dus een andere manier vinden. We hebben een programma nodig dat stabiel genoeg is om de bron te bekijken. Ik denk dat de DOM Inspector wel werkt. Dit is gratis te verkrijgen als Firefox Add-on. Je moet wel eerst Firefox hebben (maar dat hoor je eigenlijk allang te hebben), vervolgens download je DOM Inspector hier: https://addons.mozilla.org/nl/firefox/addon/6622 . Wanneer we het deelvenster apart openen en daarin de DOM Inspector draaien kunnen we de broncode zonder hapering bekijken. Vervolgens gaan we naar HTML -> BODY -> CENTER -> SCRIPT -> en een paar keer naar beneden. Dit is de broncode: var message1 = "Enter username"; var un = prompt (message1,""); var password = "Reeves" ; var message = "Enter password"; var incmess = "Incorrect username or password! Access denied!"; var minimizemsg = "The window will now minimize to prevent you peeking!" var pw = prompt (message,""); if (un == username) { if (pw != password) { alert (incmess); window.open("../../../../modules.php?op=modload&name=HackQuest&file=challenges","_top") } else { window.open("film.php","_self") } } if (un != username) { alert (incmess); window.open("../../../../modules.php?op=modload&name=HackQuest&file=challenges","_top") } Dat hele gedoe met die HTML Source Code Hide heeft me moe gemaakt; ik heb geen zin om nog naar een wachtwoord te gaan zoeken. We vullen wel gewoon film.php achter de URL. Gaat stukken sneller. De URL wordt dan: http://hackquest.de/modules/HackQuest/hacking/253/film.php. Ziezo deze is af. Vergeet niet Java en JavaScript weer te activeren. - 12 -
  • 13. Javascript 47. Now, what is that really? Eerst achterhalen we de broncode. Dit doen we op de gebruikelijke manier en hoef ik denk ik niet meer uit te leggen. Dit is het script: <script language="javascript"> function pw (form) { var d1, d2, d3; d1=window.document.bgColor; d2=form.Name.value; d3=form.Password.value; if (d2==d1.length) { if (d3==d1) { window.open (d1.substr(1, 10)+".php","_self") } else { alert("Sorry all wrong.") } } else { alert("Sorry all wrong.") } } </script> Maar er valt me iets op in de regel die ervoor staat: <body bgcolor="secret" topmargin="2" leftmargin="2" marginwidth="2" marginheight="2" text="#FFFFFF" link="#00FFFF" vlink="#FF0000" alink="#00FFFF"> Hoe zou de achtergrondkleur secret eruit zien? Er staat toch echt dat de achtergrondkleur secret is. En als we terugkijken: d1=window.document.bgColor; Het heeft dus iets met het wachtwoord te maken. Als we goed kijken geeft hij succes wanneer d2 gelijk is aan de lengte van d1 en als d3 gelijk is aan d1. Stel dat de achtergrondkleur zwart is, dan is de gebruikersnaam 5 en het wachtwoord zwart. Alleen wat is die achtergrondkleur? Het simpelste lijkt mij dat de computer zelf te laten vertellen. We slaan de pagina op door Dit deelvenster opslaan als… En we openen deze in Notepad++. We halen het hele script weg en vervangen dat door: <script language="javascript"> var d1; d1=window.document.bgColor; alert(d1); </script> Open de pagina en een popup verschijnt met deze tekst: #0ec0e0. Simpel toch? Als we tellen zien we dat het zeven karakters heeft. D2 is dus 7 en d1 is #0ec0e0. Even invullen op de site et voila! - 13 -
  • 14. Javascript 48. What you mean it’s not THAT easy? Zo te zien hebben we een pincode nodig. Eerst de broncode van het script bekijken: <script type="text/javascript" language="JavaScript"> <!-- Key-code script by Bart Jellema --> var usermulcode=10 var code=0 // the entered code var mul=1 // the multiplied digits var digit=0 // number of digits entered so far var fails=0 // number of tries done function Clear_code() { document.codepad.thecode.value='' code=0 mul=1 digit=0 } function Enter_code(number) { code=code*10+number mul=mul*number document.codepad.thecode.value=code digit++ if (digit==4) { if (mul==120) { window.open (code+".php", "_self") } else { fails++ code=0 mul=1 digit=0 if (fails<3) { if(fails==1){ document.codepad.thecode.value="Try again" } if(fails==2){ document.codepad.thecode.value="Last time" } } else { document.codepad.thecode.value="Bye!" } } } } - 14 -
  • 15. function keycodepad(mulcode) { usermulcode=mulcode document.write("<table><tr><td><form name="codepad">"); document.write("<input type="button" value=" 1 " onClick="Enter_code(1)">"); document.write("<input type="button" value=" 2 " onClick="Enter_code(2)">"); document.write("<input type="button" value=" 3 " onClick="Enter_code(3)">"); document.write("<input type="button" value=" 4 " onClick="Enter_code(4)"><br />"); document.write("<input type="button" value=" 5 " onClick="Enter_code(5)">"); document.write("<input type="button" value=" 6 " onClick="Enter_code(6)">"); document.write("<input type="button" value=" 7 " onClick="Enter_code(7)">"); document.write("<input type="button" value=" 8 " onClick="Enter_code(8)"><br />"); document.write("<input type="button" value=" 9 " onClick="Enter_code(9)">"); document.write("<input type="button" value=" 0 " onClick="Enter_code(0)">"); document.write("<input type="button" value=" C " onClick="Clear_code()"><br />"); document.write("<input type="text" name="thecode" size=9 value=""><br />"); document.write("</form></table>"); } <!-- Key-codescriptbyBartJellema--> </script> Het belangrijkste is natuurlijk kijken wanneer we succes hebben. In dit geval: if (digit==4) { if (mul==120) { window.open (code+".php", "_self") }} Hiervoor zagen we wat mul was. Mul is het product van de ingevoerde data. We hebben vier getallen (digits) nodig die samen 120 worden. Nou, even mijn rekenknobbel activeren: 120/2=60 60/3=20 20/4=5 5/5=1. En omgekeerd 1*2=2 2*3=6 6*4=24 24*5=120. Waren al die wiskundeproefwerken maar even makkelijk. We vullen (in willekeurige volgorde) 2, 3, 4 en 5 in en we zijn binnen. Of toch niet. Het blijkt dat er slechts één code werkt. En omdat je niet kunt zien welke het is, moeten we voor de code bruteforce gebruiken. We moeten alle mogelijkheden uitproberen (of tenminste tot er eentje werkt). Er zijn 36 mogelijkheden om 120 te krijgen, namelijk: 2256 - 2265 - 2345 - 2354 - 2435 - 2453 - 2526 - 2534 - 2543 - 2562 - 2625 - 2652 - 3245 - 3254 - 3425 - 3452 - 3524 - 3542 - 4235 - 4253 - 4325 - 4352 - 4523 - 4532 - 5226 - 5234 - 5243 - 5262 - 5324 - 5342 - 5423 - 5432 - 5622 - 6225 - 6252 - 6522. Het simpelste is om ze maar gewoon uit te proberen, dit kost je 5 minuten, maar dan merk je dat de echte code 3542 is. - 15 -
  • 16. Javascript 49. Jedi mindtricks Hier zien we dat de bron op een bepaalde manier gecodeerd is. Om de bron te zien moeten we hem dus decoderen. In dit geval is het een Unescape-codering. Dit decoderen we met het programma PolyCrypt. Dit programma is hier: http://www.net-force.nl/files/download/polycrypt.zip te vinden. Wanneer we de tekst in het URL-encoding vak zetten en op Decrypt drukken komt er een hele lap code. Hieronder staat alleen het login-script. <SCRIPT language=Javascript> function PassConfirm() { var y="alphabravocharliedeltae"; var x="lidocaineadrenalineekel"; var z="sidewinderamraamphoenix"; var s = ""; for (Count=0; Count < y.length; Count++) { var t1 = y.substring (Count, Count+1); var t2 = z.substring (Count, Count+1); var t3 = x.substring (Count, Count+1); if (t1 * t2 * t3 >= 5 || t3^t1 >= 3) s=s+t1; else { if (t3 == t2) s=s+t3; if (t2 == t1) s=s+t2; if (t1 == t3) s=s+t3; } } var x=document.LayoutBereich1FORM.Eingabefeld1.value if (x==s) { y = s + ".php" window.open(y,"_self") } else { alert("Dooh, try again!") } } </SCRIPT> Ik heb wederom geen zin om hier lang naar te kijken. We kopiëren de volledige broncode van PolyCrypt naar Notepad++. Het enige wat we moeten veranderen is if (x==s) { hier staat als x gelijk is aan s kom je binnen. Als we daar nou eens zorgen dat hij ons juist altijd binnen laat, behalve als x gelijk is aan s. We veranderen de == door !=. We slaan het op en openen de pagina in Firefox en vullen iets in (zou wel toevallig zijn dat het nou net toch het goede wachtwoord is) en warempel, er komt iets bij de URL te staan. Dit zetten we ook achter de URL op de online pagina, die wordt dan: http://hackquest.de/modules/HackQuest/hacking/916/ideaee.php en daar komt wat tevoorschijn. - 16 -
  • 17. Javascript 50. Security through obscuration! Nou wordt het interessant. Dit ziet er al een stuk lastiger uit. Toch vind ik de slechtste tot nu toe. Dit heeft eigenlijk niets met security te maken omdat dit gewoon niet realistisch is. Ik zou het maar gewoon vertellen: open dit keer niet meteen alles in een aparte pagina, maar klik rechts op de blauwe balk. Open hiervan de bron met Deelvensterbron bekijken. Er staat ergens: <a href="welldone.php">. Zet dit achter de URL, je krijgt: http://hackquest.de/modules/HackQuest/hacking/724/welldone.php. Dus... - 17 -
  • 18. Javascript 51. Ok, finally it's secure. Or? Wederom een beetje een slechte quest. Als we de code tevoorschijn halen, is deze behoorlijk ingewikkeld. Je kunt dat helemaal gaan decoderen, maar als je goed kijkt valt je iets op. Een normale URL op Hackquest ziet er zo uit: http://hackquest.de/modules/HackQuest/hacking/164/164.php. Maar de URL van deze specifieke quest zo: http://hackquest.de/modules/HackQuest/hacking/274/octodron/274.php. Er staat dus nog wat tussen. Als we nou dat laatste (274.php) weghalen komen we op een index. De rest spreekt voor zich, klik op de onderste link (ClickThisHiddenFile.php) en je bent binnen. - 18 -
  • 19. Javascript 52. Please don’t let me forget it. En alweer een beetje een rare. Ik denk dat je over deze quests ook uren kunt nadenken hoe ze werken en hoe je ze “eigenlijk” moet oplossen, maar wij doen het op de snelle manier. Als we het script bekijken zien we dit: <SCRIPT LANGUAGE="JavaScript"> function testEncode(form) { var dater = new Date(); Day = dater.getDate(); dater = null; var Ret = encode (form.inputbox1.value, Day) location = Ret + ".php" } function encode (OrigString, CipherVal) { Ref="0123456789abcdefghijklmnopqrstuvwxyz._~ABCDEFGHIJKLMNOPQRSTUVWXYZ" CipherVal = parseInt(CipherVal) var Temp="" for (Count=0; Count < OrigString.length; Count++) { var TempChar = OrigString.substring (Count, Count+1) var Conv = cton(TempChar) var Cipher=Conv^CipherVal Cipher=ntoc(Cipher) Temp += Cipher } return (Temp) } function cton (Char) { return (Ref.indexOf(Char)); } function ntoc (Val) { return (Ref.substring(Val, Val+1)) } </SCRIPT> Het heeft dus iets met de dag te maken. “Toevallig” staat er ook op de pagina: last edited 05.02.2008. Als we nou eens de computerklok terugzetten naar 5 februari 2008 (Javascript is een client-side taal, het script kijkt dus naar de computerklok en niet naar de klok van de server). Als dat gebeurt is vullen we het andere opvallende in, namelijk HackKing. En dan zijn we binnen. Vergeet niet de datum weer goed te zetten! - 19 -
  • 20. Javascript 53. Amazing code We zijn er bijna doorheen. Maar eerst deze nog. We openen alles in een deelvenster en bekijken de bron. Nou is er iets opvallend: <script src="www.hackquest.de/modules/HackQuest/hacking/475/stylesheet.css" /> Een .css is namelijk een stylesheet en zeker geen script, toch wordt hij zo benoemd. Een tweede ding dat me opvalt is: <base target="_self">. Bij alle andere challenges is dit namelijk <base target="_parent">. Dit zorgt ervoor dat de bovenstaande URL niet de volledige URL is, maar achter de bestaande moet komen. Dus om het .css bestand te bekijken gaan we naar: http://www.hackquest.de/modules/HackQuest/hacking/475/www.hackquest.de/modules/HackQues t/hacking/475/stylesheet.css. Daar vinden we deze code: function checkEntry(form) { var cryptpass = "Bbkwho"; var cryptpass2 = "x67x6Cx71x42x6Ex6Ax65x57"; var cryptpass3 = "156154162157151145157123166155"; var challpass = ""; var challpass2 = ""; var challpass3 = ""; for (i=0;i<=5;i++) { cryptchar = cryptpass.charCodeAt(i); cryptchar2 = cryptpass2.charCodeAt(i); if (i%2) { cryptchar--; cryptchar2++; cryptchar2++; } else { cryptchar++; cryptchar2--; cryptchar2--; } challpass = challpass + String.fromCharCode(cryptchar); challpass2 = String.fromCharCode(cryptchar2) + challpass2; } challpass2 = cryptpass2.charAt(7) + cryptpass2.charAt(6) + challpass2; for (i=1;i<=10;i++) { j = (7*i)%10; challpass3 = challpass3 + cryptpass3.charAt(j); } if ((form.pass.value === challpass) || (form.pass.value === challpass2) || (form.pass.value === challpass3)) { window.open(form.pass.value+ ".php","_self"); } else { window.open("denied.php?Pass=" + form.pass.value,"_self"); } } - 20 -
  • 21. Nou moeten we die drie variabelen eruit halen: challpass, challpass2 & challpass3. Deze zijn niet afhankelijk van de input. Dus als we het script gaan omschrijven, zou die gegeven moeten worden. We maken er dit van: <html> <head></head> <body> <script type="text/javascript"> var cryptpass = "Bbkwho"; var cryptpass2 = "x67x6Cx71x42x6Ex6Ax65x57"; var cryptpass3 = "156154162157151145157123166155"; var challpass = ""; var challpass2 = ""; var challpass3 = ""; for (i=0;i<=5;i++) { cryptchar = cryptpass.charCodeAt(i); cryptchar2 = cryptpass2.charCodeAt(i); if (i%2) { cryptchar--; cryptchar2++; cryptchar2++; } else { cryptchar++; cryptchar2--; cryptchar2--; } challpass = challpass + String.fromCharCode(cryptchar); challpass2 = String.fromCharCode(cryptchar2) + challpass2; } challpass2 = cryptpass2.charAt(7) + cryptpass2.charAt(6) + challpass2; for (i=1;i<=10;i++) { j = (7*i)%10; challpass3 = challpass3 + cryptpass3.charAt(j); } alert(challpass+' | '+challpass2+' | '+challpass3); </script> </body> </html> Hieruit alert hij drie dingen: Calvin, WellDone & Silvermoon. Alle drie doen ze eigenlijk niets wanneer je ze invult. Maar als we het derde in de URL invoeren, wordt het : http://hackquest.de/modules/HackQuest/hacking/475/Silvermoon.php. Dit lijkt bijna exact op de foutmelding die we krijgen wanneer we gewoon maar wat invullen (bijvoorbeeld ../ 475/iets.php). Toch verandert er één letter: de T. Als we naar de bron kijken zien we dit: - 21 -
  • 22. </script> <link rel="stylesheet" type="text/css" href="check.css" /> <script type="text/javascript" language="javascript"> function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); if (pair[0] == variable) { return pair[1]; } } return "Silvermoon"; } </script> Daar staat weer een vermelding naar zo’n nep stylesheet. Als we die openen krijgen we dit: a:link { color:#000000; text-decoration:none; cursor:text } a:visited { color:#000000; text-decoration:none; cursor:text } a:hover { color:#000000; text-decoration:none; cursor:text } a:active { color:#000000; text-decoration:none; cursor:text } a:focus { color:#000000; text-decoration:none; cursor:text } Er gebeurt dus iets als je over de link gaat. Als je even over de pagina gaat, merk je dat de cursor verandert als je over de middelste zin heen gaat. Even klikken en je bent binnen. - 22 -
  • 23. Javascript 54. Society matters Poeh hé, dit is me een script. Het gebruikt een wiskundig algoritme om een link weer te geven. Hiervoor gebruikt hij het opgegeven wachtwoord. Dit wordt een heleboel rekenen dus, alleen is de hint me iets te duidelijk. We weten dat het om een zin (Passphrase) gaat. En met een beetje geschiedenisles weet je dat de piramide met het oog erin voor het oog van God staat. Een plek waar dat teken ook op staat is de Amerikaanse dollar. Laten we die er eens bijpakken: En laat er nou nét een zin onder de piramide staan: Novus Ordo Seclorum… Dit is een mooi voorbeeld van social engineering. De zwakste schakel in deze challenge was de mens met haar (te) voor de hand liggende wachtwoord. - 23 -
  • 24. Javascript 55. The password is regular! De op-één-na-laatste en de tot-nu-toe moeilijkste. De bron ophalen is geen probleem en ik denk niet dat hier gemene truckjes worden gebruikt. We gaan het script regel voor regel analyseren. <script type="text/javascript" language="Javascript"> function PassConfirm() { var chk = false; var x=document.myform.input1.value Eerst wordt de variabele chk aangemaakt, waarschijnlijk afgeleid van het woord check (controleer). Het staat op false (negatief) omdat het wachtwoord nog niet gecheckt is. Var x is hetgeen wat hij uit het wachtwoordveld ophaalt. Tot nu toe niets moeilijks. Nou wordt er gebruik gemaakt van regular expressions. var re = new RegExp(".*[a-z]{2}[ ].*[d-i](?=.*)"); var m = re.exec(x); if (m != null) { re = new RegExp(".*[G-Z].*[A-Z].+[f-s](?=.*)"); m = re.exec(m[0]); Een regular expressions is een manier om patronen te beschrijven waarmee een computer tekst kan herkennen. Je stelt er als het ware voorwaardes mee op. In het begin wordt var re aangemaakt. Dat is de expressie: .*[a-z]{2}[ ].*[d-i. Vervolgens wordt gekeken of het ingevoerde wachtwoord aan die voorwaardes voldoet. In dit geval staat de .* voor een teken dat een x aantal keer voorkomt. Gevolgd door een teken dat twee keer voorkomt en binnen de alfabetische reeks van a tot en met z valt, enzovoort. Wanneer de variabele aan die voorwaardes voldoet, gaat hij naar de volgende expressie. Dit gaat zo door tot de 15e expressie, dan zet hij er .php achter en opent hij deze URL. Eerst maken we een mooie lijst van alle regulieren expressies. Op de pagina eronder staat een lijst met de beschrijvingen van alle tekens. <script type="text/javascript" language="Javascript"> .*[a-z]{2}[ ].*[d-i](?=.*) .*[G-Z].*[A-Z].+[f-s](?=.*) ([^XazhY]|[^ijkW]).+[W][A-Z].+[^i](?=.*) ([^Xa-ehY]|[^f-zW]).+[W][A-Z].+[^f](?=.*) ([Zdf]|[pass]).+[s][D]+ ([^spa])w+[ ].*[n-o][sigma] ([^f-iK-L]).*[^alamo][e-g] .*([^76]|[^A-Za]).*[^a-z][^x]{3} ([^2]|[^D-Za]|[D-Ze-f]){2}[b-r].*[^a-z][A-Bhijk].* ([^2]|[^D-Za]|[D-Ze-f]){2}[^b-q].*[ ].*[^klmadj][^dkdcewl]{2} .[3djes]([byxprln]).*[ ].*[^BhA][^dkdcewl]{2} .*([m-r])[gDaSod].*s.*[g-n]* ([A]|[^A])*[amzrbrqw][^A-Za-dg]s[^A-V]+[g-n].* [^d ] w+ [ ] [^XYZ ] w + [^ghijklm ] .{1} .*e.* </script> - 24 -
  • 25. Teken Beschrijving Normaal teken Het opgegeven teken zelf wordt gezocht [...] Een van de tekens moet worden gevonden [^...] Een teken dat niet tussen de haakjes voorkomt [A-Z] Een teken van A tot Z (...) Een bereik waarmee je tekens groepeert ? Het voorafgaande teken of bereik is optioneel + Het voorafgaande teken of bereik moet een of meerdere keren voorkomen * Het voorafgaande teken of bereik kan een willekeurig aantal keren of helemaal niet voorkomen {n,m} Het voorafgaande teken of bereik moet n en hoogstens m keer gevonden worden | Onderscheid tussen verschillende mogelijkheden ^ Caret: het begin van de tekenreeks $ Dollar: het einde van de tekenreeks : een backslash /: een slash w: een word karakter: [a-zA-Z0-9_] W: geen word karakter: [^a-zA-Z0-9_] d: digit - een cijfer [0-9] D: geen cijfer [^0-9] n: regelterugloop t: tabsprong b: woordgrens B: geen woordgrens Als we het analyseren merken we uit deze expressie: .*e.* dat er ergens een e in staat, en dat deze e niet op de eerste en laatste plaats komt. In ([Zdf]|[pass]) en ([^2]|[^D-Za]|[D-Ze-f]){2} zien we dat het wachtwoord met een Z, d, f, p, a, s, e of een letter tussen de D en Z begint. Maar door ([^spa]), [^d ] en door ([^f-iK-L]) vallen de s, p, d, a, f en de K tot en met de L af. Wat we dan over houden zijn de D tot en met de J en de M tot en met de Z. Op deze manier zou je de challenge moeten oplossen. Dit is me tot op heden nog niet gelukt. Wel weet ik dus dat er een e in zit en dat het op ng eindigt. Een andere tip is dat het een “geek”-woord is… Veel succes. - 25 -
  • 26. Extra informatie Als je meer wilt weten over hacken en gerelateerde onderwerpen kun je dat hier doen: http://www.hackquest.de De site waar het hier om draait. Er staan challenges op waarbij je door het hacken van “puzzels” meer leert. http://www.net-force.nl Een challenge site (net als HackQuest), er staan goede gidsen in de library. http://www.security.nl Blijf up-to-date over wat er in security-land gebeurt. http://hacks.mit.edu De eerste “hacks” van MIT. http://www.remote-exploit.org/backtrack_download.html Dé Linux-distro voor hackers en pen-testers. http://www.w3schools.com Leer elke gangbare internettaal. http://www.ict.teno.be/oostende/vdabrefs/jsvdab/jsNaslag_Regexp.asp Een goede gids in regular expressions. http://www.ivobrugge.be/cursusweb Een site met veel online cursussen. http://www.google.nl Google is a hacker’s best friend. http://www.rickdriessen.eu De mooiste website ooit! - 26 -
  • 27. Als extra opdracht hebben we (ik en Idzard Stoker) geprobeerd een server op te zetten. Op de volgende pagina’s volgt een kort verslag. - 27 -
  • 28. Debian We kregen een lege bestandsserver. Het doel was om deze volledig bereikbaar te maken en vervolgens te beveiligen. Hiervoor hadden we eerst een besturingssysteem nodig. Na meerdere (gratis) besturingssystemen te hebben vergeleken, kwamen we uit op Debian. Debian is een gratis distributie van Linux. Het staat bekent om zijn stabiliteit en veiligheid. Debian wordt standaard al geleverd met een behoorlijk aantal programma’s, dit is ook de reden dat wij voor deze distributie hebben gekozen. Omdat we allebei nog niet zo veel ervaring met Linux hadden werden we ervan verzekerd ook niet zo veel te hoeven instaleren. Het installeren van Debian is niet lastig. We downloaden een bestand (http://cdimage.debian.org/debian-cd/5.0.0/i386/iso-cd/debian-500-i386-netinst.iso) en dit brandden we op een CD-ROM. Deze versie bevat niet het gehele besturingssysteem, maar een programma dat ervoor zorgt dat de rest vanzelf gedownload wordt. Dit scheelt een hoop tijd, want hij downloadt en installeert het OS op deze manier tegelijk. Wanneer we de CD in de computer stoppen en hem aanzetten doorlopen we een simpel installatiemenu, vervolgens installeert hij alles en kunnen we Debian gebruiken. Het eerste waar we tegenaan liepen was het gemis van Firefox. Normaal kun je dit gewoon via pakketten instaleren, maar dit lukte niet. Toen we een CD met Windows Server 2003 aangeboden kregen zijn we daar zonder te twijfelen op overgestapt. Windows Server 2003 Het installeren van Windows is gemakkelijker dan dat van Debian. Windows is vaker gevisualiseerd dan een Linux OS (dit vooral omdat er vele miljoenen dollars in gepompt zijn). Na wat updates en programma’s als Firefox te hebben geïnstalleerd (hier lukt het wel!), hebben we Wamp geïnstalleerd. Wamp (www.wampserver.com) is een server die Apache, PHP en MySQL ondersteunt. Als we een site (HTML-bestand) in de aangewezen map zetten, kun je die site bekijken op localhost: 127.0.0.1. Wanneer we dan het IP van de server (194.123.50.2) op een andere PC invullen, gaat hij automatisch naar die site. We hebben dus een internetsite! Vervolgens instaleren we een FTP server. We downloaden FileZilla (www.filezilla-project.org) en daarvan de server-versie. Het installeren is niet moeilijk: gewoon de aanwijzingen volgen. Vervolgens zijn de poorten 20 en 21 in de router opengezet. We maken een account aan en geven het rechten. Als beveiliging stellen we in dat na tien mislukte pogingen het account voor een uur geblokkeerd blijft. Op deze manier zijn brute force-aanvallen nutteloos. Nu kunnen we ook naar de server FTP’en. Linux Vs. Windows - 28 -
  • 30. Logboek Bij dit verslag zit geen logboek waarin staat wat ik wanneer gedaan heb en hoelang ik daarover gedaan heb. Ik was namelijk al op HackQuest (en de soortgelijke site netforce.nl) actief voordat ik echt met de opdracht begon. Ik weet wel zeker dat ik meer dan de toegewezen studielasturen heb gemaakt. Ook heb ik niet elke behaalde challenge besproken. Dit, omdat ik soms al vergeten was hoe ik hem opgelost had voordat ik aan deze opdracht was begonnen. Hoe dan ook waren het er toch te veel om te documenteren (62 op dit moment). Resultaat Uiteindelijk heb ik een hoop geleerd. Echt het hacken van computers niet, maar wel een hoop over Javascript en algemene computerdingen. Zo weet ik wat meer over reguliere expressie,over aantal encryptie-protocolen en hoe je een server moet opzetten. Wel merk ik hoe frustrerend het soms is om met computers te werken. Vooral bij het hacken, wat eigenlijk puzzels zijn, kan het antwoord soms in enkele minuten zijn gevonden, maar soms heb ik meer dan vijf uur naar de oplossing gezocht. Ook heeft het configureren van de server (met name de DNS gegevens en de firewall) veel tijd gekost. Momenteel heb ik bij HackQuest 30 hacks opgelost. En bij Net-Force 32. Waarschijnlijk worden dit er in de loop van de tijd nog wel meer. Mijn voortgang kun je volgen op http://hackquest.de/user.php?op=userinfo&uname=Big-R (voor HackQuest) en op http://www.net- force.nl/members/view/13254/ (voor Net-Force).Ik wil ook nog wel wat met de server mee “spelen”. Ik wil vooral kijken of ik er, via FTP, een gameserver van kan maken en er het ouderwetse spel Ravenshiel Rainbow 6 op kan draaien. Wat ik wel mis bij deze opdracht, is toch wat extra begeleiding. Ik weet dat dit vaker niet mogelijk was, je moet namelijk veel verstand van Javascript hebben om al die challenges op te lossen. En ook was het jammer dat het zo lang duurde voor we alle DNS gegeven hadden. Al met al ben ik erg tevreden over hetgeen ik bereikt en geleerd heb. Mijn kennis over computers is door de jaren heen flink vergroot. - 30 -