У меня есть сервер, доступный из сети Интеренет.
Я крафчу пакетики с помощью scapy и отправляю их на этот сервер.
Отслеживаю с помощью Wireshark пришедшие пакеты и вижу, что все данные в них правильные за исключением номера порта источника. Например, я указываю порт источника 21, а в пришедших пакетах он 65025.
Однако, если я подключаю MacBook (с которого отправляю пакеты) к той же самой домашней сети, к которой подключен сервер, то пакеты приходят с верным номером порта.
Так же пробовал использовать socket python и через sock.bind(('', 21)) указывать нужный порт, но ситуация аналогичная.
https://ru.wikipedia.org/wiki/NAT
Маршрутизатор, через который проходит трафик, подменяет IP и порт отправителя.
Это сделано для того, чтобы пришедший ответ от сервера попал на правильное устройство, которое спрятано за маршрутизатором.
Я думал, что все дело в NAT, который подменяет как раз таки и IP и порт.
Но в настройках роутера можно только полностью отключить NAT, что логично приводит к потере доступа к Интернету.
Понял, спасибо. Даже если как-то и удастся изменить правила NAT на определенном маршрутизаторе - это не мой выход. Мне нужно чтобы я мог отправлять эти пакеты из различных мест.
Единственный вопрос, буду благодарен если подскажите куда копать:
А какие еще поля в TCP можно изменять, чтобы пакет не выделялся на фоне остального трафика? Sequence Number я уже использую Destination port тоже не вариант, так как он содержит необходимые данные
Docik99, чтобы порт не менялся, нужно подключиться к интернету мимо роутера и иметь внешний IP (можно динамический). Иначе роутер в любом случае будет подменять IP на свой, а локальный порт транслировать по таблице conntrack из определённого диапазона (это необходимо, так как одинаковый порт может встретиться у разных клиентов данного маршрутизатора).
Для чего всё это затевается? Даже при внешнем IP локальный порт автоматически выбирается из портов 1024+ или даже 50000+. Наоборот, исходящий пакет от 21 порта будет подозрительно выглядеть.
Например есть сайт, на который заходят пользователи, генерят тем самым трафик и TCP пакетики. Нужно отправлять на этот сайт свои пакеты, в которых будет "закладка", но такая чтобы при анализе общего трафика не было заметно, что она именно в этих пакетах.
Даже при внешнем IP локальный порт автоматически выбирается из портов 1024+ или даже 50000+. Наоборот, исходящий пакет от 21 порта будет подозрительно выглядеть.
В этом и была идея, что например порт 45612 будет обозначать букву "А", а порт 13726 букву "Б" и так далее
shurshur, есть у меня подозрение, что автор пилит бота для своего ботнета для DDoS'а, а определенные порты в источнике нужны чтобы закосить под какое-то безобидное приложение (в нашем случает под FTP сервер)
Inviz Custos, ну все, вскрываюсь. Но на самом деле все довольно прозаичней. Мне нужно как-то скрыто передать информацию через интернет, при этом спрятав ее в TCP. И это всего лишь для реферата по компьютерным сетям.
Docik99, а чтобы еще больше извратиться - можете ксорить данные другими значениями из заголовка (например тем же DO), выйдет что-то типа шифрования данных. Тут все ограничено лишь вашей фантазией.
Docik99, только учтите, что Options используется также и сетевым оборудованием для "расширения" возможностей TCP (что-то типа метаданных с дополнительной информацией). Эти условные "метаданные" имеют общую структуру:
Type [1 байт] - тип "метаданных"
Size [1 байт] - размер "метаданных"
Payload [(Size - 2) байт] - полезная нагрузка.
Вам важно сохранить оригинальные данные и в их конец дописать свою полезную нагрузку, получится что-то типа оверлея. В теории этот оверлей должен игнорироваться сетевым оборудованием, но все это надо проверять на практике. Также надо почитать спеки по этим "метаданным" (всего их 35 типов) и посмотреть какие из них точно не модифицируются в процессе передачи.
Docik99, и кто потом из мешанины обращений к портам будет дешифровывать сообщение? К тому же получателю самому надо знать ту же информацию по портам, что и отправителю. А если задержки/потери по дороге?