Henry Isakoff 🥕 Verkkoon tunkeutuminen

| Verkkoon tunkeutuminen | 9 min

Kivun pyramidi, timantteja ja violetti porkkana

Tuskan pyramidi Tuskan pyramidi kuvaa tietoturvaloukkauksien aiheuttamaa haittaa eri tasoilla. Pyramidin pohjalla on suuri määrä pieniä häiriöitä, kun taas kärjessä on harvinaisempia, mutta erittäin tuhoisia loukkauksia.

Timanttimalli Timanttimalli pyrkii kuvaamaan tietoturvauhkien eri elementtejä (toimija, infrastruktuuri, haavoittuvuus, kyberhyökkäys) ja niiden välisiä suhteita. Mallin avulla pyritään ymmärtämään uhkia kokonaisvaltaisemmin ja tunnistamaan hyökkäyksen eri vaiheet sekä mahdolliset torjuntakeinot.

Timanttimalli keskittyy siihen, kuinka nämä elementit ovat yhteydessä toisiinsa. Hyödyllinen hyökkäysten analysoinnissa ja jäljittämisessä.

Timanttimalli

Apachepalvelin ja lokitiedot

Aikaisemmalla kurssilla asensimme apachepalvelimen. Eli nyt keskitymme vain oletus-sivun kautta porttiskannaukseen.

Kalin peruspaketeissa olikin jo asennettu Apache2 - joten tämä piti vain asettaa aktiiviseksi.

sudo systemctl start apache2

Teen raporttia verkon yli toiseen tietokoneeseen (host), jossa ajan käyttöjärjestelmää unraidin virtualisointialustan läpi. Olen luonut oman kali.koti DNS merkinnän verkkooni yhdistämään virtuaalikoneen ipv4 osoitteeseen. Eli voin käyttää osoitteena jatkossa localhost tai kali.koti. Ajan ensimmäisenä

curl localhost

Koppi

Seuraavaksi avaan omalla Mac OS koneellani (välittäjä) nettiselaimessa http://kali.koti ja samalla seuraan client (kali) koneen lokitietoja

tail -f /var/log/apache2/access.log

Access log

Avataan kaksi ensimmäistä lokitietoa suoraan tähän.

Ensimmäinen

::1 IPv6-loopback-osoite (vastaa 127.0.0.1:tä IPv4:ssä). Tämä tarkoittaa, että pyyntö tuli samalta koneelta. ”- -” Ei käyttäjätunnistusta. [08/Apr/2025:23:43:16 +0300] Aikaleima. "GET / HTTP/1.1" Pyyntö on GET-tyyppinen, kohde on juurikansio (/), ja käytetty protokolla on HTTP 1.1. 200 HTTP-vastauksen tila on 200 OK, eli pyyntö onnistui. 10958 Vastauksen koko on 10958 tavua. "-" Ei viittaajaa (Referer), eli käyttäjä on todennäköisesti kirjoittanut osoitteen suoraan selaimeen tai käyttänyt kirjanmerkkiä. "curl/8.13.0-rc3" Käyttäjäagentti (User-Agent) kertoo, että pyyntö on tehty curl-ohjelmalla, versio 8.13.0-rc3

Eli tämä oli minun client koneelta SSH ylitse lähettämä ”curl localhost” pyyntö.

Toinen rivi 42.0.0.117 - IPv4-osoite, joka viittaa omaan client koneeseeni (jolla otin yhteyden selaimella). ”- -” - Ei käyttäjätunnistusta. [08/Apr/2025:23:44:09 +0300] - Aikaleima. "GET / HTTP/1.1" - Pyyntö on GET-tyyppinen, kohde on juurikansio (/), ja käytetty protokolla on HTTP 1.1. 200 - HTTP-vastauksen tila on 200 OK, eli pyyntö onnistui. 3383 - Vastauksen koko on 3383 tavua. "-" - Ei viittaajaa. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15" - Käyttäjäagentti kertoo, että pyyntö on tehty Safari-selaimella macOS-käyttöjärjestelmässä.

Tässä otin yhteyden virtuaalikoneeseen suoraan DNS reitillä nettiselaimesta.

Nmap ja lisätietoja.

Nmapilla skannataan virtuaalikoneen kaikki portit agressiivisesti komennolla (-A).

sudo nmap -A localhost

Koska olen tehnyt dns linkkauksen niin ajan myös. Ihan vain koska haluan nähdä mitä eroa näissä on.

sudo nmap -A kali.koti

Nmap

*Ainoana erona näyttää olevan kali.koti ja ip-osoitteen selvennys.

Skannauksessa selvisi kaksi avointa porttia 22 ja 80.

Portti 22 Nmap tunnisti portin SSHn käytössä ja kertoo, että siinä on käynnissä OpenSSH 9.9p2 Debian 1. Se myös listaa SSHn julkiset avaimet joita käytetään yhteyden todentamiseen ja salaustyypin.

Olen yhteydessä koneeseen Mac OS koneeltani SSH yhteydellä ja suoralla avaimella. Tämä ei kuitenkaan näytä salaista SSH avainta, mutta osoittaa salaustyypin.

Vaikka ’ssh-hostkey’ ei ole skripti, nmap on hakenut tämän tietueen portista.

Portti 80

HTTP standardi portti. Eli Apache2 ottaa yhteyden salaamattomasti kiinni tuosta portista. Nmap kertoo, että siinä on käynnissä Apache httpd 2.4.63. Se myös tunnisti HTTP-otsikon "It works” joka on oletusotsikko Apache-palvelimella.

’http-title’ ja ’http-server-header’ ovat tässä tapauksessa skriptejä jotka näkyvät.

Nmap skannuksessa pidin myös päällä toisessa ikkunassa

tail -f /var/log/apache2/access.log

Tail

Nmap on lähettänyt erilaisia HTTP-metodeita (GET, OPTIONS, POST, PROPFIND, OHEE). Esimerkiksi

POST /sdk HTTP/1.1" 404 ...

On puhdas tiedustelupyyntö sdk/robots txt päätepisteisiin. Nyt vastauksena on tullut ’404’ joka viittaa että mitään ei löytynyt.

Toisena esimerkkinä,

GET /.git/HEAD HTTP/1.1" 404 ...

Etsii git-repositorion jäänteitä. Mitään näistä ei löydy.

Kokonaisuudesta löytyy myös monta ’200’ merkintää, jotka viittaavat onnistuneeseen pyyntöön.

"GET / HTTP/1.1" 200 10977 ...

Viittaa palvelimen juurikansioon ja, että html sivu/hakemisto löytyy.

’Options’ vastaava viitta CORS mekanismeihin.

CORS (Cross-Origin Resource Sharing) on mekanismi, joka mahdollistaa verkkosivujen (joilla on eri alkuperä) pääsyn toistensa resursseihin. Se on turvallisuusominaisuus, joka estää haitalliset sivustot saamasta pääsyä arkaluontoisiin tietoihin toisilta sivustoilta.

Eli onnistuneet vastaukset ovat merkki toimivasta kokonaisuudesta.

’Ohee’ on ainoa joka antaa tuloksen 501. Tämä viittaa, että palvelin ei edes tue tätä http-metodia. Eli tätä ei edes yritetty.

Tshark mukaan

Ajetaan nmap etsinnän aikana myös tshark. Käytetään loopback liitäntää ’lo’ ja kirjoitetaan tiedostoon ’nmap_skannaus.pcap’.

tshark -i lo -w nmap_skannaus.pcap

Nmap ajon jälkeen lopetetaan tshark haistelu ja luetaan nmap_skannaus.pcap. Koska tshark hakee kaiken datan niin keskitytään nyt ”nmap” paketteihin.

tshark -r nmap_skannaus.pcap -Y 'frame contains "nmap"'

nmap

Yritin ensin "frame contains nmap”, mutta tämä ei tuonut yhtään tulosta. Eli hakutulos pitää laittaa omien tagien alle ”nmap”.

Tarkastelussa voidaan huomata pari asiaa. Ensinnäkin nmap käyttää monipuolisesti HTTP-pyyntöjä. Edelliset esimerkit GIT/Robots txt ovat tässäkin nähtävillä (pyynnöt 2122 ja 2132).

2122 7.372267560    42.0.0.28 → 42.0.0.28    HTTP 222 GET /.git/HEAD HTTP/1.1
2132 7.372310305    42.0.0.28 → 42.0.0.28    HTTP 223 GET /robots.txt HTTP/1.1

Myös nmapin oma testi on nähtävissä pyynössä 2120. Nmap yrittää luoda omaa uniikkia tiedostoa ja hakea sitä ’/nmaplowercheck1744149335’. Tästä ainakin huomaa nmap työkalun käytön.

2120 7.372256285    42.0.0.28 → 42.0.0.28    HTTP 237 GET /nmaplowercheck1744149335 HTTP/1.1

Edellisessä puhutuista CORS/Options hauissa, pyynnöt 2122, 2130 ja 2134 kartoittavat tuettuja ominaisuuksia.

2112 7.372037628    42.0.0.28 → 42.0.0.28    HTTP 217 OPTIONS / HTTP/1.1
2130 7.372304103    42.0.0.28 → 42.0.0.28    HTTP 217 OPTIONS / HTTP/1.1
2134 7.372316305    42.0.0.28 → 42.0.0.28    HTTP 275 OPTIONS / HTTP/1.1

2182 testaa lomakkeen lähetystoimintoa

2128 7.372290415    42.0.0.28 → 42.0.0.28    HTTP 371 POST / HTTP/1.1 (application/x-www-form-urlencoded)

Net grep ja nmap.

Käytetään myös ngreppiä. Tämä on myös verkkopakettianalysaattori ja laitetaan päälle nmap porttihaistelun ajaksi.

sudo ngrep -d lo -i "nmap" port 80

Tässä myös käytetään loopback ominaisuutta, etsitään nmap tägejä ja keskitytään porttiin 80.

nmap

Pyyntöjä tulee ngrepille 303, joista 25 tarttuu meidän hakuehtoihin.

Ngrep näyttää TCP-liikenteen ja porttikopit molemmilta puolilta.

Robots txt haistelu toimikoot nyt esimerkkinä.

########
T 42.0.0.28:35260 -> 42.0.0.28:80 [AP] #67
  GET /robots.txt HTTP/1.1..Host: kali.koti..User-Agent: Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)..Connection: close....

Portista 35260 on lähtenyt pyyntö portille 80 jossa haettu tiedostoa ’robots txt’. Jokaisessa pyynnössä on käytetty eri porttia pyyntöön.

User-agent ja maski.

Kokeillaan maskata haku normaaliksi web-selaimeksi. Löydän artikkelin ’User-agent explanation’ jossa selitetään user-agent konteksti. Voimme siis ilmoittaa selaimemme olemaan Chrome v91.0.4472.124 - Windows 10 käyttöjärjestelmältä.

sudo nmap -A localhost --script-args http.useragent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"

Ajaessani tshark komennon etsimään nmap kaappauksia. Löydän nyt vain yhden. Kuten aikaisemminkin löysimme: ainoastaan nmap:in oma tiedostokirjoitusyritys jää, koska nmap kirjoittaa tiedostoon oman nimensä. Tässä tapauksessa ’nmaplowercheck1744152903’

nmap

Myös apachen lokit tallentavat käyttäjä-agentin muuna kuin nmappina.

Lokit

Vältetään nmap kirjoitus sen omalla nimellä.

Koska ainoa lokiin jäävä merkintä nmaplowercheck### on ainoa merkintä nmapista tsharkkiin. Etsitään kyseinen komento nmapin kansiosta grepillä

grep -r "nmaplowercheck" /usr/share/nmap/

Koppi!

Muokataan tiedostoa

sudoedit /usr/share/nmap/nselib/http.lua

Nanossa etsitään ctrl + f ’nmaplower’

Löytyi!

Ja muutetaan ’nmaplowercheck’ = ’securitycheck’. Muutan myös pari muutakin riviä jossa merkitään ’nmap’ ja merkitsen ’security’ merkinnällä.

Löytyi!

Tallennan tiedoston ja ajan nmapin toisella käyttäjä-agentilla thsarkin ollessa päällä. Tallennan lokin tiedostoon nmap_skannaus_sala.pcap

Nyt voimme verrata tiedostoja nmpa_skannaus.pcap/nmap_skannaus_ua.pcap (pelkällä toisella user-agentilla) ja nmap_skannaus_sala.pcap (user agent maskaus sekä nmap skriptin muutos).

Ei jälkeä!

Ei jälkeä.

Loppusanat.

Vaikka maskasimme nmapin käyttämään muita termejä, nämä termit kuitenkin jäävät lokiin. Kyseinen skripti olisi melkein kannattanut poistaa kokonaan jos olisi tarvetta pysyä pilvien alapuolella. Toki tämäkin hyvin lyhyt pintaraapaisu näiden kokonaisuuksiin.

Tässä kaikista eniten huomataan, että tshark ja muut valvontaprotokollat ottavat sisäänsä aivan kaiken. Dataa on niin paljon, että kokonaisuuksia tarkastetaan yleisillä termeillä. Grep ”nmap” on helppo etsiä, mutta tajuaako etsijä etsiä muilla termeillä on varmasti jo ensimmäinen piilottava tekijä.

Lähteet

https://terokarvinen.com/verkkoon-tunkeutuminen-ja-tiedustelu/ https://detect-respond.blogspot.com/2013/03/the-pyramid-of-pain.html https://lockheedmartin.com/content/dam/lockheed-martin/rms/documents/cyber/LM-White-Paper-Intel-Driven-Defense.pdf https://www.threatintel.academy/wp-content/uploads/2020/07/diamond-model.pdf

https://www.kali.org http://unraid.net/

https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS https://www.wireshark.org/docs/man-pages/tshark.html https://ngrep.sourceforge.net/usage.html https://mahim-firoj.medium.com/user-agent-explanation-e6b21dd8f6b8

Lokitiedostojen ja laajojen pcap tiedostojen analysoinnissa käytetty apuna Gemma3:27b ja Mistral-Small:24b tekoälymalleja omassa lokaalissa koneessa. Ollama toiminut suorana kääntäjänä ja välissä käytetty WilmerAI tulkitsemaan mallien välistä dataa.

http://ollama.com/ https://ollama.com/library/mistral-small:24b https://ollama.com/library/gemma3:27b https://github.com/SomeOddCodeGuy/WilmerAI

Marked toimii md muuntimena sivulla. https://github.com/markedjs/marked

Sivuston kuvat optimoitu https://optimage.app

Käytetty aika 3h 10min