Malware: NewOrder.jar (o mistério dos números)

(por p3tr0v e JB VELHO NERD)

A alguns dias atrás, foi postado no grupo do Telegram um arquivo com o nome de NewOrder.jar, eu e o JB VELHO NERD pegamos o fomos estudando a questão.
De cara, nós vimos que o código estava em um nível de ofuscação altamente complexo, na nossa opinião, não foi escrito por um grupo pequeno, não foi escrito por um grupinho de adolescentes recém formados na faculdade de TI, é algo grande.

Ao decompilar o código, percebemos que em todo o código havia apenas uma única variável String com mais de 3000 posições, contendo apenas números. Esta String possui o seguinte valor:

01230240256784910111221311141151516171181219132021222313132416251226727028291030312328331534143513360373839224023541233842431944134532466471548491050315152485305455435634574658596042616261146324642565136610010110210511010167108971151156750685269254370771727374754476127748782779228066843811882838453858687368889289070911612369293949380395969764822598999210016101102757210010310410510611310197113116111114467611197100101114107271088710986522311011152891021121135511431115115101116659999101115115105981081011168411711852119119251201212112240391231241181251131261271412812991130381213113211813313013413513612013713896221395214014111814214313514414514047146147241481411491015010515115215310015415515624157158149215996160115161162163164165416216641961676816816978170171901721673317313417411122175611761771731788417912216515591180181182183108184157185177186187471021818880189190191140192152541935819453195401661961431971981991942001682620119840202203116204198318220520620714020820921019721121214976213213170214103101116831211151161011096710897115115761119710010111421521621787218342191252202212222239511422322422522611822778228183229272302282312325423342129234172235236154177902372302342381688223924092134241239792192424243647244141189245152246247248249250114251702522531529725425517661522562492572212589121259262602243320326126226368160264333721126525526626750268269128270703527127248147273627427527625627727897232792252801852812822632712832842851512861512872886717644162892902911098212292293529439942953126429614529729829913993300461161051021023012121983021883031813046030550306300307308258309553103113121423718731330231465315316317318443193202493211313222183231255732433132532632728328329223330698233178933233333433533611416337338833392063403413422083433442273453461853475834834932435021731614835133179352563213533541613553563573583593601143611733622736336481258365366367332114101115111117114991011154711310197113116111114477611197100101114469910897115115368367369146350370310371433723733743753763774435337872379154380350381382383384324385386281387183388111112101114971161051111109710846741149711611346109971051104599108971151154389373903913743923821413936039423239545505556485757505153575553524856575549521134611510110110039539632839726839839940046401461161051021021134610112011640271282604031664041274050117406407223379913634083084094104112964128723041336441427518415416832404174184193124202094213544224232840139642442580426246220427428355259429430825443143243324743436435264276272436553878843743830443924544044144222544360429444445644464474294482764494504444514524534537345429645545645711228545845928346021446145546233046335774464421465226514663394674684692214704714721301064731721154744754164764773473574784793334804104814824464834484954853814863524873284884434894909349189492414933084944018495496497459498499

Por todo o código percebia que ele fazia “coletas” de números dentro dessa String e armazenava dentro de um array de objetos Java. Nós tínhamos um objeto Java com 500 posições (ou seja, cabem 500 objetos dentro desse “container” de objetos).

Array contendo 500 posições para armazenar valores

Na primeira análise, não peguei nada, só lá no terceiro debug comecei a pegar algumas coisas desse código, vi que ele armazenava palavras dentro desse array de objetos. Do lado esquerdo, a posição dentro do array; no direito, o valor.

