возникает задача «прикрыть» лазейку.
Приложений по удаленному управлению по сети предостаточно: Сhrome remote desktop, AmmyAdmin, LiteManager, TeamViewer, Anyplace Control и др. Если у «Сhrome remote desktop» есть официальный мануал по борьбе с наличием доступа к сервису, у TeamViewer есть лицензионные ограничения по времени либо запросам из сети и пользователи «скрипя зубами» так или иначе «светятся» у админов, то любимчик многих для личного пользования — AnyDesk пока требует особого внимания, тем более если начальник сказал «Нельзя!».
Если Вы знаете что такое блокировка сетевого пакета по его содержимому и Вас она устраивает, то остальной материал не предназначен для Вас. |
Пробуя пойти от обратного, на самом сайте говорится о том, что должно быть разрешено для работы программы, соответственно была заблокирована DNS запись *.net.anydesk.com. Но AnyDesk не прост, блокировка доменного имени ему нипочем.
Update 15.08.2020
[bash#]host relays.net.anydesk.com
на данный момент их 391 адрес. Со знанием этого, остальная часть статьи становится просто беллетристикой.
Когда-то у меня была решена задача по блокировке «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 сервиса AnyDesk
using (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_pro
if (File.Exists(path_pro)){
Process p1 = Process.Start(path_pro);}
2.5. Проверять состояние AnyDesk будем 1 раз в минуту (или чаще?), и если она подключилась т.е. соединение ESTABLISHED — этот IP блокировать, и опять все заново — ждать пока подключится, блокировать и ждать.
3. Нападение
Был «набросан» код, для визуализации процесса решено "+" указывать найденный и блокированный IP, а "." — повтор проверки без успешного сосединения со стороны AnyDesk.
> Код проекта
Как результат…
Программа работала на нескольких компьютерах с разными Windows ОС, с версиями AnyDesk 5 и 6. За 500 итераций собиралось около 80 адресов. За 2500 — 87 и так далее…
Со временем количество блокируемых IP дошло до 100+.
Ссылка на финальный текстовый файл (blacklist) с адресами: >>раз<< и >>два<<
Дело сделано! Пул 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й частью поисков хостов, хотя на данный момент сама программа внутри сети не устанавливает внешнее соединение вообще.
Update 15.08.2020: пользователь Хабра @prymalbeets123 обратил мое внимание что существует хост relays.net.anydesk.com которому соответсвует 391 IP адрес, файл с их перечнем можно найти по указанным выше ссылкам как корректный. Замечено что у меня собранных наблюдением за программой AnyDesk адресов меньше, но есть те которые не входят в общие 391 и они резолвятся «левыми» доменными именами, получается что я также «собирал» адреса тех кто инициировал подключение к моему компьютеру :).
Надеюсь ничего противоправного Вы не увидели в вышеизложенном, а создатели AnyDesk отнесутся к моим действиям по-спортивному.
wmgeek
Великий китайский файервол заблокировал ESNI, а мы по старинке перебираем IP? Нет, спасибо, все что явно не разрешено — запрещено. Хочешь HTTPS до сайтов кроме списка — обоснуй, добавим.
avk013 Автор
Понимаю такую позицию, но так как работаю уже в существующей сетевой инфраструктуре, которая перешла ко мне попередникив, то приходится «бегать с молотком и забивать гвозди». У нас уже и Youtube решали блокировать… потом как-то откатили назад. История говорит что через 1 месяц у тебя будет 20 видов Випов, какждому из которых нужна отдельная политика разрешений, и при этом денег на оборудование нет.
wmgeek
Быстрое забывается, временное остается. Вы сами себе создаете «неоплачиваемую», «невидимую» работу по поддержанию таких списков.
С технической стороны на «почему?» босса разумно предоставить Allow List, расчетную стоимость обслуживания каждой записи и коммерческое предложение DPI.
С организационной стороны, разумно рекомендовать боссу издать приказ с запретом и установить ответственность за нарушение.
madcatdev
Тогда проще сразу весь интернет заблокировать, ведь 99% сайтов работать и так не будет.
slavius
Чистый белый список? Серьезно? Это где такой «интернет»?
anonymous
Такой подход «работа только по белым спискам» очень дорог и возможен только там, где большой штат айтишников. Причем сотрудники (а точнее их руководители) должны понимать и соглашаться, что 1) запросы на добавление сайтов будут выполняться с задержкой 2) периодически, ранее работавшие сайты перестанут работать целиком или частично.
Обычно такой подход (белые списки) показатель или ну очень сильно заточенной на безопасность организации или признак «мамкиного админа», который в книжках за 1997 год прочитал «про это», а на практике так и не пробовал (никого не хочу обидеть).
Вы попробуйте разрешить работу с каким-то сайтом, где публикуются журналы (платная подписка). Там, чтобы показать вам контент, данные подгружаются с большого количества других доменов. Причем половина из них — технические домены и их имена могут меняться (cdn). Я уже молчу, что на нужных по работе сайтах будут ссылки на ютуб и прочие общие сайты (которые нужны пользователю, заходящему на этот сайт).
При современном интернете (доступном с любого утюга) запрет на посещение левых сайтов может быть продиктован только безопасностью. А это решается значительно дешевле, проще, быстрее и лучше, чем белые списки (особенно с cdn, ага)
avk013 Автор
Вы рассмотрели что это просто вынужденная мера для меня, типа дешево и сердито, без понтов, сказали — сделал, попросил купить — не купили. :)