Loading... **office文档格式** office文件格式根据版本可以分为office 2007之前的版本和office 2007之后的版本。 offfice2007之前的版本为OLE复合格式:doc、dot、xls、pot、ppt; office2007之后的版本为OpenXML格式:docx、docm、dotx、xlsx、xlsm、xltx、potx。 ### **一.OLE复合格式(object Linking and Embedding Data Structures)** 复合文档不仅包含文本,而且包含图形、电子数据表格、声音、视频等其他信息。使用面向对象技术,将非标准信息(如图形、声音)作为独立的、自包含式对象包含在文档中。 1. 复合文档将数据分成许多流(steams),流存储在不同的storages里; 2. 符合文档采用NTFS(NT File System)格式; 3. 流又分成更小的数据扇区(sectors)。数据扇区可能包含控制数据或用户数据; 4. 整个文件由一个头结构(Header)以及Sectors组成,头结构确定了Sectors的大小,每个Sector的大小相同。 ![图片.png](http://47.117.131.13/usr/uploads/2021/07/165423916.png) office 2007之前的版本可以看作二进制文件。其中十六进制**D0 CF 11 E0 A1 B1 1A E1**,这是固定的OLESS文档格式文件头。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/4045962921.png) 使用offvis对doc文件进行解析:主要包括4个方面Header、FAT、MinFAT、DirectoryEntry。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/2020055042.png) **1.FileHeader**(文件头):固定512字节。记录了ole文件的关键信息,自己标注了一下,重要字段都标注着*号。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/4031015308.png) ![image.png](http://47.117.131.13/usr/uploads/2021/07/592509341.png) 结构如下: ``` struct OLEGUID { unsigned int dw1; unsigned short w1; unsigned short w2; unsigned char aby[8]; }; ``` ``` struct FileHeader{ unsigned char sig[8];//*特征码0xD0 0xCF 0x11 0xE0 0xA1 0xB1 0x1A 0xE1 OLEGUID oleguid;//ClassID unsigned short VerMinor;//修订号 unsigned short VerDll;//版本号 unsigned short ByteOrder;//*文档存储模式0xFE0xFF:小端。0xFF0xFE大端 unsigned short SectorShit;//*表示sector的大小。2^n unsigned short MiniSecShift;//*MiniSector的大小。2^n unsigned short Reserved1;//保留 unsigned int Reserved2;//保留 unsigned int NumDirSects;//*DirectorySectors目录扇区数量 unsigned int NumFatSects;//*FAT数量 unsigned int DirSect;//*Directory开始的SectorID unsigned int TransactSig;//0 unsigned int MiniStrMax;//最小Stream的最大值,默认4096 unsigned int MiniFatSect;//*MiniFAT表开始的SectorID unsigned int NumMiniFatSects;//*MiniFAT表数量 unsigned int DifatSect;//*DIFAT开始的SectorID unsigned int NumDifatSects;//*DIFAT的数量 unsigned int DiFat[109];//109个DIFAT }; ``` **2.FAT** FAT为索引表结构,每一条记录中的内容是下一个扇区的地址。如下面的SECTOR[0]中记录了下一个扇区的地址。如下面的SECTOR[0]中记录了下一个扇区为1,SECTOR[1]记录了下一个扇区为2,以此类推直到SECTOR[7]为一个链的结束。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/943348832.png) 特殊ID值扇区: ![image.png](http://47.117.131.13/usr/uploads/2021/07/1207967584.png) **3. MiniFAT**和FAT解析类似 ![image.png](http://47.117.131.13/usr/uploads/2021/07/1198489948.png) **4.DirectoryEntries** 复合文档中其实存放着很多内容,这么多内容需要有个目录,那么DirectoryEntries就是这个目录。从Header中我们可以读取出Directory开始的SectorID,我们可以定位到这个位置(0x200 + sectorSize*dirStartSectorID)。Directory中每个DirectoryEntry固定为128字节。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/1428452103.png) ``` //office DirectoryEntry数据结构 struct Element { wchar_t Name[32];//Directory名字 unsigned short NameLength;//Name长度 unsigned char Type;//节点类型。0:非法;1:目录(storage);2:节点(Stream);5:根节点 unsigned char Flags;//节点颜色 unsigned int sidLeft;//左兄弟EntryID unsigned int sidRight;//右兄弟EntryID unsigned int sidChild;//孩子节点EntryID OLEGUID ClsID; unsigned int UserFlags;//一般为0 __int64 CreateTime;//创建时间 貌似不是时间戳的格式 __int64 ModifyTime;//文件修改时间 unsigned int StartSect;//DirectoryEntry开始的SectorID unsigned int SizeLow;//Directory存储的所有字节长度 unsigned int SizeHigh;//保留置0 }; ``` ### **二.OpenXML** Open XML是微软在Office 2007中推出的基于XML的文件格式,主要是满足文档文件被应用程序、平台和浏览器读取的能力。 office 2007之后的文档,可以发现文件头为PK。这代表着zip算法的发明者Phil Katz。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/1361015156.png) 新的文件格式**实际上是标准的zip文件格式**,我们可以像打开其它zip文件一样来打开Open XML的文档文件,里面包含着XML文件、RELS文件以及一些其它文件。 ![image.png](http://47.117.131.13/usr/uploads/2021/07/2159354763.png) **文档结构:** ``` │├─[Content_Types].xml //描述文档各个部分的ContentType,协助程序解析文档 │├─docProps ├─app.xml//程序级别的文档属性,如:页数、文本行数、程序版本等 ├─core.xml//用户填写的文档属性,如:标题、主题、作者等 │├─word ├─document.xml//word文档的正文 ├─fontTable.xml//word文档的页脚 ├─settings.xml// ├─styles.xml ├─baData.xml//vba属性,是否auoopen,是否加密 ├─vbaProject.bin//记录vba工程信息 ole ├─webSettings.xml ├─theme ├─theme1.xml//记录样式,颜色编号,字体大小等等 ├─_rels ├─document.xml.rels//文档间的关系 ├─vbaProject.bin.rels//记录vba文件 │├─_rels ├─.rels//描述各个部分之间的关系 ``` ### **三.使用oletools解析** python-oletool是一款分析office文件与其OLE文件结构的工具套件。 安装oletools: `pip install -U oletools` * **mraptor**:查看是否可疑。 mraptor通过启发式方法检测大多数恶意VBA宏,不同于杀毒引擎检测特征码。当发现文档自动执行触发器和写入文件系统或内存操作,或执行VBA上下文等操作师会判断为恶意宏. ![image.png](http://47.117.131.13/usr/uploads/2021/07/3259535304.png) * **oletimes**:提取ole文件中所有流和存储的创建和修改的时间。 时间信息可以帮助我们掌握基础的IOC信息,如果创建时间距离安全事件发生时间不长则可能定义为一个新的IOC. ![图片.png](http://47.117.131.13/usr/uploads/2021/07/1265726914.png) * oledir:查看文档中流结构的基本信息. ![图片.png](http://47.117.131.13/usr/uploads/2021/07/2833268361.png) * olemeta:查看文档中的OLE所有扇区的映射. ![图片.png](http://47.117.131.13/usr/uploads/2021/07/670446481.png) * olevba:提取宏代码。 olevba是一个解析OLE和OpenXML文件的工具,可以检查VBA宏是否可疑,检查方式通过提取源代码以及通过反沙箱和反虚拟化技术使用的关键字以及潜在的IOC(ip地址、URL、可执行文件名等)。还可以检测和解码几种常见的混淆方法,包括十六进制,反转字符串,base64,dirdex,VBA表达式,并从中解码出字符串中提取的IOC. ![图片.png](http://47.117.131.13/usr/uploads/2021/07/2491449143.png) ![图片.png](http://47.117.131.13/usr/uploads/2021/07/3627689543.png) **参考链接:** https://mp.weixin.qq.com/s/4YQ-wbzM0mCLOiUad5wpNg https://www.jianshu.com/p/d2bab95ec62c 最后修改:2021 年 07 月 28 日 12 : 39 AM © 允许规范转载