<< 2.2 И снова файлы |
2.3 Что внутри интернета |
3. Криптография >> |
Перейдем к анализу сетевого трафика — данных, передаваемых через интернет. Для начала разберемся, как вообще работает интернет.
Пакеты
Для обмена информацией компьютеры отправляют друг другу пакеты. Они очень похожи на почтовые письма — в них есть адрес отправителя, адрес получателя и содержимое. Разница лишь в том, что вместо города, улицы и дома используется IP-адрес — это адрес компьютера в интернете. Обычно он состоит из 4 байт и записывается как четыре десятеричных числа, разделенных точкой, например 185.26.122.52.
Пакеты, передаваемые по сети, ограничены по размеру — обычно они не превосходят полутора килобайт. Но обычно мы передаём гораздо больше данных — например, эта страница весит уже больше. Как же обходить это ограничение?
Пакеты в пакетах
Все существующие протоколы разбиты на семь уровней, такое разбиение называется стеком OSI.
Для решения проблемы размера пакетов существует много подходов, но распространенными стали два. Это протоколы TCP (англ. transmission control protocol — протокол управления передачей) и UDP (англ. user datagram protocol — протокол пользовательских датаграмм).
UDP — достаточно простой протокол. Согласно ему, все данные просто делятся на пакеты и отправляются. Плюсом такого подхода является высокая скорость, однако есть и недостатки: пакеты могут прийти не в том порядке, вообще потеряться или даже задвоиться, и получатель в общем случае не сможет узнать об этом.
TCP устроен сложнее. Здесь обмен данными между отправителем и получателем двусторонний. Перед началом передачи данных устанавливается соединение: отправитель и получатель обмениваются подтверждениями о готовности к передаче данных. В рамках этого соединения отправитель нумерует пакеты по порядку, а получатель присылает подтверждения получения. Таким образом, получатель может переставить пакеты в нужном порядке и сообщить, если какой-то пакет пропал по пути, а отправитель в таком случае может послать утерянные пакеты повторно. Этот протокол обеспечивает надёжность передачи данных, но при этом в нём передаётся больше служебной информации. Как следствие, скорость обмена данными ниже, а задержки — дольше.
UDP часто используют для передачи потоковых данных — например, голосовой связи или видеотрансляций. В остальных случаях применяется TCP, потому что надёжность данных обычно важнее незначительного уменьшения скорости.
Поверх UDP и TCP работают другие протоколы, которые уже используются конечными приложениями — почтовые сервисы, веб-сайты и многое другое. Именно поэтому в них данные не ограничиваются размером пакета. Некоторые протоколы приложений используют как UDP, так и TCP. Один из таких — DNS (англ. domain name system — система доменных имён). Он нужен, чтобы узнавать IP-адреса по доменному имени. Например, так ваш компьютер узнает, что когда вы набираете в адресной строке baikalctf.ru, нужно отправить ваш запрос на адрес 185.26.122.52. Протокол DNS использует UDP для одиночных запросов (таких, как запрос IP-адреса по доменному имени) и TCP для передачи большого количества данных (например, при синхронизации двух DNS-серверов).
На одном компьютере может работать одновременно много приложений, использующих сеть. Чтобы различать, какому приложению какой пакет предназначен, придуманы порты. Порт — это число от 1 до 65535. В протоколе TCP свои порты, в UDP — свои. Соответственно, у отправителя и получателя, кроме IP-адресов, есть порты. Если в нашей аналогии IP-адресу соответствовал адрес дома, то порт — это аналог номера квартиры в доме. Обычно IP-адрес и порт пишут вместе и разделяют двоеточием: 192.168.42.14:27015. У многих протоколов приложений есть стандартные номера портов, которые используются по умолчанию — на Linux и Mac OS список таких стандартных портов находится в файле /etc/services.
HTTP
Мы поподробнее разберём протокол HTTP (Hypertext Transfer Protocol) — с его помощью работают веб-сайты. Мы рассмотрим версию HTTP/1.1, которую использует большинство веб-серверов на сегодняшний день. Он работает поверх TCP и обычно использует порт 80. В нём пакетами обмениваются клиент и сервер. Клиент создаёт соединение и отправляет запросы. Обычно в качестве клиента выступает веб-браузер на вашем компьютере. Сервер ожидает запрос, обрабатывает его и отправляет ответ клиенту.
Давайте посмотрим на пример запроса и ответа. Начнём с запроса:
GET /forensics/network.html HTTP/1.1
Accept: text/html;q=1
Accept-Language: ru-RU;q=0.5
Host: course.ugractf.ru
Referer: https://course.ugractf.ru/forensics/
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Структура очень проста — в первой строке тип запроса (GET), адрес страницы (/forensics/network.html) и версия протокола (HTTP/1.1). Среди типов запроса вам чаще всего встретятся два: запрос типа GET происходит, когда вы переходите по ссылке или вводите адрес в адресной строке браузера, а POST — когда вы заполняете какую-либо форму, например авторизуетесь на сайте или отправляете сообщение.
Затем идут заголовки в формате название: значение.
Разберём самые известные:
| Название | Предназначение |
|---|---|
| Host | Домен из адресной строки |
| User-Agent | Браузер пользователя |
| Referer | Откуда пришёл пользователь |
Ответ не сильно сложнее:
HTTP/1.1 200 OK
Content-Length: 1234
Content-Type: text/html
Date: Thu, 16 Apr 2020 13:37:00 GMT
Server: nginx
<!DOCTYPE html>
<html lang="ru">
<title>
§2.4. Что внутри интернета
⋅ Форензика
— ИТиИБ
</title>
<meta charset="utf-8">
<link rel="stylesheet" href="/static/book.css?template=generic">
<body>
...
В первой строке версия протокола и код ответа — число и текст. По коду ответа определяется, был ли запрос успешным. Самые известные коды:
| Код ответа | Название | Описание |
|---|---|---|
| 200 | OK | Запрос успешен |
| 404 | Not found | Страница не найдена |
| 403 | Forbidden | Доступ запрещен |
| 401 | Unauthorized | Требуется ввести логин и пароль |
| 302 | Moved Temporarily | Переадресация |
| 500 | Internal Server Error | Ошибка сервера |
После этого идут заголовки ответа — в них можно увидеть длину ответа, дату изменения и его тип. В данном случае тип — text/html, что означает HTML-страницу (Hypertext Markup Language) — это стандарт для описания веб-страниц.
Бывают и другие заголовки. Например, вместе с кодом 302 приходит заголовок Location — он сообщает браузеру, на какую страницу нужно перейти.
Сразу после заголовков идёт содержимое: в данном случае это страница нашего курса. Вместо неё может быть другая страница, изображение, видео или любые другие данные.
Анализ трафика
Часто в реальной жизни преступников вычисляют по камерам видеонаблюдения. Чтобы найти злоумышленников в интернете, используют дампы трафика — запись всех сетевых пакетов, прошедших через какой-либо компьютер или роутер. Обычно такие дампы сохраняются в файлы формата pcap (англ. packet capture — захват трафика). Для просмотра таких файлов применяется программа Wireshark.
Давайте возьмём первый дамп, скачаем его и откроем в Wireshark. Перед нами появилось какое-то число TCP-пакетов. Мы видим, что между собой общаются 172.31.33.79 и 172.31.33.71. При этом на хосте 172.31.33.71 используется порт 80, что означает, что скорее всего данные передаются по HTTP, 172.31.33.79 явлется клиентом, а 172.31.33.71 — сервером.
Wireshark автоматически обнаружил, что используемый протокол — HTTP, и пометил пакеты с данными в столбце Protocol.
В пакете 4 мы видим запрос — если выбрать его и открыть блок Hypertext Transfer Protocol, то Wireshark покажет заголовки запроса. Сравните их с теми, что были выше. Сможете ли вы определить, какой адрес был набран в адресной строке браузера?
Wireshark также показывает, что ответ на запрос находится в пакете 6 — выбрав его, мы увидим заголовки, а под ними — в блоке Line-based text data: text/html — содержимое страницы. Таким образом, в браузере пользователь увидел сообщение Hello, world!.
Для анализа более сложных дампов нам понадобится узнать ещё пару функций. Рассмотрим более сложный дамп. В нём общаются те же самые компьютеры, но сайт уже другой. Это и видно — заголовок Host в запросах изменился.
Давайте попробуем в этом дампе найти картинку ink.svg. Для начала попробуем отфильтровать лишние служебные пакеты TCP — в строке фильтра введём http

