Найти в Дзене
B0rn2beR00T

Решение JavaScript Deobfuscation (Skills Assessment)

Приветствую! В данной статье разберём приёмы деобфускации кода на примере Skills Assessment на платформе HTB Academy модуля JavaScript Deobfuscation. Обфускация — это метод, который используется для того, чтобы сделать код более сложным для восприятия человеком, но при этом сохранить его работоспособность, хотя производительность может пострадать. Обычно это достигается автоматически с помощью инструмента обфускации, который принимает код в качестве входных данных и пытается переписать его таким образом, чтобы он был гораздо сложнее для восприятия, в зависимости от его структуры. В то время как Python и PHP обычно находятся на стороне сервера и, следовательно, скрыты от конечных пользователей, JavaScript обычно используется в браузерах на стороне клиента (Client-side), следовательно код отправляется пользователю и выполняется в открытом виде. Именно поэтому для JavaScript очень часто используется обфускация. Существует множество причин, по которым разработчики могут захотеть обфусциров
Оглавление

Приветствую!

В данной статье разберём приёмы деобфускации кода на примере Skills Assessment на платформе HTB Academy модуля JavaScript Deobfuscation.

Немного теории

Обфускация — это метод, который используется для того, чтобы сделать код более сложным для восприятия человеком, но при этом сохранить его работоспособность, хотя производительность может пострадать. Обычно это достигается автоматически с помощью инструмента обфускации, который принимает код в качестве входных данных и пытается переписать его таким образом, чтобы он был гораздо сложнее для восприятия, в зависимости от его структуры.

В то время как Python и PHP обычно находятся на стороне сервера и, следовательно, скрыты от конечных пользователей, JavaScript обычно используется в браузерах на стороне клиента (Client-side), следовательно код отправляется пользователю и выполняется в открытом виде. Именно поэтому для JavaScript очень часто используется обфускация.

Существует множество причин, по которым разработчики могут захотеть обфусцировать свой код. Одна из распространённых причин — скрыть исходный код и его функции, чтобы предотвратить его повторное использование или копирование без разрешения разработчика. Это усложняет реверс-инжиниринг исходной функциональности кода. Другая причина — обеспечить дополнительный уровень безопасности при аутентификации или шифровании, чтобы предотвратить атаки на уязвимости, которые могут быть обнаружены в коде.

Деобфускация в web-приложениях — это процесс восстановления читаемого и понятного кода из обфусцированного (запутанного) JavaScript. Проще говоря, это обратный процесс обфускации.

В тестировании деобфускация нужна для понимания реальной логики клиентского кода, который намеренно скрыт или запутан.

Часто во фронтенде скрывают:

  • генерацию подписи API-запроса
  • токены / nonce
  • алгоритмы шифрования
  • антибот-проверки
  • анти-автоматизацию
  • проверка ролей
  • ограничения интерфейса
  • feature flags
  • скрытые API-endpoint'ы

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

Решаем Skills Assessment

При входе на предоставленную тачку видим веб-интерфейс без каких-либо кнопок.

-2

В таком случае, посмотрим запросы, которые нам прилетали в BurpSuite:

-3

В корневой странице видим вызов скрипты api.min.js. О нём нас спрашивали в первом вопросе лабы:

-4

Идём дальше! Смотрим что нам отдаёт этот JS-файл:

-5

Явно код обфусцирован. Давайте попробуем выполнить его на JSConsole. Не смотря на обфускацию его работоспособность должна быть сохранена.

Кстати, некоторые обфускаторы оставляют характерные «сигнатуры» — типичные названия функций, структуру вызовов или шаблон кода. Например, популярные packer-алгоритмы часто используют функцию с названием вроде pack, p,a,c,k,e,r или похожую конструкцию с большим количеством аргументов. По этой структуре можно довольно быстро определить, что код был упакован конкретным инструментом или методом.
Алгоритм P.A.C.K.E.R. — это один из классических методов обфускации JavaScript, который стал популярным благодаря своей простоте и характерной структуре. Его основная идея — не зашифровать код, а «упаковать» его так, чтобы он стал трудночитаемым для человека, но при этом продолжал корректно выполняться в браузере.
Сначала берётся исходный JavaScript-код. Затем из него выделяются часто повторяющиеся слова — ключевые слова (function, return), имена переменных, названия функций и другие фрагменты. Эти слова заменяются короткими идентификаторами — чаще всего числами или однобуквенными обозначениями.
После этого формируется словарь соответствий: список оригинальных слов, разделённых специальным символом (обычно |). В итоге весь код превращается в строку с заменёнными токенами и оборачивается в специальную функцию-распаковщик.
Когда такой скрипт запускается в браузере, происходит обратный процесс. Встроенная функция по словарю восстанавливает оригинальные слова и собирает исходный код, после чего выполняет его через eval.

И это даёт нам ещё один флаг:

-6

Отдаём его в следующем вопросе таска.

-7

Далее пробуем деобфусцировать код при помощи unPacker:

-8

Нам открывается ещё одна интересная функция flag, которую можем воспроизвести. Главное не забыть вызвать функцию при помощи console.log и поменять кавычки на двойные (иначе интерпретатор выдаёт ошибку синтаксиса).

-9

И ещё один флаг:

-10

Изучим деобфусцированный код ещё глубже, чтобы найти логику приложения. Тут явно указан метод POST и файл keys.php, который при запросе что-то нам отдаст в ответе.

-11

Воспроизведем такой запрос, чтобы проверить наш домысел:

-12

А даёт он нам какой-то ключ и ещё один ответ на вопрос таска:

-13

Попробуем декодировать его с формата HEX в читабельный вид:

-14

Получаем фразу, которую нужно отправить POST-запросом на хост с параметром key, где укажем саму фразу, при помощи ключа -d по условию задачи.

-15

А вот и последний флаг!

-16

Выводы

На примере разобранного кейса мы разобрали один из методов обфускации, познакомились с инструментами для анализа и деобфускации кода. Деобфускация — это действительно полезный навык как для пентестера, так и для разработчика, который хочет понимать, как обходят и как защищают клиентскую логику приложения.

Однако на практике всё гораздо глубже. Обфускация бывает многоуровневой. Beautifier и Unpacker помогают на первом этапе, но дальше начинается ручной анализ. Здесь уже важно понимание того, как работает JavaScript и браузерная среда.

В пентесте деобфускация — это не «расшифровка ради расшифровки», а способ ответить на конкретные вопросы, например: Где формируется токен? Можно ли воспроизвести подпись запроса? Есть ли логика безопасности только на клиенте? Можно ли обойти антибот-проверку?

Обфускация усложняет анализ, но не делает код недоступным. Любая логика, исполняемая в браузере, в конечном итоге может быть изучена. Поэтому безопасность должна строиться на серверной валидации, корректной архитектуре и криптографически стойких механизмах — а не на сокрытии кода.

В итоге деобфускация — это не просто технический приём. Это навык аналитического мышления: умение разбирать сложное на части, восстанавливать причинно-следственные связи и видеть реальную логику за слоем запутывания.

Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!