很久没写点东西了,今天就最近研究的混淆对抗记录下思考过程
谈起linux命令混淆,就不得不提强大的bash -x命令,他会把执行的sh脚本命令都打印出来,这里就不再累赘,细节可以参考qiye大佬的文章-linux命令反混淆-忙里偷闲。
其中考虑到安全&速度问题,提到了对bash功能的改造,其实修改非常简单,只需要废弃掉关键执行函数shell_execve即可,这样就可以达到既能打印命令,同时不执行外部命令的目的,下面是个简单示例:
#cat 1.sh
cat /etc/p''as''swd
#./bash -x 1.sh
+ cat /etc/passwd
缺陷
经过对混淆样本的测试发现改造后的bash仍然存在一些不足,无法还原出rev/cut等管道混淆命令,比如:
#echo 'cat $(echo "dwssap/cte/" | rev)' > 1.sh
#./bash -x 1.sh
++ echo dwssap/cte/
++ rev
+ cat
这里并没有顺利还原出/etc/passwd,究其原因,bash在执行命令时会通过find_shell_builtin对命令进行区分,根据类型是内部命令或磁盘外部命令分别调用execute_builtin和execute_disk_command来执行。上述的patch方案仅允许内部命令执行,rev/cut等属于外部命令,因此无法还原。
优化
那如何覆盖这种常见的管道混淆场景呢,其实我们只需要让bash -x 执行部分可控的外部命令即可。这里想到了两种方案。
第一,就是把这些常见的命令直接改造为内置命令进行编译打包,这种虽然可行,但实在太麻烦,不符合懒人标准,果断放弃。
第二种其实也很简单,既然所有的外部命令都会经过shell_execve函数来执行,那么我只需要在这里放通部分可执行命令就行啦,在shell_execve中增加以下代码:
// patch obf code obf_cmd like rev/cut
if (echo_command_at_execute){
int i = 0;
for (;obf_cmd[i];i++){
if (strcmp(command,obf_cmd[i]) == 0){
execve (command, args, env);
goto obf_end;
}
}
return EXECUTION_SUCCESS;
}
最终效果如下:
#cat 1.sh
cat $(echo "dwssap/cte/" | rev)
#./bash -x 1.sh
++ echo dwssap/cte/
++ rev
+ cat /etc/passwd
可以看到,顺利还原出了/etc/passwd。
但是依旧不够完美,比如最常见的混淆形如 echo "di" | rev | bash,上述改造并不会打印出解码后的内容,那就要在管道这里做点文章了。
经过分析,do_piping是bash管道的核心处理函数,祭出神器ChatGPT,帮助大家快速了解。(GPT真的太强了)

经过debug bash,找到了不错的修改函数点execute_simple_command,思路就是在匹配到命令是bash时,获取到bash的输入管道内容,并打印出来,需要注意的是,此时管道的数据就已经清空了。
execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
SIMPLE_COM *simple_command;
int pipe_in, pipe_out, async;
struct fd_bitmap *fds_to_close;
{
// pipe patch
if ( echo_command_at_execute && strcmp(simple_command->words->word->word,"bash") == 0){
char buffer[2048] = {0};
read(pipe_in,buffer,sizeof(buffer));
fprintf(stderr,"+ %s",buffer);
return EXECUTION_SUCCESS;
}
这样就完美啦,看下最终的效果:
#echo 'cat $(echo "dwssap/cte/" | rev)' > 1.sh
#./bash -x 1.sh
++ echo dwssap/cte/
++ rev
+ cat /etc/passwd # restore /etc/passwd
#echo 'echo "di" | rev | bash' > 1.sh
#./bash -x 1.sh
+ echo di
+ rev
+ id # restore id
bash安全?
东西是做好了,但是它安全吗,其实并不安全。就风险面分析,首先,他允许执行内置命令,如果未进行安全隔离,单纯的echo命令就足以拿下整个服务器权限,另外放通了部分命令执行,这些命令是否也存在被篡改的风险呢。
为此,可以引入chroot文件隔离方案,同时通过chattr锁死关键文件,基本上就可以杜绝以上风险。其他的绕过方式,这里就抛砖引玉,不再赘述了。
后记
提出问题、发现问题、解决问题,这个技术探索的过程真让人沉迷,可以淡化许多现实的中烦恼。得知qiye要离开,着实有些失落,谨此,祝好。
参考
linux命令反混淆-忙里偷闲 https://cloud.tencent.com/developer/article/1369290