目录
写在开头
本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。靶机DR4G0N B4LL:1本身非常简单,但红队笔记大佬从尽可能减少渗透痕迹的角度进行了操作,对我们的渗透思路也有一定启发(尽可能减少大量扫描)。本文涉及到的知识点包括:常规Web渗透思路、使用脚本进行字符串处理、curl批量访问、图片隐写、变量劫持提权等。完整的打靶思路详见:
「红队笔记」靶机精讲:Dr4g0nB4ll - Vulnhub靶机,简单靶机的高级打法,大量拓展,新手必看。_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
下载链接见:
https://download.vulnhub.com/dr4g0nb4ll/Dr4g0n-b4ll.zip
靶机要求使用VMware Workstation 16以上的版本,将靶机的网络设置为NAT模式,靶机打开启动界面如下图所示:
第一步:主机发现
首先进行主机发现,这里不细讲了。我kali的ip是10.10.10.128,所在网段是10.10.10.0/24。主机发现命令如下:
nmap -sn 10.10.10.0/24
靶机启动前后对比,可以确认我的靶机IP是10.10.10.157。按照常规思路,接下来应该进行端口扫描,但红队笔记提到,在渗透过程中,可以尽可能减少痕迹,因此跳过了端口扫描的步骤,直接猜测是否含有对应的端口。常规端口扫描的命令如下:
nmap -sT --min-rate 10000 10.10.10.157 //TCP全端口扫描
nmap -sT -sC -sV -O -p22,80 10.10.10.157 //用默认脚本扫描服务信息、操作系统版本
nmap --script=vuln -p22,80 10.10.10.157 //漏洞脚本扫描
nmap -sU --top-ports 20 10.10.10.157 //探测UDP最常见的20个端口的开放情况
我就跟着红队笔记大佬的思路,不进行扫描了,直接猜测存在Web(80端口或8080端口开放)服务,下一步进行Web渗透。
第二步:Web渗透
一般这种靶机最大的暴露面还是Web,这里直接浏览器访问靶机IP看看80端口的情况:
果然存在Web页面,渗透过程对于Web页面要重点关注:页面本身的信息、外链链接、子目录、源代码等。发现有个标题叫DRAGON BALL龙珠,一个日本动画(题外话:我小时候没看过这个,但还记得当年小学蹲在地上打圆片玩的时候,许多圆片上就印着七龙珠),继续往下翻,看看有没有什么有价值的信息:
后面基本上都在介绍龙珠这个动漫,好像与渗透关系不大。但是还有个标题写着:
hi this Aj's i'm creating this ctf. this my first vulnhub
提到了一个名字Aj,可能后续会用到。然后还提到这个靶机是个CTF,那也就是说渗透过程很可能会有一些CTF的套路,很可能会有图片隐写。同时提到了一个网站ComicBook.com,不过这个是个有关漫画的互联网站点,我暂时忽略,然后F12访问源代码:
源代码并不长,没有什么CMS,就是最基本的HTML骨架,连js都没有。几个图片的链接都是互联网站点的,意味着存在图片隐写的概率很低,暂时不考虑。特别要关注滚动条,貌似这个源代码有很多行呀,于是往下继续滚动发现在第647行藏着一行备注:
VWtaS1FsSXdPVTlKUlVwQ1ZFVjNQUT09
这看起来可能是个base64编码,解码试试(-n参数表示不在输出末尾添加\n换行符,在这里其实无所谓,但习惯加上-n更加保险)
echo -n 'VWtaS1FsSXdPVTlKUlVwQ1ZFVjNQUT09' | base64 -d
解出来还是个base64编码,总之经过三层解码,最终获得了明文:
echo -n 'VWtaS1FsSXdPVTlKUlVwQ1ZFVjNQUT09' | base64 -d | base64 -d | base64 -d
明文就是DRAGON BALL,这可能是某个密码,某个子目录,某个用户名等等,我们可以尝试把 DRAGON BALL作为子目录,用浏览器访问:
还真是个子目录。其实在robots.txt页面也会有提示,告诉咱们要关注子目录。
总而言之,DRAGON BALL子目录有个secret.txt,还有个子目录Vulnhub,首先先看看这个secret吧:
好像又是一大堆子目录,看名字我们肯定关心/username和/passwd这种,拼接到url上,发现并没有对应目录,试了好几行、不同的子目录都不行。
在真实情况中,需要我们测试访问的url可能会很多,逐一手工访问耗时耗力,不如写个脚本,用curl访问。
第三步:curl批量访问(无果)
首先肯定是要把这个secret.txt文件wget下来:
wget http://10.10.10.157/DRAGON%20BALL/secret.txt
vim打开看看,发现结尾有两行空行,我们把它干掉:
然后就是字符串处理了,我们需要对这17个目录前面添加url:http://10.10.10.157、http://10.10.10.157/DRAGON%20BALL、 http://10.10.10.157/DRAGON%20BALL/Vulnhub三种情况。当然可以用python写个脚本啥的,此处我们用sed工具进行处理:
sed 's|^http://10.10.10.157|' secret.txt | tee -a secret_ext.txt
sed 's|^http://10.10.10.157/DRAGON%20BALL|' secret.txt | tee -a secret_ext.txt
sed 's|^http://10.10.10.157/DRAGON%20BALL/Vulnhub|' secret.txt | tee -a secret_ext.txt
sed是一种流编辑器,将secret.txt文件中每一行的开头(^
表示行的开头)替换(s表示替换)为 http://10.10.10.157
。这样,整个文件的每一行都在行首添加了指定的URL。tee命令用于从标准输入读取数据并写入标准输出,同时保存一份副本到文件。-a选项表示在文件末尾追加而不是覆盖。因此,这个命令将sed处理后的输出保存到secret_ext.txt文件,并将其同时输出到标准输出。最终的secret_ext.txt文件如下(共17*3=51行,下图仅展示部分):
注意到url中不能有空格,手动把三处空格替换为url编码的%20。接下来就可以用curl访问了。
while IFS= read -r url; do
curl "$url"
done < secret_ext.txt
这个bash命令的作用是逐行读取
secret_ext.txt
文件,将每行的内容存储在url
变量中,然后使用curl
命令访问每个URL(分三行还是写在一行都行)。
while IFS= read -r url; do
: 这是一个while
循环,它会读取secret_ext.txt
文件的每一行,并将内容存储在变量url
中。IFS=
用于防止在读取行时发生空格截断,而-r
用于防止反斜杠转义。
curl "$url"
: 在循环的每次迭代中,使用curl
命令来访问存储在url
变量中的URL。"$url"
用于确保URL被正确传递,即使URL中包含空格或其他特殊字符。
done < secret_ext.txt
: 表示while
循环从secret_ext.txt
文件中读取数据。<
符号用于将文件内容重定向到循环中。
这样确实实现了批量访问,但回显结果太长了,不太方便我们观察,可以再改进一下,是我们能够明显的看到每个url访问的http_code:
while IFS= read -r url; do
status_code=$(curl -s -o /dev/null -w "%{http_code}" "$url")
echo "URL: $url | HTTP Code: $status_code"
done < secret_ext.txt
改进的命令使用-s选项使curl命令在执行时保持静默,-o /dev/null
选项将输出定向到/dev/null
,而-w "%{http_code}"
选项用于输出HTTP状态码。
结尾添加grep -v 404,查找不是404的情况,很遗憾,所有的子目录都是404:
对于secret.txt,我们目前是一无所获,接下来看看Vulnhub目录吧。
第四步:Vulnhub目录发现
查看Vulnhub目录,发现有两个文件,一个图片aj.jpg,还有个貌似登录界面login.html:
看看这个aj.jpg,感觉像是个黑客写病毒的图片,很炫酷,感觉这个图片可能会有玄机(隐写)。把他wget下来:
然后再看看登录页面login.html:
好像也没有啥特别的,标题有个xmen,可能是个用户名,同时下面还有个download跳转,点一下就会跳到aj,jpg(去掉url中的.,否则404)
第五步: 图片隐写破解
看来接下来就是尝试aj.jpg有没有什么特殊信息了。 用exiftool看看这个文件:
看不出什么特殊的,用stegseek试试这个图片里面有无隐藏文件(初次使用stegseek需要安装,直接按照命令行提示安装即可):
发现使用passphrase为love即可找到图片中隐藏的id_rsa文件,提取为aj.jpg.out,这貌似是个私钥,cat一下:
确实是个私钥!那很可能可以ssh登录。
第六步:ssh私钥登录
特别注意,既然是私钥文件,应当把权限设置为600。
chmod 600 aj.jpg.out
然后使用私钥登录ssh,问题是这个是谁的私钥呢?我们目前可以尝试的潜在用户名有:root、DRAGON BALL、xmen,最后发现这是xmen的私钥:
ip a和uname -a确认靶机信息:
在xmen当前目录即可看到用户的flag:
同时发现家目录还有个script目录,进去看看:
这还是个root的目录,里面有两个文件,属主和属组都是root,可能能够提权!
第七步:变量劫持提权
先查看一下demo.c:
该代码将进程的用户ID和组ID均修改为0,即root,然后调用系统命令ps,用于查看当前进程的状态。然后我们再运行一下shell,看看有什么效果:
发现运行shell文件和运行ps查看进程的效果基本一致,猜测可执行文件shell的源代码就是demo.c。注意shell这个文件是有s位的,即具有SUID(Set User ID)权限,文件所有者是root用户,那么当其他用户(例如xmen)执行该文件时,该文件将以root用户的身份运行,而不是执行者的身份。我们该如何利用这一点提权呢,特别关注demo.c中执行了system('ps'),其中的ps并未给出绝对路径,默认情况下肯定是指查看系统进程的ps,即下面这个ps:
但如果我们创建一个同名的文件ps,内容是"/bin/bash",并对这个变量ps作劫持,使得system('ps')中的ps不是指向/usr/bin/ps,而是指向我们创建的内容是"/bin/sh"的文件,最终运行这个shell文件即可以root身份执行/bin/bash,相当于提权了(见上一段黑体字)。
创建提权文件ps
因此首先我们要创建一个可执行文件,文件名是ps,内容是"/bin/bash"。在哪里创建问题都可以,但当前目录是root组的,没有创建新文件的权限。
因此我们可以在家目录创建,也可以在/tmp中创建。这里就选在家目录:
echo "/bin/bash" > ps
注意添加执行权限:
chmod +x ps
这样我们就创建好了文件ps,下面就要劫持环境变量,使得demo.c中system('ps')中的ps指向我们刚刚创建的可执行文件ps。
环境变量劫持
可以先看一下当前的环境变量是啥:
可以看到,在环境变量中,/usr/bin目录位于第二个,如果我们能将当前目录放在这个目录之前(即第二个之前),系统寻找ps时就会先找到当前目录的ps(即"/bin/sh")。 解决这个问题很简单,我们只要修改环境变量,将当前目录.放置在第一个即可:
export PATH=.:$PATH
这样就实现了劫持。下面只要在含有自己创建的ps文件的目录运行shell,即可实现提权。也就是在当前家目录运行shell即可以root权限运行/bin/bash,实现提权:
root的flag位于/root目录下:
至此打靶完成。
总结与思考
这个靶机仅从打靶的角度来看,算是个简单的靶机。但同时红队笔记大佬从尽可能减少渗透痕迹的角度来进行操作,避免了大规模的扫描和目录爆破,也是一种很好的思路。涉及到的知识点包括:常规Web渗透思路、使用脚本进行字符串处理、curl批量访问、stegseek图片隐写破解、变量劫持提权等。总结一下打靶过程:
1.主机发现,确定靶机IP。
2.Web渗透,源代码中找到提示词,发现是个子目录,目录中又有子目录Vulnhub和文件secret.txt
3.secret.txt疑似又是子目录,curl批量访问无果。
4.Vulnhub目录中有个存在隐写的图片,破解出ssh私钥。
5.ssh私钥登录,获得初始立足点。
6.变量劫持实现提权。
同时在进行curl批量访问的时候,涉及到许多bash脚本,不用死记硬背,现在有了chatgpt,可以很容易的让chatgpt来搞定:
打靶到这里就结束了。最近好久没打靶和写博客了,临近找工作,又要搞毕设,略显迷茫,找不到方向。感觉网安行业对于我这种研究生才转来的菜鸟很不友好,将来做什么还是未知数。以后还会更新一些打靶和渗透相关的博客,可能也会开个新的专栏写与网安无关的方向。
恳请各位读者多多点赞关注支持啦。学渗透还是要实操呀,如果读者有什么网安相关的问题也欢迎关注评论区留言讨论,我一定知无不言!