Monday, October 31, 2011

Определяем кто это

В продолжение некоторых повествований о Tool-ах напишу об одном из методов определения личности из IP-адреса (или MAC-адреса, или порта коммутатора) в управлеяемой сети. Здесь я не буду выписывать конкретные скрипты, но если на то будет потребность, куда-нибудь их выложу.

Под "управляемой" я понимаю сеть, где используется какой-то корпоаративный каталог и предприняты меры, чтобы все пользователи в этом каталоге как минимум аутентифицировались. В данной статье в роли каталога будет MS ActiveDirectory.

Соответствие IP-адрес (крайне актуально при использовании DHCP!) логину в домен можно взять из события входа в домен.
Для Windows 2003 - это event ID 540, для Windows 2008 - 4624.

Выгружуть логи входа в домен можно прямо в базу MSSQL logparser-ом, например, вот так:
logparser "SELECT TimeGenerated,EXTRACT_TOKEN(Strings,UNN,'|') AS UserName, EXTRACT_TOKEN(Strings,SNAN,'|') AS SourceNetworkAddress, EXTRACT_TOKEN(Strings,APN,'|') AS AuthenticationPackage INTO TABLENAME FROM \\SERVERNAME\Security WHERE EventID=EVENT AND TimeGenerated > SUB( SYSTEM_TIMESTAMP(), TIMESTAMP('2', 'd') ) AND UserName NOT IN ('';'ANONYMOUS LOGON';'OTHER YOU DONT NEED') AND SourceNetworkAddress <> '-' AND UserName NOT LIKE '%\$' GROUP BY TimeGenerated, UserName, SourceNetworkAddress, AuthenticationPackage " -i:EVT -o:SQL -server:DBSERVER -database:DBNAME -ignoreIdCols:ON -transactionRowCount:1000 -iCheckpoint:CPFILE

Здесь EVENT соответствующий EventID, SERVERNAME - сервер с которого забирать логи (контроллер домена), TABLENAME - имя таблицы куда положить, DBSERVER - сервер базы, где лежит TABLENAME, DBNAME - имя базы данных на сервер DBSERVER, CPFILE - файл контрольной точки (см помощь по logparser-у)
При этом отфильтровываются все "не люди", типа ANONYMOUS LOGON или Что-то$ (является компьютером).

Команда EXTRACT_TOKEN извлекает из переменной Strings токены (разделенные | ) с соотвествующими номерами (фактически, это место того или иного значения в переменной Strings). Чтобы было понятно, покажу как выглядит поле Strings:
S-1-0-0|-|-|0x0|S-1-5-21-2470146651-3958396388-2989495117-22222222|wgates|WINDOMAIN|0x1d4bdaa0|3|Kerberos|Kerberos||{65E49E5E-ABDF-AA83-C373-B27A1ED589E7}|-|-|0|0x0|-|1.1.1.1|3325


Для разных Windows на разных местах стоят различные параметры события. Нам нужны:
UserName
SourceNetworkAddress
AuthenticationPackage

Соотвествующие им номера токенов в приведенной выше команде:
UNN - место в Strings для значения
UserName
SNAN - для SourceNetworkAddress
APN - для AuthenticationPackage

Соотвествующие значения для 2003:
UNN => 0,
SNAN => 13,
APN => 5,

Для 2008:
UNN => 5,
SNAN => 18,
APN => 10,

Чтобы подставить правильный EventID, нужно узнать какая версия ОС на SERVERNAME. Это тоже можно сделать logparser-ом, так как последний умеет читать и из реестра:
logparser "SELECT Value FROM '\\SERVERNAME\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion' WHERE ValueName = 'ProductName' " -i:REG -o:NAT -headers:OFF -recurse:0 -q:ON
Для 2003 будет возвращено:
Microsoft Windows Server 2003
Для 2008 что-нибудь вроде:
Windows Server 2008 R2 Enterprise

Еще немаловажно, как бы это странно не звучало, найти все контроллеры домена. Тут нам поможет штатная команда Windows:
netdom query /D:DOMAINNAME DC
Она вернет список NetBIOS-имен контроллеров домена, которые затем нужно подставлять вместо SERVERNAME в указанные выше команды.

Итак, из таблицы TABLENAME мы можем получить связку IP - ADLogin.

Далее, связку IP - MAC можно получить с маршрутизатора.
Для маршрутизатора Cisco команда такая:
show ip arp
Если используется VRF (скорее всего да, поскольку это уже общепринятая практика), соответственно:
show ip arp vrf VRFNAME

Поскольку MAC, как правило, в обычных условиях не меняют, можно сказать, что компьютер уникально идентифицировали.

В целом, можно воспользоваться DNS-именем, оно тоже нечасто меняется. Хотя, для рабочих станций пользователей ситуация может и меняться.

Последнее, хочется установить коммутатор и номер порта, где этот пользователь располагается. Эту информмацию можно взять с коммутатора. Команды:
Для IOS-а:
show mac-address-table dyn
Для CatOS-а:
sh cam dynamic

Команды вернут связку VLAN-MAC-PORT, название коммутатора, соответственно, - где эту команду вызывали.

Проблема здесь только в том, что надо отфильтровать транки. Какие порты транковые можно узнать так:
для CatOS:
show trunk
Для IOS:
show interface status

Подведем итог:
IP-ADLogin - берем из контролера домена, события входа в домен
IP-MAC - берем с маршрутизатора
VLAN-MAC-PORT-SWITCH - берем с коммутатора.

Если есть какая-либо база разводки СКС, то PORT-SWITCH можно преобразовать в непосредственное метопололжение в офисе. В целом, все что нужно.

Применения.
Приведу лишь некоторые, активно используемые в практике.
1. Определение физического местоположения злоумышленника.
2. Отслеживание перемещений сотрудников по рабочим местам, офисам.
3. Фиксация прихода на работу по событию 'interface up/down' коммутатора. Событие содержит номер порта, который можно преобразовать в Login.
4. Поиск всех компьютеров, на которых логинился в домен пользователь.
....



No comments: