
От деобфускации 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, я успешно повысил своего пользователя до администратора