Teamviewer, powershell и циска из песочницы

Поставили мне тут задачку прикрыть доступ посредством софтины Teamviewer к нашей сети извне. Предыстория вопроса немного грустная – исторически сложилось, что таким образом программер-подрядчик удалённо подключался к серверу с базами 1С. Да, всё неправильно и сложно, и попытки что-то изменить как технически, так и организационно, натыкались на противодействие бухгалтерии. Но речь не об этом, а о блокировке этого самого Teamviewer’а.

Первым делом я, конечно, полез в поиск. Нашел пару десятков топиков с обсуждением данного вопроса, посмотрел, как народ блочит эту софтину с переменным успехом. Проблема в том, что серверов, к которым она коннектится, ну очень уж много, пропустить что-то легко, и в комментах к спискам найденных диапазонов люди часто жаловались, что у них это решение не работает.



Ну что ж, ставим рядом два компа, устанавливаем на них Teamviewer’ские программулины – чтобы вживую сразу видеть, получается или нет.

Блокировка порта tcp 5938, судя по комментам, давно уже не работает, с выпуска прошлой версии. На всякий случай сделал, конечно, правило на блокировку входящих-выходящих по этому порту, а также по найденному где-то tcp 9997. Мгновенного эффекта не случилось, но счётчик на циске зафиксировал срабатывания. Ну, пусть будет.

Дальше я начал шерстить все найденные товарищами диапазоны. Где-то на пятом прочитанном топике и четвертом добавленном десятке диапазонов была зафиксирована надёжная блокировка, после нескольких попыток софтина рапортует о невозможности подключения. Ура! Первичная цель достигнута, но хочется большего. Восемьдесят, девяносто, или даже девяносто пять процентов – недостаточная надёжность.

Решил заняться этой проблемой поглубже. Для начала, хотелось понять, как можно составить более полный список Teamviewer’ских хостов. В принципе, товарищами на форумах высказывалась идея о том, что нужно блокировать сервера вида serverN.teamviewer.com, где N – числа. Но, во-первых, я пока не разобрался, как сделать _отключаемую_ блокировку по имени хоста средствами циски, а во-вторых, блокировка “голых” IP в любом случае будет очень полезна в качестве дополнительной защиты.

Возникла простая идея – перебрать в цикле все имена и отресолвить их в IP. Я большой поклонник командной строки, поэтому сначала поискал подходы к тому, чтобы решить задачу с помощью батника. Прикинул – да, в принципе, можно парсить вывод nslookup, но как-то это коряво будет. А что если через Powershell?


Погуглив, быстро нашел подходящий класс .Net. Немного поэкспериментировав, понял, что эта схема работает замечательно — особенно понравилось, что если имя ресолвится в несколько айпишников, все они аккуратно кладутся в массив. Каждый айпишник добавляется в массив результатов, который потом сортируется и чистится от дубликатов одной командой Sort, и скидывается в текстовый файл. В конце маленький штрих для удобства – текстовый файл открывается в блокноте, чтобы не искать его по диску. Да, Powershell — очень удобный и могучий инструмент.

Текст скрипта (Powershell v2):

### Получение всех-всех-всех серверов Teamviewer. Ну, по крайней мере, забитых в их поддомены.
 
## Инициализация
$result_ips       = "C:\!scripts\teamviewer\result_tv_IPs.txt"
$result_addresses = "C:\!scripts\teamviewer\result_tv_addresses.txt"
del $result_ips
del $result_addresses
$servers=@()
 
## Начало
serverN.teamviewer.com - 101-11500, 646 хостов [2011-11]
for ($i=1; $i -le 11500; $i++) {
   echo $i;
   $cur_server="server" + $i + ".teamviewer.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
 
# masterN.teamviewer.com - 1-16 [2011-11]
for ($i=0; $i -le 20; $i++) {
   echo $i;
   $cur_server="master" + $i + ".teamviewer.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
 
# pingN.dyngate.com - 2-3
for ($i=0; $i -le 10; $i++) {
   echo $i;
   $cur_server="ping" + $i + ".dyngate.com"
   echo $cur_server
   [System.Net.Dns]::GetHostAddresses($cur_server)|% {
      if ($? -eq $true) {echo $cur_server |out-file -append $result_addresses};
      $servers+=$_.IPAddressToString
   }
}
   
# Сортировка и вывод результатов
$servers | sort-object -unique | out-file $result_ips
notepad.exe $result_ips
start-sleep -milliseconds 800  # пауза, просто так
notepad.exe $result_addresses


Отдельные моменты по этому скрипту:

— Строка $servers=@() инициирует массив, без этого Powershell путается в типах.
— [System.Net.Dns]::GetHostAddresses() – класс .NET, получающий IP-адреса по имени.
— IPAddressToString – метод, преобразовывающий результат в обычную строку.


В качестве промежуточного итога: Powershell жутко удобен для таких вот специфических админских задачек

(Как получившиеся подсети, числом около двухсот, попали в циску – предмет для отдельного топика, а то и так получается многобукв. Планирую доработать этот процесс)

Результаты – шесть с половиной сотен полученных адресов, надёжное решение задачи и +5 к навыку “администрирование” :-)


Поначалу может возникнуть желание заблокировать эти диапазоны с большим запасом. Однако, я быстро наткнулся на то, что один из серверов moskva.fm, 85.17.138.68, попал в закрытый таким образом диапазон 85.17.*.* — намного безопаснее делать правила более частного вида, на подсети /24 (85.17.136.* и 85.17.87.*). Как вариант, можно вообще блокировать отдельные айпишники по списку, но это уже менее надёжно с точки зрения изначальной задачи блокировки Teamviewer – думаю, появление новых его серверов “рядом” с уже имеющимися гораздо более вероятно, чем в новых диапазонах.
+17
30 ноября 2011, 19:47
74
mtp 10,2

комментарии (51)

+3
dreamjke #
А причем же тут циска? )
+1
mtp #
Циска тут осталась слегка за кадром, вы правы ) Powershell же здесь показан подробно как средство для решения основного вопроса — получения списка хостов.

Хочу заметить, основная идея данного топика — метод нахождения и последующей блокировки всех узлов Teamviewer, не более, но и не менее. Это первая публикация такого рода в интернете, до этого никто не задавался общим решением вопроса — в имеющихся ветках на форумах перечисляются только частные списки айпишников (которые, тем не менее, могут работать, о чём я сказал в тексте).
+26
Obramko #
> В качестве промежуточного итога: Powershell жутко удобен для таких вот специфических админских задачек

Если не использовать Powershell, то весь Ваш скрипт можно написать, по сути, одной строкой.

for i in `seq 101 1020` ; do dig +short server$i.teamviewer.com; done |sort -u
+1
JiLiZART #
правда для этого cygwin поставить надо :)
+1
acmer #
Отсюда вывод о пригодности Windows в плане удобства
> для таких вот специфических админских задачек
+5
mtp #
Вы правы, исторически юниксы были изначально заточены под администрирование из командной строки, и винда здесь в догоняющей позиции. Те же регэкспы появились только в powershell'е, а в юниксах они десятки лет. Да и иногда всё равно удобнее распарсить текстовый файл sed'ом.

Однако вот то, что по конвейеру передаются не просто текстовые данные, а объекты, со всеми их свойствами, у меня даже сейчас всё так же вызывает чувство радости типа «ух ты!». Хотя вроде уже и несколько лет прошло, а всё равно иногда радует. Не холивара ради, просто очень уж удобно.
–3
Alukardd #
> всё равно удобнее распарсить текстовый файл sed'ом
ратую за awk!

> иногда радует
угу в тот момент, когда догоняешь что они сделали алиасы на свои нативные команды для псевдонимов типа ls и т.п.
+4
Alukardd #
Ну не фига себе, сколько заядлых форточников… И ни кто не ленится еще и карму минуснуть помимо комента…
+1
ayambit #
Нужно различать оболочку, в которой принципильно голый текст, и языки типа перла или питона где как раз и можно пользоваться объектами.

Так что нет, объекты в оболочке у меня восторга не вызывают.
+2
YourChief #
нет, не надо. есть утилиты GnuWin, которые скомпилированны самостоятельно для запуска на виндовс
+8
Alukardd #
Тут надо молча улыбаясь секундочку посмотреть на PS скрипт, потом еще секундочку на sh… А потом просто поржать, и в конце добавить «no comments».
+5
Useless_guy #
Та ну, у нас в PS можно также:
>>foreach ($_ in 1..11500) { $s+=[System.Net.Dns]::GetHostAddresses(«server{0}.teamviewer.com» -f $_) }

С использованием linq получилось бы еще красивее.
+1
Obramko #
А у нас есть Perl. =)
+3
ComputerPers #
А ничего не мешает заюзать и его посредством PS :-)
0
yanis76 #
cmd
for /L %i in (1,1,16) do @ping -n 1 server%i.teamviewer.com | find «teamviewer.com»
0
mtp #
Линуксовый вариант оценить затрудняюсь, но вот над решением в лоб средствами cmd я уже думал — не катит.
0
yanis76 #
Да, действительно.

Сейчас попробовал прямо в командной строке
> del 1.txt
> for /L %i in (1,1,16) do @ping -n 1 master%i.teamviewer.com | find «teamviewer.com» >> 1.txt
> del 2.txt
> for /F «tokens=2 delims=[]» %i in (1.txt) do @echo %i >> 2.txt

И на сортировке задумался — выбросить дубликаты, кажется, будет сложновато.

