zoukankan      html  css  js  c++  java
  • Xshell高级后门完整分析报告(ZT)

    1. 前言

    近日,Xshell官方发布公告称其软件中存在后门。我们的实习生同学对该后门进行了详细的分析,确认这是一个具备恶意代码下载执行和数据回传等能力的高级木马。

    后门代码存在于nssock2.dll中,采用了多层加密shellcode、花指令、线程注入等各种方式逃避杀软查杀和对抗人工分析。总体流程如下

    2. 详细过程分析

    2.1 第一层功能分析

    通过BinDiff跟最新版的nssock2.dll比较可以很容易的发现一个解密shellcode的函数

    去掉花指令分析,进入到shellcode后主要功能是先查询HKCUSOFTWARE\%dHKLMSOFTWARE\%d下的Data值是否存在,%d是把硬盘的序列号异或0xD592FC92

    如果Data值存在就用其中的key解密第二层的shellcode并执行,反之就会发送DNS请求获取配置信息存储到Data键再解密第二层的shellcode并执行

    获取配置信息时首先通过根据当前年月的DGA(域名生成算法)生成一个域名,其算法如下

    然后会根据GUID、主机名和用户名等信息生成一个前缀进行加密与之前生成的域名拼接后发送DNS请求并获取配置信息

    加密主要分两步,第一步如下

    第二步如下

    DNS服务器为8.8.8.88.8.4.44.2.2.14.2.2.2和当前主机的DNS服务器,接收到key后解密第二层shellcode的代码如下

    这里非常有意思,算法跟从dll进入第一层shellcode时的解密算法一致,想到CTF的套路尝试设为相同的key,key1为0xC9BED351,key2为0xA85DA1C9,然后就成功解密出了第二层shellcode。

    2.2 第二层功能分析

    根据卡巴斯基的报告,第二层shellcode为Root插件,入口函数很像DllMain

    主要功能是先设置异常处理函数,并会把异常记录到%ALLUSERSPROFILE%error.log,然后初始化函数指针表(会在其他插件中被调用),并加载5个插件

    动态调试步入load_plugin函数就能把5个插件的shellcode dump出来,加载完5个插件后会调用ID为103的插件(Install)的第二个函数

    2.3 插件功能分析

    2.3.1 Install插件(103)

    主要功能是先修改当前进程权限,再调用ID为102的插件(Config)的第二个函数

    另外还会用winlogon.exe进程的权限创建svchost.exe进程进行线程注入,调试线程注入的shellcode可以先在VirtualAllocEx后下断获取到相应进程中的虚拟地址,然后在ResumeThread时下断,中断后附加相应进程并在之前获取的虚拟地址处下断,执行ResumeThread后会在之前的虚拟地址处中断,之后就可以继续调试了,初步分析注入的shellcode就是Root插件

    根据磁盘序列号创建互斥体:Global\% 16-48 random latin characters%

    2.3.2 Plugins插件(101)

    主要功能是监听根据磁盘序列号生成的注册表项HKLMHKCUSOFTWAREMicrosoft\%5-12 random characters%

    监听到有值改变后会解密并校验是否是合法的插件并加载和初始化

    2.3.3 Config插件(102)

    此插件主要是跟配置信息的读写相关,其路径根据磁盘序列号生成,本机是C:ProgramDataMQGOMQQTOYMWGMQUMGSAIEDIWEYK,在每次初始化插件时都会被重写

    默认的C&C地址是dns://www.notped.com

    2.3.4 Online插件(104)

    此插件主要是跟C&C服务器通信并把命令分发到相应的插件执行,首先根据协议类型选择发送请求的插件

    如果是URL就会向根据年月的DGA生成的域名发送HTTP请求来得到真正的C&C服务器地址

    另外此插件也会收集更详细的主机信息,依次调用GetSystemTimegethostbynameGlobalMemroryStatusExGetNativeSystemInfoGetDiskFreeSpaceExAEnumDisplaySettingsWGetSystemDefaultLCIDQueryPerformanceFrequencyQueryPerformanceCounterGetCurrentProcessIdRtlGetVersionGetSystemMetricsGetNetworkParamsGetAccountSid

    2.3.5 DNS插件(203)

    此插件主要是用于基于DNS协议的C&C通信

    3. 总结

    此后门用了多种手段来增加分析难度,是一个基于插件的完善的攻击平台,请尽快升级到最新版本。以上分析如有谬误之处,欢迎斧正。

    4. 附录

    4.1 shellcode字符串解密脚本

    1. from idaapi import *
    2. from ctypes import *
    3. addr = 0x274DFC8
    4. seed = c_uint(Byte(addr) | (Byte(addr + 1) << 8))
    5. result = [None] * 4096
    6. for i in range(4090):
    7. result[i] = chr((seed.value & 0xff) ^ Byte(addr + 2 + i))
    8. seed = c_uint(c_uint(c_uint(0x41120000 * seed.value).value - c_uint(0x434CBEEE * (seed.value >> 16)).value).value - 0x2F878E0F)
    9. end = result.index('x00')
    10. print ''.join(result[:end])

    4.2 IOC相关域名

    域名日期
    ribotqtonut.com 2017年7月
    nylalobghyhirgh.com 2017年8月
    jkvmdmjyfcvkf.com 2017年9月
    bafyvoruzgjitwr.com 2017年10月
    xmponmzmxkxkh.com 2017年11月
    notped.com 默认C&C域名

    5. 参考

    1. https://www.netsarang.com/news/security_exploit_in_july_18_2017_build.html
    2. https://cdn.securelist.com/files/2017/08/ShadowPad_technical_description_PDF.pdf
  • 相关阅读:
    fms服务器端呼叫客户端
    Linux C取整的方法
    fms客户端呼叫服务器端
    Tree Control DataProviders
    IE7下的css style display的兼容处理
    Maxthon,TheWorld,MyIE等多标签浏览器的Flash缓存问题
    Android深入浅出系列之实例应用—弹出消息Toast对象的使用纯文本方式(一)
    C#温故而知新学习系列之XML编程—Xml读取器XmlReader类(二)
    一步一个脚印学习WCF系列之WCF概要—生成元数据与代理(五)
    Eclipse 常用快捷键(转)
  • 原文地址:https://www.cnblogs.com/ebs-blog/p/7452180.html
Copyright © 2011-2022 走看看