477 = 285470534
479 = 312317443
482 = 1979988892
483 = defineClass
485 = 220240705
490 = 896844415
494 = de6n91hq904520jblrp1qurmmdpugc1be7f06oftra4plc19
496 = 955767434
497 = 78569053
499 = [Ljava.lang.String;@156643d4

A lista completa pode ser visualizada aqui

Analisando melhor, entendi a lógica dos números. O código pegava 3 posições a partir da posição 2000 (numero fictício pra deixar a explicação didática), então eu tinha 3 números, (posições 2000 , 2001 e 2002), que forma o número 111, esse número era convertido em Char, e de Char para String, que resultava no caractere ‘o’. Depois ele pegava mais 3 posições, que me dava o número 112, convertido, resultava na letra ‘p’, e assim ia formando uma palavra: operational.Jrat !!
Essa chave de posições pode mudar, pode ser chave 3 (pegar 3 posições da String), chave 2 (pegar 2 posições da String) , chave 1 (pegar 1 posição da String)…
Ou seja, ele convertia as letras para seu valor na tabela ASCII char-decimal.

Símbolos e seus inteiros de acordo com a ASCII
Ilustração sobre construção de palavras

Esse processo era realizado usando o Integer.decode(), que segundo a documentação Java apenas converte String para inteiros, mas esses inteiros, lembrando, vem da tabela ASCII, que por sua vez eram convertidos em seus respectivos valores do alfabeto.

Observando outras palavras contidas no array de objetos, vi métodos usados para criar classes em tempo de execução (como pode ser visto na posição 483 do trecho acima) , as classe não existia no disco, apenas na memória, o que dificulta rastros. Teríamos de fazer um dump do PID da execução da classe na memória do Java.
Realizei o dump, meio sem tempo de analisar, passei pro JB VELHO NERD, que fez uma análise detalhada. Ele executou o malware em um ambiente controlado, recuperou alguns arquivos deletados do Temp e me repassou.
Dentre alguns arquivos, havia ali um arquivo .class (um java compilado), fui fazer o decompile, ERRO! O JB VELHO NERD me alertou que pudesse ser um .jar , analisei o Hex pra ver se era um .class … Não colega, não era .class … Arquivos .class começam (seu Hex) com ‘CA FE’ (talvez seja por isso que programadores Java tomam tanto café? tu dum tsss =D ) , esse começava com ‘PK’ , o que indica ser um pacote, e .jars são um pacote — só que interpretado pelo Java.
Além disso, o JB VELHO NERD também pegou VBs, regs, TMP, e outros.

Demonstração de caracteres padrões de pacotes (caracteres PK no início)
Demonstração de caracteres padrões de arquivos class (caracteres CA FE no início)

Quando renomeei para .jar eu pude fazer decompile de tudo que estava lá, adivinha quem estava lá??

Arquivo Jar contendo operational.Jrat

Uma classe chamada ‘Jrat’! Dentro de que pacote? ‘operational’ !! Opaaaa! então o que pegamos nos debugs era o caminho de uma classe dentro um .jar, o caminho ‘operational.Jrat’… De onde veio essa classe? não sei! Do além? Das fossas Marianas? De uma jogada de dados por Deus (nerds extraterrestres entenderão hehe) Existem muuuuitos mistérios nesse NewOrder.jar
O que havia dentro da classe? nada! isso mesmo, nada! provavelmente o corpo dessa classe iria ser escrita em tempo de execução , na memória da máquina virtual java (JVM).

Outros mistérios, esse NewOrder.jar recebe argumentos ao ser executado, quais são ou quem passa esses argumentos? não sabemos…
Mas talvez possamos achar respostas em outros confins da galáx.. ops, internet! No site virustotal pesquisei pelo hash de um dos vbs e haviam outras referências de outros arquivos ligados a esse hash… Fox Mulder, the truth is out there!


Isto é algo grande, faz conexão na Moldávia; região em conflito político; encostado na Ucrânia; extremamente complexo; isso não foi escrito por um grupo pequeno, por amadores do Java!

O que aprendemos com essa análise?

  1. continue a olhar os diretórios temporários, sempre tem algo no lixo;
  2. é uma maneira bem sagaz esconder conteúdos em números… usando os números char o meu nick seria ofuscado em 1125111611448118 — p (112) 3 (51) t (116) r (114) 0 (48) v (118)

Foram várias horas, e muitas (muitas) linhas de textos trocadas entre eu e o JB VELHO NERD pra trazer essa pequena e complicada análise a voces (por isso andei até meio sumido esses dias), o que nós temos a dizer é : 1091171051161111119811410510397100111112111114108101114110111115115979711097108105115101

Experiência em desenvolvimento em Java e plataforma linux; um grande apreciador do submundo! Padwan em malwares; Padwan em hacking; Jedi em achar bugs na minha vida! Participe do grupo de discussões no Telegram: https://t.me/MalwareReverseBR

Leave a reply:

Your email address will not be published.