Использование Term для обхода Интернет-Firewall

Аннотация

Здесь приведены инструкции, как, с помощью "term", делать с сетью через TCP-firewall то, что вы делать, в принципе, не должны.


Содержание
Отказ от ответственности
Copyright
Авторские права
Введение
Суть идеи
Детальное руководство
Множество сокетов term
Файл инициализации /.term/termrc.telnet
Руководство
Безопасность
Режим Telnet
Ошибки и список пожеланий для term
Приемы, которые, кажется, не работают
Дополнительные ресурсы
Благодарности

Отказ от ответственности

!!! ВАЖНО !!!

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


Copyright

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at linux-howto@sunsite.unc.edu via email.


Авторские права

Авторские права на русский перевод этого текста принадлежат ╘ 2000 ASPLinux Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO, должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу


Введение

Программа "term" обычно используется модемными и/или другими последовательными линиями, для создания простого соединения между машинами. Иногда надо бывает создать term-соединение между двумя машинами "общающимися" через telnet. Самый интересный случай возникает, когда эти машины разделены сетевым firewall или сервером SOCKS. Такие firewall обеспечивают соединение telnet, через себя при помощи протокола SOCKS, и позволяют внутренней машине подсоединиться к внешней, а внешним пользователям соединиться, при помощи telnet, сначала к шлюзу, а затем, после введения одного пароля, соединиться с внутренней машиной. Такие firewall не позволяют, например, внутренней машине с Х клиентом соединиться с внешним Х сервером. Но при использовании term-соединения это ограничение легко обходится.


Суть идеи

Процедура установления term-соединения состоит из двух этапов. Сначала вам надо, при помощи telnet, установить telnet-соединение и зайти в систему. Затем клиент telnet останавливается, а управление сообщением передается term.


Детальное руководство

Теперь более подробно.

Сначала с внутренней машины соединитесь с внешней (здесь и далее внутренняя и внешняя относительно firewall) и войдите в систему.

Так как вы используете linux, вы будете использовать файловую систему proc (смотрите далее), удостоверьтесь, что shell - это shell типа sh (bash, zsh и т.д.) . Например, если у вас csh, то установите связь telnet следующей командой:
(setenv SHELL /bin/sh; telnet machine.outside)

После вхождения в систему внешней машины, выполните команду
term -r -n off telnet

теперь выйдите в командную строку telnet на внутренней машине, используя ^] (или как у вас настроено), и, при помощи команды !, запустите term,
telnet> ! term -n on telnet >&3 <&3

Получилось!!!

(Если у вас нестандартная версия telnet, то вам надо использовать другой дескриптор файла (у меня он 3); его можно легко определить при помощи strace. Но тройка, по-моему, работает на всех bsd-совместимых telnet клиентах, я пробовал на SunOS 4.x и обычных дистрибутивах linux.)

Некоторые клиенты telnet не имеют команды "!", которая запускает внешнюю команду оболочки. Например, telnet-клиент в дистрибутиве Slackware 3.0 именно такой. Исходники (не уверен на 100%) этого клиента лежат на
ftp://ftp.cdrom.com:/pub/linux/slackware-3.0/source/n/tcpip/NetKit-B-0.05.tar.gz
в них есть эта команда. Напрашивается решение - скачать и перекомпилировать их. Но, к сожалению, я не смог этого сделать. и в добавок если у вас используется SOCKS firewall, то вам понадобиться клиент telnet поддерживающий SOCKS. В этом случае я не оплошал и собрал такой клиент, используя
ftp://ftp.nec.com/pub/security/socks.cstc/socks.cstc.4.2.tar.gz
или, если вы находитесь за пределами США ,
ftp://ftp.nec.com/pub/security/socks.cstc/export.socks.cstc.4.2.tar.gz

Если у вас ядро до 1.2.13, вы можете приостановить telnet командой ^]^z, затем выяснить его идентификатор процесса и дать команду
term -n on -v /proc/<telnetpid>/fd/3 telnet
Это не работает с ядрами выше 1.3.x , у которых, из соображений безопасности, закрыт доступ к этим дескрипторам файлов (fd) для всех пользователей, кроме одного.


Множество сокетов term

Хорошая идея - дать сокету term явное имя. Это имя - "telnet" - параметр при вызове term. Если вы не имеете переменную среды TERMSERVER с установленным значением "telnet", вызывайте term клиент с ключом -t, например "trsh -t telnet".


Файл инициализации /.term/termrc.telnet

Я проверил качество линии, при помощи утилиты linecheck. Я думал, что она будет полностью прозрачна, но я ошибся. Однако, проблемы возникли только с символом 255. Поэтому я написал в файле ˜/.term/termrc.telnet (.telnet - это имя term-сокета, см.предыдущую главу) следующее:
baudrate off
escape 255
ignore 255
timeout 600

Наверно, после более точной настройки, скорость повысится, но у меня пропускная способность этой системы составляет около 30 тысяч cps (достаточно дальнее соединение и медленный firewall). По ftp скорость немного выше - около 100 тысяч cps. На самом деле пропускная способность может зависит от времен задержки.


Руководство

Очевидно, что если вы находитесь за пределами firewall и входите в систему при помощи карты SecureID или ей подобной, то вам может понадобиться смена ролей, описанных выше локального и удаленного серверов. (Если вы не понимаете, что это такое - значит вы не настолько знакомы с term, чтобы правильно использовать хитрость, описанную здесь))


Безопасность

В этом не больше уязвимости, чем в возможности наличия telnet подключения на необезопасенной машине. Дополнительный риск исходит от людей, способных использовать сокет term, который вы устанавливаете, а вы можете этого узнать. Так будьте внимательными. (Лично, я делаю это с внешней машиной, которую я знаю, а именно это портативный компьютер с linux, который я обслуживаю и который не принимаает никаких внешних соединений).

Другая возможность - добавить "socket off" в удаленном файле ˜/.term/termrc.telnet, или add "-u off" при обращении к term. Это предотвращает сокет от нападения с удаленной машины, лишь с небольшой потерей функциональности.


Режим Telnet

Убедитесь, что удаленный telnetd не работает в противном семибитном режиме. Если это не так, вы должны сообщить term об этом, когда вы вызываете его, добавив ключ -a. (Я иногда использую "^] telnet> set outbin", или "set bin" или вызываю telnet с ключом -8, для перевода в восьмибитный режим).


Ошибки и список пожеланий для term

Программа linecheck иногда имеет некоторые проблемы при проверке telnet соединения. Это происходит иногда, потому что она не проверяет код возврата функции read(). Для сетевых соединений вызов read() может возвращать коды ошибок -1, EINTR (прервано) или EAGAIN (попытаться снова). Очевидно, это должно проверяться.

Имеется множество особенностей, которые могут облегчить использование term через telnet. Они прежде всего касаются предположения, которое повлияло на разработку term, а именно, когда подключение идет на линиях с низкой пропускной способностью, малой надежностью и некоторой зашумленностью.

Telnet соединение в общем проходит с высокой пропускной способностью, надежностью и без ошибок. Это означает, что подключение может быть лучше, если (а) максимальный размер буфера увеличен, намного больше предела установленного term - N_PACKETS/2=16, (б) выключена проверка контрольной суммы пакета и (в) разрешены большие пакеты.

Также, чтобы увеличить безопасность, было бы хорошо иметь опцию term, чтобы регистрировать все соединения через сокет, выводить сообщения в журнал, в поток stderr или в оба. Это позволило бы увидеть, не разрушают ли term соединение хакеры на вашей машине.


Приемы, которые, кажется, не работают

Некоторые клиенты и серверы telnet согласны передавать друг другу зашифрованные данные, чтобы обеспечить их безопасность. К сожалению, хак, используемый выше (использование сетевого подключения, которое установил клиент telnet, пока он простаивает) не будет работать в этом случае. Вместо этого, необходимо проверить клиент telnet непосредственно, на наличие функции шифрования. Добавьте команду, которая выполнит процесс с его вводом и выводом.


Дополнительные ресурсы

Подробно, включая патчи к SOCKS, можно получить от Steven Danz <danz@wv.mentorg.com>.


Благодарности

Благодарю за ценные предложения:

"Extra copy of IMPORTANT DISCLAIMER --- BELIEVE IT!!!"

"I hereby disclaim all responsibility for this hack. If it backfires on you in any way whatsoever, that's the breaks. Not my fault. If you don't understand the risks inherent in doing this, don't do it. If you use this hack and it allows vicious hackers to break into your company's computers and costs you your job and your company millions of dollars, well that's just tough nuggies. Don't come crying to me."