Het kraken van UNIX door aanpassing van de protection bits op de disk.
=====================================================================


  Dit artikel beschrijft een mooie manier om UNIX systemen te kraken. Je moet
wel geluk hebben en een systeem kraken dat beheerd wordt door je moeder of door
een super-user met niet meer dan 0.00001 microgram hersenen! Eerlijk, een
systeem dat op deze manier te kraken is wordt NIET beheerd (ook al beweren ze
van wel)!!!!

  Ik zal globaal uitleggen hoe de kraak in zijn werk gaat en hoe je aan in-
formatie komt. Ik zou wel specifieker in willen gaan op deze zaak, maar de
manier waarop de verschillende versies van UNIX hun administratie op disk op-
slaan is nogal uiteenlopend. Je dient dit zelf op je systeem uit te zoeken. Hoe
je dat kunt aanpakken komt later. Een andere reden is meer estetisch. Het is
op deze manier mogelijk om met een klein programmeerfoutje het hele systeem
in puin te schieten! Dat is niet zo elegant. Deze tekst is dan ook meer bedoeld
voor gevorderde UNIX hackers en C fanaten. Ik hoop dat deze tekst voldoende
aanknopingspunten biedt voor de doelgroep, en voldoende obscuur is voor de
niet-doelgroep, anders gebeuren er gegarandeerd ongelukken! Voor de mensen uit
de doelgroep is deze methode een mooie uitdaging en geeft veel voldoening (dat
weet ik uit ervaring...).

  Zoals je wel weet houd UNIX zijn hele administratie bij in de vorm van zgn.
i-nodes. Deze i-nodes bevatten naast voor ons onbelangrijke informatie ook de
protection bits en twee nummers. Deze twee nummers zijn resp. het uid en het
gid. Het uid is het nummer van de eigenaar. Het gid is het nummer van de group
waartoe de eigenaar behoort. Je kunt je eigen uid en gid te weten komen door
het "id" commando (niet altijd aanwezig) in te typen. Van de twee nummers is
het uid het belangrijkste. Root heeft een uid van 0. Als je nou een shell hebt
die op de een of andere manier jouw uid 0 maakt, dan ben je effectief root! Dat
gaan we proberen te bereiken. Maar aangezien het hele beveiligingssysteem van
UNIX erop gericht is om jou er van te weerhouden om die nummers te veranderen,
doen we het OM UNIX heen! Maar natuurlijk zijn er ook mogelijkheden in UNIX om
jou ervan te weerhouden om zoiets te doen...

  Elk UNIX systeem heeft minimaal een disk, maar meestal meerdere. Kijk met
behulp van mount welke disks er aan het systeem hangen. Schrijf de namen op
een papiertje, die hebben we nodig. Nou komt het spannende: het testen van de
intelligentie van de systeembeheerder! Kijk met behulp van ls -l naar de /dev
directory. Zoek tussen al de namen die je ziet de namen die je hebt opgeschreven
uit. Ze staan er zeker! Als je er een ziet, kijk dan naar de protection bits.
Als je een van de devices niet alleen kunt lezen, maar ook kunt schrijven, dan
heb je geluk. Als bij geen van de door jou opgeschreven devices het w bit
aantsaat voor others, dan heb je pech. Zoek dan een andere manier!

  Laten we aannemen dat de hersens van de systeembeheerder versleten zijn en je
dus geluk hebt (je moeders computer kraken is toch niet interessant). Ga dan
ergens onder de /usr/include directory zoeken naar een header file met
informatie over het superblock en de i-nodestructuur. Schrijf deze op het
blaadje, beter is het wanneer je ze uitprint. Deze files geven je ook een
indicatie met wat voor een systeem je te maken hebt (System V of BSD).

  Koop/steel/leen een van de twee boeken die onderaan vermeld staan, hierin
vind je veel informatie die je nodig hebt. Het commentaar in de headerfiles
is meestal erg summier. Kies nu het device uit dat je wilt gebruiken voor je
kraak. Het moet gemount zijn aan een directory waar jij kunt schrijven. (Je kunt
natuurlijk ook deze methode gebruiken om de protection bits van directoies aan
te passen! Een directory is immers een file in UNIX!) Het makkelijkste is het
om dat device te kiezen waar je home directoy op staat. Ook het device voor
/tmp of /usr/tmp is goed. Ook andere schrijfbare directories zijn prima. 
Kopieer een shell naar die directory Maak nu een C programma dat (in pseudocode)
het volgende doet:

System V:
1. open de divecefile voor lezen (altijd eerst een testversie maken!)
2. bereken het i-node nummer (m.b.v. stat of via ls -li) van de shell die je
   gekopieerd hebt.
3. bereken m.b.v het i-node nummer de offset op de disk (zie lit. [1]) van de
   gewenste i-node
4. lees de inode in
5. zet informatie op het scherm, waardoor je kunt controleren of de i-node
   werkelijk de i-node is van de shell (goed controleren!)
6. sluit de file

BSD:
Suggesties welkom!

  Zo, je bent er nu absoluut zeker van dat je programma daadwerkelijk de
i-node van de gekopieerde shell kan vinden. Nu gaan we het programma ombouwen!
Verander het openen dat in regel 1 gebeurt van alleen lezen naar lees en
schrijven. Voeg tussen regel 5 en 6 het volgende in:

5a. zet de offset weer naar het begin van de i-node (om overschrijven mogelijk
    te maken).
5b. verander in de i-node het uid nummer (gewoon 0 maken) (evt. ook gid)
5c. schrijf de i-node naar disk. <<<< dit is HET moment!!!!

  Zo, nu niet zenuwachtig worden! Type ls -l in. Als alles goed is gegaan, dan
moet je zoiets als het volgende zien:

-rwsrwsrwx     root    system  sh  .... etc.
   ^  ^
   |  |
  belangrijk!

  De s bitjes (s-uid en s-gid) zijn belangrijk! Je kunt ze in je programma
zetten, maar veel makkelijker is het om gewoon met behulp van chmod de bitjes
te zetten. Na het kopieren is de shell toch van jou, dus kun je er mee doen
wat je wilt...

  Als alles goed is, dan heb je nu dus een shell, die van root is en die jou
root rechten geeft! Wees wel voorzichtig!

Tips:
 - Gooi na gebruik shell, C programma en executable weg. Het programma is erg
   klein, en wissen van je sporen maakt onderschepping moeilijker.
 - Wees voorzichtig, maak altijd eerst een versie die alleen leest en probeer
   het uit op diverse files op een file system. Laat het programma voldoende
   gegevens op het scherm printen, en controleer met behulp van ls. Haastige
   spoed is zelden goed. Fouten maken hoeft niet!
 - Als je op een systeem zit met een grote password file, dan kun je het
   risico nemen en een entry toevoegen. Maak hierbij geen fouten, want dat
   komt je duur te staan!
 - Als je floppies mag mounten op het systeem, dan is het nog leuker. Je kunt
   dan telkens je eigen root shell meenemen.

Literatuur:
1. The design of the UNIX operating system
   Maurice J. Bach
   Prentice Hall
   1986
   ISBN 0-13-201757-1  025

2. The design and implementation of the 4.3 BSD UNIX operating system
   Samuel J. Leffler, e.a.
   Addison-Wesley
   1988
   ISBN 0-201-06196-1

3. UNIX for super-users
   ???
   ???
   ???
   ???

  OK, ik hoop dat je hier genoeg informatie hebt. Mocht je nog specifieke vragen
hebben, dan ben ik bereikbaar op dit BBS. Deze kraak is een keer uitgevoerd door
mij op een computer van school. We mochten daar floppies op mounten, en men
dacht toen dat daarvoor het floppy device schrijfbaar moest zijn (pffff, daar
kijkt UNIX bij het mounten nog niet eens naar!). De devices werden gauw
beschermd. Maar dat maakte niets uit, ik had immers al een root shell op mijn
floppy staan!

Peter Busser

