漏洞预警台(Sep.17)——关于XShell官方软件被植入后门的资料汇总

1
Want create site? Find Free WordPress Themes and plugins.

近日,非常流行的远程终端Xshell被发现被植入了后门代码,用户如果使用了特洛伊化的Xshell工具版本可能导致所敏感信息被泄露到攻击者所控制的机器。

对此,居正整理了一些资料,包括事态发展与详细的技术分析,请慢慢看~

1.流行远程终端管理工具Xshell被植入后门代码,可能导致敏感信息泄露

Xshell特别是Build 1322在国内的使用面很大,敏感信息的泄露可能导致巨大的安全风险,我们强烈建议用户检查自己所使用的Xshell版本,如发现,建议采取必要的补救措施。

受影响系统

Xshell 5.0 Build 1322

Xshell 5.0 Build 1325

Xmanager Enterprise 5.0 Build 1232

Xmanager 5.0 Build 1045

Xftp 5.0 Build 1218

Xlpd 5.0 Build 1220

技术细节

Xshell相关的用于网络通信的组件nssock2.dll被发现存在后门类型的代码,DLL本身有厂商合法的数据签名,但已经被多家安全厂商标记为恶意:

Picture1.png

360威胁情报中心发现其存在加载执行Shellcode的功能:

Picture2.png

调试发现Shellcode会收集主机信息,生成一个月一个的DGA域名并尝试做解析,其中一个域名为 nylalobghyhirgh.com,360威胁情报中心显示此域名为隐私保护状态:

Picture5.jpg

此域名目前已观察到7月23日注册,8月3日达到解析量的顶峰,从360网络研究院的数据来看解析量非常巨大。所有的请求类型为NS记录,也就是说域名极有可能被用来析出数据而不是用于C&C控制。

影响

使用了木马化Xshell的用户极可能导致本机或相关所管理远程系统的敏感信息泄露。

解决方案

检查目前所使用的Xshell版本是否为受影响版本,如果组织保存有网络访问日志,检查所在网络是否存在对于下节IOC域名的解析记录,如发现,则有内网机器在使用存在后门的Xshell版本。

目前厂商已经在Xshell Build 1326及以后的版本中处理了这个问题,请升级到最新版本,修改相关系统的用户名口令。

IOC

域名 说明
vwrcbohspufip.com 6月DGA域名
ribotqtonut.com 7月DGA域名
nylalobghyhirgh.com 8月DGA域名
jkvmdmjyfcvkf.com 9月DGA域名
bafyvoruzgjitwr.com 10月DGA域名
文件HASH
97363d50a279492fda14cbab53429e75 文件名nssock.dll

参考链接

https://www.netsarang.com/news/security_exploit_in_july_18_2017_build.html


2.Xshell软件后门技术分析

概述:

整个恶意过程可以通过下图来展示

整个恶意过程

整个作恶过程分为3部分,第一部分是被patch的XShell启动后,执行到恶意的shellcode1。shellcode1解密后续数据后,执行该段代码shellcode2。第二部分shellcode2运行后会判断注册表项,如果不存在Data键值,则会收集用户信息,通过DNS 协议传走,并获取云端配置数据写回到注册表。第三部分,如果注册表项中有该键值,则会开始执行后续的恶意行为,通过注册表中的key来解密出shellcode3,最终会创建svchost进程,并盗取主机信息。下面我们就分别介绍一下各个过程。

XShell启动:

Xshell.exe启动后会调用自己的nssock2.dll,在sub_1000c6c0函数出,调用VirtualAlloc申请一段内存后,解密数据赋值到这段内存后,调用并执行。

XShell启动

Shellcode2部分:

Shellcode1解出shellcode2后就去调用执行。shellcode2动态加载获取系统函数后,会调用CoCreateGuid生成一个Guid,这个Guid会在后续上报信息时用到。

Shellcode2部分

随后调用 RegCreateKeyExA 创建 \HKEY_LOCAL_MACHINE\SOFTWARE\66094805 注册表项,这里的数字路径是随机产生的。

