WinPCap - генерация пакетов

Тема в разделе "WASM.NETWORKS", создана пользователем AlwaysAlone, 28 июн 2011.

  1. AlwaysAlone

    AlwaysAlone New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2011
    Сообщения:
    20
    Поскажите, возможно ли блокировать запрос браузера путем моментального скармливания ему фальшивого ответа "как бы от сервера" с помощью WinPCap? Насколько это надежно?

    Вообще мне нужно не пропускать пакеты, содержащие GET-запросу к неугодным сайтам. Но, поскольку WinPCap не позволяет "проглатывать" пакеты с этими запросами, а написание TDI фильтра для меня скорее всего растянется на несколько месяцев (бесплатных готовых фильтрующих библиотек я не смог найти), появилась идея просто возвратить браузеру HTTP 200 OK с текстом "Доступ запрещен", как только мое приложение ловит исходящий GET-запрос. Благо WinPcap позволяет генерировать "сырые" пакеты и инжектировать из в ядро.

    Опыт в программировании сетей у меня не большой. Какие проблемы могут возникнуть с таким вот подходом?
    Спасибо
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Если нужен запрет по именам - вбиваешь в файл hosts эти имена и несуществующий IP, типа 127.0.0.2
    Или подними сервер простенький по этому адресу у себя и отвечай то, что тебе нужно.
     
  3. Honorary_BoT

    Honorary_BoT New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    87
    С каких пор? Он только перехватывает пакеты копированием, да и то не все...
     
  4. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    по-моему, тебе подходит только инжект длл и установка хуков на send/recv; а лучшее срадство - pf на шлюзе.
     
  5. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    The purpose of WinPcap is to give this kind of access to Win32 applications; it provides facilities to:
    capture raw packets, both the ones destined to the machine where it's running and the ones exchanged by other hosts (on shared media)
    filter the packets according to user-specified rules before dispatching them to the application
    transmit raw packets to the network
    gather statistical information on the network traffic

    если я не ошибаюсь, winpcap совмещает обе юниксовые libpcap и libnet
     
  6. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    позвольте, вот вам арп сканер на winpcap (писал для своих нужд) но чтоб не пылился - выкладываю.

    http://www.sendspace.com/file/x9vuhd

    Код (Text):
    1. /////////////////////////////////////////////////////////////////////////
    2. // Module: main.cpp
    3. // Purpose: General issues
    4. // Project: SubnetStealth v 0.1a
    5. // Author: sn0w
    6. //////////////////////////////////////////////////////////////////////////
    7.  
    8. #include <winsock2.h>
    9. #include <process.h>
    10. #include <stdio.h>
    11. #include <conio.h>
    12.  
    13. #include "pcap.h"
    14. #include "headers.h"
    15. #include "misc.h"
    16. #include "opmode.h"
    17. #include "hostlist.h"
    18. #include "scan.h"
    19.  
    20. ULONG   g_nRealIPv4, g_nFakeIPv4;
    21. ULONG   g_nRealNetmask;
    22.  
    23. char    STEALTH_MAC[6];
    24.  
    25. //////////////////////////////////////////////////////////////////////////
    26. // Function: NPF_thread
    27. // Purpose: Low level traffic dispatching due to selected operation
    28. //////////////////////////////////////////////////////////////////////////
    29. void __cdecl NPF_thread(void *param)
    30. {
    31.     int rc;
    32.     pcap_pkthdr *header;
    33.     u_char *packet;
    34.     ULONG current_op;
    35.  
    36.     pcap_t* cap_if = (pcap_t*)param;
    37.  
    38.     while((rc = pcap_next_ex(cap_if, &header, (const u_char**)&packet)) >= 0)
    39.     {
    40.         if(rc == 0) continue; // timeout
    41.  
    42.         current_op = QUERY_NPF_OPERATION();
    43.  
    44.         if(current_op == OP_IDLE)
    45.         {
    46.             continue;
    47.         }
    48.  
    49.         if(current_op & OP_END_TASK)
    50.         {
    51.             break;
    52.         }
    53.  
    54.         if(current_op & OP_PARSE_ARP_RESPONSE)
    55.         {
    56.             ProcessARPReply((pether_packet_arp) packet);
    57.         }
    58.  
    59.         if(current_op & OP_PRINT_SOME_IDLE)
    60.         {
    61.             PrintTCPPacketIdle((pether_packet_tcpip) packet);
    62.         }
    63.    
    64.     }
    65.  
    66.     if(rc == -1)
    67.     {
    68.         printf("\t[-] Error reading the packets: %s\n", pcap_geterr(cap_if));
    69.     }
    70.  
    71.     pcap_close(cap_if);
    72.     printf("\n\n\t<NPF session is terminated>\n");
    73. }
    74.  
    75. //////////////////////////////////////////////////////////////////////////
    76. // Function: select_iface()
    77. // Purpose: Provides ethernet adapter selection through console interface
    78. //////////////////////////////////////////////////////////////////////////
    79. pcap_t* select_iface()
    80. {
    81.     char errbuf[PCAP_ERRBUF_SIZE+1];
    82.  
    83.     pcap_addr_t *a;
    84.     pcap_if_t *alldevs, *current_if;
    85.  
    86.     pcap_t *fp = NULL;
    87.  
    88.     int idx = 0 , nsel;
    89.  
    90.     if(pcap_findalldevs(&alldevs, errbuf) == -1)
    91.     {
    92.         printf("\t[-] Error in pcap_findalldevs: %s\n", errbuf);
    93.         return NULL;
    94.     }
    95.  
    96.     for(current_if = alldevs; current_if != NULL; current_if = current_if->next)
    97.     {
    98.         printf("\t [%d] %s\n", ++idx, current_if->description);
    99.  
    100.         for(a = current_if->addresses; a != NULL; a = a->next)
    101.             if(a->addr->sa_family == AF_INET)
    102.             {
    103.                 if (a->addr)
    104.                     printf("\t\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
    105.                 if (a->netmask)
    106.                     printf("\t\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
    107.             }
    108.  
    109.             printf("\n");
    110.     }
    111.  
    112.     printf("\n\tSelect the adapter to use:\n\t> ");
    113.     scanf("%d", &nsel);
    114.     printf("\n");
    115.  
    116.     if(!nsel || nsel > idx)
    117.     {
    118.         printf("\t[-] Invalid adapter id selected\n");
    119.         goto endsub;
    120.     }
    121.  
    122.     for(current_if = alldevs, idx = 1; nsel != idx ; current_if = current_if->next, idx++);
    123.  
    124.     for(a = current_if->addresses; a != NULL; a = a->next)
    125.         if(a->addr->sa_family == AF_INET)
    126.         {
    127.             if (a->addr)
    128.             {
    129.                 memcpy(&g_nFakeIPv4,  &((struct sockaddr_in *)a->addr)->sin_addr.s_addr, 4);
    130.                 g_nRealIPv4 = g_nFakeIPv4;
    131.             }
    132.             if (a->netmask)
    133.                 memcpy(&g_nRealNetmask,  &((struct sockaddr_in *)a->netmask)->sin_addr.s_addr, 4);
    134.         }
    135.  
    136.         if((fp = pcap_open_live(current_if->name, 0xffff, TRUE, 10, errbuf)) != NULL)
    137.         {
    138.             if(pcap_datalink(fp) != DLT_EN10MB)
    139.             {
    140.                 printf("\t[-] Only ethernet networks are supported.\n");
    141.                 pcap_close(fp);
    142.                 fp = NULL;
    143.             }
    144.  
    145.         }
    146.         else
    147.         {
    148.             printf("\t[-] Error opening adapter.\n");
    149.         }
    150.  
    151. endsub:
    152.         pcap_freealldevs(alldevs);
    153.         return fp;
    154. }
    155.  
    156. //////////////////////////////////////////////////////////////////////////
    157. // Function: main()
    158. // Purpose: Entry point, flow control
    159. //////////////////////////////////////////////////////////////////////////
    160. int main()
    161. {
    162.     pcap_t* cap_if;
    163.  
    164.     printf("\n\t--------------------------------------\n");
    165.     printf("\tSubnetStealth Scanner ver 0.1a by sn0w\n");
    166.     printf("\t--------------------------------------\n\n");
    167.  
    168.    
    169.     //
    170.     // Phase0 initialization
    171.     //
    172.     if((cap_if = select_iface()) == NULL)
    173.     {
    174.         printf("\t[-] Initialization failed\n");
    175.         return -1;
    176.     }
    177.  
    178.     printf("\t[+] Preparing...\n");
    179.  
    180.     //
    181.     // Phase1 initialization
    182.     //
    183.     HostListInitialize();
    184.     RandomMAC();
    185.     OP_INIT();
    186.    
    187.     _beginthread(NPF_thread, 0, (void*)cap_if);
    188.    
    189.     printf("\t[+] General initialization completed\n");
    190.  
    191.     //
    192.     // Scan setup
    193.     //
    194.     char spoof_input_ip[64];
    195.  
    196.     printf("\n\t    NOTE: due to stealth mode, your MAC should be spoofed.\n");
    197.     printf("\t          But also you should specify the stealth IP address,\n");
    198.     printf("\t          from which the TCP SYN scan will be performed.\n");
    199.     printf("\t          I recommend the address that is known that is dead.\n\n");
    200.     printf("\t WARNING: SETTING A STEALTH IP THE SAME AS YOUR GATEWAY\n");
    201.     printf("\t          WILL CAUSE A PERMANENT DDOS FOR ENTIRE SUBNET!\n\n");
    202.  
    203.    
    204.     printf("\t    Current stealth MAC: %s\n", mactos((LPBYTE)STEALTH_MAC));
    205.     printf("\t    Current IP: %s/%d (%d hosts)\n", iptos(g_nFakeIPv4), NetGetCIDRValue(g_nRealNetmask),
    206.                                                     NetNumHosts(g_nFakeIPv4, g_nRealNetmask));
    207.    
    208.     printf("\n\t    Enter a stealth IP: ");
    209.  
    210.     scanf("%64s", spoof_input_ip);
    211.    
    212.     g_nFakeIPv4 = inet_addr(spoof_input_ip);
    213.  
    214.     if(g_nFakeIPv4 == INADDR_NONE)
    215.     {
    216.         printf("\n\n\t[-] The address you have entered is not valid!");
    217.  
    218.         SET_NPF_OPERATION(OP_END_TASK);
    219.         getch();
    220.        
    221.         return -2;
    222.     }
    223.  
    224.     printf("\n\n\t[+] Performing hardware scan...\n");
    225.    
    226.  
    227.     // ARP SCAN BLOCK
    228.     SET_NPF_OPERATION(OP_PARSE_ARP_RESPONSE);
    229.  
    230.     QueryHardwareSubnet(cap_if,
    231.             htonl(NetFirstHost(g_nRealIPv4, g_nRealNetmask)),
    232.             htonl(NetLastHost(g_nRealIPv4, g_nRealNetmask)),
    233.             g_nFakeIPv4,
    234.             2,
    235.             500);
    236.    
    237.     Sleep(250);
    238.     FLUSH_NPF_OPERATION();
    239.     // END OF SCAN BLOCK
    240.  
    241.     ParseHWScanResults();
    242.     HostListClear();
    243.  
    244.     printf("\t[+] Hardware scan completed\n");
    245.        
    246.  
    247.     while(!kbhit())
    248.     {
    249.        
    250.     }
    251.  
    252.     return 0;
    253. }
     
  7. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Как бы можно, дело в том, что WinPCap слушает пакеты, но не имеет возможность изменить или заблокировать их. С другой стороны, да вы можете создать свой собственный пакет. И получается половина работы. Ведь запрос в нет ушел, а раз ушел, то значит на запрос, который послал браузер в нет придет еще ответ от реального сервера, который требуется заблокировать.
    Таким образом резюмируя, вам потребуется еще и фильтр траффика. Думаю это нужно сажать на Tcp стек. Теоретически. Простейший фильтр хуком, винда предоставляет, но только одному клиенту. Т.е. если кто-то уже юзает его вам придется фильтрить на тсп. А раз так, то получается уж лучше сразу делать фильтр трафика изначально и не заморачиваться с WinPCap. Потому что по факту вам нужен функционал фаервола. Могу предложить следующее решение, устанавливаете какой-нибудь фаервол и запрещаете ходить на на определенный сайт. Но запрос winpcap все равно будет видеть, тут уж формируете ответ на этот запрос и отсылаете его браузеру.