linux命令反混淆
前言
大家也都知道最近一直在做的是webshell的检测,为啥突然搞了一下linux命令反混淆呢?纯属忙里偷闲之举,主要听了几位大佬的关于linux恶意命令检测这方面的分享,真心佩服,就想搞一搞,站在大佬的肩膀上做一些苦力活,做一些小思考,多解决一些问题。。。记得点GG,文末有福利。。。
支持我就点点文末GG,穷死了。。。
第一节
去伪存真
在对linux恶意命令检测的过程中,比较头疼的是命令的混淆,混淆的命令更容易绕过静态检测,其实和webshell一样的道理,变形多样化。咱们看一个例子:
cat $(echo /e)tc$(echo /pa*)wd
其实这是一个对 cat /etc/passwd 的混淆,利用shell的语法特性,可以构造多种多样的混淆,举一些 cat /etc/passwd 的变形,当然这些网上都有,尤其是国外的Twitter上。
cat /et$'c/pa\u0000/notexist/path'sswd test=/ehhh/hmtc/pahhh/hmsswd; cat ${test//hh??hm/};
大家可以思考一个这样的问题,为什么混淆的命令,bash (shell的一种) 依然可以运行呀,说明bash是知道真正要执行的命令,也就说无论怎么混淆,bash都是知道的。
那就可以从bash本身下手。。。
支持我就点点文末GG,穷死了。。。
第二节
bash 调试功能
经常使用shell的,大家都应该知道 sh -x 这个命令,sh其实是bash的软连接,本质上还是调用的bash。sh -x可以打印出shell脚本的运行过程,这样就可以看到真正的执行命令,
但是有一点不好,就是它真的会把命令执行起来。。。用它作为沙箱比较蛋疼,浪费了检测的时间,还有可能被反调试。
先看一下效果,咱们把 cat $(echo /e)tc$(echo /pa*)wd 保存成一个 shell文件,然后使用sh -x进行调试。
大家看到了吗?前面带+号的就是执行的流程,以及最后真正执行的命令,混淆的命令在bash面前全部显示出来。如果大家使用sh -x作为沙箱的话,使用python脚本提取带+号的内容,即是还原的命令。。。
但是我感觉应该更进一步,努力一下,我提到了上面sh -x,作为沙箱的一些不太好的点,它真的会把命令执行,假如混淆的是ping命令,ping一个域名,需要较长时间,真的运行的话,这个沙箱的效率太低了。。。
对于这个功能,需要进行定制化的改造。。。不能让命令真的运行起来。。。
支持我就点点文末GG,穷死了。。。
第三节
bash 调试功能改造
现在常用的bash4.2的代码10万多行,对于bash的改造就是要好好看代码,bash是一个伟大的产品,值得一看(内心mmp)。。。
对于具体的改造,一两句话说不清楚,其实就是一句一句的跟踪代码,体力活总得有人干。等我把这个bash改造完成,再详细的说一下。经过初步的改造,编译成bash文件,外部命令已经无法运行,还是以cat /etc/passwd 为例,将他保存为test.sh文件。
cat $(echo /e)tc$(echo /pa*)wd
这样沙箱的检测速度就会成倍的增长。。。
这个编译好的bash,我会在知识星球中分享,
当然这个bash还有一些瑕疵,在处理管道的时候,还是有点小问题。