You are here: Home » Sniffing и Spoofing » Etterfilter

Etterfilter

Описание Etterfilter

etterfilter — это компилятор фильтров для движка фильтров контента ettercap.

Утилита etterfilter используется для компиляции исходный файлов фильтров в бинарные файлы фильтров, которые могут быть интерпретированы JIT интерпретатором в движке фильтров ettercap. Вы должны скомпилировать ваши скрипты фильтров, чтобы использовать их в ettercap. Все синтаксические ошибки и ошибки разбора будут проверены во время компиляции, поэтому вы будете уверены, что создали корректный бинарный фильтр для ettercap.

Домашняя страница: http://www.ettercap-project.org

Автор: Gianfranco Costamagna (LocutusOfBorg), Alberto Ornaghi (ALoR), Marco Valleri (NaGA)

Лицензия: GPLv2

Справка по Etterfilter

Использование:

etterfilter [ОПЦИИ] файл_фильтра

Общие опции:
  -o, --output <файл>         файл вывода (по умолчанию это filter.ef)
  -t, --test <file>           протестировать файл (отладочный режим)
  -d, --debug                 печатать некоторую отладочную информацию во время компиляции
  -w, --suppress-warnings     игнорировать предупреждения во время компиляции

Стандартные опции:
  -v, --version               показать версию и выйти
  -h, --help                  этот экран помощи

Руководство по Etterfilter

ОБЩИЕ ОПЦИИ

-o, --output <ФАЙЛ>

вы можете указать файл вывода для скомпилированного файла фильтра. По умолчанию это filter.ef.

-t, --test <ФАЙЛ>

с этой опцией вы можете проанализировать скомпилированный файл. Etterfilter напечатает в удобном для чтения человеком виде все инструкции, которые в нём содержаться. Это своего рода «дизассемблер» для бинарных файлов фильтра.

-d, --debug

печатает сообщения отладки во время компиляции. Используйте более чем один раз для повышения уровня отладки (etterfilter -ddd … ).

-w, --suppress-warnings

Не выходить при предупреждениях. С этой опцией компилятор будет компилировать скрипт даже если он содержит предупреждения.

СТАНДАРТНЫЕ ОПЦИИ

-v, --version

Напечатать версию и выйти

-h, --help

печатает справку по опциям.

СИНТАКСИС СКРИПТОВ

Скрипты представляют собой соединения инструкций. Они последовательно выполняются, и вы можете делать разветвления с опоератором 'if'. Поддерживаются только выражения 'if' и 'if/else'. Петли не реализованы. Синтаксис почти похож на код C за исключением того, что блоки 'if' нужно размещать в фигурные скобки '{' '}, даже если они содержат только одну инструкцию.

ПРИМЕЧАНИЕ: вам нужно делать пробел между 'if' и '('. Вам не нужно делать пробел между именем функции и '('.

Пример:

if (conditions) { }
func(args...);

Условия для оператора 'if' могут быть как функциями, так и сравнениями. Два или более условия могут быть связаны друг с другом логическими операторами вроде OR '||' и AND '&&'.

Пример:

if (tcp.src == 21 && search(DATA.data, "ettercap")) {
}

Обратите внимание на приоритет оператора. Вы не можете использовать круглые скобки для группировки условий, поэтому будьте осторожны с порядком. AND в начале блока условий будет исключать все остальные тесты, если оно оценивается как false. Разбор идёт слева направо, когда найден оператор: если он AND и предыдущее условие это false, то всё выражение оценивается как false; если это OR, то разбор продолжается даже если условие является false.

Примеры:

if (ip.proto == UDP || ip.proto == TCP && tcp.src == 80) {
}

 

if (ip.proto == TCP && tcp.src == 80 || ip.proto == UDP) {
}

первое условие будет соответствовать всему udp и http трафику. Второе является неверным, поскольку если пакет не tcp, то весь блок условия будет расценен как false. Если вы хотите сделать сложные условия, лучший способ — это разделить их во вложенные блоки 'if'.

Поскольку etterfilter поддерживает обе семьи IP адресов, вам следует быть внимательным, используете ли вы 'ip.proto', которая специфична для адресов IPv4 семьи или его IPv6 дубликат 'ipv6.nh'. Особенно для протокола L4, используя соответствующие 'ip.proto' и/или 'ipv6.nh', вы должны быть внимательным, действительно ли орудуете верным протоколом. Это должно быть обеспечено с помощью L3 протокольного идентификатора 'eth.proto'.

Примеры:

if (eth.proto == IP && ip.proto == TCP && tcp.dst == 80 || tcp.src == 80) {
}

 

if (eth.proto == IP6 && ipv6.nh == TCP && tcp.dst == 80 || tcp.src == 80) {
}

 

if (tcp.dst == 80 || tcp.src == 80) {
}

Первый пример корректно соответствует http трафику только на IPv4, второй будет соответствовать http трафику только на IPv6. Третий пример соответствует http независимо от его IP семьи.

Каждая инструкция в блоке должна заканчиваться точкой с запятой ';'.

Сравнения реализованы оператором '==' и могут использоваться для сравнения числе, строк или IP адресов. IP адрес ДОЛЖЕН быть заключён в одинарные кавычки (например, '192.168.0.7' или '2001:db8::2'). Вы также можете использовать операторы «меньше чем» ('<'), «больше чем» ('>'), «меньше или равно» ('<=') и «больше или равно» ('>='). lvalue из сравнения должны быть сдвигом (смотрите ниже).

Пример:

if (DATA.data + 20 == "ettercap" && ip.ttl > 16) {
}

Присвоение реализовано оператором '=' и lvalue может быть сдвигом (смотри ниже). rvalue может быть строкой, числом и шестнадцатеричным значением.

Примеры:

ip.ttl = 0xff;
DATA.data + 7 = "ettercap NG";

Вы также можете использовать операции 'inc' и 'dec' еа полях пакета. Используемыми операторами являются '+=' и '-='. rvalue может быть числом или шестнадцатеричным значением.

Пример:

ip.ttl += 5;

Больше примером можно найти в файле etter.filter.examples.

ОПРЕДЕЛЕНИЕ СМЕЩЕНИЯ

Смещение идентифицируется виртуальным указателем. Коротко говоря, смещение — это указать на буфер пакетов. Виртуальный указатель является этим набором <L, O, S>, где L — это уровень iso/osi, O — это сдвиг на этом уровне и S — это размер виртуального указателя. Вы можете делать алгебраические операции на виртуальных указателях и результатом будет также сдвиг. Указав 'vp + n' вы получите новый виртуальный указатель <L, O+n, S>. И это совершенно законно, мы изменили внутреннее смещение этого уровня.

Виртуальные указатели имеет формат 'name.field.subfield'. К примеру, ip.ttl' — это виртуальный указатель на поле время жизни в заголовке IP пакета. Она будет переведена как <L=3, O=9, S=1>. На самом деле девятый байт уровня 3 и размер 1 байт. 'ip.ttl + 1' это то же самое, что и 'ip.proto', поскольку десятый байт IP заголовка инкапсулируется протоколом в IP пакете. Заметьте, что хотя etterfilter также поддерживает обработку IPv6, вышеупомянутое относится только к пакетам IPv4, поскольку дубликатом в IPv6 будет 'ipv6.nh'.

Список поддерживаемых виртуальных указателей есть в файле etterfilter.tbl. Вы можете добавить ваши собственные указатели добавив новую таблицу или отредактировав существующие. За синтаксисом etterfilter.tbl файла обратитесь к комментариям в начале файла.

ФУНКЦИИ СКРИПТОВ

search(where, what)

эта функция ищет строку 'what' в буфере 'where'. Буфер может быть как DATA.data так и DECODED.data. Первый выполняет работу на уровне DATA (наверху TCP или UDP) при их передаче по проводу, второй выполняет работу декодирования/расшифровки диссекторами.

Поэтому если вы хотите искать в SSH подключении, лучше использовать 'DECODED.data', поскольку 'data' будут расшифрованы.

Строка 'what' может быть бинарной. Вы должны экранировать её.

пример:

search(DATA.data, "\x41\x42\x43")

regex(where, regex)

эта функция возвратит true если 'regex' имеет соответствия в буфере 'where'. Упомянутые выше для функции 'search' соображения о DECODED.data' и 'DATA.data' справедливы и для функции regex.

ПРИМЕЧАНИЕ: регулярное выражение может использоваться только в отношении строкового буфера.

пример:

regex(DECODED.data, ".*login.*")

pcre_regex(where, pcre_regex … )