Пролистав все пакеты, мы видим запрос искомой картинки в пакете 614 и ответ в пакете 719. Обратите внимание, что запрос и соответствующий ответ не всегда идут подряд: например, на запрос файла inter.css в пакете 157 ответ приходит в пакете 184. Соответствие можно увидеть либо с помощью стрелок в левом столбце, либо в разделе Hypertext Transfer Protocol в поле Response in frame.
Вернёмся к нашей картинке. Как мы видим, пакет 719 содержит всего 446 байт — и от картинки там только часть. Но где же вся картинка? Мы помним, что TCP поддерживает соединения, в которых может быть много соединенных друг с другом пакетов. Wireshark может их склеить самостоятельно и показать: для этого нужно перейти на вкладку Reassembled TCP в самом низу окна. Там мы видим полный ответ и все 102 килобайта иллюстрации. Другой способ посмотреть все данные в этом соединении — нажать правой кнопкой мыши и выбрать Follow → HTTP Stream (или TCP Stream — в нашем случае они покажут одно и то же):
Можно заметить, что одно и то же соединение используется для нескольких запросов и ответов.
Другой способ посмотреть файл — использовать функцию Export Objects из меню File. Она ищет все файлы в дампе и предлагает сохранить каждый из них. Этих функций уже достаточно, чтобы анализировать достаточно большие дампы трафика.
Безопасность
Сейчас протокол HTTP используется редко. Вместо него используется HTTPS (англ. HTTP Secure — безопасный HTTP) — это зашифрованный HTTP. Он также работает поверх TCP, и обычно использует порт 443. Такой ключ называется сессионным.
HTTPS-трафик гораздо сложнее анализировать: для каждого подключения используется свой ключ шифрования. Без знания этих ключей невозможно получить практически никакую информацию о том, какие данные были переданы.
Что скачал этот пользователь? download.pcap
Наш сайт взломали! Кто виноват и что делать? attack.pcap
Выводы
-
В интернете компьютеры обмениваются пакетами. У каждого компьютера есть свой IP-адрес.
-
Чаще всего используются два протокола: UDP — быстрый, а TCP — надёжный. Каждый из этих протоколов использует порты — один компьютер может иметь много одновременных соединений.
-
Протокол HTTP предназначен для работы веб-сайтов. Он работает поверх TCP на порту 80.
-
Для анализа трафика можно использовать программу Wireshark.
-
Сейчас всё чаще используется HTTPS — шифрованный HTTP.