Приветствую, коллеги!
Обфускация часто встречается в JS-файлах web-приложений и CTF, как усложнение таска. На самом деле, тут необходимо всего лишь знать инструменты для получения более понятного вида скрипта. Как раз про инструменты и базовые методы обфускации/деобфускации мы и поговорим в новой статье. Приятного изучения!
Немного теории
Обфускация — это метод, который используется для того, чтобы сделать код более сложным для восприятия человеком, но при этом сохранить его функциональность с технической точки зрения, хотя производительность может снизиться. Обычно это достигается автоматически с помощью инструмента обфускации, который принимает код в качестве входных данных и пытается переписать его таким образом, чтобы он был гораздо сложнее для восприятия, в зависимости от его структуры.
Коды, написанные на многих языках, публикуются и выполняются без компиляции на interpreted языках, таких как Python, PHP, и JavaScript. В то время как Python и PHP обычно находятся на стороне сервера и, следовательно, скрыты от конечных пользователей, JavaScript обычно используется в браузерах на стороне клиента (Client-side), следовательно код отправляется пользователю и выполняется в открытом виде. Именно поэтому для JavaScript очень часто используется обфускация.
Существует множество причин, по которым разработчики могут захотеть обфусцировать свой код. Одна из распространённых причин — скрыть исходный код и его функции, чтобы предотвратить его повторное использование или копирование без разрешения разработчика. Это усложняет реверс-инжиниринг исходной функциональности кода. Другая причина — обеспечить дополнительный уровень безопасности при аутентификации или шифровании, чтобы предотвратить атаки на уязвимости, которые могут быть обнаружены в коде.
Однако чаще всего обфускацию используют для вредоносных действий. Злоумышленники часто обфусцируют свои вредоносные скрипты, чтобы системы обнаружения и предотвращения вторжений не могли их обнаружить.
Методы обфускации
Рассмотрим для начала обфускация со стороны Blue Team.
Сокращение объема кода JavaScript
Распространённым способом уменьшить читабельность фрагмента кода JavaScript, сохранив при этом его полную функциональность, является минификация JavaScript.
Code minification означает, что весь код находится в одной (часто очень длинной) строке. Code minification более полезен для длинного кода, так как если бы наш код состоял из одной строки, то после минификации он бы не сильно изменился.
Минифицировать код JavaScript можно с помощью многих инструментов, например javascript-minifier. Мы просто копируем наш код, нажимаем Minify и получаем минимизированный результат справа.
Упаковка кода JavaScript
Теперь давайте запутаем наш код, чтобы его было сложнее понять и прочитать. Для этого используем BeautifyTools.
Мы можем попробовать запутать код с помощью того же инструмента в JSF, а затем запустить его повторно. Мы заметим, что выполнение кода может занять некоторое время, что показывает, как запутывание кода может повлиять на производительность.
Обфускаторы
- https://utf-8.jp/public/aaencode.html (сильно замедляет выполнение кода)
- https://utf-8.jp/public/jjencode.html (сильно замедляет выполнение кода)
Методы тестирования обфускации JavaScript
Теперь рассмотрим методы атак на обфусцированные файлы.
Тестирование кода JavaScript
Можно идти в лоб и запустить обфусцирванный код в JSConsole, один из онлайн компиляторов JS-кода. Это позволит узнать как работает JS-код.
Структурирование кода
Мы видим, что весь имеющийся у нас код написан в одну строку. Это называется Minified JavaScriptкодом. Чтобы правильно отформатировать код, нам нужно Beautify отформатировать наш код. Самый простой способ сделать это — использовать Browser Dev Tools.
Например, если бы мы использовали Firefox, мы могли бы открыть отладчик браузера с помощью [ CTRL+SHIFT+Z ], а затем нажать на наш скрипт secret.js. Скрипт отобразится в исходном форматировании, но мы можем нажать на кнопку '{ }' внизу, которая Pretty Print преобразует скрипт в правильное форматирование JavaScript:
Кроме того, мы можем использовать множество онлайн-инструментов или плагинов для редакторов кода, таких как Prettier или Beautifier.
Однако код по-прежнему не очень удобен для чтения. Это связано с тем, что код, с которым мы имеем дело, был не только минимизирован, но и обфусцирован. Поэтому простого форматирования или улучшения кода будет недостаточно. Для этого нам понадобятся инструменты для деобфускации кода.
Деобфускация
Инструмент UnPacker хорошо справляется со стой задачей. Пока что лучше него ничего не нашёл.
Так мы добились читаемого вида кода в интересующем нас JS-скрипте.
Выводы
Обфускация часто применяется для функционала web-приложения с клиентской стороны. Такое решение явно затрудняет анализ кода для выявления возможных уязвимостей.
Важно понимать, что на клиентской стороне не будет реализован критичный функционал. Он будет храниться на сервере, к коду которого будет иметь доступ админы.
Основная проблема — обфускация создаёт ложное чувство безопасности. Команда разработчиков думает, что код защищён, и начинает меньше следить за реальными уязвимостями. Бывает так, что компании обфусцируют код для галочки и он всё ещё остаётся читаемым для статического анализа.
Важно понимать, что такая мера защиты кода только усложняет жизнь злоумышленнику, а не защищает приложение полностью.
Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!