возникает задача прикрыть лазейку.
Приложений по удаленному управлению по сети предостаточно: Сhrome remote desktop, AmmyAdmin, LiteManager, TeamViewer, Anyplace Control и др. Если у Сhrome remote desktop есть официальный мануал по борьбе с наличием доступа к сервису, у TeamViewer есть лицензионные ограничения по времени либо запросам из сети и пользователи скрипя зубами так или иначе светятся у админов, то любимчик многих для личного пользования AnyDesk пока требует особого внимания, тем более если начальник сказал Нельзя!.
Если Вы знаете что такое блокировка сетевого пакета по его
содежимому и Вас она устраивает, то остальной материал не предназначен для Вас. |
Пробуя пойти от обратного, на самом сайте support.anydesk.com/Firewall говорится о том, что должно быть разрешено для работы программы, соответсвенно была заблокирована DNS запись *.net.anydesk.com. Но AnyDesk не прост, блокировка доменного имени ему нипочем.
Когда-то у меня была решена задача по блокировке Anyplace Control который попадал к нам с каким-то сомнительным ПО и решена она была блокировкий всего нескольких IP (я подстраховывал антиавирус). Задача же с AnyDesk, после того как я вручную собрал больше десятка IP адресов, подзадорила уйти от рутинного ручного труда.
Также было обнаружено что в C:\ProgramData\AnyDesk есть ряд файлов с настройками и т.п.,
а в файл ad_svc.trace собираются события о подключениях и неудачах.
1. Наблюдение
Как уже было сказано блокировка *.anydesk.com не дала никаких результатов в работе программы, было решено поанализировать поведение программы в стрессовых ситуациях. TCPView от Sysinternals в руки и вперед!!!
1.1. Видно что висит несколько интересующих нас процессов, и лишь тот который связывается с адресом извне нам интересен. Порты к кторомым подключается перебираются, из того что я видел это: 80, 443, 6568. :) 80 и 443 нам точно блокировать нельзя.
1.2. После блокировки адреса через роутер, спокойно выбирается другой адрес.
1.3. Консоль наше ВСЁ! Определяем PID и тут мне немного подфартило, что AnyDesk был установлен сервисом, соответсвенно искомый PID единственный. | 1.4. Определяем по PID процесса IP адрес сервера сервисов. |
2. Подготовка
Так как программа для выявления IP адресов вероятно будет работать только на моем ПК, у меня нет никаких ограничений в удобстве и лени поэтому C#.
2.1. Все методы по выявлению искомого IP адреса уже известны осталось реализовать
string pid1_;//узнаем PID сервиса AnyDeskusing (var p = new Process()) {p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = " /c \"tasklist.exe /fi \"imagename eq AnyDesk.exe\" /NH /FO CsV | findstr \"Services\"\""; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true; p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding("CP866"); p.Start(); string output = p.StandardOutput.ReadToEnd(); string[] pid1 = output.Split(',');//переводим ответ в массив pid1_ = pid1[1].Replace("\"", "");//берем 2й лемент без кавычек}
Аналогично находим сервис который установил соединение, привелу только основную строку
p.StartInfo.Arguments = "/c \" netstat -n -o | findstr /I " + pid1_ + " | findstr \"ESTABLISHED\"\"";
Результатом которой будет
Из строки аналогично перыдущему шагу извлекаем 3й столбец, и убираем все что после ":". Как результат имеем наш искомый IP.
2.2. Блокировка IP в Windows. Если в Linux есть Blackhole и iptables, то метод блокировки IP адреса в одну строку, без использования бранмауэра, в Windows оказался непривычним,
но уж какие инструменты были
route add наш_найденный_IP_адрес mask 255.255.255.255 10.113.113.113 if 1 -p
.Ключевой параметр "if 1" посылаем маршрут на Loopback (Отобразить доступные интерфейсы можно выполнив route print ). И ВАЖНО! Теперь программу требуется запускать с правами администратора, поскольку изменение маршрута требует повышение прав.
2.3. Отображение и сохранение выявленых IP адресов задача тривиальная и пояснения не требует. Если подумать, то можно обрабатывать и файл ad_svc.trace самого AnyDesk, но об этом я сразу не подумал + возможно на него стоит ограничение.
2.4. Странное неодинаковое поведение программы заключается в том, что при taskkill процесса службы в Windows 10 она перезапускается автоматически, в Windows 8 завершается, оставляя только процесс консоли и без переподключения, вобщем нелогично и это неточно.
Удаление подключившегося к серверу процесса, позволяет форсировать переподключение на следующий адрес. Реализуется аналогично предыдущик командам, поэтому привожу только:
p.StartInfo.Arguments = "/c taskkill /PID " + pid1_ + " /F";
Дополнительно запускаем программу AnyDesk.
//запускаем программу которая расположена по пути path_proif (File.Exists(path_pro)){ Process p1 = Process.Start(path_pro);}
2.5. Проверять состояние AnyDesk будем 1 раз в минуту (или чаще?), и если она подключилась т.е. соединение ESTABLISHED этот IP блокировать, и опять все заново ждать пока подключится, блокировать и ждать.
3. Нападение
Был набросан код, для визуализации процесса решено "+" указывать найденный и блокированный IP, а "." повтор проверки без успешного сосединения со стороны AnyDesk.
Код проекта github.com/avk013/SpaRDP_habr.
Как результат
Программа работала на нескольких компьютерах с разными Windows ОС, с версиями AnyDesk 5 и 6. За 500 итераций собиралось около 80 адресов. За 2500 87 и так далее
Со временем количество блокируемых IP дошло до 100+.
Ссылка на финальный текстовый файл с адресами >> bitbucket.org/avk013/anydesk_ip_block/downloads/ip_080820.txt
www.dropbox.com/s/rpeqa79xx0cyaop/ip_080820.txt
Дело сделано! Пул IP адресов через скрипт добавлен в правила основного роутера и AnyDesk просто не может создать внешнее соединение.
Есть странный момент, по первоначальным логам видно что в передаче информации учавствует адрес boot-01.net.anydesk.com. Мы конечно заблокировали все хосты *.net.anydesk.com общим правилом, но странность не в этом. Каждый раз при обычном пинге с разных компьютеров это доменное имя дает разный IP. Проверка в Linux
host boot-01.net.anydesk.com
как и DNSLookup дают только один IP адрес, но этот адрес вариативен. При анализе соединенией TCPView нам возвращаются PTR записи IP адресов типа relay-*.net.anydesk.com. Теоретически: раз пинг иногда проходит на неизвестный незаблокированный хост boot-01.net.anydesk.com мы можем найти эти ip и заблокировать, эту реализацию сделать обычным скриптом под ОС Linux, тут как раз устанавливать AnyDesk не нужно. Анализ показал что эти IP часто "пересекаются" с найденными из нашего списка. Возможно это как раз этот хост, к которому и подключается программа до того, как начинает перебирать известные IP. Вероятно я позже дополню статью 2й частью поисков хостов, хотя на данный момент сама программа внутри сети не устанавливает внешнее соединение вообще.
Надеюсь ничего противоправного Вы не увидели в вышеизложенном, а создатели AnyDesk отнесутся к моим действиям по-спортивному.