эта функция оценит совместимое с perl регулярное выражение. Вы можете искать соответствия в DATA и DECODED, но если ваше выражение модифицирует буфер, то имеет смысл работать только с DATA. Функция принимает 2 или 3 параметра в зависимости от операции, которую вы хотите. Форма с двумя параметрами используется только для поиска соответствия образцу. Форма с тремя параметрами означает, что вы хотите сделать подстановку. В обоих случаях, второй параметр является искомой строкой.

Вы можете использовать $n в строке замены. Этот заполнитель указывают на группы, созданные в поисках в строке. (к примеру, pcre_regex(DATA.data, "^var1=([:digit:]*)&var2=([:digit:]*)", "var1=$2&var2=$1") обменяют значение var1 и var2).

ПРИМЕЧАНИЕ: поддержка pcre является опциональной в ettercap и будет включена только если у вас есть установленная libpcre. Компилятор предупредит вас если вы пытаетесь компилировать фильтр, который содержит выражение pcre, но у вас нет libpcre. Используйте опцию -w для подавления предупреждения.

пример:

pcre_regex(DATA.data, ".*foo$")
pcre_regex(DATA.data, "([^ ]*) bar ([^ ]*)", "foo $1 $2")

replace(what, with)

Эта функция заменяет строку 'what' на строку 'with'. Это могут быть бинарные строки и если так, то они должны быть экранированы. Замена всегда выполняется в DATA.data, поскольку это единственная полезная нагрузка, которая перенаправляется. Буфер 'DECODED.data' используется только внутри и никогда не достигает проводов.

пример:

replace("ethercap", "ettercap")

inject(what)

эта функция вставляет содержимое файла 'what' после обрабатываемого пакета. Она всегда вставляет данные в DATA.data. Вы можете использовать её для замены целого пакета на фальшивый используя функцию drop() сразу перед командой inject(). В этом случае движок фильтрации отбросит текущее содержимое пакета и вставит фальшивое.

пример:

inject("./fake_packet")

log(what, where)

эта функция сбрасывает в файл 'where' буфер 'what'. Информация о пакетах не сохраняется, сбрасывается только полезная нагрузка. Поэтому вы увидите поток в файл. Если вы хотите записать пакеты в более расширенном режиме, вам нужно использовать опцию -L и анализировать это с etterlog.

Файл 'where' должен быть читаемым для пользователя EC_UID (смотри etter.conf).

пример:

log(DECODED.data, "/tmp/interesting.log")

msg(message)

эта функция отображает сообщение для пользователя в окне User Messages (пользовательские сообщения). Она полезна для информирования пользователя был ли конкретный фильтр загружен или нет.

пример:

msg("Packet filtered successfully")

drop()

эта функция помечает пакет как «отброшенный». Этот пакет не будет перенаправлен на реальный пункт назначения.

пример:

drop()

kill()

эта функция убивает подключение, которое является владельцем соответствующего пакета. Если это TCP подключение, RST отправляется в обе стороны подключения. Если это UDP подключение, ICMP PORT UNREACHABLE отправляется источнику пакета.

пример:

kill()

exec(command)

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

пример:

exec("/bin/cat /tmp/foo >> /tmp/bar")

execinject(command)

эта функция работает подобно функции inject за исключением того, что для вставки данных она использует не содержимое файла, а вывод команды шэлла. Она всегда вставляет в DATA.data. Вы можете использовать её для замены целого пакета на фальшивый используя функцию drop() прямо перед командой execinject(). В этом случае движок фильтрации отбросит текущий пакет и вставит фальшивый.

пример:

execinject("/bin/cat /tmp/foo")

exit()

эта функция приводит к остановке выполнения движком фильтра кода. Она полезна для остановки выполнения скрипта в некоторых обстоятельства проверенных выражением 'if'.

пример:

exit()

Примеры запуска Etterfilter

Скомпилирует исходный файл filter.ecf (filter.ecf) в бинарный filter.ef (-o filter.ef):

etterfilter filter.ecf -o filter.ef

Установка Etterfilter

Эта программа является частью пакета Ettercap — она поставляется вместе с ним. Для получения этой программ достаточно установить Ettercap. Инструкция по установке Ettercap: https://kali.tools/?p=830#install_ettercap

Скриншоты Etterfilter

Это утилита командной строки.

Инструкции по Etterfilter

  • gedit `locate etter.filter.examples`
Близкие программы:

Рекомендуемые статьи: