Методы получения дополнительных сведений при анализе протоколов и журналов. Методические указания к выполнению лабораторных работ
.pdfПРИЛОЖЕНИЕ 1
Описание выражний фильтров tcpdump
В описании Wireshark и TShark (косольный вариант программы) раздел «CAPTURE FILTER SYNTAX» содержит лаконичное описание: «See the manual page of pcap-filter(7) or, if that doesn't exist, tcpdump(8), or, if that doesn't exist, http://wiki.wireshark.org/CaptureFilters». Приведем описания и примеры использования tcpdump (опивание датировано
10.03.2011 [5]).
-A задает вывод каждого пакета (без заголовков канального уровня) в формате ASCII. Этот режим удобен для сбора трафика HTTP.
-c <число пакетов> задает завершение работы программы после захвата заданного числа пакетов.
-C <размер файла> задает необходимость проверки размера файла захвата перед записью в него каждого нового пакета. Если размер файла превышает значение параметра file_size, этот файл закрывается и создается новый файл для записи в него пакетов. Для файлов захвата используется имя, заданное параметром -w и, начиная со второго файла, к имени добавляется в качестве суффикса номер файла. Переменная file_size задает размер файла в миллионах байтов (не в мегабайтах = 1 048 576 байт).
-d задает вывод дампа скомпилированного кода соответствия пакетов (packet-matching code) в понятном человеку формате и завершение работы программы.
-dd выводит дамп кода соответствия в виде фрагмента C- программы.
-ddd выводит дамп кода соответствия в виде строки десятичных значений, перед которой следует строка со значением счетчика.
-D выводит список сетевых интерфейсов системы, с которых tcpdump может собирать пакеты. Для каждого сетевого интерфейса указывается имя и номер, за которыми может следовать текстовое описание интерфейса. Имя и номер интерфейса могут использоваться с флагом -i для задания сбора пакетов с одного интерфейса.
Эта опция может быть весьма полезна для систем, не дающих информации об имеющихся сетевых интерфейсах.
Флаг -D не поддерживается, если программа tcpdump была скомпилирована со старой версией libpcap, которая не поддерживает функцию pcap_findalldevs().
-e выводит заголовок канального уровня в каждой строке дампа.
-E задает использование алгоритма и секрета spi@ipaddr для
11
расшифровки пакетов IPsec ESP, направленных по адресу ipaddr и
содержащих and в поле Security Parameter Index значение spi.
Комбинация spi и адреса может быть повторена с использованием в качестве разделителя запятой или новой строки. Отметим, что установка секрета для пакетов IPv4 ESP в настоящее время поддерживается.
Вкачестве алгоритмов могут использоваться des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc или none. По умолчанию применяется алгоритм des-cbc. Возможность дешифровки пакетов обеспечивается только в тех случаях, когда при компиляции tcpdump были включены опции поддержки криптографии.
Параметр secret содержит ASCII-текст секретного ключа ESP. Если секрет начинается с символов 0x, будет считываться шестнадцатеричное значение. Опция предполагает использование ESP в соответствии с RFC 2406, а не RFC 1827. Эта опция поддерживается только для отладки и использовать ее с реальными секретными ключами не следует, поскольку введенный в командной строке ключ IPsec доступен другим пользователям системы.
Кроме явного указания параметров в командной строке их можно задать в файле опций, который tcpdump будет читать при получении первого пакета ESP.
-f задает вывод чужих адресов IPv4 в числовом формате. Использование этой опции позволяет избавиться от проблем, возникающих на серверах Sun NIS при попытках трансляции нелокальных адресов. Проверка чужеродности адреса IPv4 осуществляется с использованием адреса и маски принявшего пакет интерфейса. Если адрес и маска интерфейса недоступны (например, при использовании unnumbered-интерфейсов или при захвате пакетов со всех адресов в Linux с использованием фиктивного интерфейса any), эта опция будет работать некорректно.
-F <файл> задает использование фильтров, содержащихся в указанном файле. В этом случае заданные в командной строке фильтры игнорируются.
-i <интерфейс> задает сбор пакетов с указанного интерфейса. Если интерфейс не задан, tcpdump ищет в системе список доступных интерфейсов и выбирает в нем активное устройство с минимальным номером (исключая loopback).
Всистемах Linux, начиная с ядра 2.2 поддерживается фиктивный интерфейс с именем any, обеспечивающий сбор пакетов со всех активных интерфейсов системы. Отметим, что сбор пакетов с устройства any осуществляется в обычном (не promiscuous) режиме.
12
Если в системе поддерживается флаг -D, можно в качестве аргумента задавать номер интерфейса, выводимый при использовании этого флага.
-l задает буферизацию строк stdout. Эта опция полезна в тех случаях, когда вы хотите просматривать данные во время сбора пакетов. Например, команды
tcpdump -l | tee dat
или
tcpdump -l > dat & tail -f dat
обеспечивают запись пакетов в файл dat и одновременный вывод на консоль.
-L задает вывод списка известных типов канального уровня и завершение работы программы.
-m <файл> загружает модуль определений SMI MIB из указанного файла. Эта опция может использоваться неоднократно для загрузки нескольких модулей MIB.
-n отключает преобразование адресов и номеров портов в символьные имена.
-N задает использование только имен хостов, а не полных доменных имен. Например, вместо lhotze.bilim-systems.net при использовании этой опции моя рабочая станция будет обозначаться как lhotze.
-O отключает оптимизатор кода проверки соответствия пакетов условиям фильтрации. Используйте эту опцию, если вам покажется, что оптимизатор работает с ошибками.
-p указывает программе, что интерфейс не нужно переводить в режим захвата. Опцию -p нельзя использовать вместе с фильтром ether host {local-hw-addr} or ether broadcast.
-q задает вывод минимального объема информации.
-R при установке этого флага предполагается, что пакеты ESP/AH используют старый вариант спецификации и tcpdump не будет выводить поля replay prevention (защита от воспроизведения). Поскольку спецификация ESP/AH не включает поля с номером версии, tcpdump не может определить версию протокола ESP/AH по заголовкам пакетов.
-r <файл> задает чтение данных из файла, созданного ранее с использованием команды tcpdump -w или с помощью другой программы, поддерживающей формат tcpdump (например, Ethereal). Если в качестве имени файла задан символ -, используется поток данных от стандартного устройства ввода (stdin).
-S задает вывод абсолютных порядковых номеров TCP взамен
13
относительных.
-s задает захват из каждого пакета snaplen байтов, вместо отбираемых по умолчанию 68 байт. Значение 68 подходит для протоколов IP, ICMP, TCP и UDP, но может привести к потере протокольной информации для некоторых пакетов DNS и NFS. Потеря части пакетов по причине малого размера кадра захвата (snapshot) указывается в выходных данных полями вида [|proto]‘, где proto – имя протокольного уровня, на котором произошло отсечение части пакета. Отметим, что увеличение кадра захвата приведет к дополнительным временным затратам на обработку пакетов и уменьшению числа буферизуемых пакетов, что может привести к потере части пакетов. Используйте минимальное значение snaplen, которое позволит обойтись без потери информации об интересующем вас протоколе. Установка snaplen = 0 приведет к захвату полных пакетов.
-T <тип> задает интерпретацию пакетов, выбранных с помощью фильтра, как пакетов указанного параметром типа. В настоящее время поддерживаются типы aodv9, cnfp10, rpc11, rtp12, rtcp13, snmp14, tftp15, vat16 и wb17.
-t отключает вывод временных меток в каждой строке дампа.
-tt задает вывод в каждой строке дампа неформатированных временных меток.
-ttt задает вывод временных интервалов (в микросекундах) между захватом предыдущего и данного пакетов в каждой строке дампа.
-tttt задает вывод временных меток в принятом по умолчанию формате для каждой строки дампа.
-u задает вывод манипуляторов (handle) NFS без декодирования.
-U задает режим ―буферизации на уровне пакетов‖ для файлов, сохраняемых с помощью опции -w. В этом режиме каждый пакет записывается в выходной файл как только он будет захвачен (не дожидаясь заполнения выходного буфера). Флаг -U не будет поддерживаться, если программа tcpdump была скомпилирована со старой опцией libpcap, не поддерживающей функцию pcap_dump_flush().
-v задает вывод дополнительной информации при захвате файлов. К такой информации может относиться значение TTL (время жизни), идентификация, общий размер, опции IP и т.п. При использовании этого флага также выполняется дополнительная проверка целостности пакетов с помощью контрольных сумм (например, для протоколов IP и
ICMP).
-vv задает дополнительное увеличение объема выводимой
14
информации (например, полное декодирование пакетов SMB, вывод дополнительных полей откликов NFS и т.п.).
-vvv задает максимальный объем выводимой информации (например, полностью выводятся опции telnet SB … SE). При использовании вместе с ключом -X опции Telnet выводятся также в шестнадцатеричном представлении.
-w <файл> задает запись необработанных (raw) пакетов. Собранные в файл пакеты можно впоследствии просматривать с использованием флага -r или передавать для анализа другим программам. Если в качестве имени файла указан символ -, запись осуществляется на стандартное устройство вывода (stdout).
-x задает вывод шестнадцатеричного дампа (без заголовка канального уровня) для каждого захваченного пакета. Объем выводимой информации определяется меньшим из двух значений – размер пакета и значение параметра snaplen. Отметим, что при захвате полных кадров канального уровня дамп может включать также байты заполнения, если пакет сетевого уровня имеет малый размер.
-xx задает вывод шестнадцатеричного дампа для каждого пакета с включением заголовков канального уровня.
-X задает вывод дампа в шестнадцатеричном и ASCII-формате без заголовков канального уровня. Эта опция может быть очень удобна при анализе новых протоколов.
-XX задает вывод дампа в шестнадцатеричном и ASCII-формате с включением заголовков канального уровня.
-y <тип> задает тип канального уровня, используемого при захвате пакетов. Поддерживаемые значения можно посмотреть с помощью флага -L.
Примеры.
Ловим весь исходящий трафик
tcpdump -i re0 -n -nn -ttt dst host 192.168.1.2
Ловим весь исходящий трафик кроме нашей ssh сессии, либо очень большой поток данных получится.
tcpdump -i re0 -n -nn -ttt ‗dst host 192.168.1.110 and not ( src host 192.168.1.2 and dst port 22 )‘
Просмотр общения dns
tcpdump -i re0 -n -nn -ttt ‗host 192.168.1.110 and port 53′
Просмотр icmp пакетов
tcpdump -i re0 -n -nn -ttt ‗ip proto \icmp‘
Трафик переходящий из сети 10.7.20 с назначением на сети 10.7.0. или
10.7.24.:
15
tcpdump -nvX src net 10.7.20.0.0/16 and dst net 10.7.0.0/8 or 10.7.24.0/16
Трафик, идущий с сети 10.7.0.0 на порты назначения 22 или 4589: tcpdump ‘src 10.7.0.0 and (dst port 22 or 4589)‘
Посмотреть трафик на интерфейсе: tcpdump -i reo
Посмотреть трафик одного хоста: tcpdump host 192.168.1.1
Посмотреть трафик на порте: tcpdump src port 80
Посмотреть IP трафик на хост: tcpdump ip host 192.168.1.2
Посмотреть ARP трафик на хост: tcpdump arp host 192.168.1.2
Смотрим RARP трафик на хост: tcpdump rarp host 192.168.1.2
Смотрим трафик, кроме хоста pav253, tcpdump not host pav253
Смотрим трафик на pav253 и pav210 tcpdump host pav253 or host pav210
Смотрим содержимое пакетов на интерфейсе re0 на хост likeunix.ru tcpdump -X -i re0 host likeunix.ru
icq трафик
tcpdump -X -i re0 port aol
Смотрим содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста,
tcpdump -X -s 1500 -n -i re0 host likeunix.ru Top активных взимодействий
tcpdump -tn -c 10000 -i re0 tcp or udp | awk -F «.» ‗{print $1″.»$2″.»$3″.»$4}‘ | \ sort | uniq -c | sort -nr | awk ‗$1 > 100′
Смотрим все TCP пакеты с флагом SYN (начало сессии). tcpdump -i eth0 -nn tcp[13] == 2 and src net 192.168.1.0/24
Просмотр syn и fin пакетов из вне
tcpdump ‗tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net 192.168.1.0′
Просмотр все ipv4 http пакеты с порта 80, кроме syn / fin / ack данных, tcpdump ‗tcp port 80 and (((ip[2:2] — ((ip[0]&0xf)<>2)) != 0)‘
16
ПРИЛОЖЕНИЕ 2
Основы работы с OpenSSL
OpenSSL — это система защиты и сертификации данных, название SSL переводится, как система безопасных сокетов (secure socket layer). OpenSSL используется практически всеми сетевыми серверами для защиты передаваемой информацией. Существует программное API SSL (SSLEAY), позволяющее создавать безопасные сокеты с шифрацией передаваемых данных в собственных разработках. В данной статье расскажем о самой системе OpenSSL, вызываемой через командную строку.
Т.к. OpenSSL поддерживает очень много различных стандартов сертификации, шифрования, хеширования, то использование данной команды достаточно сложно. Внутри OpenSSL существуют отдельные компоненты, отвечающие за то или иное действие, для получения списка доступных компонентов можно вызвать openssl с параметрами list- standart-commands. Можно также получить список доступных алгоритмов хеширования (list-message-digest-commands) и алгоритмов шифро-
вания (list-cipher-commands).
OpenSSL может использоваться во множестве случаев и умеет выполнять следующие задачи:
-создавать и управлять ключами RSA и DSA – команды rsa, dsa, dsaparam;
-создавать сертификаты формата x509, запросы на сертификацию,
восстановление – команды x509, req, verify, ca, crl, pks12, pks7;
-зашифровывать данные с помощью симметрического или асимметрического шифрования – команды enc, rsautl;
-высчитывать хеши различных типов – команда dgst;
-работа с S/MIME – команда s/mime;
-проверка работы серверов и клиентов ssl – команды s_client, s_server.
Существует также несколько вспомогательных утилит ssl:
-openssl speed [список_алгоритмов_хеширования_или шифрования]: тестирование скорости различных алгоритмов, если запускать без параметров, то тестируются все алгоритмы; алгоритмы внутри списка разде-
ляются пробелом, например: openssl speed md5 rsa idea blowfish des 3des sha1. В конце работы выводится общая скорость работы различных алгоритмов (в 1000-х байт в секунду) для обработки различной длины блоков.
-openssl rand [-out file] [-rand file] num: генерация num рандомных байт можно использовать для проверки рандомизационной последовательности rand:
17
# openssl rand -rand .rnd 5 Wеб~
#
- openssl ciphers [-ssl2] [-ssl3] [-tls1] NAME: вывод доступных ал-
горитмов для обеспечения уровня безопасности NAME, где NAME – символическое название группы алгоритмов. Обычно используются значения:
LOW – алгоритмы низкого уровня безопасности (<128 бит); MEDIUM – алгоритмы среднего уровня стойкости (128 бит); HIGH – алгоритмы высокой стойкости (>128 бит);
ALL – все алгоритмы;
NULL – алгоритмы без шифрования.
Обычно в настоящее время используются алгоритмы групп MEDIUM и HIGH, которые еще долго не смогут быть взломаны прямым перебором. Можно также вывести список алгоритмов из нескольких групп, разделив их «:» (например, MEDIUM:HIGH).
Расскажем об основных утилитах openssl. Для начала о методах генерации ключей, затем о командах шифрования, и, наконец, о сертификатах, s/mime. Для создания rsa-ключей используется команда genrsa:
openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits]
Команда genrsa создает секретный ключ длиной bits в формате PEM, шифрует его одним из алгоритмов: des (56 бит), des3 (3-й des 168 бит) или idea (128 бит). При выборе алгоритма шифрования будет запрошен пароль для шифрации создаваемого секретного ключа (если алгоритм не указан, то секретный ключ не шифруется, чего делать ни в коем случае нельзя для личных ключей, т.к. некоторые серверы требуют отсутствие шифрации для сектетного ключа сервера). Опция -out говорит программе, что вывод нужно осуществлять не в stdout, а в файл file (опция -out присутствует во множестве других компонентов openssl и используется аналогичным образом для указания выходного файла). Опция -rand указывает на файл[ы] (разделенные «:»), из которых будут считываться данные для установки seed (зерна) генератора случайных чисел. В качестве таких файлов можно использовать /dev/random или /dev/urandom. Если возникают проблемы, то в этом случае можно использовать какие-нибудь сложно угадываемые файлы: /var/log/messages
или /boot/vmlinuz. Если используете /dev/random и /dev/urandom, то для этого скопируйте из /dev/random 32768 байт в файл .rnd таким образом:
dd if=/dev/[u]random of=.rnd count=64
18
Кроме этого, можно указывать в качестве -rand-файла EGD-сокет, который обеспечивает генерацию определенного количества случайных байт. EGD доступен на сайте http://www.lothar.com/tech/crypto/. Уста-
новка генератора случайных чисел производится на основании хеша - rand файла, поэтому можно указывать файлы различной длины, т.к. хеш имеет фиксированное число бит. Пример генерации 4096 битового секретного ключа RSA:
# openssl genrsa -out /etc/openssl/key.pem -des3 -rand /var/log/messages 4096
Generating RSA private key
.....++*...++++++++*
Enter PEM passphrase: Verify PEM passphrase:
После этого секретный ключ зашифровывается и записывается в файл (в текстовом виде). В начале ключа указывается алгоритм шифрования. Для создания публичного ключа rsa на основе секретного используется команда openssl rsa. Данная команда имеет следующий формат:
openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout]
Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного ключа, будучи вызвана с параметром -in и -out. Если применить параметр -pubout, то в указанный файл -out будет записан публичный ключ, вычисленный на основе -in секретного. Например, создание публичного ключа на основании секретного:
openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/pubkey.pem
–pubout
Изменение пароля и алгоритма шифрования секретного ключа с des3 на idea:
openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/key1.pem –idea
Для создания ключей DSA используется утилита openssl gendsa, аналогичная genrsa, но есть два отличия: во-первых, для ключей DSA нельзя прямо указывать длину в битах и, во-вторых, ключи DSA могут генерироваться согласно некоторым параметрам, записанным в файл paramfile утилитой openssl dsaparam. dsaparam имеет следующий формат:
openssl dsaparam [-rand file{s}] [-C] [-genkey] [-out file] numbits,
где numbits – длина желаемого ключа. -С заставляет dsaparam вывести
19
на stdout код на СИ для программной генерации DSA на основе необходимых параметров, а опция -genkey говорит, что в выходной файл, наряду с параметрами, дополнительно записывается созданный секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо числа бит указывается файл параметров, созданный dsaparam:
# openssl gendsa -out /etc/openssl/dsakey.pem -rand /boot/vmlinuz -idea paramfile
Enter PEM passphrase: Verify PEM passphrase:
Для управления ключами dsa используется программа openssl dsa, которая абсолютно аналогична (в параметрах) утилите openssl rsa. Поэтому я просто приведу пример генерации публичного ключа DSA:
# openssl dsa -in /etc/openssl/dsakey.pem -out /etc/openssl/pubdsakey. pem –pubout
Расскажем о компонентах openssl, выполняющих шифрование и хеширование данных. Для выполнения симметрического шифрования используется утилита openssl enc -cipher или ее сокращенная запись openssl cipher, где cipher – одно из символических имен симметрических шифров. Наиболее популярными являются следующие: base-64 (преоб-
разование в текстовый вид), bf (blowfish – 128 бит), des (56 бит), des3 (168 бит), rc4 (128 бит), rc5 (128 бит), rc2 и idea (128 бит). Для указания входного и выходного файлов используется опции -in и -out соответственно. Пароль для шифрования вводится с клавиатуры (можно указать в командной строке параметром -k, но это очень плохо по соображениям безопасности, т.к. большинство шеллов умеют сохранять историю командной строки, намного лучше ввести пароль непосредственно перед шифрованием, хотя эта опция полезна для скриптов. Учтите, что пароль не спрашивается при обработке файла base64, т.к. шифрование не происходит. Для расшифровки зашифрованных данных примените openssl cipher с опцией -d (алгоритм шифрования и дешифрования должен совпадать!), а для одновременной обработки данных base64 можно воспользоваться опцией -a. Шифрование по умолчанию происходит с подмешиванием. В этом случае, если вы шифруете один и тот же файл в разное время одним и тем же алгоритмом и паролем, то результаты скорее всего будут разными (это затрудняет атаку по словарю). Также по умолчанию используется cbc-режим алгоритмов, когда ключ меняется в течение всего сеанса работы согласно передаваемым данным, этот при-
20
