下载地址:https://download.vulnhub.com/darkhole/darkhole_2.zip
1.配置环境
kali:NAT
吧唧:NAT
2.主机发现
经过粗略的扫描我们可以看出我们吧唧的端口是192.168.139.147
经过较为详细的扫描,我们可以看见吧唧开启了22ssh服务,还有80http服务,惊喜的是,我们还发现了一个git仓库
3.访问服务
我们尝试访问80端口的http服务,如你所见,最中间的黄色按钮按了没有任何反应
右上角的那个login按钮点击后会跳转到login.php页面,很明显这是一个登录界面,输入任何的账号密码他都不会有反应,也不会告诉你正确与否,当我们尝试在输入电子邮件的时候加入一个引号,他会直接告诉我们“@”后面的内容不应包含符号“'”,这里大概是不能够进行注入的
刚刚我们在进行端口扫描的时候也扫描出他有git仓库,在Linux中.开头的是隐藏文件,网站管理员可能会存在没有删除.git文件的情况下就把网站上线,这样会造成网站泄露,因为是Apache服务器,所以我们可以通过文件夹的方式访问一些文件
通过目录扫描我们可以看见他扫描出了git仓库的一些文件,以及一些目录,我经过一番翻找和挖掘,并没有发现什么有用的东东
经过一番沉淀,我明白了一个道理,他都是git源码泄露了,干嘛不下载到本地继续审计呢?在浏览器看不到的一些php代码我们也可以下载到本地来进行查看,这里我使用的工具是git_dumper,我们可以直接使用pip install git-dumper来下载工具,然后进行源码下载
直接就是在源码仓库中进行一番挖掘和探索,这里我们知道了数据库的用户名和连接到对应的某个数据库,但是没有密码
在下载下来的源码中以及git仓库中找到了一些乱七八糟的东西,我整的不是太明白,于是我决定进行一番沉淀
经过一番沉淀,我发现我刚刚忽略了一个重要的东西,我之前在浏览器查看git仓库的时候找到了这个玩意儿,他应该是修改的历史记录之类的东西,果不其然,他这些玩意儿分别是提交的哈希值,作者信息,提交时间,时区以及提交注释
通过git log查看代码库提交的历史记录同样也可以看见之前在浏览器看到的历史记录,通过查看他的注释,我选择去看一下login.php文件中的默认凭证,于是惊喜的发现了密码lush@admin.com:321,他甚至对登录时候的账号密码部署了安全策略——使用mysqlirealescape_string()对其中的特殊字符进行转义
可以看见我们成功的登录进来了,url栏也可以看见如我们刚刚看到的代码一样会有个id参数,凭借一个weber敏锐的嗅觉,他肯定有问题,肯定可以进行注入
我已经不是原来的那个我了,曾经我以为sql注入是特别简单的事情,可是从某道题开始,一切都变了,不再是熟悉的注入,不再是熟悉的账号密码,我反复问自己,这真的是我想要的么?哪怕什么都注不出来,哪怕连最基本的注入点都找不到?真的是这样的么……你要问我为什么放弃?其实……我学会了sqlmap一把梭O.o嘻嘻嘻嘻嘻嘻嘻嘻。沃兹基硕德曾说过,梭哈是一种智慧(绝对不会告诉你是我注的时候觉得有点抽象就没注了)
我们成功的梭哈出来了一对儿账号密码jehad:fool(特喵的第一次的时候把账号密码看反了)
4.信息搜集
我们也是成功的登录进了这个吧唧
直接就是整到了我们第一个flag,在家目录中的losy目录下
DarkHole{'Thisisthelifemanbetterthanacruise'}
多惨的jehad,啥也没有
整到了数据库的账号密码root:Qrc123
直接就是进数据库里面去然后碰了一鼻子的灰,灰溜溜的出来
我使用find命令查找了当前用户jehad具有suid权限的文件,一无所获,find查找当前用户jehad具有读写权限的文件,再次一无所获,经过一番沉淀,我才想起来还有端口可以看,大意了没有闪,这里我们看到有个端口9999,虽然看不出来他在干什么,我知道你很急,但是你先不要急,且听我下回分解……
但是话又说回来,今儿我在沉淀的时候算是学到了,还可以使用history命令查看历史命令,看看jehad干了些什么玩意儿事情
我翻开历史命令一查,这命令没有输出,歪歪斜斜的每条上几乎都写着‘curl’四个字母。我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满本都写着四个字是‘心怀鬼胎’!好一个jehad,他搁这儿进行整活儿呢,看来他也想干一些坏坏的事情。捋一捋思路,不难发现一些线索:该web服务部署在9999端口上,使用了ssh端口转发,并使用curl连接到9999端口的web服务尝试进行查看文件下载脚本等一系列操作,再于攻击机监听,使用9999连接攻击机尝试进行
除了本地转发和远程转发,还有一种是动态转发。这里jehad使用的是本地转发,我以为执行ssh本地转发命令后会连接到远程主机,其实不然,这里要求的输入密码是用于验证身份建立ssh隧道。从而使得访问本地的9999端口可以访问192.168.135.129的9999端口(ssh端口转发参考:SSH端口转发(ssh隧道)_ssh隧道转发_川川小宝的博客-CSDN博客)
我们再看一下/opt/web下的有什么玩意儿,不看不知道一看就看到了我们熟悉的system($_GET['cmd']),前辈真是心怀不轨啊
再看看/etc/crontab,这么一看岂不是jehad和losy俩人各自都是一肚子坏水,真是图谋不轨啊,请允许我叫您二位一声“前辈”,如今我来了,root的事情就交给我吧,古有唐雎不辱使命,今有脚本小子不辱您二位给我做的铺垫
这样一看,如果我们拿到这个shell那么将会是losy的权限,就让我来完成jehad的愿望吧
通过查ip我们知道了这里所谓的本地转发就真是转发到本地呗,“我转我自己”,所以我们不需要像jehad前辈一样在远程主机上下载shell脚本,直接下在本地就好了,相当于我们自己就是远程主机
先去整个php-reverseshell.php到kali本地(shell脚本参考:GitHub - pentestmonkey/php-reverse-shell)
然后再kali上开启服务,在吧唧上找个我们具有权限的目录(tmp就是最好的选择)下载我们的shell脚本
还要修改ip和对应的端口号哦,至此,准备工作做好咯
我们模仿jehad前辈的方法,利用shell+nc的方式在本地弹回来了个shell,因为刚刚的/etc/crontab定时任务中,每分钟都会以losy的身份去/opt/web下开启9999端口,所以登录的身份是losy
这次我学聪明了,去看历史命令,看到咱们的losy前辈一直搁这儿clear,exit,也不知道搁这儿干嘛
咱们的losy前辈把饭喂在我嘴边了,我losy前辈能害我?我嗷呜一口猛猛炫
可以看到losy前辈可以以root权限运行Python,那不就直接使用经典的"import os;os.system('/bin/bash')"一句话直接提权
成功拿到我们的flag
DarkHole{'Legend'}
总结:最开始扫描端口的时候发现了git仓库,我们使用git_dumper命令把git仓库的内容下载到本地方便我们审计,再结合git log和git diff命令对比几次修改的不同得到了jehad的账号密码,成功以jehad的身份登录进去后我们又通过翻阅历史命令记录得知开放的9999服务为一个web服务,还有ssh端口转发来连接到远程主机,在远程主机里面整了个码给我们用来执行命令,还通过/etc/crontab定时任务文件得知了服务是losy开放的,于是我们利用shell+nc的方式成功登录losy,最后通过python提权拿到我们的root权限。这里值得记录的是使用history命令查看历史记录分析思路的做法,还有涉及到的ssh本地端口转发。