详解混合类型文件(Polyglot文件)的应用生成与检测

2023-11-17

1. 引入

混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。
比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件,可以用JVM正常运行(参考4),如下图所示:

在这里插入图片描述

这样的文件就是混合类型文件,也叫polyglot。他能绕过文件类型检测的限制,比如有的系统只允许用户上传PNG,以防止用户上传具有潜在危险的文件,例如JS文件、PHP文件。利用混合类型文件就能突破这个限制。

2. 有哪些混合类型

参考5给了很多混合类型文件的真实例子,下面举例如下:

(1)7ZIP+JAR.7z: 7z + jar + zip
(2)7ZIP+RAR-1.7z:7z + rar
(3)AVI+HTML.avi:avi + html
(4)BMP+HTML+JAR.bmp:bmp + html + jar + zip
(5)DOCX+ELF+JAR+PDF+RAR-1.zip:docx + elf + jar + pdf + rar + zip

这里给出了102种不同的类型的组合,注意这只是2018年的数据,目前可能已经出现更多类型组合了。
以 HTML+PDF-3.html (参考6)举例:
(1)这个文件下载后,直接用浏览器打开,效果如下:

在这里插入图片描述

(2)如果把这个文件的扩展名改为pdf,就能用pdf阅读器打开,效果如下:

在这里插入图片描述

3. 使用混合类型的恶意样本家族

参考4给出了如下两个恶意样本家族的例子:

  1. 恶意样本家族StrRAT 使用 MSI 格式来伪装 JAR 文件
  2. 恶意样本家族Ratty和StrRAT使用 CAB 格式来伪装 JAR 文件

其中也给出了StrRAT 和 Ratty的链接。

4. 如何生成混合类型文件

