旧酒犹香——Pentestit Test Lab第九期(上)

 

前言

Test Lab是一家名为Pentestit的俄罗斯公司所提供的系列在线靶场。不同于HacktheboxVulhub等各类在线/离线靶机,Test Lab通过模拟真实企业内网环境,为渗透测试者提供了免费练习平台。Test Lab中预留了若干token,参与者提交token标志着完成了特定渗透步骤。

截止目前,Test Lab以数月1期的速度更新到了第12期。早前已有网友发表了第10期的过关Write up。这里翻出官方推荐的第九期过关俄文Write Up(来自网友alexeystoletny),翻译、校正、优化后搬运给大家。旧酒犹香,别看是16年的老环境,个人觉得还是内容丰富,颇具特色的。以下开始正文,阅读时间预计1小时:

标题: fig:

2016年5月20日,Pentestit启动了一个全新的第九期Test lab(模拟了一个企业网络)供渗透测试实战练习。

感谢Pentestit实验室,我们可以随时了解最新的漏洞并向专业人士(那些每天接触真实网络的渗透测试者)学习,从而有机会成为真正的渗透测试者。

到2016年6月1日,本期Test lab中所有13台机器和14个FLAG全部被攻克。为了帮助那些错过的人们了解当前漏洞和渗透测试世界,接下来我将记录完整的过关过程。

过程很费力且文字叙说起来必然冗长,但是我尽力描述得有趣些。

 

连接到实验室

在开始之前,你需要注册账号,并设置VPN,连接到虚拟CyBear32C公司网络。整个测试可以在Kali Linux中完成。

 

我们开始测试

注册和连接后,我们看到以下网络拓扑图:

标题: fig:

通过VPN我们可以访问公司网络唯一的外部IP 192.168.101.8(模拟现实中的Internet网关)。像往常一样,需要从枚举开始,特别是通过端口扫描来确定可供外部访问的内部子网服务。

首先是快速端口扫描: nmap -v -n -sV 192.168.101.8

标题: fig:

如你所见,我们可以访问来自不同内部主机的一些服务(请参阅网络拓扑图),最有可能的是mainsite主站服务器(端口80),mail邮件服务器(25,8100)和ssh服务器(端口22)等。此外,还有https服务和代理服务器。

 

MAINSITE

访问http://192.168.101.8/:

标题: fig:

我们被自动重定向到域名www.cybear32c.lab

标题: fig:

Location: http://cybear32c.lab显然这是一个该公司网站上的虚拟主机。

标题: fig:

在/etc/hosts中手动添加本地DNS解析后重试:

标题: fig:

可以正常访问网站。首先使用whatweb和dirb工具来帮助获取网站信息和发现子目录(也可以使用其他扫描程序,例如nikto):

标题: fig:

我们看到所有请求的响应代码都是403,所以初步判断该站点受到WAF保护。尝试替换UA为默认用户的请求来源-浏览器,发现了一些有用的页面:

标题: fig:

网站使用的是WordPress。访问/admin页面,WAF会将我们带到一个已关闭的wp-login.php:

标题: fig:

对于Wordpress站点,wpscan是一个很棒的工具。它允许你检查WP站点是否有存在漏洞的插件。我们尝试扫描网站(记得指定浏览器UA),很快检测到了几个问题,其中包括易受SQL注入的插件wp-symposium v15.1。

标题: fig:

接着,尝试在参考链接的帮助下利用这些漏洞。但不幸的是SQL查询payload并不能通过WAF。我们需要绕开它……

WAF绕过

通常,许多Web应用程序防火墙可以使用技巧来绕过:添加注释或更改查询中的大小写(例如vErSiOn替换Version)。绕过WAF是一门高深的学问,可以整出许多书籍和文章,在这不多扯了。我们换个思路:

标题: fig:

设置浏览器HTTP代理,发现代理需要认证(火狐浏览器无法直接支持):

标题: fig:

从网站“Contact us”栏目可以获取两个用户名(b.muncy和r.diaz),所以尝试爆破密码:

标题: fig:

祝你好运!现在我们将再次尝试通过代理进入网站并登录。情况已经有所改变了(该网站也可以通过内部IP 172.16.0.5访问,但其他内部服务仍然不可用):

标题: fig:

网站不再提示非法行为,我们成功绕过WAF。

利用Wordpress插件中的漏洞

现在,你可以更方便地浏览网站和查找潜在漏洞。你可以直接去做,但使用Burp Repeater会更方便。

首先,需要通过代理链配置代理连接:

标题: fig:

在“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

标题: fig:

事情变得容易起来——sqlmap可以直接利用这个漏洞:

标题: fig:

因为注入点在列名中(而不是像往常一样在值中),所以在payload(’ — ‘)之后指定后缀很重要的,这样sqlmap就会专注于这种类型的注入。否则,sqlmap可能会错误地将注入类型定义为盲注,从而使得获取数据变得困难和冗长。

我们使用–dbs选项获取可用的数据库:

标题: fig:

然后是tables(-D tl9_mainsite –tables)

标题: fig:

获取wp_token表数据:

标题: fig:

 

BYPASS Token

