ethical.blue Magazine

// Cybersecurity clarified.

Złośliwy kod w plikach skrótu (.lnk) systemu Windows

...
Computer Viruses // // Dawid Farbaniec
Ostatnia modyfikacja:

Spis treści

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”.

...
Podstawowe struktury z jakich składa się plik binarny skrótu (.lnk) w systemie Windows

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

Code:
$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();
Download:

Tworzenie pliku skrótu (.lnk) za pomocą C#

Code:
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();
}
Download:

Tworzenie pliku skrótu (.lnk) za pomocą Visual C++

Code:
#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;
}
Download:

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]

Aplikacja konsolowa dotLNK_Console

...
Aplikacja konsolowa dotLNK_Console | Windows Shortcut (.lnk) Analysis Tool

Aplikacja dotLNK z graficznym interfejsem użytkownika (GUI)

...
Aplikacja dotLNK | Windows Shortcut (.lnk) Analysis Tool
...
Aplikacja dotLNK | Windows Shortcut (.lnk) Analysis Tool
...
Aplikacja dotLNK | Windows Shortcut (.lnk) Analysis Tool
...
Aplikacja dotLNK | Windows Shortcut (.lnk) Analysis Tool

Wykaz literatury

  1. [1] https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/16cb4ca1-9339-4d0c-a68d-bf1d6cc0f943 [dostęp: 2024-04-25]