NS2 Wormhole Attack – Wormhole attack is also a network layer attack that can also affect the network even without the knowledge of cryptographic techniques implemented.
What is wormhole-attack?
- In most commonly type of two ended worm-hole, one end tunnels the packets via wormhole link and also the other end, on receiving packets, replays them also to the local area.
Types of Ns-2 worm-hole attack:
- Wormhole also using packet encapsulation.
- In Wormhole using Out-of-Band Channel.
- Wormhole also using protocol deviation.
- Also, Wormhole using high power relay.
Models present in worm-hole attack:
- Hidden model.
- Packet replay.
- Also in Packet encapsulation.
- Participation model
- Out of band.
- High power transmission.
Different Models Present also in Wormhole Attacks.
Sample code for Ns-2-Wormhole-attack.
#include <errmodel.h> #include <mac.h> #include <ll.h> #include <address.h> #include <dsr/hdr_sr.h> #define TRACE_DROP 0 int hdr_ll::offset_; static class LLHeaderClass : public PacketHeaderClass { public: LLHeaderClass() : PacketHeaderClass("PacketHeader/LL", sizeof(hdr_ll)) { bind_offset(&hdr_ll::offset_); } } class_hdr_ll; static class LLClass : public TclClass { public: LLClass() : TclClass("LL") {} TclObject* create(int, const char*const*) { return (new LL); } } class_ll; LL::LL() : LinkDelay(), seqno_(0), ackno_(0), macDA_(0), ifq_(0), mac_(0), lanrouter_(0), arptable_(0), varp_(0), downtarget_(0), uptarget_(0), drop_on_send(0), drop_on_recv(0), routing_packet_count(0), routing_byte_count(0), data_packet_count(0), data_byte_count(0) { bind("macDA_", &macDA_); wormhole_head.ll = NULL; wormhole_head.id = -1; wormhole_head.next = NULL; } int LL::command(int argc, const char*const* argv) { Tcl& tcl = Tcl::instance(); if (argc == 3) { if (strcmp(argv[1], "ifq") == 0) { ifq_ = (Queue*) TclObject::lookup(argv[2]); return (TCL_OK); } if(strcmp(argv[1], "arptable") == 0) { arptable_ = (ARPTable*)TclObject::lookup(argv[2]); assert(arptable_); return TCL_OK; } if(strcmp(argv[1], "varp") == 0) { varp_ = (VARPTable*)TclObject::lookup(argv[2]); assert(varp_); return TCL_OK; } if (strcmp(argv[1], "mac") == 0) { mac_ = (Mac*) TclObject::lookup(argv[2]); assert(mac_); return (TCL_OK); } if (strcmp(argv[1], "down-target") == 0) { downtarget_ = (NsObject*) TclObject::lookup(argv[2]); return (TCL_OK); } if (strcmp(argv[1], "up-target") == 0) { uptarget_ = (NsObject*) TclObject::lookup(argv[2]); return (TCL_OK); } if (strcmp(argv[1], "lanrouter") == 0) { lanrouter_ = (LanRouter*) TclObject::lookup(argv[2]); return (TCL_OK); } else if( strcmp( argv[1], "wormhole-peer" ) == 0 ) { wormhole_peer* wp = (wormhole_peer*) malloc( sizeof( wormhole_peer ) ); if( !wp ) { fprintf( stderr, "(%03d) - LL::command - error allocating memory for new wormhole peer!" ); exit(-1); } wp->ll = (LL *) TclObject::lookup( argv[2] ); wp->id = wp->ll->mac_->addr(); wp->next = wormhole_head.next; wormhole_head.next = wp; printf( "(%03d) - LL::command - added %d to wormhole peer list\n", mac_->addr(), wp->id ); return TCL_OK; } } else if (argc == 2) { if (strcmp(argv[1], "ifq") == 0) { tcl.resultf("%s", ifq_->name()); return (TCL_OK); } if (strcmp(argv[1], "mac") == 0) { tcl.resultf("%s", mac_->name()); return (TCL_OK); } if (strcmp(argv[1], "down-target") == 0) { tcl.resultf("%s", downtarget_->name()); return (TCL_OK); } if (strcmp(argv[1], "up-target") == 0) { tcl.resultf("%s", uptarget_->name()); return (TCL_OK); } if (strcmp(argv[1], "drop-on-send") == 0 ) { drop_on_send = 1; return TCL_OK; } if (strcmp(argv[1], "drop-on-recv") == 0 ) { drop_on_recv = 1; return TCL_OK; } if (strcmp(argv[1], "routing_packet_count") == 0) { tcl.resultf("%d", routing_packet_count ); return (TCL_OK); } if (strcmp(argv[1], "routing_byte_count") == 0) { tcl.resultf("%d", routing_byte_count ); return (TCL_OK); } if (strcmp(argv[1], "data_packet_count") == 0) { tcl.resultf("%d", data_packet_count ); return (TCL_OK); } if (strcmp(argv[1], "data_byte_count") == 0) { tcl.resultf("%d", data_byte_count); return (TCL_OK); } } return LinkDelay::command(argc, argv); } void LL::recv(Packet* p, Handler* /*h*/) { hdr_cmn *ch = HDR_CMN(p); assert(initialized()); if(ch->direction() == hdr_cmn::UP) { //if(mac_->hdr_type(mh) == ETHERTYPE_ARP) if(ch->ptype_ == PT_ARP) { //printf( "%010.6f - (%03d) - LL::recv - got ARP packet\n", Scheduler::instance().clock(), mac_->addr() ); arptable_->arpinput(p, this); } else { switch( ch->ptype() ) { case PT_AODV: case PT_AODVUU: case PT_MAC: case PT_DSR: case PT_ARP: case PT_SEC_RT: break; case PT_CBR: if( drop_on_recv ) { static int corrupt_count = 1; if( TRACE_DROP ) printf( "%010.6f - (%03d) - LL::recv - dropping data packet (%d)\n", Scheduler::instance().clock(), mac_->addr(), corrupt_count++ ); free( p ); return; }break; default: fprintf( stderr, "%010.6f - (%03d) - LL::recv - ERROR - unknown packet type (%d = %s)!\n", NOW, mac_->addr(), ch->ptype(), packet_info.name( ch->ptype() ) ); exit( -1 ); } uptarget_ ? sendUp(p) : drop(p); } return; } ch->direction() = hdr_cmn::DOWN; sendDown(p); } void LL::sendDown(Packet* p) { hdr_cmn *ch = HDR_CMN(p); hdr_ip *ih = HDR_IP(p); int is_broadcast = 0; int unicast_addr = -1; int is_routing = 0; switch( ch->ptype() ) { case PT_AODV: case PT_AODVUU: case PT_MAC: case PT_DSR: case PT_ARP: case PT_SEC_RT: is_routing = 1; break; case PT_CBR: if( drop_on_send ) { static int corrupt_count = 1; if( TRACE_DROP ) printf( "%010.6f - (%03d) - LL::sendDown - dropping data packet (%d)\n", Scheduler::instance().clock(), mac_->addr(), corrupt_count++ ); free( p ); return; } break; default: fprintf( stderr, "%010.6f - (%03d) - LL::sendDown - ERROR - unknown packet type (%d = %s)!\n", NOW, mac_->addr(), ch->ptype(), packet_info.name( ch->ptype() ) ); exit( -1 ); } nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ih->daddr()); hdr_ll *llh = HDR_LL(p); char *mh = (char*)p->access(hdr_mac::offset_); llh->seqno_ = ++seqno_; llh->lltype() = LL_DATA; mac_->hdr_src(mh, mac_->addr()); mac_->hdr_type(mh, ETHERTYPE_IP); int tx = 0; switch(ch->addr_type()) { case NS_AF_ILINK: mac_->hdr_dst((char*) HDR_MAC(p), ch->next_hop()); if( ch->next_hop() == MAC_BROADCAST ) { is_broadcast = 1; } else { unicast_addr = ch->next_hop(); } break; case NS_AF_INET: dst = ch->next_hop(); case NS_AF_NONE: if (IP_BROADCAST == (u_int32_t) dst) { mac_->hdr_dst((char*) HDR_MAC(p), MAC_BROADCAST); is_broadcast = 1; break; } else { unicast_addr = dst; } if (arptable_) { tx = arptable_->arpresolve(dst, p, this); break; } default: int IPnh = (lanrouter_) ? lanrouter_->next_hop(p) : -1; if (IPnh < 0) mac_->hdr_dst((char*) HDR_MAC(p),macDA_); else if (varp_) tx = varp_->arpresolve(IPnh, p); else mac_->hdr_dst((char*) HDR_MAC(p), IPnh); break; } if (tx == 0) { Scheduler& s = Scheduler::instance(); if( wormhole_head.next ) { if( is_broadcast ) { wormhole_peer *wp = &wormhole_head; while( wp->next ) { wp = wp->next; Packet *p_copy = p->copy(); hdr_cmn::access(p_copy)->direction() = hdr_cmn::UP; s.schedule( wp->ll, p_copy, delay_ ); } if( is_routing ) { routing_packet_count++; routing_byte_count += ch->size_; } else { data_packet_count++; data_byte_count += ch->size_; } s.schedule(downtarget_, p, delay_); return; } else { wormhole_peer *wp_curr = wormhole_head.next; wormhole_peer *wp_prev = &wormhole_head; while( wp_curr ) { if( wp_curr->id == unicast_addr ) { hdr_cmn::access(p)->direction() = hdr_cmn::UP; s.schedule( wp_curr->ll, p, delay_ ); wp_prev->next = wp_curr->next; wp_curr->next = wormhole_head.next; wormhole_head.next = wp_curr; return; } wp_prev = wp_curr; wp_curr = wp_curr->next; } } } if( is_routing ) { routing_packet_count++; routing_byte_count += ch->size_; } else { data_packet_count++; data_byte_count += ch->size_; } s.schedule(downtarget_, p, delay_); } } void LL::sendUp(Packet* p) { Scheduler& s = Scheduler::instance(); if (hdr_cmn::access(p)->error() > 0) drop(p); else s.schedule(uptarget_, p, delay_); }Tweet