Деобфускация 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
sudo apt install npm 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 кода de4js
de4js — это деобфускатор исходного кода JavaScript и распаковщик.
Поддерживает (деобфусцирует) результат работы следующих инструментов, сервисов, методов:
- Eval, используются, например, в Packer, WiseLoop
- Array, используются, например, в Javascript Obfuscator, Free JS Obfuscator
- _Number
- Packer
- Javascript Obfuscator
- Free JS Obfuscator
- Obfuscator.IO (но не всегда срабатывает, так как этот сервис часто обновляется, что требует обновление деобфускатора)
- My Obfuscate
- Кодирование URL, используются, например, в bookmarklet
- JSFuck
- JJencode
- AAencode
- WiseLoop
Информацию об установке и запуске вы найдёте на странице программы: https://kali.tools/?p=6514
de4js запускается как небольшой сервер к которому можно подключиться веб-браузером. То есть у программы веб-интерфейс.
Перейдите в папку с программой:
cd bin/de4js
Запустите сервер:
npm start
В веб-браузере откройте адрес http://127.0.0.1:4000/de4js/
В веб-интерфейсе выберите один из способов ввода обфусцированного исходного кода:
- String — вставить код в окно веб-интерфейса
- Local File — выбрать локальный файл на компьютере
- Remote File — указать адрес удалённого файла
Ниже вы можете указать способ, которым выполнялась обфускация кода JavaScript:
- None
- Eval
- Array
- Obfuscator IO
- _Number
- JSFuck
- JJencode
- AAencode
- URLencode
- Packer
- JS Obfuscator
- My Obfuscate
- Wise Eval
- Wise Function
- Clean Source
- Unreadable
Либо вы можете нажать кнопку «Auto Decode», чтобы de4js автоматически определила способ обфускации. Деобфусцированный код будет показан в окне ниже.
Дополнительные опции, которые вы можете включить или выключить:
- Line numbers — показывать номера строк
- Format Code — форматирование и подсветка синтаксиса кода
- Unescape strings — перевод строк из экранированных последовательностей в нормальный вид
- Recover object-path — восстановить object-path
- Execute expression — вычислить выражения
- Merge strings — объединить (слить) строки
- Remove grouping — удаление группировки
de4js онлайн: https://lelinhtinh.github.io/de4js/
4. JavaScript онлайн деобфускатор deobfuscatejavascript.com
Адрес сервиса: http://deobfuscatejavascript.com/
Исходный код этого сервиса не размещён на GitHub'е, но этот продукт тоже с открытым исходным кодом, поскольку все операции выполняются в браузере, а функции деобфускации вынесены в файл http://deobfuscatejavascript.com/deobfuscate.js.
Код, проанализированный этим инструментом, будет выполнен в вашем браузере. Этот инструмент предназначен только для перехвата вызовов, выполняемых функциями eval() и write(), которые обычно используются в качестве конечной функции во вредоносных JavaScript-скриптах. Некоторые вредоносные скрипты могут не использовать эти функции и поэтому могут заразить ваш браузер.
Этот инструмент предназначен для помощи аналитикам в деобфускации вредоносных JavasSripts. Он не интерпретирует HTML, поэтому любой HTML должен быть удалён для правильной деобфускации кода. Скрипт также не должен содержать синтаксических ошибок для получения правильных результатов.
Чёрные дыры, целевые страницы и наборы эксплойтов используют обфускацию для того, чтобы скрыть намерения кода при уменьшении вероятности обнаружения. Когда скрипты упакованы, исходный код становится данными, а видимый код — процедурой деобфускации. Во время выполнения данные распаковываются подпрограммой, и результатом является строка, которая должна быть обработана (исполнена) как код для выполнения. Этот инструмент во время процедуры деобфускации возвращая эту строку кода, но не запускает её выполнение. Полученный код показывается с подсветкой синтаксиса.
5. Деобфускация Obfuscator.IO
Автор сайта Obfuscator.IO ищет программы, которые способны деобфусцировать созданный на этом сервисе код и постоянно меняет, исправляет обфускацию, в результате чего инструменты по деобфускации перестают работать. Поэтому инструменты автоматической деобфускации (включая de4js) обычно отстают от самой последней версии, то есть могут деобфусцировать код созданный ранее на Obfuscator.IO, но не могут деобфусцировать последнюю версию кода. Но это не означает, что это надёжный инструмент чтобы обезопасить свой исходный код — регулярно появляются проекты, которые обходят все методы деобфускации. К тому же, специалисты на заказ могут деобфусцировать любой код.
6. 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
7. 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».
Связанные статьи:
- Как увидеть JavaScript код, написанный с использованием непечатных символов (90.2%)
- Обратный инжиниринг с использованием Radare2 (Reverse Engineering) (52.8%)
- Обратный инжиниринг с использованием Radare2 (Reverse Engineering) (часть 2) (52.8%)
- Анализ трояна Snojan (52.8%)
- Анализ вредоносной программы под Linux: плохое самодельное шифрование (52.8%)
- Как пользоваться Puppeteer: установка и быстрый старт (RANDOM - 7.9%)