При открытии терминального сервера «наружу» неизбежно придет время, когда вы обнаружите в логах системы большое количество попыток подбора логина и пароля, которые, при большом потоке данных, могут банально заDDOSить сервер до полной невозможности работы пользователей. Да, есть и VPN, и проверка подлинности на уровне сети, и смена номера порта на роутере и т.д,, но все равно проходят и атаки идут. Так усложним им работу 🙂
Потребуется:
- Windows 2008+
- Скрипт
- База данных (Access файл или MS SQL)
- Настроенный брэндмауэр Windows (даже если сервер у вас за внешним файрволом)
Идея работы: ловим событие аудита отказа логина, помечаем адрес злоумышленника в базе, считаем сколько раз событие произошло и, при достижении определенного порога, делаем новую блокирующую запись в правилах файрволла.
В 2008+ сервере появилась возможность выполнить задачу при наступлении определенного события, так воспользуеся этим.
Создадим новую задачу по событию аудита отказа входа в систему, которая будет запускать VBS скрипт.
После создания задачи нужно открыть ее свойства и поставить галку «Выполнять с наивысшими правами».
Теперь нужно определиться, как передать параметры из события, в частности, интересует IP-адрес, с которого идет подбор паролей, и подбираемый логин. В Windows, как всегда, напрямую сделать нельзя, поэтому пойдем через черный ход.
В планировщике заданий находим созданную нами задачу, нажимаем на ней правой кнопкой и выбираем пункт «Экспортировать». Сохраняется файл в формате XML.
Сохранили? Теперь откроем файл в Блокноте и допишем следующие блоки, выделенные желтым цветом. Внимание, верстка немного едет, если что — см. рис 7.
- <Task version=«1.2» xmlns=«http://schemas.microsoft.com/windows/2004/02/mit/task»>
- <RegistrationInfo>
- <Date>2013-12-02T22:50:07.3872408>
- <Author>X>
- >
- <Triggers>
- <EventTrigger>
- <Enabled>true>
- <Subscription><QueryList><Query Id=»0″ Path=»Security»><Select Path=»Security»>*[System[Provider[@Name=’Microsoft-Windows-Security-Auditing’] and EventID=4625]]</Select></Query></QueryList>>
- <ValueQueries>
- <Value name=«TargetUserName»>Event/EventData/Data[@Name=’TargetUserName’]>
- <Value name=«IpAddress»>Event/EventData/Data[@Name=’IpAddress’]>
- >
- >
- >
- <Principals>
- <Principal id=«Author»>
- <UserId>X>
- <LogonType>Password>
- <RunLevel>LeastPrivilege>
- >
- >
- <Settings>
- <MultipleInstancesPolicy>IgnoreNew>
- <DisallowStartIfOnBatteries>true>
- <StopIfGoingOnBatteries>true>
- <AllowHardTerminate>true>
- <StartWhenAvailable>false>
- <RunOnlyIfNetworkAvailable>false>
- <IdleSettings>
- <StopOnIdleEnd>true>
- <RestartOnIdle>false>
- >
- <AllowStartOnDemand>true>
- <Enabled>true>
- <Hidden>false>
- <RunOnlyIfIdle>false>
- <WakeToRun>false>
- <ExecutionTimeLimit>P3D>
- <Priority>7>
- >
- <Actions Context=«Author»>
- <Exec>
- <Command>C:WindowsSystem32cscript.exe>
- <Arguments>C:UsersdmitryBLOCKRDP.vbs ‘$(TargetUserName)’ ‘$(IpAddress)’>
- >
- >
- >
Сохраняем файл, удаляем старую задачу и там же импортируем новую из скорректированного способа. Таким вот затейливым способом можно распарсить данные в XML файле события и передать их в качестве параметров в нужный нам скрипт.
Собственно скрипт.
- Dim ipAddress, idLogin
- Const adOpenStatic = 3
- Const adLockOptimistic = 3
- Const toBlock = 4
- Set objConnection = CreateObject(«ADODB.Connection»)
- Set objRecordSet = CreateObject(«ADODB.Recordset»)
- Set objRecordSet2 = CreateObject(«ADODB.Recordset»)
- if wscript.arguments.count > 0 then
- idLogin = wscript.arguments.item(0)
- ipAddress = wscript.arguments.item(1)
- else
- idLogin = «—«
- ipAddress = «—«
- end if
- ‘ настраивам подключение к хранилищу
- ‘ в качестве хранилища может использоваться база данных как MS SQL, так и обычная база MS Access
- objConnection.Open _
- «Provider=SQLOLEDB;Data Source=cloud-sql;» & _
- «Trusted_Connection=Yes;Initial Catalog=RDP_BlockIP;» & _
- «User ID=RDP_BlockIP;Password=RDP_BlockIP;»
- ‘ отметим в базе что была попытка подключения с ipAddress с логином idLogin
- objRecordSet.Open «insert into dbo.IP values (GETDATE(), « & ipAddress & «, « & idLogin & «, null)», _
- objConnection, adOpenStatic, adLockOptimistic
- Dim wsh
- Set wsh = WScript.CreateObject(«WScript.Shell»)
- ‘ посчитаем, сколько раз за 24 часа было попыток подключения с указанного адреса
- ‘ считается только для адресов, которые не входят в адреса-исключения и не были уже обработаны ранее
- objRecordSet.Open «SELECT COUNT(LoginDate) as Attempts FROM [RDP_BlockIP].[dbo].IP WHERE [LoginDate] > GETDATE()-1 and (not [IP] in (select * from [RDP_BlockIP].[dbo].exclude_ip)) and (Done is null) and [IP] = « & ipAddress , _
- objConnection, adOpenStatic, adLockOptimistic
- objRecordSet.MoveFirst
- Dim fso, tf
- ‘ Сделаем событиный файл, который подхватит jabber-робот и пришлет адресату
- ‘ Можно убрать или заменить на отправку почты, или что-то еще
- Set fso = CreateObject(«Scripting.FileSystemObject»)
- Set tf = fso.CreateTextFile(«\bettajabberaudit_rdp.txt», True)
- tf.WriteLine(«dmitry@192.168.0.3»)
- tf.WriteLine(«********** RDP ALERT src: « & ipAddress & «, usr: « & idLogin & «**********»)
- tf.WriteBlankLines(3)
- tf.Close
- ‘ По этоу строку можно удалять, если не требуется
- Do Until objRecordSet.EOF
- ‘ Если попыток подбора больше определенного значения…
- if (objRecordSet(«Attempts») >= toBlock) and (Len(ipAddress)>4) Then
- ‘ …то добавим в файрволл windows ipAddress с политикой блокировки доступа к порту 3389
- wsh.Run(«netsh advfirewall firewall add rule name=RDP_AUTOBLOCK_» & Replace(ipAddress,«‘»,«») & » dir=in action=block profile=any remoteip=» & Replace(ipAddress,«‘»,«») & » localport=3389 protocol=tcp»)
- ‘ Тут можно сделать СМС-оповещение, etc
- Set wsh = Nothing
- ‘ Пометим что для указанного адреса все события обработаны
- objRecordSet2.Open «update [RDP_BlockIP].[dbo].IP set [done]=1 where [IP] =» & ipAddress , _
- objConnection, adOpenStatic, adLockOptimistic
- end if
- objRecordSet.MoveNext
- Loop
Скрипт работает с базой (в примере с MS SQL), поэтому база должна быть, как и пользователь, с которым производится подключение.
Структура таблиц банальна (см. рис.). Первая таблица накапливает данные по IP-адресам, вторая предназначеня для адресов-исключений.
Итог работы.
Потираем руки и смотрим, как появляются новый записи при попытках брутфорса:
Обновление
Список часто подбираемых логинов, зафиксированных этим скриптом за 2 месяца
@dmin | alohasvr | denis | pos005 | test1 | Деректор |
1 | amberpos | gateway | pos05 | test3 | Директор |
123 | amministratore | guest | pos1 | user | дом |
1234 | an | home | pos2 | user1 | иванов |
12345 | angel | john | pos3 | User2 | Лена |
1234567 | aspnet | jose | pos4 | user3 | менеджер |
333 | augusto | Justin | pos5 | user4 | Нотариус |
666 | backup | kassa | raquel | user5 | пользователь |
777 | Boss | kasse_1 | rdspos | user6 | пользователь1 |
a | bruno | kasse1 | reception | usertask | склад |
actuser | Buh | Marko | root | zxc123 | смирнов |
adm | buh1 | max | sales | Админ | смирнова |
admin | buhgalter | Melissa | scan | Администратор | тест |
admin1 | caisse | micros | server | Алекс | |
admin2 | carlos | office | servr | Александр | |
administrator | comp3 | operator | sklad | Александра | |
administrator1 | cthsq29 | owner | support | алена | |
akapos | DataCenter | padicheva | support_388945a | бухгалтер | |
aloha01 | david | pochta | sys | главбух | |
alohaedc | debbie | pos | test | гость |
как нарисовать сову.
рисуем два кружка и дорисовываем все остальное- сова готова.
это я к чему.
аудит отказа.
человек в ВЫДЕЛЕННЫМ ip
Сведения о сети:
Имя рабочей станции: OWNEROR-PRS****
Сетевой адрес источника: —
Порт источника: —
и таких 90%
остальные либо из-за прокси либо иными путями
чрез пол года правил будет столько что тормоза видны будут и без ддоса.
далее в скрипте есть строки для jabbera
‘ Сделаем событиный файл, который подхватит jabber-робот и пришлет адресату
все бы ничего но если кто не умеет и не любит читать вставит — словит ошибку.
далее не поленился повторил все (я так понял таблицы ручками создаются?) и в результате ничего.
то есть аудит отказа есть и ничего не происходит.
то есть создал задачу через привязать задачу к событию — без исправлений — работает
с изменениями- нет.
как-то так.
(1) iov,
Думаю, там в событии ниже указано «Пакет проверки подлинности: NTLM», когда проверка подлинности идет до подключения к серверу (если говорить простым языком), мой блок срабатывает, когда идет режим Negotiate, соответственно адреса ботов видны. На данный момент такие события попадались только с моей машины и то в ходе тестов. Как такое заблокировать — пока не вкурсе.
Не знаю админов, которые запускают незнакомые скрипты, перед этим не посмотрев код. Может там rm -rf / ? А коде указывается — не нужно — выпилите.
Це же не сложно.
Выполните скрипт из консоли, через cscript.exe, передав ему путь к скрипту и два параметра, могут быть ошибки.
типа cscript.exe rdp.vbs ‘pupkin’ ‘8.8.8.8’
Что то цитаты аццки распухли, сорри.
так це яж про тоже. Тут для тех кто в курсе все просто просто. Но тутаж программисты 1с. Короче не жеваное не едет. стоило бы скриптик выложить для создания базы с нужными полями. имена параметров вынести отдельно с комментариями и пр. плюсов бы поболе насобирал и смысл архив качать был бы. Цеж не упрек а рекомендации.
Ну, думаю, кто реально это будет использовать, то сделает без проблем.
http://notepad.cc/share/c185kLi1jI
Да, скриптег по созданию базы тут
Адрес только файликов базы поменяйте.
Недостаток решения в том, что злоумышленник блокируется по факту, в отличие от VPN, когда все злоумышленники блокируются превентивно.
Год или два назад обнаружилась юзабельная дырка в RDP, как следствие, появился червяк. Так у меня IPS фиксировал порядка 3000 атак в сутки на протяжении нескольких месяцев, с абсолютно разных хостов.
Боюсь, при таких масштабах сервер с приведенным решением упадет совершенно самостоятельно, не дожидаясь, пока его взломают.
Можно эти правила периодически сбрасывать, т.е. при обнаружении атака блокируется, но через некоторое время адрес опять становится открытым.
(6) Так речь идет о том, что это дополнительная защита, а не основная. VPN не всегда можно использовать, да и нормальные ОСи тоже. Понятное дело, если сервер высовывать наружу без нормального файера будет печально. Например, на моем шлюзе (pfSense) в правилах pfBlocker чуть не целые страны закрывает, Snort постоянно атаки обнаруживаем и т.д. и т.п., но все равно идут атаки, то с площадки вебстудии в Самаре, то с ноутбука менеджера, который сам не знал про зловреда. Поэтому подключению я даю 4 попытки и рублю. Мне так лучше, чем дикие логи в журнале безопасности.
Правила всегда можно очистить, или написать запросец и экспортнуть их в файрволл выше.
(8)
Или банить по маске /8, kekeke)
Полезная и занимательная статейка, спасибо автору за инициацию проблемы и решение.
А почему бы просто не использовать роутер сервер на линухе ?
Полезная статья, у нас сегодня есть такая проблема с атаками на сервер смотрящий «наружу». Будем решать по схеме, описанной в данной статье.
За статью +, но вот использование скуля для данной задачи лично мне кажется «пушкой по воробьям». Банальные файлы с именами = ip-адресу наверняка и дали бы прирост в скорости и повысили бы надёжность решения. Впрочем, это лишь имхо.
Дурацкое решение ставить винду наружу изначально.
Кроме РДП может быть еще куча служб успешно атаковано, где на них скрипты?
А что RDP Gateway уже не актуален? Проще и безопаснее не придумаешь.
(11) Trotter_NN, это дополнительная защита. Роутер не спасет, если порт открыт.
Единственное, что можно настроить, это количество коннектов до блока на внешнем firewall’е, но это не всегда возможно. Также весьма трудно настроить блокировку на внешнем шлюзе в автоматическом режиме, я не гуру скриптов под линукс.
(13)
Как бы сервер уже есть (в нем 1С крутится), почему бы не использовать. Можно и базу Access заюзать, можно и файлы — дело уже каждого. Главное — понять, когда впилить новое блокирующее правило.
(14) По комментам выше и статье понятно, что наружу смотрит только порт RDP, через внешний шлюз-файрволл.
(15) Не сталкивался, так что сказать ничего не могу.
(16) рекомендую обратить на него внимание. RDPG использует протокол удаленных рабочих столов(в том числе и RemoteApp) через HTTPS(443).
(17) Попробуем, почему бы и нет.
Собственно статья появилась даже не от того, что брутфорс полез, а просто нашел на просторах интернета способ «выковырять» данные из XML события и передать их в качестве параметров, и подумал «О! Куда бы запилить?». Ну и не знал, что так просто с консоли правило добавить в брандмауэр. Собственно, последний обычно везде выпиливаю, чтобы не мешал, а тут пригодился. 🙂
Удобно сидеть и попивать кофеек, и смотреть в сообщениях от робота в чате
19:54 @Робот-Бобот: * RDP ALERT src: ‘75.99.184.131’, usr: ‘Administrator’*
19:54 @Робот-Бобот: * RDP ALERT src: ‘75.99.184.131’, usr: ‘Administrator’*
19:54 @Робот-Бобот: * RDP ALERT src: ‘75.99.184.131’, usr: ‘Administrator’*
19:54 @Робот-Бобот: * [!BLOCKED!] RDP ALERT src: ‘75.99.184.131’, usr: ‘Administrator’*
Согласен с тем, что пушкой по воробьям, у меня так настроено:
1: Новый сотрудник обязуется иметь интернет с выделенным IP, хотя он уже у большинства провайдеров по умолчанию.
2. Если человек с планшетника и ежи подобных, то тоже можно прикрутить через IP, благо айпишники сейчас выдаются сотовыми операторами белыми или арендуются на длительный срок., ресурсов много как определить простому юзеру свой ip. На инструктаже получает всю это информацию при приеме.
3. Настраивается на Циске (роутере или прокси сервере) правила доступа с фильтрацией по ip.
4. Закрываем с глаз долой свой внешний IP для всякого рода сканеров и сниферов на внешнем канале.
5. Разрешаем заходить только определенному списку IP, предварительно настроив правило с проксятника на терминалку.
6. Остальной на блок.
Смотрим лог файл, и не видим ни каких попыток подключения и перебора пароля, способ действует для всех приложений, не только для SQL портов и ежи подобных.
Я в своё время тоже озаботился безопасностью и стал ставить всем OpenVPN на входе.
То есть наружу открыт только 1194. а его ломай не ломай, без сертификата ничего не сделаешь.
Все остальные подключения уже через VPN соединение.
К тому же при его использовании можно будет напрямую подключиться и к другим компьютерам той же подсети.
Если в наличии только сервак без навороченного сетевого оборудования, то руководствуюсь следующим. Для перебора пароля надо знать не только пароль но и логин. Поэтому учетную запись админа на серваке надо переименовывать. Гостей отключать. Даже обычных юзеров лучше называть как то оригинальнее чем user1 и т.п. Пользоваться только стойкими паролями. В политиках безопасности в политике блокировок учетных записей ставим время блокировки учетки и количество неверных попыток. 100% защиты не будет, но от шальных взломщиков в самый раз.
это дополнительная защита. Роутер не спасет, если порт открыт
если вы сисадмин а не 1сник то покурите в сторону роутеров mikrotik (не панацея! особенно в плохих руках) — оно и стоит относительно недорого, с кучей функционала в т.ч. vpn. Ну а вообще — вы просто обязаны в какой-то мере иметь политику в области безопасности (раз у вас рдп то и людей работает не 2 человека), пусть сильно упрощенную, но базовые вещи — логины/пароли/доступ снаружи и т.п. в ней необходимо отразить и утвердить у руководства. А то вы и дальше будете к скулю прикручивать ненужные вещи.
PS кстати про сертификаты. вполне себе работает аутентификация по сертификатам в винде (правда придется разворачивать центр сертификации и т.п.) — можно к примеру на етокене с простым паролем держать сертификат и логиниться на виндовый терминал. Это кстати достойный ответ подбиральщикам паролей 🙂 пусть попробуют ага.
(23) Ей богу, странные вы.
Ну есть у меня Микротики, все региональные офисы на них подняты (RB2011UAS-2HnD), все завязано в VPN. Изнутри — проблем нет вообще.
Но покажите мне скрипт под Микротик, который будет банить адреса, с которых идет подбор паролем. Размещу — проверим результативность.
Вам — не нужные. Мне — вполне нужные, опыт тем более разный нужен.
Вот в (15) «товарисчь» указал что есть шлюзы, и их лучше использовать. Так это тоже опыт, все приходит в сравнении. Вот например, сертификаты у себя на планшете в RDClient заюизать не могу, шлюз возможно (но не пробовал).
Так что, думаю, каждый сам сможет вынести нужную ему пользу как из статьи, так и из комментов.
——————-
Кстати, в скрипте можно использовать отправку смс по событию. (Не реклама: смс.ру дает бесплатно 60 смс/день на свой номер, почему бы и не юзать).
В примере ниже нужно подставить свой API и номер (см. примеры на оф. сайте).
wsh.Run(«C:curl.exe «»http://sms.ru/sms/send?api_id=ВАШ_ГУИД&to=ВАШ_НОМЕР&text=BLOCK+» & Replace(ipAddress,»‘»,»») & «/» & idLogin & «»»»)
из элементарных решений могу еще добавить такое как смена порта на роутере
то есть к примеру открываешь порт 11000 и мапишь его на 3389 по нужному айпи
меня избавило от флудеров
Плюс однозначно!
А к 2003R2 можно прикрутить?
(26) Оперативно не получится, тут вся соль в триггере Windows на новую запись в журнале безопасности, насколько знаю он только в 2008+ версии появился. Да и брандмауэр нужно смотреть в 2003, если там такие же команды консольные и т.п.
Журналы безопасности я Zabbix’ом анализирую, правда для других нужд, можно там прикрутить еще и анализ аудита + действия, но под рукой рабочей системы с 2003 нету уже, так что проверить не смогу.
Полгода работы скрипта — полет нормальный. В день в среднем блокируется 8-10 IP адресов, и логи аудита короче стали 🙂
Хорошая статья, но под свой сервер пришлось все скрипты переписывать, часть представленного вверху неработоспособно, пришлось менять xml и vbs файлы, так как выдавали кучу ошибок, также не передавались параметры в планировщике в vbs и при большой сети нужно исключить свой диапазон ИП адресов, иначе перебаниться всё 🙂 Впрочем это мелочи, при нужных навыках, всё поправимо. Также блочу не только порт 3389, поставил Any (все). И всё неплохо заработало, просто недавно один из моих удаленных серверов сделали дедиком, там конечно был однозначно мой косяк, дал буху полный доступ и забыл про это, а у неё простой пароль, который быстро подобрали. В общем от всей вирусной дряни избавился, запустил этот метод и всё норм, все адреса хацкеров баняться при подборе на любые порты, так как в силу регулярного удаленного доступа, открыто много различных портов.
(29) Скрипт отработал (отразил) успешно январскую атаку на сервер клиента, за 21 день было заблокировано 51 000 адресов.
https://rdpguard.com/ принцип работы которой тот же)
Самое интересное, недавно изучал аналоги на рынке, есть коммерческая программа
братцы, откуда взяться внешнему ip взломщика в логах безопасности, когда rdp за натом? разжуйте пожалуйста, может что то не понимаю
(31) Нат же у вас проброшен, коннект идет на внешний адрес + порт.
не получается импортировать XML — прошу пример
мой :
<?xml version=»1.0″ encoding=»UTF-16″?>
<Task version=»1.2″ xmlns=»http://schemas.microsoft.com/windows/2004/02/mit/task»>
<RegistrationInfo>
<Date>2017-04-02T22:17:14.2790261</Date>
<Author>SERVERTarlich</Author>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><QueryList><Query Id=»0″ Path=»Security»><Select Path=»Security»>*[System[Provider[@Name=’Microsoft-Windows-Security-Auditing’] and EventID=4625]]</Select></Query></QueryList></Subscription>
</EventTrigger>
<ValueQueries>
<Value name=»TargetUserName»>Event/EventData/Data[@Name=’TargetUserName’]>
<Value name=»IpAddress»>Event/EventData/Data[@Name=’IpAddress’]>
>
</Triggers>
>
<Principals>
<Principal id=»Author»>
<UserId>SERVERTarlich</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context=»Author»>
<Exec>
<Command>C:WindowsSystem32cscript.exe</Command>
<Arguments>C:lokRDP_Block.vbs ‘$(TargetUserName)’ ‘$(IpAddress)’>
</Exec>
</Actions>
</Task>
Все гораздо банальнее.
1) Меняем порт RDP (на самом сервере или НАТе)
2) Разрешаем подключение только с проверкой подлинности
3) В политиках включить NLA
Вот полезная (хоть и старая) статья:https://www.atraining.ru/windows-rdp-tuning/
(34) 1) Смена порта ничего не даст, (2,3) Актуально, если все клиенты поддерживают NLA. На момент времени, когда писалась статья — freerdp под linux в NLA не умел, RDClient на IOS не умел, да и сейчас вроде не может.
Да, это может быть костылище, но работает.
Идея понятна а рабочего примера нету?
(34) Клиенты под XP и android смогут подключаться после выполнения рекомендаций?
Под IOS, как я понял не смогут?
Скрипт в теме мне не поможет так как в логах win нет ip источника. Видны только события отказы и имена под которыми пытаются подрубится.
(21) подскажите как настроить?
(21) читал в интернете что и VPN ломается