Burp Suite Loader 1.7.31 - тот еще конь

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Следующая публикация содержит образец вируса. Если вы решите пообщаться с ним, вы сделаете это на свой страх и риск. Не запускайте его на своем компьютере, по крайней мере, используйте виртуальную машину. Ниже приведена запись анализа RAT.

А ты используешь Burp Suite? А лицензионный? 
Если нет, аккуратнее там, как минимум Burp Suite Loader 1.7.31 - тот еще конь. 
Хотя, вполне ожидаемо, чаще всего малварь распространяется в крякнутом софте.

 В кейгене есть файл с именем, virus.txt который содержит то, что, как представляется, является ссылкой, на общее сканирование файла keygen.jar


 Однако хэш вируса отличается от фактического файла, указывая, что это проверка другого файла.
 (ПРИМЕЧАНИЕ: когда я изначально посещал страницу, все проверки были чистыми, а имя файла соответствовало файлу burp-loader-keygen1.7.31.jar. На этой странице говорится, что последний анализ был сегодня, так что это может иметь какое-то отношение к нему.)

> shasum -a 256 burp-loader-keygen1.7.31.jar 1bf764e77a543def4c623e6e207b1b72999f6550cf49651b88d53f80ae10e4d7 burp-loader-keygen1.7.31.jar
Ящики хранятся в виде zip-файлов, поэтому мы можем извлечь банку с помощью unzip.

 > cp burp-loader-keygen1.7.31.jar burp-loader-keygen1.7.31.zip
 > unzip burp-loader-keygen1.7.31.zip
 Archive: burp-loader-keygen1.7.31.zip
 creating: META-INF/
 extracting: META-INF/MANIFEST.MF
 creating: burploader/
 extracting: burploader/Burploader.class
 extracting: burploader/Data.bin

 Существует файл класса, который можно декомпилировать, я буду использовать jad, который установлен на kali.
> jad burploader/Burploader.class 
Вот важная часть декомпилированного java-кода

Перед этой частью будет base64 кодировка другого jar file, связанного с keygen.
Это сохраняется в m.
 Функция декодирования декодирует base64 и записывает ее в файл Data.jar.
 Этот раздел кода содержит команды powershell для загрузки и запуска сценария powershell http://imonty.cn/wp-includes/pomo/script/dcss/js.js 
(расширение .js, но на самом деле это powershell), а также запуска keygen.

 Давайте загрузим этот код и посмотрим.

 Это отбрасывает еще два файла в новый каталог c: \ ProgramData \ WindowsNT .
 Файлы:
http://imonty.cn/wp-includes/pomo/script/dcss/co.js сохранен как WindowsNT.ini и http://imonty.cn/wp-includes/pomo/script/dcss/co.vbs сохранен как WindowsNT.vbs
Затем он запускает визуальный базовый скрипт (co.vbs)

Здесь у нас запутанный визуальный базовый код. Самый простой способ deobfuscate - заменить часть кода, который выполняет что-то, что печатает (это может не работать во всех случаях, но это очень полезный метод). Здесь, очевидно, часть, которая выполняет деобфузированный код, представляет собой EVAL(ExEcUTE(www)) (обведенную кружком)

 (что этот файл на самом деле делает, состоит в том, чтобы разделить длинную строку на каждый, *а затем оценить выражения в результирующем списке и превратить результаты математических выражений в символы.
Наконец, запуская результирующую строку из конкатенации этих символов)

 Для того, чтобы напечатать строку вместо выполнения можно заменить
EVAL(ExEcUTE(www)) с wscript.echo www и запустить его.


Это запустит другой загруженный файл co.js (сохраненный как WindowsNT.ini) в powershell.
 Итак, давайте посмотрим на co.js.
 Этот файл большой, поэтому я загрузил его здесь.
 Я gziped и b64ed файл, чтобы сделать его загруженным красиво.
вы должны сделать: cat co.ps1.gzip.b64 | base64 -d | gunzip > co.ps1 чтобы прочитать его.
 Я также переименовал co.js в co.ps1, чтобы сделать ./в PowerShell работу легче.


 iex (псевдоним для invoke-expression) - это функция, которая оценивает код powershell, поэтому нам нужно заменить его, write-output чтобы распечатать его, а затем запустить файл. Измененный код должен выглядеть так:



Я работал на новой виртуальной машине, поэтому мне пришлось разрешить выполнение ненадежных сценариев powershell.
 После запуска powershell в качестве администратора:


PS E:\burp\burploader> ./co.ps1 > co.2.ps1

Я загрузил полученный файл здесь.
У нас есть еще один слой обфузии.
 Начало этой игры выглядит так:


На этот раз Invoke-Expression вместо этого вызывается вместо iex этого write-output.


 Теперь запустите его.
 PS E:\burp\burploader> ./co.2.ps1 > co.3.ps1
 Файл
 Первое, что нужно заметить, это то, что новый файл состоит из трех разделов, разделенных пустыми строками. Я сделал ошибку, пропустив первый раздел и не смог найти нужный код  (позже это было найдено ). Вместо того, чтобы пытаться деобшибить весь файл сразу, я узнал, что было бы лучше разделить его на 3 небольших файла и сделать их по одному.
Первый раздел: конец раздела выглядит следующим образом .



У нас нет того, что выглядит так хорошо, как на invoke-expression этот раз, однако, поскольку выполнение будет выполнено в последний раз, скорее всего, вызов будет на одном из концов, слева - с дефоксицированным кодом в качестве аргумента или справа , с кодом, входящим в стандартный ввод. В этом случае левый просто состоит из скобки, поэтому давайте проверим самый правый оператор после трубы (обведено кругом).
.( $PsHOmE[21]+$PShOMe[30]+'X') 
Интересно. посмотрим, что $PsHOmE[21]+$PShOMe[30]+'X' оценивает.

 PS E:\burp\burploader> $PsHOmE[21]+$PShOMe[30]+'X'
 ieX
поэтому мы должны заменить .( $PsHOmE[21]+$PShOMe[30]+'X') с write-output



В результате получается код.



 Давайте повторим ту же идею.
.( $eNv:PuBliC[13]+$eNv:pUBLiC[5]+'x') в начале

 PS E:\burp\burploader> $eNv:PuBliC[13]+$eNv:pUBLiC[5]+'x' iex
 поэтому замените его на write-output 



 После выполнения есть больше обмана, так что сделайте это снова в новом файле, заменяющем
 & ($pShoME[21]+$pShoME[34]+'X') в конце write-output
