Повторное внедрение модифицированных пакетов в модуль netfilter

я использовал netfiler_queue создать NFQUEUE модуль для iptables который обрабатывает все исходящие UDP пакеты.

Я хочу изменить все UDP пакеты, которые соответствуют определенному шаблону, и повторно вводят их в сеть.

Вот пример кода:

...

static int Callback( nfq_q_handle *myQueue, struct nfgenmsg *msg, nfq_data *pkt, void *cbData) {
uint32_t id = 0;
nfqnl_msg_packet_hdr *header;

if ((header = nfq_get_msg_packet_hdr(pkt))) {
id = ntohl(header->packet_id);
}

// Get the packet payload
unsigned char *pktData;
int len = nfq_get_payload(pkt, &pktData);

// The following is an example.
// In reality, it involves more parsing of the packet payload.
if (len && pktData[40] == 'X') {
// Modify byte 40
pktData[40] = 'Y';
}

// Pass through the (modified) packet.
return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);
}

...

int main(){

...

struct nfq_handle nfqHandle;
nfq_create_queue(nfqHandle,  0, &Callback, NULL)

...

return 0;
}

Модифицированный пакет не вводится повторно в поток. Как бы я ввел модифицированную версию пакета?

1

Решение

Две вещи. Первый:

return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);

должно быть:

return nfq_set_verdict(myQueue, id, NF_ACCEPT, len, pktData);

Это говорит о том, что вы хотите отправить измененный пакет. (вам может понадобиться литье типов)

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

Контрольная сумма UDP будет жить в байтах 0x1A а также 0x1B вашего пакета, так что это обнулит их:

pktData[0x1a] = 0;
pktData[0x1b] = 0;

и тогда ваш пакет пройдет.

3

Другие решения


По вопросам рекламы [email protected]