2017-04-22 52 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 
    }