欢迎关注同名微信公众号!狼蛛安全实验室!
正文
近期发现了一些恶意的Lnk样本,忽然想到之前研究过Lnk文件的结构,就在此向大家分享一些有用的知识点,希望大家有所收获。
在Lnk文件中有很多字段,其中有一些字段很有意思,包括:“MachineID”、“MAC Address”、“SID”、“DriveSerialNumber”、“Item Type Text”等等,这些字段对溯源是很有帮助的,可以结合VT等样本沙箱进行Hunter,扩展更多样本,从而梳理攻击者的攻击时间线、攻击目标等等。
以下篇幅作者主要讲解Lnk文件的结构,我会尽量写的详细一点,方便大家学习。
首先,我们先创建一个lnk文件,找到一个程序,右键创建快捷方式
可以看到快捷方式的实际后缀为.lnk文件,大小1k字节。
我们打开010Editor,选择左上角的文件->打开
选择我们创建的快捷方式后会提示安装模板,点击安装。
我们可以在下面看到安装完后,下面出现了一个窗口。
我们可以通过展开“struct ExtraData sExtraData”->“struct TrackerDataBlock sTrackerDataBlock”->“byte MachineID[16]”,查看MachineID(计算机名称)
接着,我们展开“struct ExtraData sExtraData”->“struct TrackerDataBlock sTrackerDataBlock”->“GUID VolumeDroid[16]”,可以从最后的6字节看到完整的MAC地址。
紧接着,展开“struct ExtraData sExtraData”->“struct PropertyStoreDataBlock sPropertyStoreDataBlock”->“struct PropertyStoreList sPropertyStoreList[1]”->“struct PropertyIntegerValue sPropertyIntegerValue”->“struct TypedPropertyValue Value”->“wchar_t Value[44]”,查看创建lnk文件用户的SID。
然后,我们展开“struct LinkInfo sLinkInfo”->“struct VolumeID sVolumeID”->“uint32 DriveSerialNumber”,并将其转换为16进制查看改卷的序列号。
然后,展开“struct ExtraData sExtraData”->“struct PropertyStoreDataBlock sPropertyStoreDataBlock”->“struct PropertyStoreList sPropertyStoreList[0]”->“struct PropertyIntegerValue sPropertyIntegerValue[1]”->“struct TypedPropertyValue Value”->“wchar_t Value[6]”,可以看到存在文件类型字段
该字段在其他系统中也是以系统语言的方式存在,例如JP。
那么我们该如何扩线呢?
作者用mac地址和netbios名称举个例子,以上述样本为例,yara规则可以这么实现(也可以按照个人习惯添加其他字段等):
rule Lnk
{
strings:
$mac = {00 0C 29 11 EB 76}
$netbios = "work-pc" fullword asci
condition:
uint16(0) == 0x4c and ($mac or $netbios)
}