Shellcode2部分

通过判断此表项中是否存在Data键值,来决定后续流程。

Shellcode2部分

如果不存在则会进行数据上报。数据上报的方式比较独特,通过DGA域名随机算法,每个月产生一个随机域名。

Shellcode2部分

随后会调用getNetWorkParam,getUserName获取计算机名和用户名,并与前面的Guid以及标志位rood拼接成45个字符的上报数据。

Shellcode2部分

Shellcode2部分

在经过两次加密处理,最终将45字符的上报数据加密成90字符。

Shellcode2部分

然后将这个长域名,发往知名的域名解析器,通过域名解析将用户上线信息传到黑客的后台服务器。

Shellcode2部分

随后木马会通过调用recvfrom来接受服务端下发的数据

Shellcode2部分

对接收到的数据进行判断后,便把数据写入到之前的注册表项

\HKEY_CURRENT_USER\SOFTWARE\66094805的Data键中。

Shellcode2部分

Shellcode2部分

写入的数据包括下一步要解密执行shellcode3时用的key1和key2。

shellcode3:

随后发现Data键值存在数据后,便准备调用解密函数来解密执行shellcode3了,这里的a1,a2就是从云端获取到的key1和key2.

Shellcode3

解密执行后,运行shellcode3,会创建一个日志文件

C:\ProgramData\CCGQWCS\HACM\OQO\RUAAAYKK,然后在里面写入以下数据

Shellcode3

随后会创建傀儡svchost.exe进程,注入后运行恶意代码。

Shellcode3

IOC:

通过每个月的DGA算法,可以获取到一些域名

ribotqtonut.com       (2017年7月)

nylalobghyhirgh.com   (2017年8月)

jkvmdmjyfcvkf.com     (2017年9月)

bafyvoruzgjitwr.com    (2017年10月)

xmponmzmxkxkh.com  (2017年11月)

tczafklirkl.com          (2017年12月)

SHA256:

462a02a8094e833fd456baf0a6d4e18bb7dab1a9f74d5f163a8334921a4ffde8

696be784c67896b9239a8af0a167add72b1becd3ef98d03e99207a3d5734f6eb

536d7e3bd1c9e1c2fd8438ab75d6c29c921974560b47c71686714d12fb8e9882

c45116a22cf5695b618fcdf1002619e8544ba015d06b2e1dbf47982600c7545f

515d3110498d7b4fdb451ed60bb11cd6835fcff4780cb2b982ffd2740e1347a0

查杀与建议:

1,目前NetSarang公司已经发布公告,如果有运维人员使用了公告中提到的受影响版本,请尽快升级。

2,运维人员发现IOC中列出的域名请求时,请尽快进行排查。

3,已经中毒的电脑,建议查杀后,应尽快修改服务器的密码。


3.XShell官方软件被植入后门溯源分析

近日,境内外多家安全公司爆料称NetSarang旗下Xmanager和Xshell 等产品的多个版本被植入后门代码,由于相关软件在国内程序开发和运维人员中被广泛使用,可能导致大量用户服务器账号密码泄露。

微步在线对相关样本进行了分析和跟进,目前主要发现包括:

l 情报数据分析发现,在7月 23日至31日使用过相关Xshell等产品的用户信息 极有可能已被攻击者窃取,由于其他时间段内C&C无任何DNS解析,且NS服务器指向正常,信息被窃取的可能性较小,但不排除攻击者在后续过程中再次修改配置实施攻击。

l 后门程序通过DGA算法,根据系统时间、机器名等参数每月生成一个新的C&C 域名,并通过DNS TXT请求进行通信,具体C&C域名信息见附录。

l 分析发现[email protected][email protected] 两个邮箱与此次事件有较大关联,幕后团伙的活动时间或可追溯至2014年。

l 建议客户根据附录版本对相关软件进行全面排查,如发现对应文件和域名请求,请立即修改相关服务器登录账号密码。

import-iu4TdVK32bh9GAER.png

事件概要

攻击目标 开发、运维人员
时间跨度 2017年7月18日—8月14日
攻击复杂度 丰富的编程经验
后勤资源 丰富的开发能力
攻击向量 软件供应链污染
风险承受力
最终目标 窃取用户账号密码信息

详情

此事件的主要节点如下:

1、2017年8月7日,NetSarang公司发布公告[1]称其 7月18日发布的Xmanager、Xshell 、Xftp和Xlpd等多个产品存在安全漏洞,建议用户停用相关版本的产品,并及时更新至8 月5日发布的最新版。

2、8月9日,多个境外用户在卡巴斯基的论坛称其 XShell目录下的nssock2.dll文件被杀软报毒[2] ,共公开了该文件的MD5为97363d50a279492fda14cbab53429e75。

3、以97363d50a279492fda14cbab53429e75为基础,关联发现多个nssock2.dll样本(见附件),这些文件最早编译于2017年7月13日,最后一个编译于2017年7月21日,时间点与NetSarang发布存在后门程序的产品吻合。

import-Xe0AfebNM9Kdysbk.png

图 1 关联样本在微步分析平台检测结果

4、存在后门的XShell等程序会在启动时发起大量请求DNS域名请求,并根据使用者系统时间生成不同的请求链接(见附件),其中7月的相关域名为ribotqtonut.com,而8月的相关域名为nylalobghyhirgh.com。

5、对后门程序动态生成的10余个域名分析发现,攻击者最早于7月 23、24日在NameSilo网站注册了7 月至12月相关的6个域名,启用了隐私保护服务,无指向IP地址; 8月1日,攻击者再次在NameSilo网站注册了2018 年1月、2月、3月、 7月相关的4个域名,注册者为LucyAnteo,注册邮箱为 [email protected]

6、进一步分析发现,攻击者7月使用的域名ribotqtonut.com存在多个子域名,且曾于7月24日至26日将该域名的NS解析服务地址分别指向ns1. ribotqtonut.com、ns2.ribotqtonut.com、ns3.ribotqtonut.com、ns5.ribotqtonut.com,且这些子域名分别指向209.105.242.187和108.60.212.78两个IP地址(属地均为美国),因此在这段时间使用过 Xshell等产品的用户信息有极大可能已被攻击者窃取。

