View Single Post
[SIZE=3]Hva er hacking?[/SIZE]

Hva som faktisk er hacking er et mye diskutert tema og alle strides om hva som skal skilles under hacking og cracking. Slik jeg oppfatter miljøet nå er hacking tenkt på "alt" av programmering og operasjoner som krever en større IT-kompetanse enn gjennomsnittet. Cracking blir da brukt når man bruker denne kunnskapen ondsinnet og for å skaffe seg rettigheter man ikke skal ha.

Jeg vil også benytte meg av sjansen til å anbefale boken "Hacking Exposed" som forklarer veldig godt og inngående og lever absolutt opp til påskriften "Informational Gold!".

Brukte begrep:
Exploit - En svakhet i et program.
Daemon - En tjensteserver som kjører i bakgrunnen. F.eks. Apache(HTTP) og PureFTP
DoS, Denial Of Service - Her skaffer man ikke rettigheter, men sørger for at offeret blir lammet og satt ut av funksjon.
Flooding - Flom, gi offeret en alt for stor mengde informasjon på kort tid.
Spoofe - Få en TCP/UDP pakke til å oppgi feil IP-addresse som avsender.

[SIZE=3]Hvilke typer hacking/cracking finnes?[/SIZE]

Det finnes mye som inngår under disse begrepene. Jeg vil prøve å dele de største inn i forskjellige grupper:

1. Rettighetscracking
1.1 Ved å knekke passord
1.2 Ved bruk av trojaner
1.3 Ved å utnytte svakheter(exploit) i daemons
1.4 Social Engineering

2. Tjenestenekting(DoS)
2.1 Nettverksflooding
2.2 Ressursflooding
2.3 Båndbredde

3. Serial/lisens-cracking
3.1 Serial
3.2 Trial-utvidelse

Appendix
4. Nettsider
4.1 Bruteforce
4.2 Variable scope
4.3 Cookie spoofing
4.4 Session hijack
4.5 SQL injection

1. Rettighetscracking
1.1 Ved å knekke passord
Det er i prinsippet 3 måter å knekke et passord på. Den ene er å gjette.

Den andre er å bruke et verktøy som bruteforcer. Et program som bruteforcer et spørsmål kan benytte seg av en ordliste og tilfeldig generering av tegn. Så prøver den å lage en tekststreng som stemmer med passordet. Siden de fleste algoritmer for passord er en-veis orienterte, altså at de ikke kan løses(dekrypteres). Resultatet av et kryptert passord kaller man en hash. For å bruteforce et passord må man først generere en tekststreng som man enkrypterer med den aktuelle algoritmen og sammenligner med hashen man har innhentet fra en passordfil på offermaskinen.

Den tredje kan brukes når det brukes svake algoritmer som kan dekrypteres direkte utifra hashen. Dette er så godt som dødt da ingen bruker slike algoritmer lenger.

Typiske verktøy: John The Ripper, L0phtCrack(@stake LC), knoppix-std


1.2 Ved bruk av trojaner
Når man skaffer seg rettigheter ved hjelp av en trojan utnytter man en tjeneste/funksjon på offerets maskin for å få trojanen til å kjøres. Det foregår da med at man f.eks. sender en trojan per e-post og kaller den "c00lpic.jpg.exe". De fleste windowsbrukere har på at de ikke vil se filendingen så de ser bare "c00lpic.jpg" og reagerer kanskje ikke på at det er en kjørbar fil. De velger å starte den og da legges trojanen inn. Den kan være en enkel telnet server som lytter på en høy port; f.eks.: 31337. Da kan vi logge oss inn på maskinen som er smittet.

Windows er utmerket til å knekkes med trojaner da IE er integrert helt inn i kjernen til Windows og om man da har en svakhet i IE så man får kjørt en trojan kan den kjøre så godt som uten begrensninger. F.eks. endre passordfilene.l


