IB组专家分析了木马攻击美国银行客户的情况,并使用Python脚本和CnC服务器上的信息对动态配置数据格式进行了深入分析,并向公众公开。2017年11月,来自IBM X-Force的一组研究人员发布了有关新木马
-IcedID的报告,该报告主要针对美国银行的客户。 该机器人具有臭名昭著的Zeus恶意软件的许多功能,包括:下载和运行模块,收集身份验证数据并将其传输到服务器,有关受感染设备的信息以及进行浏览器人(MITB)攻击。 尽管事实证明,新的特洛伊木马实际上与其他攻击银行客户的流行银行家-Trickbot,GOZI和Dridex类似,但IcedID使用非标准二进制格式存储配置数据。 该恶意软件的另一个显着特征是能够在受感染的计算机上直接部署代理服务器以进行MITB攻击的能力。
文字:IB恶意软件分析专家Ivan Pisarev
立即,与其他木马相比,IcedID并没有普及,但是现在它具有足够的功能来实现其目标,其中主要是盗窃受害人的凭据。 这可以通过多种方式来实现,从从受感染计算机中非法窃取文件和注册表项开始,到最后是拦截和更改加密的浏览器流量(浏览器攻击)。
在IcedID的情况下,数据从帐户中被盗:Windows Live Mail,Windows Mail,RimArts,Poco Systems Inc,IncrediMail,The Bat! 和Outlook。 MITB攻击是使用代理服务器执行的,该代理服务器在受感染的设备上拾取木马,从而使所有网络流量通过自身并进行修改。 IcedID还具有服务器命令处理模块,该模块可让您远程下载并运行文件(例如,在研究中的示例中,样本加载了VNC模块,其程序代码与IcedID的代码段相似)。
对于这种类型的木马,将代理服务器用于MITB是一种非典型行为。 通常,恶意软件会嵌入浏览器上下文中,并将函数调用从标准库重定向到其处理函数(例如:
WinHttpConnect() ,
InternetConnect() ,
InternetReadFile() ,
WinHttpReadData()等)。 以前,代理技巧已在
GootKit中使用 。
IcedID是使用另一种恶意软件Emotet分发的(尽管Emotet具有高级功能,但现在经常用作引导加载程序),并且一开始就已经包含了广泛的现代窃取用户数据的方法。
现在,该木马具有相当弱的反解析机制(字符串加密,标头损坏),并且没有VM检测方法。 从研究人员的角度来看,恶意软件仍在开发中,这些保护机制将在以后添加。
Group-IB威胁情报网络情报系统未在主题论坛上检测到IcedID的销售,这意味着在银行木马领域中出现了一个新的团体,或者通过私人渠道销售了该木马。 根据动态配置数据(以下称为config)判断,该机器人的目标主要位于美国。
目标清单追逐
查尔斯·施瓦布
美国银行
美国航空
美国运通
富国银行
大写一
TD商业银行
道明银行
中央银行
美国银行
加利福尼亚联合银行
亚马孙
PNC网上银行
滑膜
BB&T银行
花旗银行
电子银行
亨廷顿
ashanalyzer
电子贸易
摩根大通
西伯
区域OnePass
邮政橡树银行
美洲
发现银行
钥匙库
弗罗斯特现金经理
汇丰银行
红细胞
哈利法克斯
威瑞森无线
劳埃德银行
M&T银行
Virwox
ADP
本文包括对该木马的详细分析,对使用Python脚本的动态配置格式的深入分析以及有关CnC的信息。
技术部分
木马工作概述
最初,该木马的
.data部分被加密。 首先,启动它之后,它将根据算法解密该部分:
变量
initial_seed和
size_seed位于数据段的开头(该段的前8个字节),此后找到大小为
size字节的加密数据。
make_seed()函数是
IcedID的唯一伪随机数生成器(
PRNG)函数,我们将返回多次。 您可以在
此处找到该函数的Python版本。
最初,该漫游器包含加密的字符串。 为了便于分析,已为IDA Pro解码了一个
脚本以解密字符串(您必须在示例中插入解密函数的地址)。
下一步是使用
SetUnhandledExceptionFilter()函数添加异常处理程序。 如果在应用程序操作期间发生任何异常,则只需重新启动即可。
添加异常处理程序后,木马会收集有关受感染系统的信息:
- 作业系统版本
- 操作系统内部版本号
- 服务包版本
- 系统容量
- 操作系统类型
该应用程序创建一个安全描述符:
D:(A ;; GA ;;; WD)(A ;; GA ;;; AN)S:(ML ;; NW ;;; S-1-16-0) ,然后分配内存在木马运行期间记录信息。 记录的字符串示例(使用IDA中的脚本获得字符串):
- E | C | IN | INS | ISF | CP%u
- I | C | IN | INT | CI | %u
- W | C | IN | INT | CI | CRLL
IcedID可以采用多个参数。 其中包括:
- --svc = -通过名称为IcedID_reg(“ * p *”)的键将参数中的字符串保存到注册表中,其中IcedID_reg(str)是从字符串str生成键名的功能(生成注册表键名的算法将在后面说明)。该特洛伊木马访问名称为Global \ <%random string%>的事件 。 出现错误时,漫游器会使用/ w =参数创建其进程的副本。 如果无法完成,则会在注册表中创建一个值:
HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run \ <%由字母[az]%中的随机字符组成的长度为9的字符串
从而确保系统的持久性。 该密钥用于首次启动该木马。
- / u-默认情况下,恶意软件会尝试以域管理员的身份运行自身(使用runas程序)。 如果存在此标志,该木马将不执行此操作,仅在目录C中创建其副本:\ Users \ <%username%> \ AppData \ Local \ <%字符串,长度为9,由字母[az]%>的随机字符组成,名称为<%由字母[az]%>。exe的随机字符组成的长度为9的字符串 ,并将路径写入注册表中的文件,从而确保了系统的持久性。
HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Run \ <%由字母[az]%中的随机字符组成的长度为9的字符串
似乎在更新银行家时使用了此密钥。 在重新启动之前,特洛伊木马“入睡”了5秒钟。
- / c-在执行恶意功能之前,木马“入睡” 5秒钟
- / w = -通过名为IcedID_reg(“ * p *”)的键将参数中的字符串保存到注册表
处理完参数后,应用程序访问注册表并获取包含CnC地址以及Web注入的动态配置数据。 以下各节介绍了在注册表中存储数据的格式。
访问注册表后,程序将创建一个线程,该线程每5或10分钟一次(取决于内部标志)与CnC联系以接收命令。 值得注意的是,两次CnC调用之间“入睡”机器人的非标准机制:开发人员没有使用标准的
Sleep()函数,而是在非信号状态下创建了一个事件,并且在不将其转换为信号状态的情况下,调用了
WaitForSingleObject()函数。 CnC呼叫流程创建功能:
IcedID中的
Sleep()函数的类似物:
长时间访问服务器以及非标准的“睡眠功能”很可能旨在抵消分析。
SSL用于隐藏服务器与应用程序之间的流量。
启动线程后,僵尸程序会“提升”本地计算机上的代理服务器,以处理受感染计算机上的流量。
服务器和受感染设备的通信协议将在以下各节中讨论。 但是,值得注意的是,服务器命令中的恶意软件可以更新配置,启动和停止VNC服务器,执行cmd.exe命令,下载文件。
IcedID与CnC服务器之间的交互
CnC地址列表以加密形式存储在银行家的正文中,以及以动态配置形式存储在注册表中。 服务器和木马之间的交互是使用HTTPS协议进行的。 使用POST请求将数据发送到服务器,使用GET接收数据。
服务器查询字符串如下:
<%CnC%> /forum/viewtopic.php?a=<%Integer%>&b=<%长整数%>&d = <%Integer%>&e = <%Integer%>&<%其他数据%>
栏位值:
- -请求类型,此字段可以采用以下值:
- b-机器人ID
- d-标志
- e-常量,直接位于机器人代码中
此外,字段值取决于字段“ a”。 如果为0或1,则查询如下所示:
POST /forum/viewtopic.php?a=<%0或1%>&b = <%BotID%>&d = <%Integer%>&e = <%常量%>&f = <%Cfg1 Checksum%>&g = <% Cfg0校验和%>&h = <%Rtd校验和%>&r = <%VNC校验和%>&i = <%请求时间%> HTTP / 1.1
连接方式:关闭
内容类型:应用程序/ x-www-form-urlencoded
内容长度:
请求正文包含有关受感染机器的信息。 信息以以下形式提供:
k = <%String%>&l = <%String%>%j = <%Integer%>&n = <%Integer%>&m = <%String%>
其中:
- k-UNICODE中的计算机名称
- l-UNICODE中的域成员
- m-系统信息:
- 作业系统版本
- 操作系统内部版本号
- 服务包版本
- 系统容量
- 操作系统类型
如果字段是2或3,则查询如下所示:
POST /forum/viewtopic.php?a=<%3或2%>&b = <%BotID%>&d = <%Integer%>&e = <%Constant%> HTTP / 1.1
连接方式:关闭
内容类型:应用程序/八位字节流
内容长度:
否则,请求如下:
GET /forum/viewtopic.php?a=<%4-8%>&b=<%BotID%>&d=<%Integer%>&e=<%Constant%>&o=<%Object checksum%>
HTTP / 1.1
连接方式:关闭
内容类型:应用程序/ x-www-form-urlencoded
内容长度:
下图显示了查询示例。 访问服务器时的包头:
邮件正文:
该木马可以从服务器接收命令。 命令以整数值表示。 所有命令都以字符串形式到达机器人,其参数由符号“;”分隔。 该程序可以处理23个命令:
如果命令成功执行,木马会将字符串“ True”发送到服务器,否则将“ False”发送给服务器。
在接收到启动高级命令模块的命令的情况下,应用程序将两个字节发送到服务器,然后等待响应。 从服务器收到的第一个字节对应于表中的扩展命令:
可以通过两种可能的方式启动VNC服务器(取决于内部标志):
- 将CreateProcessA()函数与rundll32.exe kernel32参数一起使用,Sleep -s <%param%>
- 通过svchost.exe -s <%param%>参数使用CreateProcessA()函数
其中
<%param%>是字符串表示形式中的16个字节,如下所示:
启动后,VNC模块立即检查
-s开关的存在,然后读取传递的参数并检查条件:
paramValue[0] == paramValue[1] ^ (paramValue[3] | (paramValue[2] << 16))
并使用
DuplicateHandle()函数创建套接字句柄的副本,以便与服务器进行进一步的交互。
CreateProcessA()函数的
StartupInfo参数包含专门生成的Desktop'a的名称:
Default <%flag%> 。 同样,在函数调用之前,VNC模块的地址位于
ProcessInformation参数中:
从列表中可以看出,IcedID具有广泛的功能,可以完全控制受感染的计算机。 即使操作员遇到缺少任何功能的问题,他也可以在木马的帮助下简单地下载另一个程序并执行分配给它的任务。 例如,在2017年12月,我们记录了该银行家的TrickBot分布。
配置信息
注册表项名称的生成
程序从服务器收到的所有配置数据都存储在受感染设备的注册表中(VNC模块除外,VNC模块以
tmp%0.8X01.dat格式存储在%TEMP%目录中)。
使用以下函数计算存储我们感兴趣的配置数据的注册表项的名称:
从图中可以看到,键名是来自两个变量
str和
computerSeed的MD5哈希值。 注册表变量中存储哪种类型的数据取决于第一个变量的值。 例如,变量值为
* cfg0或
* cfg1 ,则注册表项存储Web注入,值为
* rtd时,注册表项存储一个CnC列表。
computerSeed是用户唯一的变量。 它是根据用户的SID计算的。 该
脚本提供了此变量计算的python版本。
注册表中配置条目的完整路径:
HKEY_CLASSES_ROOT \ CLSID \ <%MD5值,格式为:{%0.8X-%0.4X-%0.4X-%0.4X-%0.4X%0.8X}%>
上面描述的算法恰好是用于生成名称
IcedID_reg()的算法,上面已经重复提到了该算法。
我们发现以下字符串值与生成对银行家重要的信息的注册表名称有关:
- * cfg0-包含网络注入的常见列表
- * cfg1-包含地址和字符串列表,以完全窃取页面数据
- * rtd -CnC地址列表
- * bc * -通知模块状态,以处理来自服务器的扩展命令。 如果此条目在注册表中-模块正在运行
- * p * -使用--svc =和/ w =键保存启动参数
动态配置文件的存储结构
动态配置以加密形式存储在注册表中。 位于TEMP%目录中的VNC服务器以相同的方式加密。
两种算法用于数据加密:专有的Trojan算法和RC4。 解密算法方案:
让我们从理论转向实践。 从注册表读取后的初始加密数据:
收到数据后,恶意软件会使用自己的算法对其进行解密:
再一次,我们遇到了
make_seed()函数!
解密后,我们拥有了(注意地址-它在内存的同一部分被解密):
在内存中进行第二次解密后,我们将看到以下内容:
数据解压缩并解析后。 值得注意的是,在释放数据之前,将使用RC4对数据进行回加密-防止对应用程序进行动态分析。
其他数据结构取决于配置数据的类型。 例如,带有
rtd前缀的配置数据以以下格式存储:
typedef struct CNCStruct { char signedMD5sum[128]; int checksum; BStrings cnc[N]; } CNCStruct; typedef struct BStrings { int length; char str[length]; } BStrings;
一项研究中的CnC地址列表:
僵尸程序在从接收到的列表访问CnC地址之前,会检查数字签名。 验证签名的公共密钥以加密形式存储在机器人主体中。 在签名验证过程之后,应用程序首先用随机数据然后用零“覆盖”公钥:
带有
cfg前缀的配置以以下格式存储:
typedef struct CfgStruct { int checksum; int elements_count; char config[]; } CfgStruct;
在研究的案例中,我们看到了以下数据:
数据以唯一的二进制格式存储,稍后将进行讨论。
您可以在
脚本中看到用于生成注册表项和解密配置数据的算法。
配置数据解析算法
解密数据后,程序将解析它们并以链接列表的形式保存它们,该列表随后将参与受感染设备(MITB)上流量的分析。 首先,将数据分为具有以下结构的块:
typedef struct BaseBlock { int size; char type; char global_flag; char data[size - 6]; } BaseBlock;
数据字段的结构取决于
类型标志。 此结构中的标志指示在请求的URL /正文中找到字符串时会发生什么。 该字段可以采用以下值:
如果
类型为0x40或0x41,则
数据字段的结构:
typedef struct ConfigBlock { BStrings patterns[N]; int(0); } ConfigBlock;
否则,字段结构为:
typedef struct BaseBlock { int typeSizeStr; string urlStr; int flagSize; char flag[flagSize]; int firstOptStrSize; char firstOptStr[firstOptStrSize]; int secondOptStrSize; char secondOptStr[secondOptStrSize]; int thirdOptStrSize; char thirdOptStr[thirdOptStrSize]; } BaseBlock;
让我们仔细看一下示例块之一:
首先,请注意“ Config block common information”块中的“ Config block type”字段。 它是0x11,这意味着当用户加载URL
服从正则表达式规则
^ [^ =] * \ / wcmfd \ / wcmpw \ / CustomerLogin $的页面时 ,行
<body (第二个参数)替换为行
<正文样式=“显示:无;” (第三个论点)。
在应用程序内存中,为每种类型创建一个链表。 下图以IDA Pro屏幕的形式显示了链表的解析算法。 您可以在
此处查看用于配置数据解析的Python脚本。
CnC信息
在监视IcedID的发展几个月后,我们发现了该木马包含在CnC部分的动态配置列表中的许多域。 我们将以通信的形式代表域(进行注册的电子邮件→域):
现在,让我们仔细看看已注册域的用户:
最后,考虑更改域IP地址的时间顺序。 自2017年11月以来,所有IP地址均已添加到表中:
研究了所提供的数据之后,我们可以总结出所有域都已注册到使用临时邮件服务生成的邮件中。 虚拟注册人位于美国,而域名本身位于俄罗斯,乌克兰,荷兰,中国,哈萨克斯坦和德国(最近有一种将域名“迁移”到乌克兰和德国的趋势)。 所有域都在域区域“ com”和“ net”中。 域组成的字母仅包括英语字母。 在CnC端,将引发OpenResty Web服务器。
结论
尽管像宙斯一样的木马“古老”,但它们的相关性并没有下降。 结果,IcedID出现在针对银行客户的特洛伊木马程序中。 尽管这位银行家一开始就已经拥有了广泛的机会清单,但他仍在改进:拆箱方法变得越来越复杂,目标清单也在不断扩大。 将来很有可能该恶意软件将获得反分析机制,而CnC服务器将有选择地向受感染的设备进行Web注入。 同时,木马不能满足其“用户”的所有要求,去年12月与IcedID一起使用TrickBot便证明了这一点。
IB集团对网络犯罪一无所知,但却讲述了最有趣的事情。
充满动感的电报频道(https://t.me/Group_IB),涉及信息安全,黑客和网络攻击,黑客主义者和互联网盗版者。 逐步调查轰动性网络犯罪,使用Group-IB技术的实际案例,当然,还提供有关如何避免成为Internet受害者的建议。
YouTube Channel Group-IB
Instagram上的Group-IB Photowire
网站www.instagram.com/group_ibTwitter短消息twitter.com/GroupIB
Group-IB是总部位于新加坡的网络中用于检测和预防网络攻击,检测欺诈和保护知识产权的解决方案的领先开发商之一。