Коли одного прекрасного дня начальник порушує питання: «Чому деякі мають віддалений доступ до раб.комп'ютера, без отримання додаткових дозволів на використання?»,
виникає завдання «прикрити» лазівку.
Додатків по віддаленому управлінню по мережі достатньо: Сhrome remote desktop, AmmyAdmin, LiteManager, TeamViewer, Anyplace Control та ін. з мережі та користувачі «скрипучи зубами» так чи інакше «світяться» у адмінів, то улюбленець багатьох для особистого користування — AnyDesk поки що вимагає особливої уваги, тим більше якщо начальник сказав «Не можна!».
Якщо Ви знаєте, що таке блокування мережного пакета за його вмістом і Вас воно влаштовує, то решта матеріалу
не призначений для вас.
Пробуючи піти від зворотного, насправді
Колись у мене було вирішено завдання щодо блокування «Anyplace Control», який потрапляв до нас з якимось сумнівним ПЗ і вирішено воно було блокуванням всього декількох IP (я підстрахував антивірус). Завдання ж з AnyDesk, після того, як я вручну зібрав більше десятка IP адрес, підбурила уникнути рутинної ручної праці.
Також було виявлено, що в «C:ProgramDataAnyDesk» є ряд файлів з налаштуваннями тощо, а у файл 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
Ключовий параметр "якщо 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+.
Посилання на фінальний текстовий файл з адресами:
Справу зроблено! Пул 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 поставляться до моїх дій по-спортивному.
Джерело: habr.com