Деобфускация 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».


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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *