§2.4. Что внутри интернета

Перейдем к анализу сетевого трафика — данных, передаваемых через интернет. Для начала разберемся, как вообще работает интернет.

Пакеты

Для обмена информацией компьютеры отправляют друг другу пакеты. Они очень похожи на почтовые письма — в них есть адрес отправителя, адрес получателя и содержимое. Разница лишь в том, что вместо города, улицы и дома используется IP-адрес — это адрес компьютера в интернете. Обычно он состоит из 4 байт и записывается как четыре десятеричных числа, разделенных точкой, например 193.138.89.12.

Пакеты, передаваемые по сети, ограничены по размеру — обычно они не превосходят полутора килобайт. Но обычно мы передаём гораздо больше данных — например, эта страница весит уже больше. Как же обходить это ограничение?

Пакеты в пакетах

Для решения проблемы размера пакетов существует много подходов, но распространенными стали два. Это протоколы TCP (англ. transmission control protocol — протокол управления передачей) и UDP (англ. user datagram protocol — протокол пользовательских датаграмм).

UDP — достаточно простой протокол. Согласно ему, все данные просто делятся на пакеты и отправляются. Плюсом такого подхода является высокая скорость, однако есть и недостатки: пакеты могут прийти не в том порядке, вообще потеряться или даже задвоиться, и получатель в общем случае не сможет узнать об этом.

TCP устроен сложнее. Здесь обмен данными между отправителем и получателем двусторонний. Перед началом передачи данных устанавливается соединение: отправитель и получатель обмениваются подтверждениями о готовности к передаче данных. В рамках этого соединения отправитель нумерует пакеты по порядку, а получатель присылает подтверждения получения. Таким образом, получатель может переставить пакеты в нужном порядке и сообщить, если какой-то пакет пропал по пути, а отправитель в таком случае может послать утерянные пакеты повторно. Этот протокол обеспечивает надёжность передачи данных, но при этом в нём передаётся больше служебной информации. Как следствие, скорость обмена данными ниже, а задержки — дольше.

UDP часто используют для передачи потоковых данных — например, голосовой связи или видеотрансляций. В остальных случаях применяется TCP, потому что надёжность данных обычно важнее незначительного уменьшения скорости.

Поверх UDP и TCP работают другие протоколы, которые уже используются конечными приложениями — почтовые сервисы, веб-сайты и многое другое. Именно поэтому в них данные не ограничиваются размером пакета. Некоторые протоколы приложений используют как UDP, так и TCP. Один из таких — DNS (англ. domain name system — система доменных имён). Он нужен, чтобы узнавать IP-адреса по доменному имени. Например, так ваш компьютер узнает, что когда вы набираете в адресной строке ugractf.ru, нужно отправить ваш запрос на адрес 193.138.89.12. Протокол 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">
<body>
...

В первой строке версия протокола и код ответа — число и текст. По коду ответа определяется, был ли запрос успешным. Самые известные коды:

Код ответаНазваниеОписание
200OKЗапрос успешен
404Not foundСтраница не найдена
403ForbiddenДоступ запрещен
401UnauthorizedТребуется ввести логин и пароль
302Moved TemporarilyПереадресация
500Internal 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 — сервером.

В пакете 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 килобайта иллюстрации. Другой способ посмотреть все данные в этом соединении — нажать правой кнопкой мыши и выбрать FollowHTTP Stream (или TCP Stream — в нашем случае они покажут одно и то же):

Другой способ посмотреть файл — использовать функцию Export Objects из меню File. Она ищет все файлы в дампе и предлагает сохранить каждый из них. Этих функций уже достаточно, чтобы анализировать достаточно большие дампы трафика.

Безопасность

Сейчас протокол HTTP используется редко. Вместо него используется HTTPS (англ. HTTP Secure — безопасный HTTP) — это зашифрованный HTTP. Он также работает поверх TCP, и обычно использует порт 443.

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

Выводы

  1. В интернете компьютеры обмениваются пакетами. У каждого компьютера есть свой IP-адрес.

  2. Чаще всего используются два протокола: UDP — быстрый, а TCP — надёжный. Каждый из этих протоколов использует порты — один компьютер может иметь много одновременных соединений.

  3. Протокол HTTP предназначен для работы веб-сайтов. Он работает поверх TCP на порту 80.

  4. Для анализа трафика можно использовать программу Wireshark.

  5. Сейчас всё чаще используется HTTPS — шифрованный HTTP.

Задача А. Лучшие снимки ⟶