linux命令反混淆沙箱小记

很久没写点东西了,今天就最近研究的混淆对抗记录下思考过程

谈起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要离开,着实有些失落,谨此,祝好。

参考

  1. linux命令反混淆-忙里偷闲 https://cloud.tencent.com/developer/article/1369290

  1. shell运营流程 https://cloud.tencent.com/developer/article/1004360

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值