Также пинг дает единственный адрес хоста. Нужно разбирать вывод nslookup и подумать, как отличать Address от Addresses.

Так что беру cmd-шный for обратно — тут с нормальным скриптовым языком все проще будет.
+2
dobersoft #
Даже не знаю, как назвать… Epic Shell или Power Fail…
0
mtp #
Поясните?
+3
ertaquo #
Глупый вопрос, но… Можно ли поднять свой DNS-сервер и перенаправлять запросы к *.teamviewer.com на 127.0.0.1?
+4
acmer #
А вдруг TeamViewer как скайп — прорывается по голым IP, по любым портам, по любым протоколам.
0
s7eepz #
скайп легко закрывается, если в инет разрешить только 80 порт через прокси, NAT udp и https не делать, кому надо скайп — открывать https на прокси.
торренты легко режутся на циске, объявляем нужные порты в class-map, выставляем нужные параметры в policy-map, в этом же policy-map создаем class-default и делаем ему скорость через police.

все проверено на своем опыте.
0
Himari #
Создайте белый список программ которые можно запускать на машине.
0
mtp #
Шутите? Виндовыми средствами, конечно, можно соорудить политики по запуску, но, почитав, как народ массово с этим мучается, даже думать не хочу в эту сторону. Это геморрой и на этапе первоначального сбора хэшей, и при каждом обновлении софта. Могу ошибаться, конечно.
+2
cepera_ang #
Да по большому счёту это единственное решение таких вот задачек, когда программа ломится через любую открытую дырку.

Как вариант минимум — пользователи с ограниченными правами и запрещен запуск любых программ из тех папок куда у них есть доступ на запись.
+1
YourChief #
настроил файрвол — напиши на хабр. как будете решать вопрос с тем, что он через прокси работает?
0
mtp #
Ну, во-первых, чтобы пустить teamviewer через прокси, пользователю всё-таки нужно приложить кое-какие усилия (мы говорим про пользователя, поймите). По умолчанию программулина всё-таки ходит напрямую.

Во-вторых, мне не приходит в голову какой-либо метод общего вида, позволяющий узнавать, что вот такое-то соединение идёт через прокси. При необходимости придётся глушить адреса руками поодиночке, и это, да, сложнее, вы правы. Но это уже совсем-совсем другое дело и другой разговор.

А как бы вы предложили блокировать прокси?
+2
YourChief #
проще всего принудительно всех на свой прокси зарулить. если с этим проблемы, то можно нетфильтром (iptables) резать соединения по проскакивающим в нём строкам — там прям открытым текстом много характерных строк вызелает. вот один пакетик из сессии для примера
0
mtp #
Любопытный пакет, прямо-таки html-страничка в миниатюре. Спасибо, содержимое я не копал.

А на свой прокси всех зарулить — идея. Хотя на прошлой работе отдельные продвинутые пользователи ходили через всякие веб-анонимайзеры, и корпоративный прокси этому превентивно помешать не мог, поскольку браузер-то честно шёл через него.

Сейчас пытаюсь сообразить, а можно ли пройти через один (жестко заданный, корпоративный) прокси на другой? Ну, в смысле, не через браузер, а по портам. Хотя вон, Tor и Skype умеют.
+2
YourChief #
анонимайзеры регэкспами блокируются, есть опубликованные большие списки.

Сейчас пытаюсь сообразить, а можно ли пройти через один (жестко заданный, корпоративный) прокси на другой?
вообще говоря да

у прокси-серверов есть метод CONNECT который не проксирует HTTP запрос, а просто открывает соединение к указанному адресу и порту, которым может быть порт следующего, каскадного прокси-сервера. чтобы такого не было, этот метод по дефолту оставляют разрешённым только для того, для чего он действительно жизненно необходим — это HTTPS, порт 443. поэтому-то этот порт так горячо любим всякими скайпиками, тимвиверами, торами, бесплатными открытыми опенвпнами — он обычно пролезает через прокси. я и сам так опенвпнился к своему серву, когда в билайне работал.

однако и у этой проблемы есть решение — ставят модуль к прокси-серверу, который подменяет SSL-сертификат и разбирает соединение на лету, эмулируя этот метод. решение так себе — и все серты сразу инвалидными становятся, и персональные сертификаты не будут работать, и приватность пользователя нарушена — но дело будет сделано.
0
mtp #
Не знаю, как остальные браузеры, а Firefox сейчас вместо ругательств на неверный сертификат теперь стал просто блокировать такие адреса. Подозреваю, что Хром, Опера и даже IE тоже подтянутся, а может быть, кто-то и обогнал давно Мозиллу в этом в вопросе. Так что увы, это решение с подменой сертификатов скоро накроется, если ещё не.

