2017-04-22 26 views
0

我正在写一个教育人在中间应用程序(Linux套接字)。我在苦苦挣扎的是如何重新发送从victim1到victim2的TCP/UDP和ICMP数据包?我的方法似乎不起作用:重新发送所有传入的数据包

unsigned char buffer[BUF_SZ]; 
struct ethhdr *eth_head = (struct ethhdr *)(buffer); 

struct sockaddr_ll sock_adr_resnd = {0}; 
sock_adr_resnd.sll_family = AF_PACKET; 
sock_adr_resnd.sll_ifindex = interface_i; 
sock_adr_resnd.sll_protocol = htons(ETH_P_ALL); 
sock_adr_resnd.sll_halen = MAC_LEN; 
memcpy(sock_adr_resnd.sll_addr, source_mac, MAC_LEN); // my MAC 

if ((sct = socket(AF_PACKET, SOCK_DGRAM, 0)) < 0) { //recieve all 
    perror("Socket open error "); 
    exit (EXIT_FAILURE); 
} 
if (bind(sct, (struct sockaddr *) &sock_adr_resnd, sizeof(sock_adr_resnd)) < 0) { 
    printf("Failed to bind socket \n"); 
} 
int res_len = sizeof(sock_adr_resnd); 
if (recvfrom(sct, buffer, BUF_SZ, 0, (struct sockaddr*)&sock_adr_resnd, (socklen_t *)&res_len) < 0) 
{ 
    process = 0; // nothing accepted 
} 
// change mac address to actual destination 
memcpy(sock_adr.sll_addr, vic_mac1, MAC_LEN); 
memcpy(eth_head->h_source, vic_mac1, MAC_LEN); 

if (process) { 
    if (sendto(sct, buffer, BUF_SZ, 0, (struct sockaddr *)&sock_adr_resnd, sizeof(sock_adr_resnd)) < 0) 
    { 
     close(sct); 
     perror("sendto: "); 
     exit (EXIT_FAILURE); 
    } 
} 

我很困惑的是如何设置套接字。不应该是SOCK_RAW?数据包是否必须根据类型进行不同的处理 - UDP,TCP,ICMP?

+0

这是很容易嗅出它不是试图拦截并重新发送。 – ThingyWotsit

+0

我已经完成了。所以我知道两个受害者的MAC地址和IP地址,缓存中毒,现在我需要重新发送它们之间的所有通信。 – Croolman

回答

0

问题在于最好使用RAW数据包 - 所以你可以得到dest/source IP,并且在接收时也不需要发布关于源接收的任何内容,所以最终的变化是像这样:

  1. 变化SOCK_DGRAMSOCK_RAW
  2. 通创建时它只是缓冲到recvfrom()功能
  3. 国家插槽类型
  4. 你不必绑定

    if ((sct = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { 
        perror("Socket open error "); 
        exit (EXIT_FAILURE); 
    } 
    if (recvfrom(sct, buffer, BUF_SZ, 0, NULL, NULL) < 0) 
    { 
        process = 0; // nothing accepted 
    }