目录
写在开头
第一步:主机发现和端口扫描
第二步:FTP和NFS渗透(失败)
第三步:web渗透
第四步:jsfuck解码
第五步:再次FTP渗透与莫尔斯电码解码
第六步:vim读取断电swp文件
第七步:tar文件能力读取root.txt
第八步:提权
suit之polkit利用提权
Linux Polkit 权限提升漏洞利用提权
总结与思考
写在开头
本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机的打靶过程还挺长的(下载就花费了挺长时间),也可能是因为有好多知识点我不够了解,同时最后采用了两种方式进行提权。靶机很有解密的性质,同时也涉及到了有关意外断点产生的swp交换文件读取知识点,与实际情况的渗透相似。靶机的难度不高,但涉及到的知识点较为密集,包括nfs挂载、jsfuck混淆、ftp多文件读取、文件图片隐写、莫尔斯电码解码、断电swp文件读取、polkit权限提升等,完整打靶思路详见:
「红队笔记」靶机精讲:CONNECT THE DOTS - 不懂jsfuck,polkit,图片隐写,莫尔斯码和断电隐患,你可能玩不转这台靶机。_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
Connect The Dots: 1 ~ VulnHub
下载链接见:
https://download.vulnhub.com/connectthedots/Connect-The-Dots.ova
本靶机的目标是拿到两个flag即可,即user.txt和root.txt。不过考虑到本靶机的特殊性,本文还是以拿到最终root权限为打靶成功的标志。靶机下载成功后用vmware打开,将网络链接设置为NAT模式。靶机启动之后如下:
第一步:主机发现和端口扫描
常规思路,首先进行主机发现:
nmap -sn 10.10.10.0/24
我kali的地址是10.10.10.128,扫出来靶机的ip是10.10.10.151,然后扫描所有端口,将结果保存在portscan:
得到开放的端口信息(说白了就是方便复制,用/作分隔符取第一位,并将换行符替换为,):
cat portscan.nmap | grep 'open' | awk -F '/' {'print $1'} | tr '\n' ','
然后详细扫描这些tcp端口,包括操作系统版本-O,服务版本-V,用默认脚本-sC进行扫描:
nmap -sT -sV -sC -O -p21,80,111,2049,7822,37381,39995,48903,53453 10.10.10.151
信息量很大,重点看的是111和2049端口都涉及到nfs网络文件系统的挂载。同时ssh端口修改到了7822。后面的端口是动态端口,没什么有用信息。这里再用默认的漏洞扫描脚本进行尝试:
nmap --script=vuln -p21,80,111,2049,7822 10.10.10.151
漏洞脚本扫描其实没有太多的信息,发现了一个sql注入,还有一些目录枚举的内容。
第二步:FTP和NFS渗透(失败)
分析渗透思路。由于FTP可以算是低摘的果子,我们干脆从21端口入手,先对ftp进行匿名登陆尝试,再查看有没有nfs挂载的目录,接着再对web进行渗透,实在不行再考虑ssh。 先尝试登录ftp:
可惜无法匿名登录,看来ftp这条路走不通,我们再用showmount尝试查看有没有挂载目录(-e参数用于导出挂载目录):
showmount -e 10.10.10.151
确实存在挂载目录/home/morris,这也说明这个靶机有一个用户名是morris,说不定以后我们能拿到这个账号的权限。此时我们新建一个目录mor,尝试能不能把靶机的开放目录挂载连接到mor(-t指定类型nfs):
mount -t nfs 10.10.10.151:/home/morris mor
感觉还是存在很多信息的,但经过尝试,隐藏目录都没有进入权限,也没有查找到什么有用的信息。
这里我看红队笔记大佬的视频,他尽然是可以进入.ssh目录的,很奇怪,按道理说这个所在组和其他组应该都没有读权限的。总之这条路是走不通的。
第三步:web渗透
打开浏览器访问靶机ip,可以看到如下的界面,这个页面的加载略显卡顿:
其实这个界面就是一些文字和图片。查看源代码也没什么收获。不过初看下面这段文字可能会有一些线索:
You know how our family have named us, right? Them naming me M and you N. Well, our names are entirely the same except the initials. Life is too short to save names in your memory when you're old, so why not! But do you know who did that? Our mother who was fond of the James Bond movies. She named me after her as M. Perhaps, she thinks that the director of the movie was too lazy to think of one.
首先尽然有拼错的单词,可能是开发者打字太快了。然后这句话暗示了我们的名字只有首字母的不一样的,而我是“M”你是“N”。结合之前发现的一个账号morris,可以猜测存在另外一个用户名norris。当然此处仅仅是猜测,后面会证实。 这也看不出来啥,进行一个目录爆破吧:
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.151
还是有一些收获的,发现几个目录images,manual,javascript,mysite等,还有一个路径backups,先看一下这个backups:
尽然是个奇怪的视频,播放着几张图片,可能存在隐写啥的。这里先暂时不管。然后发现images就是初始页面的图片目录,manual是apache的配置界面。javascript没有什么值得关注的内容。进入mysite目录:
这个目录中有一个文件bootstrap.min.cs,这个文件名的后缀我还真不知道是啥,点开发现有一大串字符,感觉像是一种程序语言,分析这个文件,结合末尾的setInterval( function() {console.log(a)}, 3000);判断,可能与javascript相关:
第四步:jsfuck解码
这里感觉类似CTF其实需要经验,就是我们看到的由一大堆[]()!+组成编码的字符其实是jsfuck,这是一种针对javascript程序的混淆方法。 和我们上一期打靶Narak中的brainfuck类似。
那么我们当然就要对这个jsfuck进行解码了。进行解码之前,应该先把完整的jsfuck内容复制下来。可以直接复制,并依次删除非jsfuck的字符,也可以像下面这样,在mysite目录下发现了register.html页面:
查看源代码发现这个页面会调用含有jsfuck语句的bootstrap.min.cs:
而 bootstrap.min.cs文件中的jsfuck语句正是由变量b1,b2,...b10拼接而成,因此直接在这个页面的console控制台用console.log将所有的字符串变量拼接即可:
console.log(b1+b2+b3+b4+b5+b6+b7+b8+b9+b10)
然后我们搜索一个在线解码器,把拼接而成的超长jsfuck字符串进行解码:
JSFuck - Write any JavaScript with 6 Characters: []()!+
解码成功了!出现了alert的提示信息:
You're smart enough to understand me. Here's your secret, TryToGuessThisNorris@2k19
TryToGuessThisNorris@2k19应该就是一个凭据,那账号是啥呢,根据推理应该是norris,这既源于开头web页面的提示,也源于密码本身就含有norris,总之我们尝试能否使用这个凭据登录ssh。(可能的用户就只有root/morris/norris三个,注意ssh端口修改为7822)经过尝试发现norris登录成功:
ssh norris@10.10.10.151 -p 7822
成功拿到了user.txt:
第五步:再次FTP渗透与莫尔斯电码解码
同时在当前目录下看到了ftp文件夹,为了方便我们将ftp内的文件下载到kali本地进行分析,因此我们在kali中再次通过norris账号密码TryToGuessThisNorris@2k19登录ftp成功:
发现ftp中有文件夹files,进入目录,把里面的内容全都下载到本地:
这里需要注意的是,如果目录下的文件不是文本.txt文件的话,需要先运行binary指令(即输入binary然后回车)转换为二进制格式,以保证通过FTP下载的文件不会损坏。此处又运行了prompt指令关闭了交互模式,就不用对每个下载都逐一确认了。
如上图所示,四个文件都下载到本地了:
接下来我们使用file工具逐一查看,发现backups.bak是一个iso媒体文件,没找到什么有用信息,game.jpg.bak文件好像备注信息comment中有类似莫尔斯电码的东西:
用exiftools详细查看:
我们可以将这段摩尔斯密码复制下来,找个在线网页尝试解密:
Morse Code Translator - Morse Decoder
解密成功了:
解密后内容如下:
HEY#NORRIS,#YOU'VE#MADE#THIS#FAR.#FAR#FAR#FROM#HEAVEN#WANNA#SEE#HELL#NOW?#HAHA#YOU#SURELY#MISSED#ME,#DIDN'T#YOU?#OH#DAMN#MY#BATTERY#IS#ABOUT#TO#DIE#AND#I#AM#UNABLE#TO#FIND#MY#CHARGER#SO#QUICKLY#LEAVING#A#HINT#IN#HERE#BEFORE#THIS#SYSTEM#SHUTS#DOWN#AUTOMATICALLY.#I#AM#SAVING#THE#GATEWAY#TO#MY#DUNGEON#IN#A#'SECRETFILE'#WHICH#IS#PUBLICLY#ACCESSIBLE.
说实话这么看可读性有点差,干脆存成一个文件morse_decode,然后把所有的#替换成空格再查看:
cat morse_decode | tr '#' ' '
NORRIS, YOU'VE MADE THIS FAR. FAR FAR FROM HEAVEN WANNA SEE HELL NOW? HAHA YOU SURELY MISSED ME, DIDN'T YOU? OH DAMN MY BATTERY IS ABOUT TO DIE AND I AM UNABLE TO FIND MY CHARGER SO QUICKLY LEAVING A HINT IN HERE BEFORE THIS SYSTEM SHUTS DOWN AUTOMATICALLY. I AM SAVING THE GATEWAY TO MY DUNGEON IN A 'SECRETFILE' WHICH IS PUBLICLY ACCESSIBLE.
这段话意思说他的电池很快就没电了,他就要ger~了,于是火速给我们留下一个信息,他把关键的信息secretfile放在了公共的区域。那啥是公共的区域呢?最容易想到的就是web的目录/var/www/html。不过在此之前,我们还要查看其它两个文件:
hits.txt.bak首先给出了一个网址,我们访问这个网址看看有啥信息:
给了我们一句提示:
Remember! Keep your enumeration game strong!
记住!枚举一定要尽全力!
说白了就是再次强调不要遗漏信息。最后一个文件m.gif.bak没发现什么特殊的。
第六步:vim读取断电swp文件
进入web目录/var/www/gtml查找线索:
还真有secretfile,先查看secretfile:
意思是:我知道你来到这里是找密码的。电池就要没电啦!下面的信息有些参考。
下面的信息在哪里?我们看到最后还有一个.secretfile.swp文件,直接cat是没有权限的:
不过这个页面在web端,我们可以把它wget下来:
然后就可以查看了:
感觉cat还是有点乱,我们尝试用strings看一下其中的字符串信息:
这里其实是非常巧妙的。由于swp文件是一种临时的交换文件,通常在特殊异常退出的情况时会产生。结合strings中看到的字符串中存在vim,再考虑到先前我们看到的好多提示都与快没电了!电池耗尽相关。因此我们大胆猜测这个文件就是vim编辑时断点异常退出产生的,我们可以使用vim -r参数读取损坏的swp文件:
vim -r .secretfile.swp
这样子我们又得到了一串字符串blehguessme090,这很可能是又一个凭据,有可能是root或morris的凭据,通过尝试我们发现,这就是morris账户的凭据:
第七步:tar文件能力读取root.txt
下一步就是进行提权了。两个用户用哪个提权都没有倾向性,因此根据用户组的信息,我们还是选用norris进行提权(起码norris所在用户组有sudo):
经过一番sudo -l,定时任务查找之后无果。决定使用getcap工具读取有没有文件具有特殊的文件能力。
/sbin/getcap -r / 2>/dev/null
发现有打包工具tar,具有能力cap_dac_read_search+ep:
cap_dac_read_search+ep
:这是指定文件的扩展文件权限标志。它包含两个部分:
cap_dac_read_search
:这是一种扩展文件权限标志,表示该文件具有读取和搜索(read/search)访问权限,通常用于文件系统的访问。具体来说,这个标志允许tar
命令读取文件和搜索目录,而不需要使用者拥有完全的文件访问权限。
+ep
:这部分表示该文件是一个具有执行权限(execute permission)的可执行文件。这意味着用户可以运行/usr/bin/tar
命令,并且它将以正常的用户身份执行,而不需要特权(root权限)。+ep
的意思是执行和提升权限(effective privilege),这允许tar
在不需要完全的 root 权限的情况下执行一些特定高权限的操作。
说白了,就是tar具有特殊高权限,我们使用tar时哪怕没有拥有文件的访问权限也可以正常读取和搜索。 那我们直接用tar把/root目录打包,然后再解压就可以看到flag即root.txt:
tar -zcvf root.tar.gz /root
然后我们再解压即可读取root.txt:
tar -zxvf root.tar.gz
至此就完成了靶机的要求,但我们其实并没有提权。因此作为后续操作,我们还是实现提权。
第八步:提权
提权有两种方法,先介绍红队笔记大佬的方法,suid提权。
suit之polkit利用提权
首先寻找有s位的文件:
find / -perm -u=s -type f 2>/dev/null
重点关注这个/usr/lib/policykit-1/polkit-agent-helper-1,该文件的属主和数组都是root,且具有s位权限,可以以属主的身份运行,应该可以提权:
polkit是linux系统中针对文件权限管理的一套机制,而helper相当于是充当一个介于操作者与被操作文件的一个中介,会通过这个helper去调用执行文件。因此如果我们能够借助helper的高权限,以root的身份调用bash,即可实现提权。可以通过如下的命令实现触发polkit-agent-helper-1,并借用polkit-agent-helper-1的root高权限启动bash进行提权。
可以使用systemd-run -r启动伪终端,此时会通过polkit-agent-helper-1启动,而polkit-agent-helper-1具有高权限,因此就有可能实现提权。
完整命令如下:
systemd-run -t /bin/bash
如图所示,输入norris的凭据TryToGuessThisNorris@2k19后提权成功:
其中的红色字符正是polkit-agent-helper-1的作用。至此打靶完成。这里引用chatgpt的解释以下polkit和helper的机制:
polkit-agent-helper 是一个用于帮助执行基于 PolicyKit(即 Polkit)的授权请求的工具,它通常用于 Linux 操作系统中。
在 Linux 系统中,PolicyKit 是一个用于管理系统范围的特权访问的工具。当需要执行需要特权的操作时,通常会向 PolicyKit 发送授权请求。PolicyKit 会检查请求者的身份,并基于定义的授权策略(即 polkit 规则)来决定是否授权该请求。
polkit-agent-helper 就是作为一个代理工具,协助应用程序向 PolicyKit 发送授权请求,并处理来自 PolicyKit 的响应。当一个应用程序需要执行特权操作时,它会调用 polkit-agent-helper,该工具会弹出一个对话框,提示用户输入其凭证(如密码),然后将这些凭证发送给 PolicyKit 进行验证。如果用户提供的凭证被验证成功,PolicyKit 就会授权该请求。
因此,polkit-agent-helper 的提权原理可以简单概括为:通过代理向 PolicyKit 发送授权请求,并通过用户提供的凭证验证来获得特权访问。因为polkit-agent-helper所属用户是root且有s权限,那么启用更高级的bash时,就会利用特权提权。
Linux Polkit 权限提升漏洞利用提权
此处存在一个漏洞,即Linux Polkit 权限提升漏洞,这个漏洞通杀很多老版本的linux靶机,可以直接在github上搜索CVE-2021-4034。
选择python编写的exp。你问我明明有C语言,也有go语言写的exp,为啥选python?因为我尝试了很多,发现靶机上没有gcc,也没有go语言的编译器,没法编译,但又python3,因此可以运行python的exp。总之我们应该想方设法把这个exp放到靶机上,github链接是joeammond/CVE-2021-4034: Python exploit code for CVE-2021-4034 (pwnkit) (github.com)
奈何靶机连git都没有,没办法git clone,因此咱还是在kali上git clone,然后启动一个web服务,再在靶机上通过wget拿到这个exp:
git clone https://github.com/joeammond/CVE-2021-4034.git
然后用python启动一个http服务,我这里就用1111端口了:
python -m http.server 1111
此时浏览器访问kali的ip:1111可以看到开放目录:
回到靶机norris,把这个CVE-2021-4034.py用wget下载下来:
然后给这个脚本添加执行权限:
chmod +x CVE-2021-4034.py
运行即可提权:
至此打靶完成。详细关于这个漏洞的描述可以参考:Linux Polkit权限提升漏洞复现&分析(CVE-2021-4034) - 知乎 (zhihu.com)
本文就懒得详细阐释了。
总结与思考
这个靶机知识点真多呀。涉及到ftp渗透、nfs挂载、目录爆破、jsfuck混淆破解、文件隐写、莫尔斯电码解码、vim读取断电swp文件、getcap查看文件能力、suid提权、polkit利用与pokit权限提升漏洞利用等等。感觉知识点很密集,重点是不能放弃。像jsfuck、莫尔斯电码解码以及上一篇博客narak打靶中的brainfuck(详见红队打靶:Narak打靶思路详解(vulnhub)-CSDN博客),都颇有CTF的感觉,需要了解这些知识点,否则哪怕看到了信息,也可能会以为是乱码而忽略了重要线索。同时这个靶机有关读取swp文件的部分也很有趣,前面就暗示我们快没电了,最后产生的swp文件也符合真实情况。最后还是总结一下打靶过程:
1.主机发现和端口扫描:常规思路,发现有ftp和nfs服务。以及常规的80web和ssh端口
2.FTP和NFS渗透:由于FTP和NFS相对好入手,先从这边查看,发现ftp无法匿名登录,此路不通,再尝试寻找开放目录,发现/home/morris,但无法访问。
3.web渗透:目录爆破发现敏感目录mysite,其中有关键信息bootstrap.min.cs
4.jsfuck解码,发现bootstrap.min.cs的内容是jsfuck,在线解码找到一个初始凭据TryToGuessThisNorris@2k19,经过尝试发现是norris的ssh密码。
5.再次FTP渗透与莫尔斯电码解码:登录norris的ssh,发现存在ftp,将ftp中的文件下载到本地后,发现了文件隐写,其中有莫尔斯电码,解码提示我们寻找公开目录,暗示我们访问web目录。
6.vim读取断电swp文件,经过web目录的搜索找到了.secretfile.swp文件,结合之前的断电线索,我们判断这是vim编辑时断点异常退出产生的文件,用vim -r参数修复会话,读取了另外一个凭据blehguessme090,经尝试发现这是morris账号的密码。
7.tar文件能力读取root.txt:发现tar具有特殊高权限,利用tar工具打包/root目录,再解压即可读取flag,即root.txt。
8.提权:介绍了两种方法,suit之polkit利用提权和Linux Polkit 权限提升漏洞利用提权。
总结这个靶机真的太费劲了,也感谢红队笔记大佬的分享。
到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的,有很多新的知识点。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言!