相关文章推荐
腼腆的机器猫  ·  tar ...·  1 年前    · 

干货 | 快捷方式文件的参数隐藏技巧

0x00 前言

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

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

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

phrozensoft博客地址:

Phrozen Software™ - Official Website


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代码,提示错误,如图


2.修改poc

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

编译通过,如图


3.编译

选择Project-Build All Projects

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


4.测试

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


echo
123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678

cmd下执行如下命令:


Project1.exe test.txt test.lnk

生成test.lnk

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


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


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

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


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


注:无法使用UltraEdit,UltraEdit打开lnk文件默认会打开lnk指向的文件

实例如图,指向cmd.exe


0x03 Lnk文件格式介绍

1、整体结构


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

2、文件头结构

1.


如图


2.


如图


3.


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


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

如图


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

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


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

4.


3、shell item id list

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


如图


shell item id list总长度为0129

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

4、描述字符串


如图


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

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

5、工作路径


如图


工作路径长度为0012(Unicode)

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

6、命令行参数


如图


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

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

7、自定义图标


如图


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

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

0x04 实现原理

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

故推断出原理:

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

测试powershell代码:

$file = Get-Content "c:testtest.txt"
$WshShell = New-Object -comObject WScript.Shell