И снова с &( $pShoME[21]+$pSHOMe[30]+'X') самого начала

 Второй раздел: (начинается с [String] :: JoIN ('', ([Char []] (127, 105)
 Конец второго раздела выглядит следующим образом



 Замените его .((gV '*mDR*').nAme[3,11,2]-joIn'') в конце write-output , пока он все еще запутан. Итак, посмотрите на конец .( $pShoME[4]+$PsHoMe[30]+'X'), замените, write-output
 а затем выполните. И тогда нам нужно сделать это снова, заменив его
&( ([sTrINg]$verbosePREFerencE)[1,3]+'x'-JOIN'') в начале write-output 
и в последний раз, заменив . ( $Env:comsPec[4,15,25]-JOiN'') в конце write-output 

 Третий раздел:
 начало третьего раздела выглядит так:


 Заменить .( $PsHome[4]+$PShoME[34]+'X') в начале write-output и выполнить.
Этот раздел теперь выглядит довольно читаемым, в частности, если мы заменим имена функций.
Это насколько мы можем получить с помощью этого метода. Имена функций должны быть найдены с помощью ручного анализа и развязывания имен переменных, а содержимое должно быть выполнено с помощью другого метода, например, вручную или написания сценария.

 Выход конкатенации все это обратно вместе здесь

Здесь является модификацией кода , который я сделал без запутанных переменных и составляющих имена для некоторых функций.
Virustotal не обнаруживает сценарий powershell как вирус



Однако некоторые эвристики обнаруживают здесь dropper



Первый раздел содержит только переменные, однако имена и значения очень искажены.



Из анализа функций мы разработали, что переменная $dragon_middle содержит домены, к которым RAT будет пытаться подключиться (проходя через них, пока он не сможет подключиться к одному).
Переменные $private и $public содержат ключи шифрования и дешифрования для данных, передаваемых RAT.
 @Leeky вытащил их, зациклившись на массивах и распечатав содержимое.
Результаты приведены здесь
 @ Cry0l1t3 Прошел через домены и выделил это для того, чтобы иметь другой хост, чем все остальные.
 @dtm сделал более полный список переменных здесь
 Я не знаю достаточно о Windows, чтобы сказать, как это было сделано. Но в зависимости от формата, я думаю, он использовал команду для печати среды (исправьте меня, если я ошибаюсь).
 Хотя в нем нет всех элементов, $dragon_middle он содержит некоторые другие интересные переменные, такие как последовательности, которые он использует, чтобы найти ip-адрес жертвы https://api.ipify.org / и страну http://apinotes.com/ipaddress/ip.php?ip=.
 Он также сделал пакетный захват, пытаясь связаться с сервером.

Второй раздел содержит код для шифрования и дешифрования, а третий раздел содержит остальную часть кода.
 RAT использует RSA для связи с сервером. Как ни странно, я думаю, что открытый ключ и закрытый ключ были названы неверным способом.

 Открытый ключ и закрытый ключ имеют разные модули, что указывает на то, что они, скорее всего, связаны с разными парами ключей. Сообщения, отправленные на сервер, зашифровываются открытым ключом сервера ( $secret в коде) и дешифруются личным ключом сервера (хранятся на сервере). Сообщения, отправленные в RAT, зашифровываются открытым ключом RAT (на сервере) и дешифруются с помощью закрытый ключ RAT ( $public в коде) Теоретически, если это было сделано правильно, сообщение на сервер не сможет быть расшифровано (конечно, RAT может быть изменен, чтобы просто распечатать его). Однако ключи используют небольшие простые числа и, таким образом, слабы. Когда начинается RAT, первое, что он пытается сделать, это настойчивость.


Он делает это, добавляя местоположение файла vbs в реестр в ключе. HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Run\DifenderUpdate
Затем он выполняет сканирование сценария в этом месте для запуска при входе в систему.
Я не уверен, что делает первая часть функции сохранения. Я думаю, похоже, что это отключает защиту в защищенном виде Word, но я не уверен, зачем это нужно. Затем крыса проверяет отладчики, проверяя имена запущенных процессов на список отладчиков и другие инструменты. Если он найден, он выключает компьютер
Затем он пытается подключиться к одному из серверов, перечисленных в $dragon_middle. Всякий раз, когда ошибки кода в будущем также будут делать это снова (по-видимому, потому, что он считает, что сервер может быть заблокирован или заблокирован) Затем он пытается зарегистрироваться на сервере, прежде чем принимать и обрабатывать команды









 Принимаются следующие команды:
 reboot  перезагружает компьютер
 shutdown выключает компьютер
 clean пытается стереть как можно больше из C :, D :, E: \ и F: \ перед перезагрузкой
 screenshot снимает скриншот и отправляет его на сервер
 upload переносит файл с сервера на жертву
Если команда не является одной из тех, она пытается выполнить в powershell

 Я запускал keygen с политикой выполнения по умолчанию (помните, когда мне пришлось ее менять) и проверял каталог c: \ ProgramData \ WindowsNT, чтобы проверить, удалось ли RAT выполнить.
Каталог не был создан, поэтому кажется, что он может быть заблокирован окнами. ## #Adendum: Я упомянул, что крипто слабо, вот как вы его сломаете .
 Я не собираюсь , открыть основы того , как RSA работает, но есть 0x00sec учебник и википедии много хорошей информации.

В RSA два простых числа pи используются для расчета n = p*q используемых пробелов, должны храниться в секрете. Они также используются для расчета λ(n) = λ(p*q) = lcm(p-1, q-1). Публичный экспонент e и частный экспонент d связаны друг с другом следующим уравнением d == e^(-1) (mod λ(n)).
 В случае RAT n мало (в результате использования небольших простых чисел), поэтому его легко можно разложить на pи q.
Они могут быть использованы для расчета λ(n) и то последнее уравнение можно использовать для расчета d с e.
 Использование математики

 # from $private variable in rat
 e = 959
 n = 713
 # factor n 
# list(factor(n)) returns prime factors as a list of tuples of (factor, amount) 
# we just want the factors
 p, q = [a[0] for a in list(factor(n))] 

 # calculate λ(n)
 l = lcm(p-1, q-1)
 # calculate d
 print('d = {}'.format(inverse_mod(e, l)))

 дает d = 149
 С помощью закрытого ключа сервера мы можем написать сценарий для дешифрования сообщений, отправленных на сервер.
Если мы используем тот же процесс для получения открытого ключа RAT, мы можем MiTM трафик между RAT и сервером.
 Вот скрипт расшифровки в python

 def decrypt(ciphertext):
 key = 149
 n = 713
 decrypted = [] 
 for i in range(0, len(ciphertext)):
 num = int(ciphertext[i])
 t = pow(num, key, n)
 decrypted.append(chr(t))
 return ''.join(decrypted)

 nums = input().split()
 print(decrypt([int(i) for i in nums]))

 В pcap @dtm на сервер отправляется следующее сообщение:
 340 362 396 383 105 598 219 362 581 362 518 73 35 73 504 220 515 665 504 515 515 35 515 518 133 335 316 665 515 665 220 665 316 181 665 335 515 38 335 335 335 316 362 663 362 145 180 396 637 383 219 362 581 362 180 383 432 432 145 219 367 362 590
 Выполнение этого через скрипт дает расшифровку как {"TOKEN":"70e0a413a11e17db9313439c3b1fbbb9","ACTION":"COMMAND"}

0x00sec.org 

Комментарии

  1. А ты используешь Burp Suite? А лицензионный?
    Если нет, аккуратнее там, как минимум Burp Suite Loader 1.7.31 - тот еще конь.

    ОтветитьУдалить
  2. Burp Suite Loader 1.7.31 - Тот Еще Конь >>>>> Download Now

    >>>>> Download Full

    Burp Suite Loader 1.7.31 - Тот Еще Конь >>>>> Download LINK

    >>>>> Download Now

    Burp Suite Loader 1.7.31 - Тот Еще Конь >>>>> Download Full

    >>>>> Download LINK JQ

    ОтветитьУдалить

Отправить комментарий