Windows命令混淆

阅读量345607

发布时间 : 2021-11-30 12:00:39

 

最近有些朋友问我一些免杀问题,由于个人技术有限,对静态免杀有些了解(动态免杀真的不会,太菜了),所以就总结了一些Windows中cmd的命令混淆思路,静态免杀无非就是对安全设备检测到代码(命令)中的特征字符进行查杀、过滤,首先做的就是对于特征字符的处理,随后就是对环境中限制的字符替换或混淆,从而达到免杀效果。

(1) 选项字符替换

​ CMD命令中可以执行ping 命令,该命令是由unix系统移植过来的,帮助页面建议命令行选项应使用连字符作为选项字符,例如ping -n 1 127.0.0.1. 这与大多数其他使用正斜杠的 Windows 原生命令行工具不一致。大概是为了帮助有疑问的用户,该程序还接受正斜杠作为选项比如 ping /n 1 127.0.0.1也能运行的。

大多数使用连字符的内置 Windows 可执行文件也接受正斜杠,但有的命令却不可以,例如find /i keyword,该命令将显示包含单词“keyword”的所有文件,但find -i keyword会提示语句错误。

(2) 字符替换

Unicode修饰符替换

​ 另一种方法是用类似的字符替换命令行中的其他字符(即除了选项字符之外)。特别是当你考虑整个 Unicode 范围时,在某些进程可能接受的 ASCII 范围中还发现了许多字母变体。

涉及到的 Unicode 字符ʱ ʰ ʲ ʳ ʷ ʸ ˢ ˣ ˡ

ʷ 修饰字母小写 W

ʸ 修饰字母小写 Y

ʰ 修饰字母小写 H

ʱ 带钩的修饰字母小写 H

ʲ 修饰字母小写 J

ʳ 修饰字母小写 R

ˡ 修饰字母小写 L

ˢ 修饰字母小写 S

ˣ 修饰字母小写 X

​ Unicode 包含一个间距修饰字母范围(0x02B0 – 0x02FF) [ 4 ],其中包括 ˪、ˣ 和 ˢ 等字符。一些命令行解析器将它们识别为字母并将它们分别转换回 l、x 和 s。这方面的一个例子是reg,它将reg export HKCU out.reg和reg eˣport HKCU out.reg视为平等。

因为编码问题显示 ˣ 为方框

逗号、分号替换空格

​ 使用 ; (分号) 和 , (逗号)替换合法空格,但是在某些命令中无法替换,例如:net user会提示语法错误。

(3) 字符插入

​ 同样,有时可以在命令行中插入额外的字符,这些字符将被执行程序忽略。例如,某些可执行文件可能会删除不可打印的字符,同时也可能会过滤掉某些可打印的字符。

​ 例如,Windows 事件日志工具wevtutil似乎接受在随机位置插入某些范围内的 Unicode 字符(ࢯ)的命令行。因此执行wevtutil gli hardwareeventsandwevtutil gࢯli hardwareevents将产生完全相同的输出,尽管后者在第一个参数的中间包含一个阿拉伯字母。

​ 还有常见的 ^ 转义字符插入

​ 插入多个(),也不会影响命令运行

(4) 行情插入

在保持流程完整的同时操纵命令行的另一种方法是插入引号。尽管这听起来像是先前技术的一个子集,但这里的要求是引号成对出现。

您可能熟悉在参数周围加上引号的概念。就拿dir “c:\windows\”例如,这是有效的一样dir c:\windows\,由于缺乏空间。大多数程序都接受这个约定。鲜为人知的是,大多数程序在任意位置接受引号:该命令dir c:\”win”d””ow”s”也可以工作。只要每个参数的引号数是偶数并且后面的引号不超过两个,大多数程序似乎都接受这一点。

(4) 环境变量

​ 在cmd命令行中支持设置环境变量和自定义变量,使用环境变量中的值或字符串可以拼接成想要的命令。例如whoami,将am 设置变量为 t,将命令拼接成who%t%i,执行成功。

利用@在cmd中的特性,@表示后面的命令不显示执行

(5) 参数缩写

​ 插入和替换字符后,我们还需要尝试删除字符。一些应用程序允许为其他冗长的命令行选项提供“速记”,从而更容易记住这些命令,或者缩短命令字符个数。

​ 这是基于 Unix 的工具(例如grep -i keywordvs grep —ignore-case keyword)中的一个众所周知的概念,但在 Windows 上则不然。然而,一些程序接受缩短的版本。有些程序采用与 Unix 类似的方法并接受单字母版本(例如cmdkey /lvs cmdkey /list),有些程序接受其他缩写版本(例如wevtutil glivs wevtutil get-loginfo),而其他程序则采用“通配符方法”。这方面的一个例子是 PowerShell,它的许多关键字允许您在关键字 [ 5 ]的末尾省略一个或多个字符。

​ 需要注意的是有些命令的缩写会出现一些冲突。可以查看powershell相关文档。

​ 免杀的方法有很多,只要思路灵活,静态免杀很容易的。

​ 命令混淆工具已经有好多大佬开发出来了,详细用法大家可以自己研究(网上已经有很多了),命令混淆过静态免杀很简单,在这里提供一个简单的样例供大家参考。

下载地址:https://github.com/danielbohannon/Invoke-DOSfuscation

大概使用方法也很简单。

下载文件后再当前目录运行powershell,导入使用的模块 Import-Module .\Invoke-DOSfuscation.psd1 ;

再运行程序Invoke-DOSfuscation ;

可以查看工具的基本使用方法TUTORIAL

  1. Set command __ //设置需要混淆的命令
  2. Set FINALBINARY__ //设置命令运行的环境
  3. 加载混淆模块,(可以查看下当前目录下的文件夹,不同文件有不同的混淆效果)
  4. 使用show命令查看当前命令设置的参数情况
  5.  可以使用test命令再当前窗口进行测试混肴过后的命令;
  6. 复测下再cmd 中运行的结果;

​ 其中有很多混淆方法,可以自己看下教程,在这里就不一一举例了。混淆只是可以过一些静态面纱,静态免杀无非就是针对特征字符的处理,静态免杀的方法千千万,基本原理不会变,这里只是提供一种思路,供大家参考。

本文由雷石安全实验室原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/260422

安全客 - 有思想的安全新媒体

分享到:微信
+15赞
收藏
雷石安全实验室
分享到:微信

发表评论

雷石安全实验室

欢迎关注公众号@雷石安全实验室 安全工作者不定期分享渗透、APT、企业安全建设等新鲜干货

  • 文章
  • 48
  • 粉丝
  • 44

热门推荐

文章目录
内容需知
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全客 All Rights Reserved 京ICP备08010314号-66