Фальсификация ip udp в 2019?

Discussion in 'Песочница' started by Seoul, 16 Nov 2019.

  1. Seoul

    Seoul New Member

    Joined:
    16 Nov 2019
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Вопрос простой. Можно ли до сих пор ставить ложный айпи в заголовках удп пакетов? Пропустит ли их провайдер?
    Мой провайдер - билайн
    Если кто-нибудь позволит с включенным wireshark попробовать это провернуть, то будет вообще замечательно
     
  2. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    287
    Likes Received:
    39
    Reputations:
    24
    Первое что пришло в голову, поставить scapy и зарегать(если нет своего или не хочешь палить) бесплатный vds и запусти там netcat и долби свой vds любыми пакетами.

    send(IP(src="FAKE_IP", dst="127.0.0.1")/UDP(dport=123)/Raw(load="abc")) #Не тестил
     
    #2 tester_new, 24 Nov 2019
    Last edited: 24 Nov 2019
  3. lifescore

    lifescore Elder - Старейшина

    Joined:
    27 Aug 2011
    Messages:
    601
    Likes Received:
    459
    Reputations:
    65
    источ: https://www.ibm.com/support/knowledgecenter/ru/ssw_ibm_i_71/rzaja/rzajal2tpprotocol.htm
    если речь про l2tp билайна
    проверки так каковой может и не быть, негде тестить(
     
  4. vikaig

    vikaig Member

    Joined:
    3 Jul 2019
    Messages:
    52
    Likes Received:
    39
    Reputations:
    0
    Лучше называть это не фальсификацией, а IP-спуфингом или подменой IP-адреса, не когда не слышал чтоб это называли фальсификацией.
    На счет провайдера твоего не знаю, если нет NAT, то вполне вероятно, а с NAT - нет(точнее да, он скорее пропустит, но со своим IP, без спуфа).
    Сделал простую отправку UDP датаграммы чтоб прочекать у себя, можешь тоже проверить:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <linux/ip.h>
    #include <linux/udp.h>
    
    #define PACKET_SIZE 8192
    #define SOURCE_ADDR "1.2.3.4"
    #define SOURCE_PORT 12345
    #define DST_ADDR "1.1.1.1"
    #define DST_PORT 12345
    
    unsigned short csum(unsigned short *buf, int nwords) {
        unsigned long sum;
        for(sum=0; nwords>0; nwords--) {
            sum += *buf++;
        }
        sum = (sum >> 16) + (sum &0xffff);
        sum += (sum >> 16);
    
        return (unsigned short)(~sum);
    }
    
    int main(int argc, char *argv[]) {
        int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
        assert(sock != -1);
    
        const int optval = 1;
        int ret = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(optval));
        assert(ret != -1);
    
        char packet[PACKET_SIZE] = { 0 };
        struct iphdr *ip = (struct iphdr *)packet;
        struct udphdr *udp = (struct udphdr *)(packet + sizeof(*ip));
    
        ip->ihl = 5;
        ip->version = 4;
        ip->tos = 16;
        ip->tot_len  = sizeof(*ip) + sizeof(*udp);
        ip->id = htons(12345);
        ip->ttl = 64;
        ip->protocol = 17;
        ip->saddr = inet_addr(SOURCE_ADDR);
        ip->daddr = inet_addr(DST_ADDR);
    
        udp->source = htons(SOURCE_PORT);
        udp->dest = htons(DST_PORT);
        udp->len = htons(sizeof(*udp));
    
        ip->check = csum((unsigned short *)packet, sizeof(*ip) + sizeof(*udp));
    
        struct sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(DST_PORT);
        sin.sin_addr.s_addr = inet_addr(DST_ADDR);
    
        ret = sendto(sock, packet, ip->tot_len, 0, (struct sockaddr *)&sin, sizeof(sin));
        assert(ret != -1);
    
        close(sock);
    
        printf("Datagram sent to %s:%d, from %s:%d", DST_ADDR, DST_PORT, SOURCE_ADDR, SOURCE_PORT);
    
        return EXIT_SUCCESS;
    }