前言
Test Lab是一家名为Pentestit的俄罗斯公司所提供的系列在线靶场。不同于Hackthebox、Vulhub等各类在线/离线靶机,Test Lab通过模拟真实企业内网环境,为渗透测试者提供了免费练习平台。Test Lab中预留了若干token,参与者提交token标志着完成了特定渗透步骤。
截止目前,Test Lab以数月1期的速度更新到了第12期。早前已有网友发表了第10期的过关Write up。这里翻出官方推荐的第九期过关俄文Write Up(来自网友alexeystoletny),翻译、校正、优化后搬运给大家。旧酒犹香,别看是16年的老环境,个人觉得还是内容丰富,颇具特色的。以下开始正文,阅读时间预计1小时:
2016年5月20日,Pentestit启动了一个全新的第九期Test lab(模拟了一个企业网络)供渗透测试实战练习。
感谢Pentestit实验室,我们可以随时了解最新的漏洞并向专业人士(那些每天接触真实网络的渗透测试者)学习,从而有机会成为真正的渗透测试者。
到2016年6月1日,本期Test lab中所有13台机器和14个FLAG全部被攻克。为了帮助那些错过的人们了解当前漏洞和渗透测试世界,接下来我将记录完整的过关过程。
过程很费力且文字叙说起来必然冗长,但是我尽力描述得有趣些。
连接到实验室
在开始之前,你需要注册账号,并设置VPN,连接到虚拟CyBear32C公司网络。整个测试可以在Kali Linux中完成。
我们开始测试
注册和连接后,我们看到以下网络拓扑图:
通过VPN我们可以访问公司网络唯一的外部IP 192.168.101.8(模拟现实中的Internet网关)。像往常一样,需要从枚举开始,特别是通过端口扫描来确定可供外部访问的内部子网服务。
首先是快速端口扫描: nmap -v -n -sV 192.168.101.8
如你所见,我们可以访问来自不同内部主机的一些服务(请参阅网络拓扑图),最有可能的是mainsite主站服务器(端口80),mail邮件服务器(25,8100)和ssh服务器(端口22)等。此外,还有https服务和代理服务器。
MAINSITE
访问http://192.168.101.8/:
我们被自动重定向到域名www.cybear32c.lab
Location: http://cybear32c.lab显然这是一个该公司网站上的虚拟主机。
在/etc/hosts中手动添加本地DNS解析后重试:
可以正常访问网站。首先使用whatweb和dirb工具来帮助获取网站信息和发现子目录(也可以使用其他扫描程序,例如nikto):
我们看到所有请求的响应代码都是403,所以初步判断该站点受到WAF保护。尝试替换UA为默认用户的请求来源-浏览器,发现了一些有用的页面:
网站使用的是WordPress。访问/admin页面,WAF会将我们带到一个已关闭的wp-login.php:
对于Wordpress站点,wpscan是一个很棒的工具。它允许你检查WP站点是否有存在漏洞的插件。我们尝试扫描网站(记得指定浏览器UA),很快检测到了几个问题,其中包括易受SQL注入的插件wp-symposium v15.1。
接着,尝试在参考链接的帮助下利用这些漏洞。但不幸的是SQL查询payload并不能通过WAF。我们需要绕开它……
WAF绕过
通常,许多Web应用程序防火墙可以使用技巧来绕过:添加注释或更改查询中的大小写(例如vErSiOn替换Version)。绕过WAF是一门高深的学问,可以整出许多书籍和文章,在这不多扯了。我们换个思路:
设置浏览器HTTP代理,发现代理需要认证(火狐浏览器无法直接支持):
从网站“Contact us”栏目可以获取两个用户名(b.muncy和r.diaz),所以尝试爆破密码:
祝你好运!现在我们将再次尝试通过代理进入网站并登录。情况已经有所改变了(该网站也可以通过内部IP 172.16.0.5访问,但其他内部服务仍然不可用):
网站不再提示非法行为,我们成功绕过WAF。
利用Wordpress插件中的漏洞
现在,你可以更方便地浏览网站和查找潜在漏洞。你可以直接去做,但使用Burp Repeater会更方便。
首先,需要通过代理链配置代理连接:
在“User Options”选项中添加Upstream Proxy Servers,输入主机信息,将浏览器设置为Burp代理并尝试使用wpscan找到各种漏洞。(其他不直接支持代理认证的程序都可以通过Burp代理来实现代理)
尝试了几个选项后,我们找到了一个SQL注入漏洞:
GET http://cybear32c.lab/wp-content/plugins/wp-symposium/get_album_item.php?size=version(); — HTTP/1.1
获取MySQL版本号 :5.5.49-0 + deb8u1
事情变得容易起来——sqlmap可以直接利用这个漏洞:
因为注入点在列名中(而不是像往常一样在值中),所以在payload(’ — ‘)之后指定后缀很重要的,这样sqlmap就会专注于这种类型的注入。否则,sqlmap可能会错误地将注入类型定义为盲注,从而使得获取数据变得困难和冗长。
我们使用–dbs选项获取可用的数据库:
然后是tables(-D tl9_mainsite –tables)
获取wp_token表数据:
BYPASS Token
在端口扫描期间,还在443端口上找到了https服务。粗略分析和使用dirb爆目录没有发现有用的东西:
显然https服务内容仍在开发中且很长时间没有更新。让我们来看看2014年轰动一时的心脏滴血漏洞:
漏洞存在!可以使用此处脚本进行利用。在阅读了大量有用的信息和数百次尝试之后(重要的是不要轻易放弃),我们发现了:
有人访问下载了旧的备份。我们也可以这样做:
得到token和一些新帐户和密码哈希。我们尝试从哈希中恢复密码(hashcat中1600 Apache apr1)
我们从mainsite获得了b.muncy密码,以及其他帐户的其他密码。
需要强调的是记录所有找到的凭据密码非常重要,因为用户在企业网络不同服务中往往会使用相同的密码。
攻击SSH
不幸的是,到目前为止找到的密码都无法登陆邮箱(通常获取邮箱权限会给深入公司网络提供很大的帮助)。但是没关系,我们可以在端口22上尝试连接SSH:
一个很不寻常的情况:这里使用了自定义的身份验证模块,系统首先请求“SSH密码”,然后是“二次密码”。
我们尝试将找到的所有凭据组合也无济于事。
尝试登陆邮件和SSH都没有预期的结果,也没有其他可用的服务,我们一定是错过了什么。SSH很重要,我们需要死磕它,因为我们可以通过它访问公司网络内部从而继续前进。看看SSH Banner信息里的作者:Pam©krakenwaffe ,不像常见的,谷歌一下能在Github上找到krakenwaffe开发者帐户(cybear32c也是),很有趣!
在某个David的commit中可以发现mypam.c文件,位于:github.com/krakenwaffe/eyelog/blob/master/mypam.c。很明显这是我们尝试登录并请求“密码”的模块。
进入根目录下,看看下一步是什么……注意到了下面这段代码:
我们看到输入的密码会与daypass%d%d比较。我们在编写文档的这一部分时尝试替换当前值,即“daypass80”:
它仍然不起作用。然后我们记住了我们的开发者的名字,他们通过Github与David Nash分享了密码。我们试着去d.nash:
事实证明!我们得到了SSH服务器。让我们看看上面有什么:
除了token之外,在.ssh文件夹中我们还可以找到用于连接到其他服务器的私钥(你可以在known_hosts文件中找到,肯定会在以后派上用场)
现在我们获得了下一次攻击的跳板,CyBear32C的整个企业网络在我们面前展开。
下一步
使用SSH后,你可以访问网络上的所有其他计算机。首先,可以用nmap扫描从在SSH服务器上得到的三个子网,检查可用的服务。
你可以转发端口并尝试攻击,几乎所有内部资源(Windows机器和开发服务器除外)都可用于攻击。
端口转发
有很多方法可以通过SSH连接实现对内部网络的便捷访问。
首先,我建议研究文章“Pivoting或端口转发”。
此外,了解标准SSH客户端的功能非常有用:想要端口转发只需向命令行添加参数而无需重新启动会话。
输入以上命令后,我们将通过127.0.0.1上的端口8086访问服务器192.168.0.6(photo)的端口80:
照片托管和文件上传
照片服务器仅有一个文件上传表单与用户交互(它确实存在漏洞)。
从开发人员的角度来看,要使上传文件安全非常困难,因为攻击媒介太多了(文件扩展名验证绕过,MIME类型或处理文件的库中的漏洞,或竞争条件,或任何其他问题)。
同时,运行dirb以查看Web服务器上有哪些隐藏目录。
上传目录可直接访问,我们将尝试上传正常的图像并确保文件保存在此文件夹中:
google.png可以访问。请注意,该网站显示图像的大小,显然已经解析了。试图下载一个PHP文件:
修改MIME类型和扩展名并没有什么作用:
有趣的是,这给我们提供两个线索:第一是文件可能在加载后删除,所以可以在删除前访问它,第二,我们需要服确保服务端检查这张照片是否存在(对于getimagesize()你可以通过添加GIF头等欺骗)。我们使用file.jpg再次尝试:
文件已成功加载并且可以访问:
但不幸的是,它没有被执行。因为php后缀名并没有解析,所以我们尝试使用不同的扩展名下载此文件:.htaccess,.php5,.phtml和.pht , 发现最后一个有效!它执行了:
现在你需要一个shell。为此,请在SSH服务器上监听端口并访问该文件:
成功获取连接:
你可以在上传文件夹里隐藏子目录找到token:
顺便可以查看下源代码:
我们看到该文件首先存储在一个文件夹中然后只检查,也就是说,除了我们利用的漏洞之外,还存在竞争条件。除了token和服务器上的代码之外,我们发现没什么有趣的,下篇继续!