![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
ДК2009 |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Не могу отправить принятый пакет!
(на приеме обычный код пассивного сниффера)
Дальше читаю служебную информацию из пакетов:
Далее необходимо отправить пакет получателю(его ip находится в поле destination ) Код C
Код компилируется без ошибок.При выполнении программы принимаю пакеты из интерфейса, читаю поля, но при попытке отправить пакет дальше получателю(машина-шлюз через который идет транзитный траффик) в QTCreator'e выводится строка : sendto failed Недопустимый аргумент!!!!!!!!!(подозреваю - buf) Что происходит с буфером buf при приеме пакета и как его отправить дальше что то не совсем понятно...(может в него необходимо добавить новое значение контрольной суммы или что либо наподобие) Чую что многого здесь не понимаю.....
|
||||||||||
|
|||||||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
buf - это весь пакет включая L2, L3, L4 заголовки, в sendto нужно передавать все, что дальше L4 т. е к buf нужно прибавить длину заголовков IP и TCP/UDP это раз во-вторых, если servaddr.sin_addr.s_addr соответствует тому же хосту, на котором работает снифер, то отправка не прокатит, т. к на пакетный сокет приходит _копия_ пакета и велика вероятность, что оригинал уже доставлен аналогично, если включен форвардинг пакетов, в этом случае оригинал уже может быть отправлен хосту адресату -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
1.Так а зачем прибавлять к buf длину заголовков IP и TCP/UDP если buf уже содержит эти все заголовки? что то я не пойму....
Или buf все таки содержит только пользовательские данные а рядом с ним в памяти содержатся заголовки? 2. похоже я там опечатался- servaddr.sin_addr.s_addr поменять на servaddr.sin_addr.d_addr. на этом компе forwarding отключен, пакеты идут на него транзитом с помощью подмены mac адресов путем статистических записей на клиентах и сервере(в arp таблицах).Т.е. я патаюсь сделать что то наподобие функции ip_forwarding только основная цель это вносить изменения в проходящий траффик(весь) !!!!!! Так что думаю оригинал проходить не должен дальше...... Будет ли такая система работать вообще? Спасибо за внимание!!! ![]() |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
про servaddr.sin_addr.d_addr ступил такого члена в данной структуре нет...
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в sendto нужно передавать только пользовательские данные у тебя же buf содержит весь пакет включая L2, L3, L4 поэтому если передать его как есть, то в пакете, который придет к адресату, будет куча "мусора" до фактических данных да -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
svlary |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
НЕ очень понял, как программа выполняется в креаторе, но ладно... По смыслу :
|
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Вот, это уже на правду похоже....
to MAKCim 1. Понятно, получается L2 L3 L4 уровни в sendto достравивает сама система? Что же тогда будет на передаче из сервера если на приеме будут пакеты служебные какие набудь, например ARP ICMP запросы, ответы?(все таки траффик нужно передавать не изменяя) будут ли "проходить" TCP пакеты устанавливающие соединения?(я как понимаю флаги SYN ACK то передаваться не будут.........) 2. Не подскажете что конкретно делает эта строка , а то везеде при описании только сленг используется в материалах: ip = (struct iphdr *)(buf + sizeof(struct ethhdr)); to svlary ■ Почему не сделали bzero(servaddr, sizeof(servaddr)) ? - Учту ■ Этот оператор : servaddr.sin_port=0 вызывает у меня большие сомнения. Что, в самом деле, на том конце кто-то слушает нулевой порт ?! Обычно пишется так : servaddr.sin_port=htons(DEST_PORT); - Как тогда передавать принятые IP,ARP,ICMP пакеты, ведь в них нет полей портов? ■ Может быть Вы перепутали этот параметр с третьим параметром ф-ции создания сокета ? У Вас написано htons(ETH_P_ALL), а по man для socket там должен стоять параметр : " protocol задает конкретный протокол, который используется на сокете. Обычно существует только один протокол, обеспечивающий конкретный тип сокета в заданном наборе протоколов. Однако, возможно существование нескольких таких протоколов -- тогда и используется этот параметр. Номер протокола зависит от используемого “домена коммуникации”, см. protocols(5). См. getprotoent(3), где описано, как сопоставлять имена протоколов их номерам." - т.е. к номеру порта пункта назначения этот параметр отношения не имеет. - в файле /usr/include/linux/if_ether.h прописана переменная ETH_P_ALL, на приеме работает отлично, принимает все пакеты с разбором заголовков всех трех уровней(L2-L4). Пробовал указывать IPPROTO_ICMP и пинговал данную машину - пинг не проходил, все та же ошибка в sendto() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
да вам для передачи также нужно использовать пакетный сокет (а не AF_INET) но в этом случае маршрктизацией вы сами будете заниматься (искать сетевой интерфейс для передачи) ;) Добавлено через 39 секунд получаем адрес ip заголовка -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
svlary |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Похоже, решение Вашей проблемы описано тут : Анализатор пакетов ICMP - своими руками А собака зарыта, похоже, вот здесь :
|
||||
|
|||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
1. На приеме я использую пакетный сокет(PF_PACKET,SOCK_RAW) для доступа к канальному уровню.
2. Далее нужно выделить польз-е данные и заголовки? 3. Потом отправить через этот же сокет поль-е данные но с флагами которые были в принятом пакете на всех уровнях...? В сыром сокете можно установить через setsockopt переменную IP_HDRINCL в 1 и создать свой IP заголовок. Можно ли создать свои заголовки в оставшихся канальном и транспортном уровнях? Вобщем как отправить принятые пакеты именно в первоначальном виде?использовать для каждого уровня свой сокет или все таки можно в моем сокете (sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) вручную набрать все заголовки? |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
только через пакетный сокет
у тебя же уже есть _весь_ пакет в buf изменяешь нужные данные, поправляешь контрольные суммы и передаешь через твой пакетный сокет этот буфер НО фишка в том, что если форвардинг на хосте отключен и адрес получателя в пакете не соответствует ни одному из локальных адресов сетевого интерфейса, через который он был получен, то генерируется ICMP вида "хост недоступен" как я уже говорил, пакетный сокет предствляет собой фильтр, который получает _копии_ пакетов, т. е. оригинал передается дальше по сетевой подсистеме и уже независимо от нас генерируется ICMP преодолеть это можно 2-мя путями 1. блокировать исходящий ICMP через netfilter/iptables 2. использовать цель QUEUE в iptables далее через netlink сокет получать уже оригиналы пакетов, фильтровать их, сопоставлять с копиями, полученными через iptables и через пакетный сокет отправлять дальше с ARP и прочими L3 еще сложнее -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Вообще общая задача для чего эта программа мне понадобилась состоит с следующем:
- в локальной сети несколько компов, один сервер. - необходимо организовать прохождение всего траффика между клиентами только через сервер! - на программном уровне(как я себе представляю) вносить изменения в проходящий траффик(отбросить n-й пакет,исказить содержимое и т.п.) Добавлено через 4 минуты и 13 секунд to MAKCim Понятно, я так и пытался изначально сделать......может из за контрольных сумм ошибка получается..... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
ДК2009,
что мешает сделать сервер дефолтным gateway'ем в локалке и настроить форвардинг через iproute2 на нем? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
пробовал прописать в route gateway default но из материалов узнал что на этот сервер пойдет траффик не предназначенный для локального адресата, да и прописать вроде не полусилось в таблицу маршрутизации, уже не помню почему
По проге: 1.получается что для пакетного сокета не нужно утанавливать никаких опций, подаешь на вход собранный вручную пакет и все. 2.Т.К. я пакет не меняю вообще то и суммы контрольные тоже не меняются, так? 3.на вход sendto нужно подать buf(адрес его начала а функция уже оправит то что содержится в куске длины buf+заголовки,ты кстати это уже писал))) а длину нужно сделать соотв-ю отправляемому пакету, для ICMP получается sendto(sd,buf,sizeof(buf + sizeof(struct ethhdr) + sizeof(struct iphdr)),0,(struct sockaddr *)&servaddr,fromlen)? попробовал, что то не хочет опять.... думал может не правильно пробую тестить......може например послать самому себе пинг а в servaddr в sendto записать сторонний ip?(думаю должен же логически пакет уйти даже если в source destination будут мой ip на входе) короче попробовал struct hostent* hp; servaddr.sin_family=AF_INET; hp = gethostbyname("192.168.1.15"); servaddr.sin_addr = *((struct in_addr *)hp->h_addr); servaddr.sin_port=0; не идет... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в смысле? на каждом клиенте настраиваем таблицу маршрутизации с одним маршрутом - через на сервер дальше настраиваем маршрутизацию на сервере: все пакеты, предназначенные для других клиентов диспетчеризируются клиентам -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
блин.....когда удаляю маршруты те которые есть то добавить один маршрут на шлюз не получается, делаю командой route
пойду еще пытаться..... п.с. если так получится то вообще будет все намного проще и надежнее, но прогу все равно нужно для имитации помех делать.... |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
получилось шлюз прописать все остальные маршруты стереть.
Тут загвоздка в том что на компах по 2 сетевухт, на серевере соответственно тоже.Шлюз прописывается же для компа всего, ели бы для интерфейса то было бы то что нужно.......а так комп будет слать пакеты предназначенные для другой подсети в интерфейс по умолчанию..... |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
что мешает на сервере это обработать: все пакеты на другую сеть форвардить на другую сеть -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
получаю пакет на интерфейс eth0 и далее отправляю его получателю, все 2 компа и сервер в одной подсети.....
так форвард сам в оригинале не нужен так как в этом случае сложно вносить изменения в траффик, а его предполагал я отключить и ввместо него передавать программно но уже с изменениями!
Читал про это, судя по всему более надежный способ, чем прием recfrom() и отправка sendto() как я пытаюсь сделать но не сталкивался с реализацией вообще Добавлено через 9 минут и 17 секунд пробовал снова прописать стат. арп на сервере и клиентах и включить форвард на сервере-вроде бы работает. проверял на пингах. ssh почему то не пашет, SYN,SYN+ACK идут, а обратно ACK клиент с которого по ssh лезу на другого клиента не генерируется вообще.......tcpdump везде использовал..... попадаются еще ICMP redirect пакеты,их шлет сервер клиентам с указанием редиректа самого клиента на себя...фигня какая то, думаю это никак не влияет на процесс...... Добавлено через 10 минут и 22 секунды большое спасибо за помощь, я надеюсь что не сильно утомил?????! ![]() |
||||||
|
|||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
отвечать на форуме в общем то не является обязательным ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
просто мало где по делу люди помогают, еще и так активно
|
|||
|
||||
ДК2009 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Вернулся я снова к коду, уж больно охота сделать задуманное.
1. исходя из такого рода операций
получается что в памяти пакет все таки располагается так:? |__________|____________|________________|_________________| tcphdr iphdr ethhdr buf данные считывать cправа налево.<------------------------------------------- 2. т.е. на вход sendto нужно подать начальный адрес буфера buf и его длину вместе с заголовками?:
или ...... 3. как sendto понимает что ip заголовок уже набран вручную? только через IP_HDRINCL? попробовал так
пишет "протокол недоступен" спасибо |
||||||
|
|||||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
buf -> tcp -> ip -> eth SOCK_RAW?
какой домен? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
ДК2009 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 29.9.2009 Репутация: нет Всего: нет |
Все то же:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |