
От деобфускации code.js до root, CVE-2023-0386
| порт | сервис | подробности |
|---|---|---|
| 22/tcp | ssh | syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | http | syn-ack ttl 63 nginx 2million.htb |
Я добавил 2million.htb в свой файл /etc/hots
Я выполнил поиск путей по 2million.htb с помощью gobuster
В ходе перечисления я обнаружил эндпоинт /invite

После перехода на страницу /invite

При изучении страницы я заметил, что она загружает JavaScript-файл с именем inviteapi.min.js, содержащий обфусцированный код:
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))
Я деобфусцировал код с помощью de4js, и получил следующий читаемый JavaScript:

function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/v1/invite/verify',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/v1/invite/how/to/generate',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
makeInviteCode() : генерирует новый инвайт-код
verefyInviteCode(code) : проверяет, действителен ли код
и чтобы понять больше, я перехватил запрос проверки:

API использует JSON-ответы
Я открыл консоль браузера и выполнил makeInviteCode()

Я заметил, что данные зашифрованы шифром ROT13

После дешифровки я нашёл эндпоинт /api/v1/invite/generate и затем сгенерировал инвайт-код

Дешифровка Base64

Ключ
Ключ 2F4BN-YI8OH-B0SCL-L8OE6 был вставлен и успешно принят

Регистрация

Домашняя страница

Страница доступа
Немногие страницы на этом сайте работают должным образом; страница доступа — вот где становится интересно

Перечисление API-эндпоинтов
Я загрузил VPN-файл, нажав кнопку connection pack, и перехватил GET request

Затем я выполнил curl-запрос с опциями verbose и silent, чтобы перечислить доступные API endpoints


Сервер ответил JSON-списком API-эндпоинтов
У администратора было 3 API-эндпоинта с методами GET, POST и PUT
Когда я попытался сгенерировать ключ администратора через админский эндпоинт /api/v1/admin/vpn/generate, ключ не был сгенерирован, поскольку я не был администратором; первый админский эндпоинт /api/v1/admin/auth подтвердил это


Выяснив правильный формат PUT request с Content-Type: application/json и required parameters, я успешно повысил своего пользователя до администратора









Я ввёл ;whoami; в поле username; мои подозрения пали на PHP-функции exec() или system(), которые часто встречаются в функциях, доступных только администратору, и зачастую не имеют надлежащей санитизации
Например, уязвимый код, вероятно, выглядел примерно так:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
Этот эндпоинт POST /api/v1/admin/vpn/generate был уязвим, и инъекция команд ОС была успешно выполнена



Поскольку в приложении были ограничения, не позволявшие использовать специальные символы, я закодировал команду полезной нагрузки обратной оболочки в base64, чтобы обойти это ограничение

Я внёс полезную нагрузку в username parameter, передав её через конвейер в base64 -d | bash для декодирования и выполнения:


Полезная нагрузка выполнилась успешно, вернув обратную оболочку под пользователем www-data user

Я попытался выполнить латеральное перемещение с пользователя www-data на пользователя admin, используя различные техники
При изучении каталога /var/www/html я обнаружил файл .env, содержащий учётные данные базы данных:

Обнаруженный пароль был успешно использован повторно для аутентификации через SSH и MySQL
SSH

MySQL

После получения первоначального доступа под пользователем admin я выполнил перечисление системы для выявления потенциальных векторов повышения привилегий
Я перепробовал все самые известные приёмы повышения привилегий: SUID-бинарники, capabilities, права sudo, cron-задания — ничего не сработало. Поэтому я проверил переменные окружения на предмет перехвата PATH или чувствительных переменных и обнаружил MAIL variable, указывающую на /var/mail/admin

Я пошёл проверить содержимое почты и заметил, что администратора предупреждали о необходимости пропатчить ядро от OverlayFS/FUSE vulnerability

версия ядра

версия ОС

Ядро так и не было обновлено, что подтверждает: администратор проигнорировал или забыл предупреждение о безопасности
Перечисление ядра показало версию 5.15.70-051570-generic, которая уязвима к CVE-2023-0386 — локальному повышению привилегий через OverlayFS/FUSE
Убедившись в наличии уязвимости, я приступил к получению публичного POC-эксплойта
Я склонировал POC и перенёс его на целевую машину
Затем я выполнил его и успешно получил root-доступ


CVE-2023-0386 - CVE-2023-0386 - OS Command Injection
Отказ от ответственности: Эта машина была скомпрометирована в рамках авторизованной среды тестирования на проникновение.
| Этап | Техника | Цель | Результат |
|---|
| 1. Разведка | Сканирование портов | 22 (SSH), 80 (HTTP) | Обнаружение сервисов |
| Поиск путей | /invite | Найдена страница приглашения | |
| Деобфускация JS | inviteapi.min.js | Раскрыты API-эндпоинты | |
| 2. Первоначальный доступ | Генерация инвайт-кода | POST /api/v1/invite/generate | Действительный инвайт-код |
| Регистрация | POST /api/v1/user/register | Создан стандартный пользователь | |
| 3. Повышение привилегий в веб-приложении | Перечисление API | GET /api/v1 | Обнаружены админские эндпоинты |
| Вертикальное повышение привилегий | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. Доступ к системе | Инъекция команд | POST /api/v1/admin/vpn/generate | username=test;id; |
| Обратная оболочка | Полезная нагрузка в Base64 | оболочка www-data | |
| 5. Латеральное перемещение | Поиск файлов | /var/www/html/.env | admin:SuperDuperPass123 |
| Повторное использование SSH | ssh [email protected] | доступ под пользователем admin | |
| 6. Повышение привилегий до root | Перечисление ядра | uname -r -> 5.15.70 | Определён CVE-2023-0386 |
| Предупреждение по почте | /var/mail/admin | Подтверждён OverlayFS/FUSE | |
| Запуск эксплойта | ./fuse && ./exp | root-оболочка |