Деобфускация JavaScript кода

Что такое обфускация

Обфускация — это изменение исходного кода таким образом, чтобы он становился трудно понимаемым, но чтобы при этом не изменялась его функциональность. Обфускация применяется для исходного кода на интерпретируемых (а не компилируемых) языках программирования. То есть это JavaScript, PHP, обфускация может применяться для HTML (хотя это язык разметки, а не программирования), CSS и других, программы на которых не компилируют, а запускают в виде простых текстов.

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

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

Часто при обфускации код превращается в бессмысленный набор функций и строк в которых невозможно разобраться, но которые в конечном счёте делают ровно то же самое, что и исходный код. Но есть и действительно потрясающие примеры обфускации, например, JSFuck может отобразить любой JavaScript код с помощью всего лишь шести следующих символов []()!+

К примеру, следующий код является рабочим JavaScript кодом:

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

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

Что такое деобфускация

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

Поскольку методов обфускации множество, то методов и инструментов деобфускации тоже немало и они имеют разные возможности и разную степень эффективности.

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

Пример использования деобфускации будет показан в следующей статье во время «взлома» сайта.

1. Читаемый вид JavaScript в браузере

Современные веб-браузеры умеют сжатый для экономии трафика код разворачивать в исходное состояние. Подробно об этом говориться в статье «Статический анализ исходного кода веб-сайта в браузере», поэтому рассмотрим эту возможность совсем кратко.

В Google Chrome (или Chromium) перейдите в Инструменты веб мастера (кнопка F12), выберите вкладку Sources и интересующий файл:

Нажмите на иконку с фигурными скобками { } и код будет преобразован в удобный для восприятия вид:

В Firefox эта кнопка доступна на вкладке «Отладчик»:

Результат:

2. JStillery

JStillery это продвинутый деобфускатор JavaScript через частичное вычисление.

JStillery можно использовать без установки — программа доступна как в виде онлайн сервиса от автора: https://mindedsecurity.github.io/jstillery/.

Установка JStillery

Установка в Kali Linux

git clone https://github.com/mindedsecurity/JStillery
cd JStillery
sudo npm install

Для компиляции сервера (если вам нужен не только инструмент с интерфейсом командной строки, но вы ещё хотите использовать и веб интерфейс):


npm run build_server

Для запуска сервера:

npm run start_server

После этого веб-интерфейс будет доступен по адресу http://localhost:3001

Установка в BlackArch

sudo pacman -S jstillery

Использование очень простое, просто укажите путь до файла для деобфускации:

jstillery /путь/до/файла

3. JavaScript онлайн деобфускатор deobfuscatejavascript.com

Адрес сервиса: http://deobfuscatejavascript.com/

Исходный код этого сервиса не размещён на GitHub'е, но этот продукт тоже с открытым исходным кодом, поскольку все операции выполняются в браузере, а функции деобфускации вынесены в файл http://deobfuscatejavascript.com/deobfuscate.js.

Код, проанализированный этим инструментом, будет выполнен в вашем браузере. Этот инструмент предназначен только для перехвата вызовов, выполняемых функциями eval() и write(), которые обычно используются в качестве конечной функции во вредоносных JavaScript-скриптах. Некоторые вредоносные скрипты могут не использовать эти функции и поэтому могут заразить ваш браузер.

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

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

4. JS Beautifier

Программа JS Beautifier улучшает внешний вид JavaScript кода за счёт переформатирования и проставления отступов. Также умеет распаковывать скрипты упакованные популярным пэкером от Dean Edward. Частично может деобфусцировать скрипты обработанные npm пакетом javascript-obfuscator. Применяется для улучшения читаемости JavaScript кода.

Программа доступна в виде онлайн сервиса от авторов: https://beautifier.io/

Установка JS Beautifier

Установка в Kali Linux

sudo apt install npm
sudo npm -g install js-beautify
js-beautify -h

Установка в BlackArch

Есть два варианта установки — из репозиториев и как NPM пакет. В репозиториях BlackArch доступна Python версия, её особенности в том, то html-beautify отсутствует вовсе, а css-beautify не устанавливается из-за ошибки. Также есть некоторые другие отличия.

Если вы хотите установить из стандартных репозиториев то выполните следующую команду:

sudo pacman -S python-jsbeautifier

Если вы хотите установить Node.js JavaScript версию, то выполните следующие команды:

sudo pacman -R python-jsbeautifier
sudo pacman -S npm
sudo npm -g install js-beautify
js-beautify -h

Установка в Windows

Начните с установки Python по статье «Как установить Python и PIP на Windows 10».

После установки Python и PIP выполните команды:

sudo pip3 install jsbeautifier
sudo pip3 install cssbeautifier

Использование:

jsbeautifier.py [ОПЦИИ] <ВХОДНОЙ ФАЙЛ>

Например:

js-beautify -f medium.js

Все опции программ из набора инструментов JS Beautifier вы найдёте на странице https://kali.tools/?p=5581

5. UglifyJS

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

В плане деобфускации UglifyJS умеет делать сжатый код JavaScript читаемым.

Установка в Kali Linux

sudo apt install uglifyjs

Установка в BlackArch

sudo pacman -S uglify-js

Пример запуска: для улучшения вида файла используется опция -b; файл (или несколько файлов) нужно указывать перед опциями:

uglifyjs medium.js -b

Также программа может обрабатывать файлы переданные по стандартному вводу:

cat medium.js | uglifyjs -b

Другие опции и возможности на странице https://kali.tools/?p=5594

Заключение

Если я пропустил какой-то инструмент для деобфускации кода JavaScript, то пишите в комментариях!

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

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.