Анализ возможности блокировки приложения для удаленного управления компьютером по сети, на примере AnyDesk

Когда в один прекрасный день начальник поднимает вопрос: «Почему у некоторых есть удаленный доступ к раб.компьютеру, без получения дополнительных разрешений на использование?»,
возникает задача «прикрыть» лазейку.

9mrixdgtwybas_z2cioxrrvqzhm.png


Приложений по удаленному управлению по сети предостаточно: Сhrome remote desktop, AmmyAdmin, LiteManager, TeamViewer, Anyplace Control и др. Если у «Сhrome remote desktop» есть официальный мануал по борьбе с наличием доступа к сервису, у TeamViewer есть лицензионные ограничения по времени либо запросам из сети и пользователи «скрипя зубами» так или иначе «светятся» у админов, то любимчик многих для личного пользования — AnyDesk пока требует особого внимания, тем более если начальник сказал «Нельзя!».
Пробуя пойти от обратного, на самом сайте говорится о том, что должно быть разрешено для работы программы, соответственно была заблокирована DNS запись *.net.anydesk.com. Но AnyDesk не прост, блокировка доменного имени ему нипочем.

Когда-то у меня была решена задача по блокировке «Anyplace Control» который попадал к нам с каким-то сомнительным ПО и решена она была блокировкий всего нескольких IP (я подстраховывал антивирус). Задача же с AnyDesk, после того как я вручную собрал больше десятка IP адресов, подзадорила уйти от рутинного ручного труда.

Также было обнаружено что в «C:\ProgramData\AnyDesk» есть ряд файлов с настройками и т.п., а в файл ad_svc.trace собираются события о подключениях и неудачах.

1. Наблюдение

Как уже было сказано блокировка *.anydesk.com не дала никаких результатов в работе программы, было решено поанализировать поведение программы в стрессовых ситуациях. TCPView от Sysinternals в руки и вперед!

koa92qfajqgbjc6irfvfiufbnpa.png

1.1. Видно что «висит» несколько интересующих нас процессов, и лишь тот который связывается с адресом извне нам интересен. Порты к которым подключается перебираются, из того что я видел это: 80, 443, 6568. :) 80 и 443 нам точно блокировать нельзя.

1.2. После блокировки адреса через роутер, спокойно выбирается другой адрес.

zptkknuojhze09tgf7xqjseob3c.png


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\"\"";


Результатом которой будет:

r5aiz3myohigbqqyykh3mj_pf28.png


Из строки аналогично перыдущему шагу извлекаем 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.

leyd6l9si7owkgflj0fjf2nog60.png

→ Код проекта

Как результат…

ns96giib5jkwhbrxeywar5qpfy4.jpeg


Программа работала на нескольких компьютерах с разными Windows ОС, с версиями AnyDesk 5 и 6. За 500 итераций собиралось около 80 адресов. За 2500 — 87 и так далее…

Со временем количество блокируемых IP дошло до 100+.

Ссылка на финальный текстовый файл с адресами: раз и два

Дело сделано! Пул 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 отнесутся к моим действиям по-спортивному.

© Habrahabr.ru