在端口扫描期间,还在443端口上找到了https服务。粗略分析和使用dirb爆目录没有发现有用的东西:

标题: fig:

显然https服务内容仍在开发中且很长时间没有更新。让我们来看看2014年轰动一时的心脏滴血漏洞:

标题: fig:

漏洞存在!可以使用此处脚本进行利用。在阅读了大量有用的信息和数百次尝试之后(重要的是不要轻易放弃),我们发现了:

标题: fig:

有人访问下载了旧的备份。我们也可以这样做:

标题: fig:

得到token和一些新帐户和密码哈希。我们尝试从哈希中恢复密码(hashcat中1600 Apache apr1)

我们从mainsite获得了b.muncy密码,以及其他帐户的其他密码。

需要强调的是记录所有找到的凭据密码非常重要,因为用户在企业网络不同服务中往往会使用相同的密码。

 

攻击SSH

不幸的是,到目前为止找到的密码都无法登陆邮箱(通常获取邮箱权限会给深入公司网络提供很大的帮助)。但是没关系,我们可以在端口22上尝试连接SSH:

标题: fig:

一个很不寻常的情况:这里使用了自定义的身份验证模块,系统首先请求“SSH密码”,然后是“二次密码”。

我们尝试将找到的所有凭据组合也无济于事。

尝试登陆邮件和SSH都没有预期的结果,也没有其他可用的服务,我们一定是错过了什么。SSH很重要,我们需要死磕它,因为我们可以通过它访问公司网络内部从而继续前进。看看SSH Banner信息里的作者:Pam©krakenwaffe ,不像常见的,谷歌一下能在Github上找到krakenwaffe开发者帐户(cybear32c也是),很有趣!

标题: fig:

在某个David的commit中可以发现mypam.c文件,位于:github.com/krakenwaffe/eyelog/blob/master/mypam.c。很明显这是我们尝试登录并请求“密码”的模块。

标题: fig:

进入根目录下,看看下一步是什么……注意到了下面这段代码:

标题: fig:

我们看到输入的密码会与daypass%d%d比较。我们在编写文档的这一部分时尝试替换当前值,即“daypass80”:

标题: fig:

它仍然不起作用。然后我们记住了我们的开发者的名字,他们通过Github与David Nash分享了密码。我们试着去d.nash:

标题: fig:

事实证明!我们得到了SSH服务器。让我们看看上面有什么:

标题: fig:

除了token之外,在.ssh文件夹中我们还可以找到用于连接到其他服务器的私钥(你可以在known_hosts文件中找到,肯定会在以后派上用场)

现在我们获得了下一次攻击的跳板,CyBear32C的整个企业网络在我们面前展开。

 

下一步

使用SSH后,你可以访问网络上的所有其他计算机。首先,可以用nmap扫描从在SSH服务器上得到的三个子网,检查可用的服务。

你可以转发端口并尝试攻击,几乎所有内部资源(Windows机器和开发服务器除外)都可用于攻击。

端口转发

有很多方法可以通过SSH连接实现对内部网络的便捷访问。

首先,我建议研究文章“Pivoting或端口转发”

此外,了解标准SSH客户端的功能非常有用:想要端口转发只需向命令行添加参数而无需重新启动会话。

标题: fig:

输入以上命令后,我们将通过127.0.0.1上的端口8086访问服务器192.168.0.6(photo)的端口80:

标题: fig:

 

照片托管和文件上传

照片服务器仅有一个文件上传表单与用户交互(它确实存在漏洞)。

从开发人员的角度来看,要使上传文件安全非常困难,因为攻击媒介太多了(文件扩展名验证绕过,MIME类型或处理文件的库中的漏洞,或竞争条件,或任何其他问题)。

标题: fig:

同时,运行dirb以查看Web服务器上有哪些隐藏目录。

标题: fig:

上传目录可直接访问,我们将尝试上传正常的图像并确保文件保存在此文件夹中:

标题: fig:

google.png可以访问。请注意,该网站显示图像的大小,显然已经解析了。试图下载一个PHP文件:

标题: fig:

修改MIME类型和扩展名并没有什么作用:

标题: fig:

有趣的是,这给我们提供两个线索:第一是文件可能在加载后删除,所以可以在删除前访问它,第二,我们需要服确保服务端检查这张照片是否存在(对于getimagesize()你可以通过添加GIF头等欺骗)。我们使用file.jpg再次尝试:

标题: fig:

文件已成功加载并且可以访问:

标题: fig:

但不幸的是,它没有被执行。因为php后缀名并没有解析,所以我们尝试使用不同的扩展名下载此文件:.htaccess,.php5,.phtml和.pht , 发现最后一个有效!它执行了:

标题: fig:

现在你需要一个shell。为此,请在SSH服务器上监听端口并访问该文件:

标题: fig:

标题: fig:

成功获取连接:

标题: fig:

你可以在上传文件夹里隐藏子目录找到token:

标题: fig:

顺便可以查看下源代码:

标题: fig:

我们看到该文件首先存储在一个文件夹中然后只检查,也就是说,除了我们利用的漏洞之外,还存在竞争条件。除了token和服务器上的代码之外,我们发现没什么有趣的,下篇继续!

(完)