渗透基础——获得 Exchange 服务器的内网 IP

发布于 2024-10-02 09:24:41 字数 4302 浏览 7 评论 0

0x00 前言

在渗透测试中,为了搜集信息,常常需要从外网获得 Exchange 服务器的内网 IP,公开资料显示 msf 的 auxiliary/scanner/http/owa_iis_internal_ip 插件支持这个功能,但是这个插件公开于 2012 年,已不再适用于 Exchange 2013、2016 和 2019,本文将要介绍一种更为通用的方法,开源代码,记录细节。

0x01 简介

本文将要介绍以下内容:

  • owa_iis_internal_ip 插件介绍
  • 更为通用的方法
  • Python 开源代码

0x02 owa_iis_internal_ip 插件介绍

msf 的 auxiliary/scanner/http/owa_iis_internal_ip 插件支持探测 Exchange 服务器的内网 IP,对应 kali 系统下的位置为: /usr/share/metasploit-framework/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

github 上的地址为: https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

通过阅读源码,可以总结出实现原理:

  • 设置 HTTP 协议为 1.0 并访问特定 URL
  • 在返回数据中,如果状态码为 401,在 Header 中的 "WWW-Authenticate" 会包含内网 IP
  • 在返回数据中,如果状态码位于 300 和 310 之间,在 Header 中的 "Location" 会包含内网 IP

在提取 IP 时,使用正则表达式 (192\.168\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ,这里存在 bug:只能筛选出格式为 "192.168.*.*" 的内网 IP

为了修复这个 bug,可以将正则表达式修改为 ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})

注:

修改插件后需要执行命令 reload_all 来重新加载 msf 插件

修复上面的 bug 后,我在测试 Exchange 2013、2016 和 2019 时仍然无法获得准确的内网 IP

0x03 更为通用的方法

这里给出一种基于 owa_iis_internal_ip 插件的方法,使用 Python 实现,适用范围更广

思路如下:

利用 Python 设置 HTTP 协议为 1.0 并访问特定 URL,在报错结果中暴露出 Exchange 服务器的内网 IP

需要细节如下:

(1)Python 设置 HTTP 协议为 1.0

Python2:

import requests
import httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'

Python3:

import requests
from http import client
client.HTTPConnection._http_vsn=10
client.HTTPConnection._http_vsn_str='HTTP/1.0'

(2) 设置访问 URL

owa_iis_internal_ip 插件中提到的 URL:

urls = ["/Microsoft-Server-ActiveSync/default.eas",
      "/Microsoft-Server-ActiveSync",
      "/Autodiscover/Autodiscover.xml",
      "/Autodiscover",
      "/Exchange",
      "/Rpc",
      "/EWS/Exchange.asmx",
      "/EWS/Services.wsdl",
      "/EWS",
      "/ecp",
      "/OAB",
      "/OWA",
      "/aspnet_client",
      "/PowerShell"]

经过多个环境的测试,更为精确的 URL 如下:

urls = ["/OWA",
      "/Autodiscover",
      "/Exchange",
      "/ecp",
      "/aspnet_client"]

(3) 测试代码

#python3
import requests
import urllib3
urllib3.disable_warnings()
from http import client
client.HTTPConnection._http_vsn=10
client.HTTPConnection._http_vsn_str='HTTP/1.0'
try:
    url = "https://mail.test.com/OWA"
    response = requests.get(url, verify = False)
    print(response.status_code)
    print(response.text)
    print(response.headers)
except Exception as e:
    print(e)

回显结果:

HTTPSConnectionPool(host='192.168.1.1', port=443): Max retries exceeded with url:/owa/auth/logon.aspx?url=https://192.168.1.1/OWA/&reason=0 (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000000003604CC8>: Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))

从报错信息中,我们可以看到 Exchange 服务器的 IP,这里只需要加一个正则表达式 host='(.*?)', 即可提取出来 IP

0x04 开源代码

完整的实现代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetInternalIP.py

代码支持 5 种方式探测内网 IP

目前测试结果显示,该脚本支持 Exchange 2010、2013、2016 和 2019,能够稳定获得内网 IP

0x05 小结

本文分析了 msf 的 auxiliary/scanner/http/owa_iis_internal_ip 插件,对于获得 Exchange 服务器的内网 IP,给出了一个更为通用的方法,开源代码,记录细节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

毁梦

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

安静被遗忘

文章 0 评论 0

喔爱吃橙子

文章 0 评论 0

草莓味的萝莉

文章 0 评论 0

梦里兽

文章 0 评论 0

mb_83J3Cyxa

文章 0 评论 0

时间海

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文