7、通过“追踪溯源系统”对上述IP拓线时发现,另一个Gmail邮箱( [email protected])与之存在较强关联,该邮箱于2014年、2015年期间注册了 paniesx.com、notped.com、techniciantext.com、 operatingbox.com和dnsgogle.com等5个域名( https://x.threatbook.cn/domain/notped.com),其中前四个域名均可通过系统直接关联。

import-QLpM3pypvxqH1cRU.png

import-z9FN6EM5RAE22Gfu.png

8、查询发现,notped.com和dnsgogle.com均存在多个与此次事件类似的超长子域名,据此判断攻击者为同一团伙的可能性较大,活动时间或可追溯至 2014年。

import-Tc6STxs8jtka5IyS.png

import-cmU3X1VybcFkPdZI.png

行动建议

1、 依据附录产品版本号全面排查公司员工是否使用相关软件,并从官网下载最新版本。

2、 建议公司安全管理人员重点排查2017年7 月23日至31日的DNS访问日志,如出现 ribotqtonut.com子域名相关访问记录,建议修改对应员工使用过Xmanager 、XShell、Xftp等相关的登录账号密码。

3、 如发现对应文件和DNS域名请求,请立即修改服务器登录账号密码。

附录

受影响产品及版本

Xmanager Enterprise 5.0 Build 1232

Xmanager 5.0 Build 1045

Xshell 5.0 Build 1322

Xshell 5.0 Build 1325

Xftp 5.0 Build 1218

Xlpd 5.0 Build 1220

IOC

DNS请求域名(需涵盖子域名)

ribotqtonut.com(2017年7月)

nylalobghyhirgh.com(2017年8月)

jkvmdmjyfcvkf.com(2017年9月)

bafyvoruzgjitwr.com(2017年10月)

xmponmzmxkxkh.com(2017年11月)

tczafklirkl.com(2017年12月)

vmvahedczyrml.com(2018年1月)

ryfmzcpuxyf.com(2018年2月)

notyraxqrctmnir.com(2018年3月)

fadojcfipgh.com(2018年4月)

bqnabanejkvmpyb.com(2018年5月)

xcxmtyvwhonod.com(2018年6月)

tshylahobob.com(2018年7月)

notped.com

dnsgogle.com

后门DLL文件SHA256

536d7e3bd1c9e1c2fd8438ab75d6c29c921974560b47c71686714d12fb8e9882

696be784c67896b9239a8af0a167add72b1becd3ef98d03e99207a3d5734f6eb

515d3110498d7b4fdb451ed60bb11cd6835fcff4780cb2b982ffd2740e1347a0

c45116a22cf5695b618fcdf1002619e8544ba015d06b2e1dbf47982600c7545f

462a02a8094e833fd456baf0a6d4e18bb7dab1a9f74d5f163a8334921a4ffde8

[1] https://www.netsarang.com/news/security_exploit_in_july_18_2017_build.html

[2] https://forum.kaspersky.com/index.php?/topic/375143-trojaner-oder-doch-nur-fehlalarm/


4.XShell后门DNS Tunnel编码分析

XShellGhost 通过 DNS Tunnel 把打点的数据传上去,分析了下编码算法,对数据进行了解密。 

编码分析

DNS Tunnel的编码算法是先经过下图的算法1编码;如图:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

待编码的数据单字节和一个每4次运算一次的DWORD常量的1,2,3,4字节进行单字节运算来编码,如下:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

算法1编码后的数据如下:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

然后把结果转换成可见的字符转换方法是通过每个字节的高位加‘j’低位加‘a’,把1个字节拆分成2个字节的可见字符,这样就浪费了一个字节:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

解密算法是加密算法的逆运算,解密算法流程入下图:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

解密的单条数据的HEX如下:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

根据网上的一些公开的流量数据,

XShell后门DNS Tunnel编码分析 FreeBuf.COM

解密出的一些上传的数据:

XShell后门DNS Tunnel编码分析 FreeBuf.COM

解密代码如下:

int DecodeSecond(int a1, unsigned char* a2, int a3, int a4, unsigned char* szOut)
{
char v4; // cl@1
int v5; // esi@1
unsigned char* v6; // edi@2
byte v7[1024]= {0}; // eax@11
char v8; // dl@11
int v10; // [sp+4h] [bp-10h]@1
int v11; // [sp+8h] [bp-Ch]@1
int v12; // [sp+Ch] [bp-8h]@1
int v13; // [sp+10h] [bp-4h]@1
v4 = 0;
v5 = 0;
v10 = a1;
v11 = a1;
v12 = a1;
v13 = a1;
int i = 0;
if ( a3 > 0 )
{
v6 = a2 - a4;
do
{
if ( v5 & 3 )
{
switch ( v5 & 3 )
{
case 1:
v11 = 0xBFD7681A - 0x7DB1F70F * v11;
v4 = (*((byte *)&v11  + 2) ^ (*((byte *)&v11 + 1)
+ (*((byte *)&v11) ^ v4)))
- *((byte *)&v11 + 3);
v8 = v4 ^ *(byte *)(v6 + v5++ + a4);
v7[i]= v8;
i++;
break;
case 2:
v12 = 0xE03A30FA - 0x3035D0D6 * v12;
v4 = (*((byte *)&v12  + 2) ^ (*((byte *)&v12 + 1)
+ (*((byte *)&v12) ^ v4)))
- *((byte *)&v12 + 3);
v8 = v4 ^ *(byte *)(v6 + v5++ + a4);
v7[i]= v8;
i++;
break;
case 3:
v13 = 0xB1BF5581 - 0x11C208F * v13;
v4 = (*((byte *)&v13  + 2) ^ (*((byte *)&v13 + 1)
+ (*((byte *)&v13) ^ v4)))
- *((byte *)&v13 + 3);
v8 = v4 ^ *(byte *)(v6 + v5++ + a4);
v7[i]= v8;
i++;
break;
}
}
else
{
v10 = 0x9F248E8A - 0x2F8FCE7E * v10;
v4 = (*((byte *)&v10 + 2) ^ (*((byte *)&v10 + 1)
+ (*((byte *)&v10 ) ^ v4)))
- *((byte *)&v10 + 3);
v8 = v4 ^ *(byte *)(v6 + v5++ + a4);
v7[i]= v8;
i++;
}
}
while ( v5 < a3 );
memcpy(szOut, v7, a3);
}
return 0;
}
void DecodeFirst(unsigned char* szText)
{
int iLength = strlen((char*)szText);
int iSubLength = iLength/2;
unsigned char* szXXX = new unsigned char[iSubLength+1];
memset(szXXX, 0, iSubLength+1);
for (int i=0; i<iSubLength; i++)
{
unsigned char One = szText[2*i] - 'a';
unsigned char Two = szText[2*i+1] -'j';
unsigned char Total = One+Two*16;
szXXX[i]= Total;
}
unsigned char* szOutData = new unsigned char[iSubLength+1];
memset(szOutData, 0, iSubLength+1);
DecodeSecond(0, szXXX, iSubLength, 0, szOutData);
printf(" --------------------Decode Data--------------------------------\r\n");
hexdump(szOutData, iSubLength); 
delete [] szOutData;
return;
}
void hexdump(void *pAddressIn, long  lSize)
{
char szBuf[100];
long lIndent = 1;
long lOutLen, lIndex, lIndex2, lOutLen2;
long lRelPos;
struct { char *pData; unsigned long lSize; } buf;
unsigned char *pTmp,ucTmp;
unsigned char *pAddress = (unsigned char *)pAddressIn;
buf.pData   = (char *)pAddress;
buf.lSize   = lSize;
while (buf.lSize > 0)
{
pTmp     = (unsigned char *)buf.pData;
lOutLen  = (int)buf.lSize;
if (lOutLen > 16)
lOutLen = 16;
sprintf(szBuf, " |                            "
"                      "
"    %08lX", pTmp-pAddress);
lOutLen2 = lOutLen;
for(lIndex = 1+lIndent, lIndex2 = 53-15+lIndent, lRelPos = 0;
lOutLen2;
lOutLen2--, lIndex += 2, lIndex2++
)
{
ucTmp = *pTmp++;
sprintf(szBuf + lIndex, "%02X ", (unsigned short)ucTmp);
if(!isprint(ucTmp))  ucTmp = '.'; // nonprintable char
szBuf[lIndex2] = ucTmp;
if (!(++lRelPos & 3))     // extra blank after 4 bytes
{  lIndex++; szBuf[lIndex+2] = ' '; }
}
if (!(lRelPos & 3)) lIndex--;
szBuf[lIndex  ]   = '|';
szBuf[lIndex+1]   = ' ';
printf("%s\n", szBuf);
buf.pData   += lOutLen;
buf.lSize   -= lOutLen;
}
}

以上资料分别来源于:

http://www.freebuf.com/vuls/144136.html

http://www.freebuf.com/articles/terminal/144367.html

http://www.freebuf.com/articles/terminal/144254.html

http://www.freebuf.com/articles/terminal/144292.html

Did you find apk for android? You can find new Free Android Games and apps.

关于作者

大道至简

一条评论

  1. 幸亏及早升级,这事儿之后开始对winscp产生危机感,于是乎换到了同开发商的xftp最新版(貌似为了防止某些行为,官方网站下载还得系统发一次性下载地址到邮箱)

发表评论