Понадобилось узнать причину обрывов соединения при обмене данными между сайтом и сервисом, в логах веб сервера ошибок обнаружено не было. В процессе поисков причин наткнулся на данный инструмент.
Данная заметка представляет собой перевод статьи TCPDump Capture HTTP GET/POST requests
TCPDUMP — это швейцарский нож для всех администраторов и разработчиков, когда дело доходит до устранения неполадок. Этот пост написан для людей, которые работают с промежуточными технологиями.
Представьте себя в любом из следующих сценариев:
- Вы хотите отслеживать входящий и исходящий трафик сервера Apache на конкретном порту, 80 или 443.
- Вам нужно отследить HTTP-вызовы между веб-серверами и серверами приложений или, чтобы убедиться, что прокси работает нормально.
- Если вы хотите проверить наличие и значения определенных заголовков, таких как:
X-Forwarded-For
X-Forwarded-Proto
X-Forwarded-Port
X-Forwarded-Host
X-Frame-Options
X-Forwarded-By
ETag - Когда вы хотите просмотреть файлы Сookie в запросе и ответе
- Когда вы хотите просмотреть данные, которые отправляются на сервер в методе POST, например:
Content-type: multipart/form-data;
Content-Type: application/x-www-form-urlencoded
Content-Type: application/json
Content-Type: text/plain - Для отслеживания входящего вызова веб-службы, сделанного с помощью пользовательского интерфейса SOAP или любого клиента веб-службы.
TCPDUMP в основном ошибочно воспринимается как инструмент для сетевых инженеров, и он отображает некоторые непонятные двоичные данные, которые никто из нас не мог понять.
Но имея надлежащие инструменты и небольшие знания о протоколах, любой может легко использовать его и почувствовать волшебство, скрытое внутри.
Имейте в виду, что отраслевые стандарты изменились навсегда, и HTTPS становится основным требованием для всех веб-сервисов и веб-сайтов. Таким образом, это может немного затруднить устранение неполадок, поскольку пакеты зашифрованы. Есть решение для расшифровки HTTPS-трафика в этой статье(англ.)
Цель
В этом посте мы увидим, как администраторы или разработчики программного обеспечения могут использовать tcpdump для устранения неполадок.
Мы собираемся обсудить следующие вопросы, насколько это возможно.
- Как отслеживать/отслеживать вызовы HTTP и HTTPS с помощью tcpdump в weblogic, WebSphere, серверах приложений tomcat и веб-серверах, таких как Apache , которые работают на платформе LINUX
- Как подделывать и читать входящий и исходящий HTTP-трафик для наших приложений, развернутых в weblogic
- Как изучить входящий (или) исходящий HTTP-трафик и взглянуть на конкретные элементы HTTP-протокола, такие как заголовки, файлы cookie, тело запроса по мере их передачи.
- Как перехватить HTTP-трафик, инициированный браузером (или) пользовательским интерфейсом SOAP на сервер приложений, и заглянуть в содержимое, такое как тело запроса , такое как XML, JSON, имя пользователя и пароль и т. д.
- Как контролировать входящее тело запроса веб-службы SOAP (или) запрос XML
- Больше практических примеров использования TCPDUMP для анализа HTTP-трафика
Прежде чем продолжить
Некоторые основы того, как правильно запустить tcpdump на вашем сервере.
Убедитесь, что tcpdump установлен и настроен правильно.
[root@mwiws01 ~]# tcpdump – version
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Используйте правильное имя интерфейса.
Чтобы получить имя интерфейса вашего IP адреса, который нужно будет указывать в команде tcpdump, вы можете выполнить команду
ifconfig
или
ip a
В моем случае IP-адрес моего веб-сервера 192.168.10.10, поэтому я должен выбрать и использовать его имя интерыейса enp0s8
Как только вы нашли имя интерфейса, его необходимо указать к команде:
tcpdump -i enp0s8
Также можно контролировать все доступные интерфейсы:
tcpdump -i any
Примеры TCPDUMP
TCPDUMP выполняет одну и ту же функцию независимо от того, для какой технологии или сервера вы его используете. Другими словами, если вы хотите перехватывать HTTP-вызовы для Apache, в основном вы будете использовать порт 80 или 443.
Если вы хотите захватить трафик weblogic или Websphere или любых других серверов приложений, все, что вам нужно сделать, это изменить номер порта, на котором прослушивается ваш сервер приложений.
Хотя мы привели примеры как для веб-серверов, так и для серверов приложений, все, что вы должны знать, это то, что ничего особенного в технике нет, мы просто меняем номер порта (или) интерфейса. Вот и все.
Как захватить весь входящий HTTP GET трафик или запросы
tcpdump -i enp0s8 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
Объяснение:
tcp[((tcp[12:1] & 0xf0) >> 2):4] сначала определяет местоположение интересующих нас байтов (после заголовка TCP), а затем выбирает 4 байта, с которыми мы хотим сопоставиться.
Чтобы узнать больше о том, как был получен этот синтаксис сегмента. обратитесь по этой ссылке(англ.)
Здесь 0x47455420 значения ASCII символов 'G' 'E' 'T' ' '
Символ->ASCII-код:
G->47 E->45 T->54 пробел->20
Как захватить все входящие запросы HTTP POST
tcpdump -i enp0s8 -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354'
Здесь 0x504F5354 значения ASCII символов 'P' 'O' 'S' 'T'
Как перехватывать только HTTP GET запросы, входящие на порт 80 (Apache/NGINX)
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
Как перехватывать только HTTP POST запросы, входящие на порт 80 (Apache/NGINX)
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354'
Как перехватывать только HTTP GET запросы, входящие на порт 443 (Apache/NGINX)
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 443 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
Как перехватывать только HTTP POST запросы, входящие на порт 443 (Apache/NGINX)
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 443 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354'
Как перехватывать входящие вызовы HTTP GET или POST на порт 80 или 443 (Apache/NGINX), исходящие с хоста 192.168.10.1
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 or tcp dst port 443 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354' and host 192.168.10.1
Как перехватить полную HTTP-передачу, входящих и исходящих GET и POST запросов
Предположим, я получаю запрашиваю страницу, размещенную на веб-сервере с адресом 192.168.10.10, с моей базовой машины с IP-адресом, 192.168.10.1., используя методы GET и POST. Как мы отслеживаем HTTP-запрос и ответ между сервером и клиентом
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F and host 192.168.10.1'
Здесь дополнительно мы используем еще два значения ASCII для захвата исходящих HTML-файлов и HTTP-вызовов. Они следующие.
0x3C21444F представляет значение ASCII '<' 'D' 'O' 'C' для захвата исходящего HTML-файла
0x48545450 представляет значение ASCII 'H' 'T' 'T' 'P' для захвата исходящего HTTP-трафика
На изображении выше можно увидеть, что выходные данные команды tcpdump (справа) показывают данные REQUEST и RESPONSE вместе с HTML-кодом. Вы также можете обнаружить, что он совпадает с подробным выводом CURL.
Как отслеживать все входящие URL-адреса HTTP-запросов (POST или GET)
tcpdump -i enp0s8 -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
Как захватить HTTP-пароли в POST-запросах
tcpdump -i enp0s8 -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
Как получить файлы cookie с сервера и с клиента (запрос и ответ)
tcpdump -i enp0s8 -nn -A -s0 -l | egrep -i 'Set-Cookie|Хост:|Cookie:'
Как фильтровать пользовательские агенты HTTP
Извлечь пользовательский агент HTTP из заголовка HTTP-запроса.
tcpdump -vvAls0 | grep 'User-Agent:'
Как захватить HTTP-пакеты, передаваемые между веб-сервером и сервером приложений, как GET, так и POST?
В случаях, когда вы проверяете HTTP-трафик между веб-сервером и сервером приложений, вы можете использовать tcpdump для диагностики и устранения проблемы. Это будет полезно для многих администраторов промежуточного программного обеспечения.
Таким образом, вы можете убедиться, что плагин прокси-сервера websphere или плагин прокси-сервера weblogic правильно перенаправляет HTTP-вызовы. По сути, вы также можете видеть, на какой управляемый сервер или узел идет вызов и какие данные передаются
Предположим, это ваша среда
- WebServer IP 192.168.10.4
- AppServer IP 192.168.10.6
- AppServer Listen Port 18001
Вы можете запустить следующую команду на сервере приложений, чтобы выполнить ваше требование
tcpdump -i any -s 0 -A 'tcp dst port 18001 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F and host 192.168.10.4'
Примеры, ориентированные на сервер приложений
Настройка контекста: мы используем сервер приложений weblogic для этого поста, но это не ограничивает объем этого поста только weblogic. Как я уже упоминал ранее. Все, что вам нужно изменить, это интерфейс и порт.
Позвольте мне дать некоторый обзор инфраструктуры weblogic, которая использовалась для этого.
- Application Server product Weblogic Server 12c
- Server Listening Port 18001
- Server listen address 192.168.60.4
- Application Full URL http://192.168.60.4:18001/TestWebService
- Application Web Service EndPoint http://192.168.60.4:18001/TestWebService/WS
Как перехватить полную HTTP-передачу с помощью TCPDUMP (GET и POST) на определенном порту
Все примеры, приведенные выше, могут быть использованы для веблогики с небольшим изменением номера порта.
Здесь мы собираемся сделать вызов от клиента 192.168.60.1 к нашему TestWebService приложению, используя методы GET и POST, и захватить данные HTTP-трафика на стороне сервера.
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 18001 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F and host 192.168.60.1'
Прослушивание веб-сервиса SOAP
Как перехватить трафик веб-службы между конечной точкой веб-службы, развернутой в weblogic, и клиентом веб-службы (например, пользовательский интерфейс SOAP)?
Вот конечная точка нашего веб-сервиса
http://192.168.60.4:18001/ТестВебСервис/WS
Здесь у нас есть два метода.
- Hello — просто поздороваться с именем, которое передается в запросе.
- GetSimilarWord — для получения строки от пользователя, поиска в интернете подходящего слова и возврата массива JSON.
Давайте вызовем методы в пользовательском интерфейсе SOAP и посмотрим, что мы увидим в tcpdump на стороне сервера.
Вы можете видеть ответ SOAP XML от сервера, возвращаемый пользовательскому интерфейсу SOAP.
Для тех, кто не знаком с SOAP UI. Используйте Postman, как показано ниже.
До сих пор мы обсуждали различные варианты использования и примеры TCPDUMP. Но я уверен, что может быть много требований и примеров, которые я мог пропустить в этом посте.
Вместо использования команды tcpdump именно для выполнения/захвата запроса (или) ответа.
Вы также можете записать сеанс tcpdump (сделать дамп tcpdump) и проанализировать. На самом деле, это более надежно и просто, чем пытаться написать команду с сопоставлением кода ASCII.
Как записать сеанс TCPDUMP (или) захватить пакеты с помощью tcpdump
Чтобы записать сеанс tcpdump, вы можете использовать следующую команду
Примечание*: здесь я использовал any в качестве интерфейса для захвата всех пакетов по всем каналам/интерфейсам, доступным на моем сервере.
tcpdump -i any -s 0 -X -w /tmp/tcpdump.pcap
pcap является широко распространенным расширением для вывода tcpdump.
Как прочитать записанный TCPDUMP сеанс или захваченные пакеты из файла pcap
tcpdump -A -r /tmp/tcpdump.pcap
Вы сможете прочитать записанный сеанс, и он предложит больше информации, чем команды сопоставления ASCII.
Вы также можете использовать такие команды, как less для лучшей читаемости и поиска.
tcpdump -A -r /tmp/tcpdump.pcap|less
Wireshark
На рынке есть замечательный инструмент Sniffing (анализатор сетевых пакетов) под названием Wireshark. Вы можете просто импортировать pcap файл и обработать вывод tcpdump, как никогда раньше.
Вы будете просто поражены деталями и возможностями, которые предоставляет Wireshark.
Взгляните на этот пример, в котором показана подробная информация и XML-ответ, отправленный клиенту.