Я вот думаю, а не собрать ли «белый список» сайтов с https, закрыв для остальных 443 порт нафиг? Крайняя мера, конечно.
+2
YourChief #
ну или так, или же можно установить клиентам в браузеры свой удостоверяющий центр и тогда уже либо подписывать на лету сгенерённые доменные сертификаты, или использовать сертификат на очень широкий wildcard-домен — тут от конкретного софта зависит
0
hhrhhr #
а что мешало удалить Teamviewer? создать политику запрещающую его запуск?
если бухгалтера такие злодеи, что с ними нельзя договориться, то представляете, что они устроят когда в очередной раз к ним не сможет подключиться их программер?
0
mtp #
Так правила-то отключаемые, в этом вся и вкусность. Зашёл на циску, деактивировал пункт, и соединения снова проходят. С удалением или блокировкой запуска программ так гибко и оперативно сделать не получилось бы.
0
hhrhhr #
я что-то не пойму, задача стояла в том, чтобы бухгалтера ничего не подозревали?
странные тогда порядки в вашей фирме. у нас в первую очередь связались бы с программерами, если им нужен доступ на сервер — пробросили бы через ту же циску банальный rdp и открывали бы его по звонку, вы ведь не отключили тимвьювер совсем.
не нравится rpd — vnc-клиентов куча, в том числе и работающих в браузере, на случай когда программер работает с телефона едучи в автобусе (правда у нас с такими людьми работать не стали бы).

p.s.
политики, как ни странно, тоже являются динамически отключаемыми.
0
mtp #
Ай, там с оргстороны беда и разлад в этом вопросе. RDP предлагали (сами-то через него подключаемся), не понравилось. Программер сторонний, менять его бухгалтерия не даёт — это к вопросу про то, что работать с такими людьми не стали бы. Не будем о грустном.

Возвращаясь к политикам запрета запуска программ по хэшу — действительно можно отключить некий пункт и на клиентских машинах всё заработает через полминуты и без перезагрузки? Нет, правда интересно, просто по имеющимся описаниям это что-то громоздкое и неуклюжее.
0
Aidos #
ну клиентам можно gpupdate/force в командной строке запустить, должно работать и без перезагрузки

запрет лучше не по хэшу, а разрешить только запуск из директории куда пользователь не имеет прав на запись
0
hhrhhr #
да, тяжело там у вас. могу только посоветовать дать бухам почитать про трояны мониторящие клиент-банки и ворующие эцепешные ключики, и ненароком поинтересоваться, кто из них несет ответственность в случае «неправильного перевода на неизвестный счет».

про политики уже ответили, можно добавить что если ориентироваться на уровень «бухгалтера обыкновенного», то достаточно запретить конкретный путь (если teamviewer уже установлен), либо просто по имени (если юзают мобильную версию).

0
kvo #
«дать бухам почитать про трояны мониторящие клиент-банки и ворующие эцепешные ключики, и ненароком поинтересоваться, кто из них несет ответственность в случае «неправильного перевода на неизвестный счет»»
может и есть исключения, в 95% случаев бух ответит, что виноват будет сисадмин, который не проконтролировал, не обеспечил, не среагировал и т.д. и т.п.
0
AFC #
Вы у буха уточните кто будет отвечать, а не кто виноват по его мнению.
+5
Aidos #
Еще вариант натравить на teamviewer антивирус, практически все они эффективны в этом плане.
0
art0m #
А вот так пробовали?
url-regex client=DynGate
0
mtp #
Спасибо за наводку, интересная штука, надо посмотреть.
0
nakamura #
А у TeamViewer GmbH нет своей AS?
0
mtp #
Вы имели в виду такое колдунство?
0
Karroplan #
я к безопасности и доступу в сеть извне подхожу по-другому:
1) запретить всё
2) подумать — нужно ли что-то?
3) обсудить и потребовать много бумажек на тему «нам нужно это, откройте пожалуйста»
4) подумать как бы не открыть лишнего
5) открыть только нужные приложения

собственно тогда вопрос «нужно закрыть приложение_Х» решается несколько проще :)
0
masterclass #
Как один из вариантов можно выпускать бухгалтеров через прокси, NAT им отключить. Оставить NAT лишь для клиент-банков на какие-то определенные destination-ip.
+1
mihmig #
Автор виндовый админ? Чего-ж тогда ISA-сервер с клиентскими частями не настроите?
На ISA-firewall-е добавляете правило по ИМЕНИ ПРИЛОЖЕНИЯ и включаете/выключаете когда надо.
0
mtp #
Автор виндовый админ, и даже когда-то работал с ISA, но в настоящее время имеется только циска.
0
siniysv #
бывает, что решать проблему надо на том, что есть, но…
как же всяческие специализированные layer7 фаерволы?
0
mtp #
См. чуть-чуть выше )

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.