Złośliwy kod w plikach skrótu (.lnk) systemu Windows
Spis treści
- Format plików binarnych skrótu (.lnk) w systemie Windows
- Tworzenie plików skrótu (.lnk) w systemie Windows
- Analiza statyczna plików skrótu (.lnk)
Format plików binarnych skrótu (.lnk) w systemie Windows
Opis formatu plików skrótu (.lnk) można znaleźć w dokumencie pt. „[MS-SHLLINK]: Shell Link (.LNK) Binary File Format”.
Tworzenie plików skrótu (.lnk) w systemie Windows
Podmioty zagrażające (ang. threat actor) mogą tworzyć pliki skrótu
za pomocą programów do generowania malware (ang. malware builder).
Pliki binarne z rozszerzeniem .LNK
utworzone w ten sposób
pozwalają na umieszczenie wewnątrz nich różnego rodzaju ładunków (ang. payload)
oraz wymazanie lub sfałszowanie metadanych.
Fragmenty kodu często są wykonywane przez programy typu
LOLBin (Living off the Land Binary),
czyli neutralne komponenty zawarte w systemie operacyjnym, ale użyte w złym celu.
Przykładowe ładunki mogą zawierać np.: jednolinijkowy kod w PowerShell, polecenia cmd.exe
,
wywołania funkcji bibliotek .dll
przez rundll32.exe
,
skrypty Visual Basic i inne uruchamiane przez wscript.exe
(Windows Script Host)
czy też kompilację kodu źródłowego „w locie” (ang. on the fly) za pomocą csc.exe
(Visual C# Compiler).
Tworzenie pliku skrótu (.lnk) za pomocą Windows PowerShell
$Path = [Environment]::GetFolderPath("Desktop") + "\ethical2.lnk";
$WScriptShell = New-Object -comObject WScript.Shell;
$Shortcut = $WScriptShell.CreateShortcut($Path);
$Shortcut.TargetPath = '%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe';
$Shortcut.Arguments = '-Command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show(''ethical.blue Magazine'', ''ethical.blue'', ''OK'', ''Information'');"';
$Shortcut.Save();
Tworzenie pliku skrótu (.lnk) za pomocą C#
using System.Runtime.InteropServices;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
string path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"ethical.lnk");
dynamic WScriptShell = Microsoft.VisualBasic.Interaction.CreateObject("WScript.Shell", "");
dynamic Shortcut = WScriptShell.CreateShortcut(path);
Shortcut.Arguments = "-Command \"Add-Type -AssemblyName System.Windows.Forms; " +
"[System.Windows.Forms.MessageBox]::Show('ethical.blue Magazine'," +
"'ethical.blue', 'OK', 'Information');\"";
Shortcut.Description = "ethical.blue Magazine";
Shortcut.TargetPath = "%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe";
Shortcut.Save();
}
Tworzenie pliku skrótu (.lnk) za pomocą Visual C++
#include <Windows.h>
#include <ShlGuid.h>
#include <WinNls.h>
#include <Shobjidl.h>
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd)
{
HRESULT hResult = CoInitialize(NULL);
IShellLink* pShellLink = nullptr;
hResult = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink,
(LPVOID*)&pShellLink);
if (SUCCEEDED(hResult))
{
pShellLink->SetPath(L"%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe");
pShellLink->SetArguments(L"-Command \"Add-Type -AssemblyName System.Windows.Forms; "
L"[System.Windows.Forms.MessageBox]::Show('ethical.blue Magazine', "
L"'ethical.blue', 'OK', 'Information');\"");
IPersistFile* pPersistFile = nullptr;
hResult = pShellLink->QueryInterface(IID_IPersistFile,
(LPVOID*)&pPersistFile);
if (SUCCEEDED(hResult))
{
OPENFILENAME openFileName;
WCHAR wszFilePath[MAX_PATH] = L"";
ZeroMemory(&openFileName, sizeof(openFileName));
openFileName.lStructSize = sizeof(openFileName);
openFileName.lpstrFilter = L"Pliki skrótu (*.lnk)\0*.lnk\0Wszystkie pliki\0*.*\0";
openFileName.nMaxFile = MAX_PATH;
openFileName.lpstrFile = wszFilePath;
openFileName.lpstrDefExt = L"lnk";
if (GetSaveFileName(&openFileName))
{
hResult = pPersistFile->Save(wszFilePath, TRUE);
}
pPersistFile->Release();
}
pShellLink->Release();
}
return EXIT_SUCCESS;
}
Analiza statyczna plików skrótu (.lnk)
Przed rozpoczęciem analizy statycznej może być potrzebna zmiana rozszerzenia pliku skrótu z .lnk
na przykład na .lnk.bin
,
aby uniknąć odczytania miejsca docelowego na jakie skrót wskazuje zamiast pliku .lnk
.
Można to wykonać np. za pomocą cmd.exe (rename C:\msgbox.lnk C:\msgbox.lnk.bin
) lub
PowerShell (Rename-Item -Path C:\msgbox.lnk -NewName C:\msgbox.lnk.bin
).
Narzędzie dotLNK
podczas wyświetlania okna dialogowego OpenFileDialog
używa parametru DereferenceLinks = false
.
Dzięki temu powinno być możliwe otwieranie plików skrótu z rozszerzeniem .lnk
.
Pod poniższym adresem można znaleźć narzędzie umożliwiające przegląd zawartości i metadanych plików skrótu (.lnk
) systemu Windows.
https://ethical.blue/download/dotLNK.zip [dostęp: 2024-05-03]