渗透技巧——快捷方式文件的参数隐藏技巧

发布于 2025-02-24 11:17:59 字数 9353 浏览 7 评论 0

0x00 前言

最近,phrozensoft 在博客中介绍了关于快捷方式的利用技巧,实现了将应用程序存储在快捷方式当中,当用户打开快捷方式时,通过 vbs 脚本释放应用程序并运行。

我对此很感兴趣,因为快捷方式的参数默认存在长度限制,最大为 260,并且我在研究 jsrat 的过程也遇到过这个问题(最后通过调用 sct 文件解决了长度限制问题)

phrozensoft 分享了 Delphi 格式的 POC 代码,本文将要对其进行测试,研究 lnk 的文件格式,开发出对应 powershell 实现的 POC 代码,简单分析该技术的利用和防御方法

phrozensoft 博客地址:https://www.phrozensoft.com/2016/12/shortcuts-as-entry-points-for-malware-poc-part-2-19

0x01 简介

Delphi

是 Windows 平台下著名的快速应用程序开发工具

Borland 公司研发

也可以在 LINUX 平台上开发应用,其在 LINUX 上的对应产品 Kylix

常用版本:

  • Borland Delphi 7
  • Delphi 2010

0x02 Delphi POC 测试

phrozensoft 博客中也分享了其他功能的 poc,如生成 lnk 文件的 python 脚本,本文暂不介绍,只测试其中的 Delphi POC

环境搭建:

测试系统:Win7 x86

Delphi 版本:Delphi 2010

注:使用 Delphi 7 会存在编译不通过的错误,提示 “File not found System.sysutils.dcu” 换用 Delphi 2010 后,poc 作细微修改编译通过

1.新建工程

打开 Delphi 2010

选择 File-New-Other-Console Application

直接复制 poc 代码,提示错误,如图

Alt text

2.修改 poc

经测试,System.SysUtils 需要更改为 SysUtils

编译通过,如图

Alt text

3.编译

选择 Project-Build All Projects

如图,编译成功,生成 Project1.exe

Alt text

4.测试

新建 test.txt,填入超过 260 个字符的数据:

echo 123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678

cmd 下执行如下命令:

Project1.exe test.txt test.lnk

生成 test.lnk

查看命令行参数,只能看到长度为 260 的字符串,如图

Alt text

然而,lnk 文件的大小为 2.45kb,如图

Alt text

(看起来我们发现了有趣的地方)

cmd 下打开 test.lnk,lnk 文件的参数正常执行,显示的字符超过超过 260 个,没有被截断,如图

Alt text

使用 16 进制编辑器 Hex Editor 查看 lnk 文件格式,如图

Alt text

注:

无法使用 UltraEdit,UltraEdit 打开 lnk 文件默认会打开 lnk 指向的文件 实例如图,指向 cmd.exe

Alt text

0x03 Lnk 文件格式介绍

1、整体结构

  • 文件头
  • Shell Item Id List 段
  • 文件位置信息段
  • 描述字符段
  • 相对路径段
  • 工作目录段
  • 命令行段
  • 图标文件段
  • 附加信息段

2、文件头结构

1.

偏移长度说明
0h4 字节固定值,字符为 L

如图

Alt text

2.

偏移长度说明
4h4 字节GUID

如图

Alt text

3.

偏移长度说明
14h4 字节属性标志位

将该四字节以二进制表示,如果 0-6 位为 1,分别代表该 lnk 文件包含以下属性:

0 位 有 shell item id list 1 位 指向文件或文件夹 2 位 存在描述字符串 3 位 存在相对路径 4 位 存在工作路径 5 位 存在命令行参数 6 位 存在自定义图标

如图

Alt text

偏移 14h,取 4 字节为 000000f5,二进制表示为 11110101

0、2、4、5、6 位为 1,对应包含如下属性:

  • 有 shell item id list
  • 存在描述字符串
  • 存在工作路径
  • 存在命令行参数
  • 存在自定义图标

4.

偏移长度说明
18h4 字节目标文件属性
1ch8 字节文件创建时间
24h8 字节文件修改时间
2ch8 字节文件最后一次访问时间
34h4 字节目标文件长度
38h4 字节自定义图标个数
3ch4 字节窗口执行方式:1.正常 2.最小化 3.最大化
40h4 字节热键

3、shell item id list

由 14h 位置得出 test.lnk 存在 shell item id list,所以从 4ch 开始的第一个段为 shell item id list

偏移长度说明
4ch2 字节shell item id list 总长度

如图

Alt text

shell item id list 总长度为 0129

下一段(描述字符串)的起始地址为 004e+0129=0177h

4、描述字符串

偏移长度说明
004e+0129=0177h2 字节长度(Unicode),实际长度要乘以 2

如图

Alt text

描述字符串长度为 000c(Unicode)

下一段(工作路径)的起始地址为 0177+2+000c×2=0191h

5、工作路径

偏移长度说明
0177+2+000c×2=0191h2 字节长度(Unicode),实际长度要乘以 2

如图

Alt text

工作路径长度为 0012(Unicode)

下一段(命令行参数)的起始地址为 0191+2+0012×2=01b7h

6、命令行参数

偏移长度说明
0191+2+0012×2=01b7h2 字节长度(Unicode),实际长度要乘以 2

如图

Alt text

命令行参数长度为 039f(Unicode)

下一段(自定义图标)的起始地址为 01b7+2+039f×2=08f7h

7、自定义图标

偏移长度说明
01b7+2+039f×2=08f7h2 字节长度(Unicode),实际长度要乘以 2

如图

Alt text

自定义图标长度为 000bf(Unicode)

下一段(自定义图标)的起始地址为 08f7+2+000b×2=090fh

0x04 实现原理

结合 Delphi 的 POC 代码和 Lnk 文件格式,对比正常 lnk 文件和 poc 文件差异,发现只有命令行参数长度不同

故推断出原理:

只要命令行参数长度超过 260 即可!

测试 powershell 代码:

$file = Get-Content "c:\test\test.txt"
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("c:\test\test.lnk")
$Shortcut.TargetPath = "%SystemRoot%\system32\cmd.exe"
$Shortcut.IconLocation = "%SystemRoot%\System32\Shell32.dll,21"
$Shortcut.Arguments = '                                                                                                                                                                                                                                      '+ $file
$Shortcut.Save()

test.txt 中写入如下内容:

/c start calc.exe

执行命令后生成的 test.lnk 文件格式如图,260 个空格字符后面接着为 payload 代码

Alt text

查看文件参数,显示如图,均被空格字符填充,payload 成功隐藏

Alt text

运行 test.lnk,弹出计算器,payload 成功执行

完整过程如下图

Alt text

gif 在线地址:

..//BlogPic/2016-12-31/5-1.gif

0x05 利用思路

可将 payload 放置在 260 个空字符之后,这样无法在文件属性查看 payload,只能通过文件格式去分析,payload 加密后分析难度也会变大。

0x06 防御

注意 lnk 文件大小

必要情况下,直接分析 16 进制 lnk 文件格式

0x07 小结

对于 lnk 文件,虽然通过查看文件属性无法看到 lnk 文件的命令行参数,但不代表其不存在,在此提醒用户注意。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

指尖凝香

暂无简介

文章
评论
27 人气
更多

推荐作者

闻呓

文章 0 评论 0

深府石板幽径

文章 0 评论 0

mabiao

文章 0 评论 0

枕花眠

文章 0 评论 0

qq_CrTt6n

文章 0 评论 0

红颜悴

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文