许多 Windows 应用程序有多种方式可以表达相同的命令行,通常是出于兼容性或易用性的原因。结果,命令行参数的实现不一致,由于变化的数量,使得检测特定命令变得更加困难。这篇博文展示了5个 Windows 命令行混淆的方法。
方法:
为了看到这一点,我们现在将仔细研究可能导致同义命令行的五种不同方法。
1、选项字符替换
有些Windows 可执行文件(例如ping)程序是原始 Unix 版本的移植,命令行选项应使用连字符作为选项字符,例如ping -n 5 127.0.0.1. 这与大多数其他使用正斜杠的Windows 原生命令行工具不一致。该程序还接受正斜杠作为选项 ping /n 5 127.0.0.1也能工作。
大多数使用连字符的内置 Windows 可执行文件也接受正斜杠,但反之则不然。find /i keyword例如,该命令将显示包含单词“keyword”的所有文件,同时find -i keyword会导致错误。
(2) 字符替换
另一种方法是用类似的字符替换命令行中的其他字符。尤其是考虑整个 Unicode 范围时,在 ASCII 范围内也发现了许多可能接受的字母变体。
Unicode 包含一个间距修饰字母范围(0x02B0 - 0x02FF) ,其中包括 ˪、ˣ和 ˢ等字符。一些命令行解析器将它们识别为字母并将它们分别转换回 l、x 和 s。这方面的一个例子是reg,它将reg export HKCU out.reg和reg eˣport HKCUout.reg视为平等。
成功执行的一个例子reg eˣport HKCUout.reg。
事实证明,有更多 Unicode 范围包含某些程序接受的字符。
(3) 字符插入
同样,有时可以在命令行中插入额外的字符,这些字符将被执行程序忽略。例如,某些可执行文件可能会删除不可打印的字符,同时也可能会过滤掉某些可打印的字符。
例如,Windows 事件日志工具wevtutil接受在任意位置插入某些范围内的 Unicode 字符的命令行。因此执行wevtutil gli hardwareeventsandwevtutil gࢯlihardwareevents将产生完全相同的输出,尽管后者在第一个参数的中间包含一个阿拉伯字母。
成功执行的一个例子wevtutil gࢯlihardwareevents。
由于命令行提示的标准输入有时不支持可用于此技术的字符(例如,因为它们不可打印),您可能必须使用字节表示法插入字符。从截图中可以看出,在这种情况下,字符被正确地传递给了进程。
(4) 引号插入
在保持流程完整的同时操纵命令行的另一种方法是插入引号。尽管这听起来像是很久以前的技术的一个子集,但这里的要求是引号成对出现。
就拿dir"c:windows"例如,这是有效的一样dir c:windows,由于缺乏空间。大多数程序都接受这个约定。大多数程序在任意位置接受引号:该命令dir c:"win"d""ow"s"也可以工作。只要每个参数的引号数是偶数并且后面的引号不超过两个,大多数程序都是可以的。
成功执行的一个例子netshad"vfi"rewall show currentprofile state。
在命令提示符中使用引号可能很棘手,因为它们通常会在将引号传递给底层程序之前自行处理引号。cmd例如,解决此问题的一种方法是将每个引号加倍,因此要获得如上所示的等效执行,您必须运行netsh ad""vfi""rewall show currentprofile state.
(5) 简写
插入和替换字符后,我们还需要尝试删除字符。一些应用程序允许为其他冗长的命令行选项提供“简写”,从而更容易输入它们。
这是基于 Unix 的工具(例如grep -i keywordvs grep --ignore-case keyword)中的一个众所周知的概念,但在 Windows 上则不然。一些程序接受缩短的版本。有些程序采用与 Unix 类似的方法并接受单字母版本(例如cmdkey /lvs cmdkey /list),有些程序接受其他缩写版本(例如wevtutil glivs wevtutil get-loginfo),而其他程序则采用“通配符方法”。这方面的一个例子是 PowerShell,它的许多关键字允许您在关键字的末尾省略一个或多个字符。
成功执行powershell/encodedcommand ZQBjAGgAbwAgACIASQB0ACAAdwBvAHIAawBzACEAIgA=后跟 13 种不同简写的示例。
也许除了最短的变体之外,在/e使混淆变得更加复杂和不可预测。例如,PowerShell 仅接受缩短的版本,前提是它不会导致另一个命令之间的歧义。出于这个原因,关键字/noprofile的最短变体是/nop, 因为/no会与 eg 发生冲突/noexit。除了这种“通配符方法”之外,PowerShell 在某些情况下也接受首字母缩写词,因此尽管屏幕截图中没有显示,/ec但也可以用作/encodedcommand.