1.3 Ved å utnytte svakheter(exploit) i daemons
En exploit er en svakhet i en program som gjør at vi kan få programmet til å gjøre noe helt annet enn utvikleren hadde tenkt vi skulle. En daemon er da en tjeneste som står å går på offermaskinen og kan ofte være HTTP serveren, f.eks. Apache eller IIS. De letteste er FTP-servere som tillater anonym tilkobling da det er veldig uproblematisk å utveksle filer med offermaskinen.

En exploit kan være hva som helst og man må kunne en god del programmering for å oppdage og utnytte exploiter. De simpleste exploitene er ganske enkelt f.eks. PHP sider som bruker .php?site=main.php og en kode som ser slik ut: "include($_GET['site']);". Da kan man sende .php?site=/etc/httpd.conf og vil få kunne se hele konfigurasjonen til Apache. Eller mer interessante filer.

Exploit kan også være en buffer overflow og disse er mye brukt. Buffer overflows oppstår ofte når programmererene blir litt late og ikke gidder å ha noe særlig streng sjekking av variabler som kommer fra brukeren. For eksempel dette stykke C-kode:
Buffer overflow i C
char user[128];
char realuser[128] = "bufferoverflow";
char passwd[128];
char realpasswd[128] = "bufferoverflow";

if (strcmp(user, realuser,128)==0 && strcmp(passwd, realpasswd,128)==0)
Vis hele sitatet...
Denne koden kan bli utsatt for buffer overflows om brukeren taster inn et brukernavn og passord 255 tegn med like tegn. Ganske enkelt fordi da vil variabelen user gå over sin predefinerte grense i stacken(minnet) og skriver over innholdet i realuser og samme for passordet. Så når det kommer til sammenligningen sammenligner den bare en lengde like tegn.

Buffer overflows kan også brukes til å kjøre programmer som ikke er tiltenkt.

Gode sider om nye exploits: www.packetstormsecurity.com, www.cert.org, securityfocus.com


1.4 Social Engineering
Dette er på vei fram da folk er som oftes lettere å lure enn å finne svakheter i systemer. Social Engineering er rett og slett at man bruker de mennekeskene som er involvert i et system for å få seg tilgang man ikke skal ha. Mange har hatt suksess med å ringe "Hei, jeg jobber firma XXX og skal utføre vedlikehold på serveren deres. Kan jeg få passordet?". Mange gir fra seg passord ved slike banale ting som dette. Men Social Engineering er så mye mer også. Kevin Mitnick's bok om social engineering(The Art of Deception: Controlling the Human Factor) er en kjempebok som jeg anbefaler for alle.

2. Tjenestenekting(DoS)
2.1 Nettverksflooding
Her benytter seg man av svakheter i nettverksprotokollene og f.eks. setter opp et vanvittig antall gående tilkoblinger som gjør at offeret etterhvert rett og slett ikke klarer å koble seg til flere brukere. Og da har man oppnådd målet. Her bruker man f.eks. et SYN-angrep.


2.2 Ressursflooding
Her prøver man å få offeret til å bli helt opptatt med enten et vanvittig antall pakker eller setter 2 tjenester på offeret opp mot hverandre så de bruker opp minnet og trekker all CPU-kraft fra de andre prosessene. Man kan spoofe en UDP-pakke.


2.3 Båndbredde
Et angrep som går på båndbredde går ut på en ting, overbelaste linja til offeret. Dette er ofte DDoS(Distributed Denial Of Service) angrep som bruker store nettverk av flere hundre maskiner(som man gjerne har cracket seg tilgang til) over hele verden og man får alle maskinene til å sende en enkel ping pakke til offeret som må svare til alle maskinene.

3. Serial/lisens-cracking
3.1 Serial
For å finne serials brukes en metode som heter "Serial fishing". Man starter en debugger og ber den bryte av (setter en breakpoint) like før programmet sjekker om serialen stemmer. Så går man steg for steg videre (man stepper) igjenom til programmet sammenligner den riktige serialen med den man har skrevet inn, og leser ut den riktige. Eller så kan man ganske enkelt modifisere programmet og endre slik at man elegant hopper over sjekkingen(crack).

Brukte verktøy: SoftIce, w32dasm

3.2 Trial-utvidelse
Dette er mye av det samme som over. Man leter etter sammenligninger av tidspunkter og enten modifiserer datoen langt fram i tid eller hopper over hele sjekkingen.

Brukte verktøy: SoftIce, w32dasm


4. Nettsider
4.1 Bruteforce
Man kan faktisk bruteforce en login, men det er vanvittig ueffektivt og alt for lett å bli oppdaget. Det er en helt uaktuell metode å bruke så jeg vil ikke gå nærmere inn på det.


4.2 Variable scope
I PHP har man noe så dumt som en register_globals innstilling. Denne var i gamle dager default satt til on, noe som innebærer at alle variabler, uansett hvor de kommer fra kan kalles ganske enkelt med $variabelnavn. Etterhvert som PHP ble utbredt skjønte man hvor dumt dette var og endret til til off. Men mange lærte seg PHP i denne perioden og koder ofte som register_globals er satt til on og endrer konfigurasjonen til serveren.

For å skjønne denne typen må man forstå begrepet variable scope. Kort fortalt så er det hvor variabler kan brukes etter hvor de blir opprettet. Man kan f.eks. sette en variabel utenfor en funksjon og ikke få tilgang til den i funksjonen. Dette er i og for seg greit, men problemet oppstår da variabler fra brukeren f.eks. gjennom en form som bruker POST metoden. Med register_globals satt til on kan man ganske enkelt bare skrive $var, men ved register_globals satt til off må man skrive $_POST['var']. Da er man sikker på at variabelen kommer fra en POST kilde.

Forskjellen på POST og GET er ganske enkelt at data som kommer via POST blir sendt i bakgrunnen, mens data via GET blir lagt til i addressen(.php?var=foo).

Og da har man problemet med register_globals=on. En har skrevet et stykke kode som ser slik ut:
login.php
<?php
session_start();
session_register("loggetinn");

if ($brukernavn == "admin" AND $passord == "passord")
{
$loggetinn = true;
}

if ($loggetinn == true)
{
//vis adminside
}
?>
Vis hele sitatet...
En som vil utnytte dette kan gjøre det ganske enkelt slik: .php?loggetinn=true. Man har ingen måte å sjekke hvor $loggetinn kommer fra og dermed kan den like gjerne komme fra GET som sessionen. Den sikre måten å gjøre dette på vil være:
login.php
<?php
session_start();
session_register("loggetinn");

if ($_POST['brukernavn'] == "admin" AND $_POST['$passord'] == "passord")
{
$_SESSION['loggetinn'] = true;
}

if ($_SESSION['loggetinn'] == true)
{
//vis adminside
}
?>
Vis hele sitatet...

4.3 Cookie spoofing
Det å hijacke en session eller cookie innebærer at man utnytter svakheter her. For å demonstrere bruker jeg et av nivåene i ngsec spillet. Her får man en cookie med innholdet "Credentials=hfre%3Dthrfg" når man logger seg inn med feil brukernavn. Det etter likhetstegnet ser for folk flest ut som bare rot, men med litt tenking finner man fort ut at det er rot13 algoritme. %3D er ganske enkelt =, bare prøv. Så vi har "hrfe=thrfg". Vi setter igang med å dekryptere det og vi vil få user=guest. Ok! På siden får man beskjed om at "You are not user: admin" så da vil vel vanlig logikk tilsi at vi må endre user=guest til user=admin? Om vi krypterer admin med rot13 blir det ngzva. Vi leser litt i RFC 2616 som beskriver HTTP/1.1 standarden og finner ut hvordan cookies blir sendt. Vi hiver opp en telnetklient, åpner en kobling til webserveren på port 80 og sender dette til den:
telnet quiz.ngsec.com 80
GET /gameX/levelX/validate_TakeDown_cookie.php HTTP/1.1
Host: quiz.ngsec.com
Referer: http://quiz.ngsec.com/gameX/levelX/v...dmin&password=
Cookie: Credentials=hfre%3Dnqzva
Vis hele sitatet...
Serveren tror dermed vi sender den en cookie hvor user er satt til admin og scriptet vil tro vi er innlogget som gyldig bruker.


4.4 Session hijacking
For å hijacke en session må man bruke en sniffer for å finne ut når noen logger seg inn og har en sesjon gående mot serveren og ta ut Session ID. Da vil serveren tro at du er brukeren som logget inn tidligere. Metoden er mindre brukt da sniffing er kjedelig og krever mye tid.
Sider som bruker SSL(HTTPS) kan ikke bli utsatt for slikt.


4.5 SQL injection
Dette er en av "vanskligste", men samtidig en veldig lett teknikk. Man leter ganske enkelt etter svakheter i hvordan scriptet kjører spørringer mot SQL serveren og utnytter disse. Jeg vil igjen bruke et nivå fra ngsec til å forklare dette. Man har en loginside som henter ut brukerinformasjon fra databasen med denne spørringen:

"SELECT pass FROM $table WHERE user='$login'".

Dette kan man fort utnytte. Vi logger oss inn slik med dette brukernavnet:

' union select '5F4DCC3B5AA765D61D8327DEB882CF99
og passord: "password". 5F4DCC3B5AA765D61D8327DEB882CF99 er MD5 hashen av "password". Det man gjør ved dette er lage en spørring som vil se slik ut:

"SELECT pass FROM $table WHERE user='' union select '5F4DCC3B5AA765D61D8327DEB882CF99"

Det man ganske enkelt gjør her er å ikke hente noe fra tabellen $table, men den henter bare ut MD5 hashen vi ga den. Scriptet sammenligner hashen fra SQL med hashen den får av passordet vi prøvde å logge inn med. Vi har ganske enkelt lurt systemet.

En enklere SQL injection kan se slik ut:
"select * from users where brukernavn = '$brukernavn' AND passord = '$passord'"

Brukernavn: a' or '1' = '1
Passord: a' or '1' = '1

Dersom magic quotes er av og man ikke bruker addslashes() så blir queryen slik:

"select * from users where brukernavn = 'a' or '1' = '1' AND passord = 'a' or '1' = '1'"

SQL injections kan foregå på mange måter, dette er bare to av mange.


[SIZE=3]Framgangsmåte for et angrep[/SIZE]

Mange tenker nok fortsatt "Hvordan hacker jeg en maskin?". Det vil jeg gå litt inn på nå. I utgangspunktet så er det 1 kriterie som alltid må være oppfylt for at man skal kunne få tilgang til en maskin fra utsiden. Det er at maskinen må kjøre en eller annen form for tjeneste som lytter mot internett(http, ftp, ssh, telnet, etc).

De fleste hjemmemaskiner og kontormaskiner med Windows har ikke slikt. Man har rett og slett ingen mulighet å få en samtale med maskina uten å infisere den f.eks. med en trojan via e-post først.

Et angrep går som oftes i 4 steg.
1. Footprinting
2. Scanning
3. Enumeration
4. Angrepet

1. Footprinting
Footprinting innebærer å finne ut mye informasjon om offeret. Hvem som eier serveren, hvem som er ISP, hvilke DNS-servere offeret bruker, hvordan nettverket ser ut rundt offeret og slike ting.

Brukte verktøy: whois, nslookup, host, traceroute


2. Scanning
Nå begynner å gå mer nøyaktig inn på offermaskinen og finne ut detaljerte ting om den. Da finner man ut hvilke tjenester maskinen kjører og hvilke versjoner av daemonene som blir brukt.

Brukte verktøy: nmap, strobe, icmpquery, udp_scan(satan), netcat


3. Enumeration
Nå begynner man å såvidt sjekke muligheten for å komme inn på maskinen. En sjekker etter delte volum, anonyme brukere på ftp, snmp daemons, og lignende.

Brukte verktøy: netcat, rpcinfo, finger, enum, NTRK


4. Angrepet
Alt etter hva man fant ut i de foregående stegene utfører man angrepet. Det kan være usikre kontoer, buffer overflows, dårlige konfigurerte daemons, etc.


Håper det hjelper dere og jeg vil takke til Scha og |d13m0b for innspill!