Расширение Tshark с помощью скриптов Lua

WiresharkBeginner
Практиковаться сейчас

Введение

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

В упражнениях вас будут сопровождать по созданию скриптов на Lua, тестированию их с помощью команды tshark в Wireshark и проверке вывода. Вы научитесь выполнять скрипты с пустыми захватами и интерпретировать подробную информацию о пакетах.

Загрузите скрипт с помощью -X lua_script:script.lua

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

Сначала создадим простой скрипт на Lua в каталоге по умолчанию. Этот скрипт будет служить нашим базовым тестовым примером для проверки того, что Wireshark может успешно загрузить и выполнить код на Lua:

  1. Откройте терминал и убедитесь, что вы находитесь в каталоге ~/project. Именно здесь мы создадим и сохраним наш скрипт на Lua:

    cd ~/project
    
  2. Создайте новый файл скрипта на Lua с именем script.lua с помощью редактора nano. Мы используем nano, так как он прост в использовании и доступен в большинстве Linux-окружений:

    nano script.lua
    
  3. Добавьте следующий базовый код на Lua для вывода сообщения при загрузке. Это демонстрирует самую основную операцию - проверку выполнения скрипта:

    -- Simple Wireshark Lua script
    print("Wireshark Lua script loaded successfully!")
    
  4. Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X). Теперь скрипт готов к загрузке в Wireshark.

Теперь загрузим этот скрипт с помощью командной строки Wireshark. Мы будем использовать специальную комбинацию параметров для тестирования скрипта без обработки реального сетевого трафика:

wireshark -X lua_script:script.lua -r /dev/null -k

Разберем, что делает каждая часть этой команды:

  • -X lua_script:script.lua сообщает Wireshark загрузить наш файл скрипта на Lua
  • -r /dev/null указывает на пустой файл захвата (мы просто тестируем загрузку скрипта, а не анализируем пакеты)
  • -k запускает захват сразу же, не ожидая ввода пользователя

При выполнении этой команды вы должны увидеть сообщение "Wireshark Lua script loaded successfully!" в выводе терминала. Это подтверждает, что Wireshark успешно нашел, загрузил и выполнил ваш скрипт на Lua. Если вы не видите это сообщение, убедитесь, что файл скрипта существует в правильном месте и не содержит синтаксических ошибок.

Передайте аргумент с помощью -X lua_script1:arg1

На этом этапе вы узнаете, как передавать аргументы в скрипт на Lua в Wireshark с использованием опции -X lua_script1:. Этот метод полезен, когда вы хотите сделать свои скрипты более гибкими, принимая разные входные данные без изменения самого скрипта каждый раз.

Сначала разберем, как работает передача аргументов в среде Lua в Wireshark. Опция -X lua_script1: позволяет отправить строковое значение в ваш скрипт, которое затем можно получить с помощью функции get_string(). Это похоже на то, как работают аргументы командной строки в других языках программирования.

Изменим наш существующий скрипт на Lua, чтобы он принимал и обрабатывал аргумент:

  1. Откройте файл script.lua из предыдущего шага:

    nano ~/project/script.lua
    
  2. Замените содержимое следующим кодом, который принимает и отображает аргумент:

    -- Lua script with argument handling
    local arg1 = get_string("lua_script1")
    print("Received argument: " .. (arg1 or "no argument provided"))
    

    Функция get_string("lua_script1") извлекает аргумент, переданный с помощью -X lua_script1:. Часть or "no argument provided" предоставляет сообщение по умолчанию, если аргумент не был передан.

  3. Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X).

Теперь выполним скрипт с аргументом:

wireshark -X lua_script:script.lua -X lua_script1:test123 -r /dev/null -k

Разберем эту команду:

  • -X lua_script:script.lua загружает наш файл скрипта на Lua
  • -X lua_script1:test123 передает "test123" в качестве аргумента в скрипт
  • -r /dev/null указывает на пустой файл захвата (так как мы просто тестируем скрипт)
  • -k запускает захват сразу же, не ожидая ввода пользователя

Вы должны увидеть вывод, похожий на следующий:

Received argument: test123

Чтобы убедиться, что скрипт работает с разными входными данными, попробуйте запустить его с другим значением:

wireshark -X lua_script:script.lua -X lua_script1:another_value -r /dev/null -k

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

Обработайте файл с помощью -r capture.pcap

На этом этапе вы узнаете, как обработать предварительно записанный файл сетевого захвата с использованием командной строки Wireshark - Tshark и опции -r. Это полезно, когда вы хотите проанализировать сохраненный сетевой трафик, а не захватывать пакеты в режиме реального времени.

Сначала нам нужен пример файла захвата пакетов для работы. Файлы PCAP содержат реальные данные сетевого трафика, которые мы можем проанализировать. Скачаем стандартный пример HTTP-трафика:

  1. Скачайте пример файла pcap в ваш проектный каталог:

    wget https://wiki.wireshark.org/SampleCaptures/http.cap -O ~/project/capture.pcap
    
  2. Проверьте, что файл был скачан правильно, проверив его размер и местоположение:

    ls -lh ~/project/capture.pcap
    

Теперь изменим наш скрипт на Lua для анализа этого файла захвата. Скрипт подсчитает все пакеты в файле и сообщит общее количество. Вот как его обновить:

  1. Откройте скрипт для редактирования:

    nano ~/project/script.lua
    
  2. Обновите содержимое с помощью этой логики подсчета пакетов:

    -- Packet counter script
    local arg1 = get_string("lua_script1") or "default"
    local packet_count = 0
    
    -- Called for each packet
    function tap.packet(pinfo,tvb)
        packet_count = packet_count + 1
    end
    
    -- Called after processing all packets
    function tap.draw()
        print("Argument received: " .. arg1)
        print("Total packets processed: " .. packet_count)
    end
    
    -- Register the tap
    tap = Listener.new()
    
  3. Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X).

Теперь запустим наш скрипт на файле захвата. Эта команда сообщает Tshark:

  • Использовать наш скрипт на Lua (-X lua_script)
  • Передать аргумент в скрипт (-X lua_script1)
  • Обработать наш скачанный файл (-r)
  • Работать тихо, без графического интерфейса (-q)
wireshark -X lua_script:script.lua -X lua_script1:analysis -r ~/project/capture.pcap -q

После обработки вы должны увидеть вывод, показывающий:

  • Аргумент, который мы передали в скрипт
  • Общее количество подсчитанных пакетов

Пример вывода:

Argument received: analysis
Total packets processed: 83

Проверьте пользовательский вывод с помощью -V

На этом этапе мы рассмотрим, как проверить вывод вашего скрипта на Lua с использованием опции -V (подробный вывод) в Wireshark. Это особенно полезно, когда вам нужно увидеть детальные результаты анализа из вашего пользовательского скрипта вместе со стандартной информацией о пакетах.

Сначала улучшим наш скрипт на Lua, чтобы он предоставлял более осмысленную статистику. Изменим его так, чтобы он отслеживал разные типы протоколов:

  1. Откройте скрипт для редактирования в nano:

    nano ~/project/script.lua
    
  2. Обновите скрипт с помощью этого расширенного варианта, который подсчитывает пакеты HTTP и TCP:

    -- Enhanced packet analyzer
    local arg1 = get_string("lua_script1") or "default"
    local stats = {
        total = 0,
        http = 0,
        tcp = 0
    }
    
    function tap.packet(pinfo,tvb)
        stats.total = stats.total + 1
        if pinfo.visited then return end
    
        if pinfo.protocols:find("http") then
            stats.http = stats.http + 1
        end
        if pinfo.protocols:find("tcp") then
            stats.tcp = stats.tcp + 1
        end
    end
    
    function tap.draw()
        print("=== Analysis Report ===")
        print("Argument received: " .. arg1)
        print("Total packets: " .. stats.total)
        print("HTTP packets: " .. stats.http)
        print("TCP packets: " .. stats.tcp)
        print("======================")
    end
    
    tap = Listener.new()
    
  3. Сохраните файл (Ctrl+O, Enter) и выйдите из nano (Ctrl+X).

Теперь выполним наш скрипт с включенным подробным выводом. Флаг -V сообщает Wireshark отобразить всю доступную информацию, включая вывод нашего пользовательского скрипта:

wireshark -X lua_script:script.lua -X lua_script1:final_run -r ~/project/capture.pcap -q -V

Вы должны увидеть вывод, похожий на следующий, показывающий как детали пакетов, так и анализ вашего скрипта:

=== Analysis Report ===
Argument received: final_run
Total packets: 83
HTTP packets: 10
TCP packets: 83
======================

Для сохранения этого вывода для будущего использования перенаправьте его в файл:

wireshark -X lua_script:script.lua -X lua_script1:final_run -r ~/project/capture.pcap -q -V > ~/project/analysis_output.txt

В конце, проверьте сохраненный вывод, просмотрев содержимое файла:

cat ~/project/analysis_output.txt

Резюме

В этом практическом занятии вы узнали, как расширять функциональность Wireshark с помощью скриптов на Lua с использованием командной строки. Основные этапы включали загрузку скриптов на Lua с помощью опции -X lua_script:script.lua и их тестирование с использованием командной строки Wireshark.

Кроме того, вы изучили передачу аргументов в скрипты на Lua с помощью -X lua_script1:arg1, показав, как создавать гибкие скрипты, которые принимают внешние параметры. Этот метод повышает эффективность анализа пакетов в Wireshark за счет настраиваемых расширений на Lua.