Приветствую!
В данной статье разберём приёмы деобфускации кода на примере Skills Assessment на платформе HTB Academy модуля JavaScript Deobfuscation.
Немного теории
Обфускация — это метод, который используется для того, чтобы сделать код более сложным для восприятия человеком, но при этом сохранить его работоспособность, хотя производительность может пострадать. Обычно это достигается автоматически с помощью инструмента обфускации, который принимает код в качестве входных данных и пытается переписать его таким образом, чтобы он был гораздо сложнее для восприятия, в зависимости от его структуры.
В то время как Python и PHP обычно находятся на стороне сервера и, следовательно, скрыты от конечных пользователей, JavaScript обычно используется в браузерах на стороне клиента (Client-side), следовательно код отправляется пользователю и выполняется в открытом виде. Именно поэтому для JavaScript очень часто используется обфускация.
Существует множество причин, по которым разработчики могут захотеть обфусцировать свой код. Одна из распространённых причин — скрыть исходный код и его функции, чтобы предотвратить его повторное использование или копирование без разрешения разработчика. Это усложняет реверс-инжиниринг исходной функциональности кода. Другая причина — обеспечить дополнительный уровень безопасности при аутентификации или шифровании, чтобы предотвратить атаки на уязвимости, которые могут быть обнаружены в коде.
Деобфускация в web-приложениях — это процесс восстановления читаемого и понятного кода из обфусцированного (запутанного) JavaScript. Проще говоря, это обратный процесс обфускации.
В тестировании деобфускация нужна для понимания реальной логики клиентского кода, который намеренно скрыт или запутан.
Часто во фронтенде скрывают:
- генерацию подписи API-запроса
- токены / nonce
- алгоритмы шифрования
- антибот-проверки
- анти-автоматизацию
- проверка ролей
- ограничения интерфейса
- feature flags
- скрытые API-endpoint'ы
Деобфускация позволяет понять, как формируется подпись, воспроизводится алгоритм, обнаружить небезопасные проверки на клиенте, найти тестовые или забытые эндпоинты
Решаем Skills Assessment
При входе на предоставленную тачку видим веб-интерфейс без каких-либо кнопок.
В таком случае, посмотрим запросы, которые нам прилетали в BurpSuite:
В корневой странице видим вызов скрипты api.min.js. О нём нас спрашивали в первом вопросе лабы:
Идём дальше! Смотрим что нам отдаёт этот JS-файл:
Явно код обфусцирован. Давайте попробуем выполнить его на JSConsole. Не смотря на обфускацию его работоспособность должна быть сохранена.
Кстати, некоторые обфускаторы оставляют характерные «сигнатуры» — типичные названия функций, структуру вызовов или шаблон кода. Например, популярные packer-алгоритмы часто используют функцию с названием вроде pack, p,a,c,k,e,r или похожую конструкцию с большим количеством аргументов. По этой структуре можно довольно быстро определить, что код был упакован конкретным инструментом или методом.
Алгоритм P.A.C.K.E.R. — это один из классических методов обфускации JavaScript, который стал популярным благодаря своей простоте и характерной структуре. Его основная идея — не зашифровать код, а «упаковать» его так, чтобы он стал трудночитаемым для человека, но при этом продолжал корректно выполняться в браузере.
Сначала берётся исходный JavaScript-код. Затем из него выделяются часто повторяющиеся слова — ключевые слова (function, return), имена переменных, названия функций и другие фрагменты. Эти слова заменяются короткими идентификаторами — чаще всего числами или однобуквенными обозначениями.
После этого формируется словарь соответствий: список оригинальных слов, разделённых специальным символом (обычно |). В итоге весь код превращается в строку с заменёнными токенами и оборачивается в специальную функцию-распаковщик.
Когда такой скрипт запускается в браузере, происходит обратный процесс. Встроенная функция по словарю восстанавливает оригинальные слова и собирает исходный код, после чего выполняет его через eval.
И это даёт нам ещё один флаг:
Отдаём его в следующем вопросе таска.
Далее пробуем деобфусцировать код при помощи unPacker:
Нам открывается ещё одна интересная функция flag, которую можем воспроизвести. Главное не забыть вызвать функцию при помощи console.log и поменять кавычки на двойные (иначе интерпретатор выдаёт ошибку синтаксиса).
И ещё один флаг:
Изучим деобфусцированный код ещё глубже, чтобы найти логику приложения. Тут явно указан метод POST и файл keys.php, который при запросе что-то нам отдаст в ответе.
Воспроизведем такой запрос, чтобы проверить наш домысел:
А даёт он нам какой-то ключ и ещё один ответ на вопрос таска:
Попробуем декодировать его с формата HEX в читабельный вид:
Получаем фразу, которую нужно отправить POST-запросом на хост с параметром key, где укажем саму фразу, при помощи ключа -d по условию задачи.
А вот и последний флаг!
Выводы
На примере разобранного кейса мы разобрали один из методов обфускации, познакомились с инструментами для анализа и деобфускации кода. Деобфускация — это действительно полезный навык как для пентестера, так и для разработчика, который хочет понимать, как обходят и как защищают клиентскую логику приложения.
Однако на практике всё гораздо глубже. Обфускация бывает многоуровневой. Beautifier и Unpacker помогают на первом этапе, но дальше начинается ручной анализ. Здесь уже важно понимание того, как работает JavaScript и браузерная среда.
В пентесте деобфускация — это не «расшифровка ради расшифровки», а способ ответить на конкретные вопросы, например: Где формируется токен? Можно ли воспроизвести подпись запроса? Есть ли логика безопасности только на клиенте? Можно ли обойти антибот-проверку?
Обфускация усложняет анализ, но не делает код недоступным. Любая логика, исполняемая в браузере, в конечном итоге может быть изучена. Поэтому безопасность должна строиться на серверной валидации, корректной архитектуре и криптографически стойких механизмах — а не на сокрытии кода.
В итоге деобфускация — это не просто технический приём. Это навык аналитического мышления: умение разбирать сложное на части, восстанавливать причинно-следственные связи и видеть реальную логику за слоем запутывания.
Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!