使用 mitra 这个工具(参考:https://github.com/corkami/mitra)就能生成混合类型文件。

从源代码看,直接使用它,只能生成两种类型文件混合的文件:

def main():
	args = Setup(__description__)
	fn1,fn2 = args.file1, args.file2 #这里显示只读入两个文件
	with open(fn1, "rb") as f:
		fdata1 = f.read()
	with open(fn2, "rb") as f:
		fdata2 = f.read()

	pad = getVar("PAD")
	fdata1 += b"\1" * (pad - len(fdata1))
	fdata2 += b"\1" * (pad - len(fdata2))

使用方法,笔者在python3.8的环境中,直接运行如下命令,根据报错再安装或者mkdir缺少的文件后:

python mitra.py  pic1.png  2203.07561.pdf

就能生成 一个文件 P(10-4b8516)-PNG[PDF].4425bf7c.png.pdf,它是一个能直接用pdf阅读器打开的pdf文件,能看到pdf的文件内容;当我们把他的文件扩展名改为 P(10-4b8516)-PNG[PDF].4425bf7c.png.png后,就能用图片阅读器打开它,此时看到的就是一张图片。

注意 mitra 这个文件并不能生成所有类型文件的组合,比如笔者实验中就不能把.py文件组合到png图片上。下面是参考7的论文中给出的组合:

DCM+GIF,     DCM+JAR,    DCM+ISO,    DCM+PDF,    DCM+ZiP,    GIF+ISO,    GIF+JAR,    GIF+Zip,    JPG+JAR,    JPG+Zip,    
PE+ISO,    PE+JAR,    PE+Zip,    PNG+ISO,    PNG+JAR,    PNG+PDF,    PNG+Zip,    TIFF+ISO,    TIFF+JAR,    TIFF+PDF,    TIFF+Zip

5. 如何检测文件类型

对于非混合类型文件,有如下几种检测方法,都有相对比较成熟的工具:

  1. 对于常见编程语言的类型,可以使用 guesslang 这个工具来进行检测(参考: https://github.com/yoeo/guesslang/tree/master), 他能用深度学习模型识别如下类型的文本文件
Assembly	Batchfile	C	C#	C++
Clojure	CMake	COBOL	CoffeeScript	CSS
CSV	Dart	DM	Dockerfile	Elixir
Erlang	Fortran	Go	Groovy	Haskell
HTML	INI	Java	JavaScript	JSON
Julia	Kotlin	Lisp	Lua	Makefile
Markdown	Matlab	Objective-C	OCaml	Pascal
Perl	PHP	PowerShell	Prolog	Python
R	Ruby	Rust	Scala	Shell
SQL	Swift	TeX	TOML	TypeScript
Verilog	Visual Basic	XML	YAML	
  1. 对于exe,elf之类的文件,可以使用polydet来检测 (参考:https://github.com/Polydet/polydet/tree/master),
    他能使用已定义的yara规则来检测如下类型的文件
'7z', 'avi', 'bmp', 'elf', 'exe', 'flac', 'gif', 'html', 'jpg', 'mp3', 'ogg', 'pdf', 'php', 'png', 'polyglot_level', 'rar', 'swf', 'tar', 'tiff', 'wav', 'webm', 'zip'

  1. 对于多种不同类型的图像、视频、音频,甚至于SQLITE类型,可以 fleep 来检测(参考:https://github.com/ua-nick/fleep-py/tree/master),
    他能使用已magic-number来检测如下类型的文件
图像: BMP,GIF,ICO,JP2,JPEG,PNG,PSD,TIFF,WEBP
原始图像:ARW,CR2,CRW,DNG,ERF,NEF,NRW,ORF,PEF,RAF,RAW,RW2,SRW,X3F
矢量图:AI,EPS
3D图像:C4D,FBX,MA,MS3D,MTL,OBJ,PLY,WRL,X3D,XSI
音频:AAC,AC3,AIFF,AMR,AU,FLAC,M4A,MIDI,MKA,MP3,OGA,RA,VOC,WAV,WMA
视频:3G2,3GP,ASF,AVI,FLV,M4V,MKV,MOV,MP4,MPG,OGV,SWF,VOB,WEBM,WMV
文档:DOC,DOCX,EPUB,KEY,NUMBERS,ODP,ODS,ODT,PAGES,PDF,PPS,PPT,PPTX,RTF,XLS,XLSX,XML,
压缩:7Z,DMG,GZ,ISO,RAR,TAR.Z,ZIP,
可执行文件:COM,EXE,JAR
字体:OTF,TTF,WOFF,WOFF2
系统文件:CAB,CAT,DLL,DRV,REG,SDB,SYS
数据库:SQLITE

6. 混合类型文件检测

  1. linux下的file命令能检测一部分混合类型文件(参考8),示例如下
$ file --keep-going --raw mA-pdf.pdf
mA-pdf.pdf: tar archive
- DR-DOS executable (COM)
- Windows Program Information File for  R>>
- DOS/MBR boot sector
- Nintendo DS ROM image: "%PDF-1.3" (┬╢, Rev.116)
- Plot84 plotting file DOS/MBR boot sector
- SymbOS executable v., name: 1 0 obj
- PDF document, version 1.3
- Old EZD Electron Density Map
- Scream Tracker Sample adlib drum mono 8bit
- SoundFX Module sound file
- DICOM medical imaging data
- CCP4 Electron Density Map
- VirtualBox Disk Image (%PDF-1.3), 5715999566798081280 bytes
- data
  1. 机器学习方法,找到一篇文章给了一些检测思路,文章见参考7:
    (1)传统机器学习方法:二分类模型,特征为二进制字节直方图,一共256个字节的出现次数,模型选用传统集成学习树模型,比如 light GBM, gradient boosting, and CatBoost
    (2)深度学习方法:二分类模型,选用CNN网络中知名的Malconv2,直接读入字节流(超出容量则截断文件)

根据论文提供的检测结果:
(1)直接使用file命令,效果并不理想,file在很多时候无法准确检测
(2)CatBoost调优后,效果比其他模型要好,也比Malconv2好

在这里插入图片描述

7. 总结

本文总结了 混合类型文件 的定义,使用混合类型的恶意样本家族,如何生成混合类型文件,以及非混合类型的文件检测及混合类型文件检测的方法。

参考

  1. Polyglot的定义。https://en.wikipedia.org/wiki/Polyglot_(computing)
  2. https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
  3. html混合java文件。https://github.com/deepinstinct/JAR-Polyglot-POC/blob/main/eula.html
  4. https://www.deepinstinct.com/blog/malicious-jars-and-polyglot-files-who-do-you-think-you-jar
  5. https://github.com/Polydet/polyglot-database/tree/master/files
  6. https://github.com/Polydet/polyglot-database/blob/master/files/HTML%2BPDF-3.html
  7. Toward the Detection of Polyglot Files. 2022. https://arxiv.org/pdf/2203.07561.pdf
  8. tool to generate polyglog file. https://github.com/corkami/mitra
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解混合类型文件(Polyglot文件)的应用生成与检测 的相关文章

  • Python 和 Numpy 是 nan 和 set

    我在使用 Python 的 Numpy set 和 NaN 非数字 时遇到了不可预测的行为 gt gt gt set np float64 nan np float64 nan set nan nan gt gt gt set np flo
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 从字典的元素创建 Pandas 数据框

    我正在尝试从字典创建一个 pandas 数据框 字典设置为 nvalues y1 1 2 3 4 y2 5 6 7 8 y3 a b c d 我希望数据框仅包含 y1 and y2 到目前为止我可以使用 df pd DataFrame fr
  • 如何使用 python 的 http.client 准确读取一个响应块?

    Using http client在 Python 3 3 或任何其他内置 python HTTP 客户端库 中 如何一次读取一个分块 HTTP 响应一个 HTTP 块 我正在扩展现有的测试装置 使用 python 编写 http clie
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • Python re无限执行

    我正在尝试执行这段代码 import re pattern r w w s re compiled re compile pattern results re compiled search COPRO HORIZON 2000 HOR p
  • 为什么第二个 request.session cookies 返回空?

    我想使用 requests Session post 登录网站 但是当我已经登录主页 然后进入帐户页面时 看来cookies还没有保存 因为cookies是空的 而且我无法进入正确的帐户页面 import requests from bs4
  • numpy:高效执行数组的复杂重塑

    我正在将供应商提供的大型二进制数组读入 2D numpy 数组 tempfid M N load data data numpy fromfile file dirname fid dtype numpy dtype i4 convert
  • 是否有一个包可以维护所有带有符号的货币列表?

    是否有一个 python 包提供所有 或相当完整 货币的列表与符号 如美元的 有优秀的pycountry 贪财的 https github com limist py moneyed and ccy http code google com
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 仅当某些值相等时,如何才能将一个文本文件中的值替换为另一个文本文件中的其他值?

    我有一个名为finalscores txt我想创建一个 python 脚本 它将打开它并从两个单独的列中读取值 这是我的finalscores txt file Atom nVa predppm avgppm stdev delta QPr
  • 更改QLineEdit的ClearButton图标

    我想在Windows 10 1909 64位 上的Python 3 8和PyQt5 5 15 0 上更改我的QLineEdit的ClearButton图标 稍后我想在Linux上运行代码 我尝试应用此处找到的代码 如何在 QLineEdit
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • 为什么这个 if 语句会导致语法错误

    我正在尝试设置一个 elif 语句 如果用户按下 Enter 键 代码将继续 但是我不断遇到语法错误 GTIN 0 while True try GTIN int input input your gtin 8 number if len
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • 高效创建抗锯齿圆形蒙版

    我正在尝试创建抗锯齿 加权而不是布尔 圆形掩模 以制作用于卷积的圆形内核 radius 3 no of pixels to be 1 on either side of the center pixel shall be decimal a
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我

随机推荐

  • 中央和省级产业政策匹配数据(含完整stata代码)

    1 数据来源 国泰安数据库 2 时间跨度 中央产业政策 2001 2020年 和省份产业政策 2006 2020年 3 区域范围 全国 4 指标说明 具体匹配代码详见分享文件中的do文件 匹配流程 1 整理证监会2001年分类标准和证监会2
  • Python 进阶(七): Word 基本操作

    1 概述 Word 是一个十分常用的文字处理工具 通常我们都是手动来操作它 本节我们来看一下如何通过 Python 来操作 Python 提供了 python docx 库 该库就是为 Word 文档量身定制的 安装使用 pip insta
  • openwrt 格式化_如何在路由器上格式化 U 盘、硬盘

    本教程适用于梅林 padavan LEDE openwrt 等固件 以下具体方法都基于 ext4 NTFS 相关错误不做回答 使用ssh连接路由器 把U盘插到路由器上 我们需要在命令行进行以下4步操作 安装fdisk 一般梅林 Padava
  • Keil(MDK-ARM-STM32)系列教程(六)Configuration(Ⅱ)

    写在前面 本文接着上一篇文章 Configuration 进行讲述Configuration后面三项Shortcut Keys快捷键 Text Completion代码完形 Other其他的内容 Shortcut Keys快捷键 Keil软
  • 精学JS:宏任务 & 微任务的运行机制

    首先分析宏任务和微任务的运行机制 并针对日常开发中遇到的各种宏任务 微任务的方法 结合一些例子来看看代码运行的顺序逻辑 把这部分知识点重新归纳和梳理 在日常开发中 例如 setTimeout和 promise都是经常会使用到的 JS方法 当
  • 操作系统【六】虚拟内存

    传统存储管理方式的不足 一次性 作业必须一次性全部装入内存后才能开始运行 这会造成 当作也很大时不能全部装入内存 当大量作业要求运行时 由于内存无法容纳所有作业 因此只有少量作业能够运行 导致多道程序并发度下降 驻留性 一旦作业被装入内存
  • 【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

    文章目录 一 简介 二 Vision Transformer如何工作 三 ViT模型架构 四 ViT工作原理解析 4 1 步骤1 将图片转换成patches序列 4 2 步骤2 将patches铺平 4 3 步骤3 添加Position e
  • Python——LSTM、GRU 时间序列股票数据预测(文末完整代码)

    GRU 是在 LSTM 基础上的简化 将 LSTM 内部的三个闸门简化成两个 往往 GRU 的计算效果会优于 LSTM 目录 1 导入工具包 2 获取数据集 3 数据预处理 4 时间序列滑窗 5 数据集划分 6 构造网络模型 7 网络训练
  • tracert命令返回的三个时间为什么有时会出现1个或2个星号?

    如图 三个时间里有1个或者2个显示星号 这是为什么呢 如果是配置了ACL丢弃了响应报文的话按理应该3个都显示星号呀 直接ping这个ip的话不会出现丢包 时延也很稳定 这个问题很诡异 演绎一下 仅供参考 首先traceroute 是利用 T
  • 后台系统切换主题颜色(换肤) Vue+ elementUi

    文章目录 前言 一 css color function 二 使用步骤 1 下载依赖项 2 引入 3 使用 定义data数据 3 定义方法 4 调用方法使用 5 模板 6 AllCode 总结 前言 不断学习demo中 有好的demo会记录
  • antd pro protable request请求有数据 页面不渲染或postdata里的data一直是undefined

    异常原因 protable的request请求默认的数据格式为 data pageSize 10 current 1 total 28 success true request请求如果返回的数据格式不是以上形式就会获取不到data page
  • STM32 DMA 应用之(二) DMA 串口 数据传输--发送

    一 DMA请求映像 由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1 Channel4 使用串口1的接收功能需要用到的是DMA1 Channel5 二 怎样配置软件来使用DMA 把数据传到串口发送 1 配置dma 函数名称 Dm
  • vim退出时提示:q:未找到命令的解决办法

    有一天 我在WSL上快乐的用vim编游戏 可就在我输入 q时 bash提醒我 q 未找到命令 平常程序都在WSL上 cat不自动在行尾加换行违反了我的强迫症 然后我就开始修理vim了 然后我又试了 wq等等和q有关的命令 甚至连 q都没问题
  • C#编程,.NTE调用java类、jar包方法

    基本思路 用C 实现调用Java编写的类中的方法 重点是将Java编写的程序打包成Jar 然后使用开源工具IKVM将其转化成DLL控件 在 NET环境下调用 一 使用IKVM NET组件 首先到IKVM官网 http www ikvm ne
  • React学习(JSX+组件+state+表单)

    React JSX 声明元素 渲染元素 组件 练习 this props children PropTypes 默认值 获取真实的DOM节点 this state 表单 组件的生命周期 例子 JSX JSX是一种JavaScript语法的拓
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3
  • json-server在vscode终端运行文件报错

    错误 无法加载文件 D 因为在此系统上禁止运行脚本 json server 无法加载文件 D ruanjian nodejs node global json server ps1 因为在此系 统上禁止运行脚本 有关详细信息 请参阅 htt
  • 关于宝塔面板无法访问的解决方法

    前言 本篇文章主要介绍宝塔面板无法访问的几种情况以及如何解决 正文 1 没有开放相应端口 这种情况比较常见 服务商默认情况下会将所有的端口关闭 你需要使用哪个端口就得手动去打开这个端口 例如 http 47 8888 adminuser 中
  • ubuntu如何开放22端口 ubuntu22端口开启

    ubuntu开放22端口的操作步骤 1 打开终端命令行模式 2 依次输入以下命令进行开放22端口即可 输入以下命令打开22端口 sudo ufw allow 22 重启防火墙使其生效即可 sudo ufw reload 附加 sudo ap
  • 详解混合类型文件(Polyglot文件)的应用生成与检测

    1 引入 混合类型文件 Polyglot文件 是指一个文件 既可以是合法的A类型 也可以是合法的B类型 比如参考3中的文件 是一个html文件 可以用浏览器正常打开 它也是一个一个 jar文件 可以用JVM正常运行 参考4 如下图所示 这样