RenX6 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 最近phrozensoft在自己的博客中介绍了使用快捷方式的技巧,实现了应用程序存储在快捷方式中,当用户打开快捷方式时,应用程序被释放并通过vbs脚本运行。 我对这个比较感兴趣,因为快捷键的参数默认有260的长度限制,我在学习jsrat的过程中也遇到过这个问题(最后通过调用sct文件解决了长度限制问题)。 Phrozensoft分享了Delphi格式的POC代码。本文将对其进行测试,研究lnk的文件格式,开发powershell实现对应的POC代码,并简单分析该技术的利用和防御方法。 Phrozensoft博客地址: https://www . phrozensoft . com/2016/12/shortcut s-as-entry-points-for-malware-POC-part-2-19 0x01 简介 Delphi 它是Windows平台下著名的快速应用开发工具。 Borland公司研发 还可以在LINUX平台上开发应用,以及其在LINUX上对应的产品Kylix。 常见版本: Borland Delphi 7 德尔福2010 0x02 Delphi POC测试 Phrozensoft博客还分享了其他poc函数,比如生成lnk文件的python脚本,本文不会介绍,只测试Delphi POC。 环境搭建: 测试系统:Win7 x86 Delphi版本:Delphi 2010 注: 使用Delphi 7时,会出现编译失败的错误,提示“文件未找到系统。sysutils.dcu " 换成Delphi 2010后,对poc稍加修改和编译。 1.新建工程 打开Delphi 2010 选择文件-新建-其他-控制台应用程序。 直接复制poc码,提示错误,如图。 2.修改poc 测试后,系统。SysUtils需要改为SysUtils。 已编译,如图所示 3.编译 选择项目-构建所有项目。 如图所示,编译成功,Project1.exe生成。 4.测试 创建一个新的test.txt,并填写超过260个字符的数据: 回声123456781 123456781 在cmd下,执行以下命令: Project1.exe测试. txt测试. lnk 生成test.lnk 查看命令行参数,只能看到长度为260的字符串,如图。 但是,lnk文件的大小是2.45kb,如图所示 (看起来我们找到了一些有趣的东西) Cmd打开test.lnk文件,lnk文件的参数正常执行,显示的字符超过260个字符,不被截断,如图。 使用Hex Editor hex editor查看lnk文件格式,如图所示。 注: 不能使用UltraEdit,默认情况下会打开lnk指向的文件。 如图所示,指向cmd.exe。 0x03 Lnk文件格式介绍 1、整体结构 文件标题 外壳项目Id列表段 文件位置信息段 描述字符段 相对路径段 工作目录段 命令行段 图标文件段 附加信息段 2、文件头结构 1. 偏移 长度 说明 0h 4字节 固定值,字符为L 画 2. 偏移 长度 说明 4h 4字节 GUID 画 3. 偏移 长度 说明 14h 4字节 属性标志位 这四个字节用二进制表示。如果位0-6为1,则意味着lnk文件包含以下属性: 0位具有外壳项目id列表。 1位指向一个文件或文件夹。 2位存在描述字符串 3位有相对路径。 4位有工作路径。 5位有命令行参数。 6位有自定义图标。 画 14h偏移量,取4字节为000000f5,二进制表示为11110101。 位0、2、4、5和6是1,并且相应地包含以下属性: 有一个外壳项目id列表。 存在描述字符串 有工作路径。 命令行参数存在。 自定义图标存在。 4. 偏移 长度 说明 18h 4字节 目标文件属性 1ch 8字节 文件创建时间 24h 8字节 文件修改时间 2ch 8字节 文件最后一次访问时间 34h 4字节 目标文件长度 38h 4字节 自定义图标个数 3ch 4字节 窗口执行方式:1.正常2.最小化3.最大化 40h 4字节 热键 3、shell item id list 根据14h位置,test.lnk中有一个shell项目id列表,所以从4ch开始的第一段就是shell项目id列表。 偏移 长度 说明 4ch 2字节 shell item id list总长度 画 外壳项目id列表的总长度为0129。 下一段(描述字符串)的起始地址是004e 0129=0177h。 4、描述字符串 偏移 长度 说明 004e+0129=0177h 2字节 长度(Unicode),实际长度要乘以2 画 描述字符串的长度是000c(Unicode) 下一段(工作路径)的起始地址是0177 2 000 C 2=0191 h。 5、工作路径 偏移 长度 说明 0177+2+000c2=0191h 2字节 长度(Unicode),实际长度要乘以2 画 工作路径长度是0012(Unicode) 下一段的起始地址(命令行参数)是0191 2 00122=01b7h。 6、命令行参数 偏移 长度 说明 0191+2+00122=01b7h 2字节 长度(Unicode),实际长度要乘以2 画 命令行参数长度为039f(Unicode) 下一段(自定义图标)的起始地址是01b7 2 039f2=08f7h。 7、自定义图标 偏移 长度 说明 01b7+2+039f2=08f7h 2字节 长度(Unicode),实际长度要乘以2 画 自定义图标的长度为000bf(Unicode) 下一段(自定义图标)的起始地址为08f7 2 000b2=090fh。 0x04 实现原理 结合Delphi的poc代码和lnk文件的格式,对比正常Lnk文件和POC文件的区别,发现只有命令行参数的长度不同。 因此,推断出这样的原理: 只要命令行参数长度超过260! 测试powershell代码: $ file=Get-Content ' c:\ test \ test . txt ' $ wsh shell=New-Object-com Object WScript。壳 $Shortcut=$WshShell。create shortcut(' c:\ test \ test . lnk ') $快捷方式。target path=' % SystemRoot % \ system32 \ cmd . exe ' $快捷方式。icon location=' % SystemRoot % \ System32 \ shell32 . dll,21 ' $快捷方式。参数=“”$ file $快捷方式。保存() 在test.txt中编写以下内容: /c开始calc.exe 命令执行后生成的test.lnk文件的格式如图所示,包含260个空格字符,后跟有效载荷代码。 检查文件参数,如图,全部用空格字符填充,有效载荷隐藏成功。 运行test.lnk,计算器弹出,有效载荷执行成功。 完整的过程如下 Gif在线地址: https://raw . githubusercontent . com/3g student/BlogPic/master/2016-12-31/5-1 . gif 0x05 利用思路 有效负载可以放在260个空字符之后。 这样,在文件属性中无法查看有效载荷,而只能通过文件格式进行分析。 有效载荷加密后,分析变得更加困难。 0x06 防御 注意lnk文件的大小 如有必要,直接分析十六进制lnk文件格式。 0x07 小结 对于lnk文件,虽然通过查看文件属性看不到lnk文件的命令行参数,但不代表不存在。在此,提醒用户注意。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子