最近在开发一些小东西, 大家都知道之前写过web的在线免杀, 但是总感觉用起来不得劲, 也懒得维护, 写的也乱, 后面就不了了之了, 但是每次需要用到的时候, 都要么去自己编译, 要么去用脚本加载, 有点麻烦, 就想着写个gui的, 方便自己用。目前已经做好了免杀和命令混淆, 后续应该会加一些类似ThinkPHP全版本漏洞检测之类的东西进去, 本来最开始只是想写个免杀的, 后面写魔怔了, 就接着写下去了。工具由Python编写, 除了部分免杀脚本, 其他所有脚本代码都是我一点一点造轮子敲出来的。免杀模块这里, 配置文件把每种免杀方法可过的杀软写成了列表, 用户可以多选需要绕过的杀软, 以此应对目标主机有多个杀软的情况, 获取到目标杀软列表后会和配置文件中每种杀软可过的杀软列表做对比, 如果是子集, 则标记该方法可用, 如果有多个方法可以用, 会随机选择一个。因为我比较懒, 懒得搭环境去做详细的测试, 也不想上传vt (其实也上传了一个), 所以就默认虚拟机检测了三种常见的AV, 如果想添加其他杀软, 可以在配置文件修改。


命令混淆模块其实GitHub上面有现成的脚本, 但是本着我造轮子我光荣的理念, 我还是决定自己去写 (虽然lengyi宝还是提出了实战是否用得到这么混的代码的质疑哈哈)
遇到的坑是在编写混淆模块1的时候遇到的, 中间排错调试过程很曲折, 我这里直接写最简洁的思路。在模块编写完成并且可以正常运行之后, 我发现生成的混淆cmd命令有时可以用, 有时用不了, 根据报错信息来看是因为没有成功执行set去添加环境变量。常见的混淆手法网上挺多的, 这里就略过, 首先我们知道, 我们可以通过这样的语句去混淆命令:cmd c "set x=whchui & echo %x:hchu=hoam% | cmd"

这里设置环境变量后, 通过对环境变量内的值进行重复值, 再通过"|"符号echo出来给cmd去执行这里为了方便看, 且除了set以外, 后面的其他内容无论混淆与否都没有什么影响, 我们把它记作:
当出现混淆后的命令不能执行后, 我尝试把调用cmd和实际执行的命令分开, 也就是分别去执行A, B两个命令
A :
cmd /c (实际执行的是混淆后的, 但是不影响, 这里写简写)
B :
command
我发现这样去执行, 两个命令都可以正常执行, cmd可以正常调用, 而混淆后的command也可以成功执行。
起初我以为是环境变量名后面只能跟数字和字母, 不能跟特殊字符, 但是测试之后发现都是可以的。于是接着排错, 为了方便看, 这里用引号: " 为例子做一个简单的混淆""c""m""d"""" ""/c "w"h"o"a"m"i"""""

cmd c
第一种:
先执行:
""c""m""d"""" ""/c "set a=whoami"
再执行:
%a%
第二种:
直接执行:
""c""m""d"""" ""/c "set a=whoami & echo %a% | cmd"


这是因为/c参数会在执行结束后关闭掉开启的cmd环境, 而set设置的环境变量会在cmd重启之后消失, 第一种命令相当于设置环境变量之后, cmd环境被关闭, 再回到你的cmd环境之后, set的变量已经消失了, 你再去调用环境变量执行, 就会报错不存在。第二种之所以可以执行, 是因为"|"符号的存在, 让输出也在同一个cmd环境下进行了。 先执行:
""c""m""d"""" ""/k "set l=whoami"
再执行:
%l%

这里/k参数保留了当前的cmd环境 (可以通过窗口标题看出来, 环境并没有刷新), 因此可以成功执行。 根据以上演示的原理, 我分别尝试了使用/c和/k对混淆逻辑做了修改, 但是后面发现/k输出后没有回显, 还是得用/c。在这里卡了很久, 最后终于测出来是cmd /c之间的引号问题, 这里就很奇怪了, 因为在我们前面的演示中, cmd /c之间的引号是不会影响我们执行的。这里需要注意的是引号存在的位置, 我们可以看到在cmd和/c之间引号是不起作用的 (无论奇偶, 另外补充一下在使用^转义符号的时候, 会跟引号的奇偶数有关系)""c""m""d "/c "w"h"o"a"m"i"""""
""c""m""d ""/c "i"p"conf"ig"""""

没有引号:
cmd /c "set m=whoami & echo %m% | cmd"

有引号: # 因为图太多, 就不放了, 大家注意引号的位置和个数
cmd "/c "set m=whoami & echo %m% | cmd" # 不可以执行
cmd"" /c "set m=whoami & echo %m% | cmd" # 可以执行
cmd ""/c "set m=whoami & echo %m% | cmd" # 可以执行
cmd " " /c "set m=whoami & echo %m% | cmd" # 可以执行
cmd """/c "set m=whoami & echo %m% | cmd" # 不可以执
(1) cmd和/c之间的空格不影响 , 有无都可, 引号之间也是有无都可 (2) 引入set后, cmd和/c之间的引号必须为双数, 单数将会报错实不相瞒, 这是我写文章的时候现测出来的, 本来我测到以为cmd和/c之间引入set后是不能有引号的, 写文章的时候复现截图发现跟引号个数有关系, 我是真的心里苦。
=====================================帮婷姐发个驻场招聘, 时间是九月份开始, 有意可以微信联系我待遇:
学历低 能力不强10k左右,学历高的话可以安排到金融行业驻场 年薪30左右
要求:
1. 熟悉常见漏洞原理, 渗透测试方法, 漏洞修复方法, 熟练使用常见安全工具
2. 熟悉常见框架漏洞、常见反序列化等最新漏洞
3. 熟悉常见安全设备,具备攻击事件分析研判能力
4. 具备溯源应急响应能力
5. 具有工作经验或参与过护网、重保项目优先
地点:
大部分北上广深=====================================