最近多次处理SHc加密脚本 + 植入Rootkit 方式的挖矿事件,记录一下快速解密SHc加密脚本的方法。
1.Rootkit处置
利用LinuxAR处置Rootkit,卸载可疑内核模块。
发现被隐藏的可疑进程。
发现被隐藏的可疑文件mdcheck
2.SHc 加密脚本分析
mdcheck-b4d5a21f文件存在可疑字符串
E: neither argv[0] nor $_ works.
通过特殊字符串,发现mdcheck-b4d5a21f是通过SHc(Shell 编译器)编译的
2.1 利用UnSHc.sh解密
SHc工具通过ARC4算法加密shell 脚本,其实有现成UnSHc.sh,但是运气好碰到没用时间戳校验以及x86的可以直接解,运气不好需要处理一下样本。
2.1.1 定位ARC4
快速定位的方式可以通过,通过objdump,将所有call函数的调用次数统计一下,大于等于14,则为ARC4加解密函数地址
objdump -D mdcheck-b4d5a21f > dumpfile
grep -Eo "call.*[0-9a-f]{6,}" dumpfile | grep -Eo "[0-9a-f]{6,}" | sort | uniq -c
找到函数地址400BC5
2.1.2 定位扩展密钥
解密UnSHc.sh只考虑14次调用的情况,此样本使用了15次,这也是执行失败的原因,脚本默认找第一次调用ARC4函数前面去找call指令,寻找key地址和长度
mdcheck-b4d5a21f第一次调用sub_400BC5,大概看了一下应该是获取pid做校验用的,与被加密的shell脚本无关
mdcheck-b4d5a21f样本的扩展密钥算法函数在第二次调用sub_400BC5的前面,其实可以直接看到key地址和长度,0x607970和0x100
2.1.3 解密sh.x
接下来,用0x00覆盖第一次调用sub_400BC5的地方,再执行UnSHc.sh,自动定位到扩展密钥算法函数的key地址和长度0x607970和0x100
如果无法直接定位0x607970和0x100,可以修改UnSHc.sh,直接将分析后的地址写入,再执行,效果一样
mdcheck脚本功能,打开防火墙、把Rootkit源码、头文件、Makefile释放到特定目录下,然后编译加载
之后下载挖矿程序,访问域名与yayaya挖矿一致,此次事件为yayaya挖矿新的变种
2.2 利用GDB解密
先替换主机rm命令,再利用GDB加载mdcheck,execvp或者exit下断点,run,记住PID,查看堆区范围
cat /proc/PID/maps | heap
返回GDB,dump堆区
dump binary memory /tmp/bin 0xffffxxxx 0xffffxxxx
查看堆区字符串也能看到解密后脚本内容
strings /tmp/bin
4.3 直接执行解密
先替换主机rm命令,直接执行,执行过程中会报错
新开ssh,执行命令,将进程的cmdline写入文件中,cmdline为解密执行的shell脚本内容
ps -ef | grep mdcheck | grep -v grep | awk '{print $2}' | xargs -I {} cat /proc/{}/cmdline > mdcheck_cmdline.txt
原文始发于微信公众号(TahirSec):Linux | SHc 加密脚本解密技巧
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论