All pastes #838320 Raw Edit

Mine

public text v1 · immutable
#838320 ·published 2007-12-30 08:40 UTC
rendered paste body
# wifizoo
# complains to Hernan Ochoa (hernan@gmail.com)
import sys
import curses.ascii
from scapy import *
import scapy
import wifiglobals
import appHandlers
import datetime
import WifiZooEntities
import wifizoowebgui
import wifizooproxy

# tcp port numbers
HTTP_PORT = 80
POP3_PORT = 110
FTP_PORT = 21
TELNET_PORT = 23
MSN_PORT = 1863
SMTP_PORT = 25

# udp port numbers
NETBIOS_NS_UDP		=	137
NETBIOS_DGM_UDP		=	138

# dictionary of portnumber->handler
tcpHandlers = {}
udpHandlers = {}


# add your handlers here
# tcpHandlers
tcpHandlers[ HTTP_PORT ] = appHandlers.httpHandler
tcpHandlers[ POP3_PORT ] = appHandlers.pop3Handler
tcpHandlers[ FTP_PORT  ] = appHandlers.ftpHandler
tcpHandlers[ TELNET_PORT ] = appHandlers.telnetHandler
tcpHandlers[ MSN_PORT ] = appHandlers.msnHandler
tcpHandlers[ SMTP_PORT ] = appHandlers.smtpHandler

# udpHandlers
udpHandlers[ NETBIOS_NS_UDP ] = appHandlers.netbiosnsHandler
udpHandlers[ NETBIOS_DGM_UDP ] = appHandlers.netbiosdgmHandler

#config
conf.verb=0
# interface where to listen for traffic
# tested with a rt2570 chipset
conf.iface = 'ath0'



print "WifiZoo v1.2, complains to Hernan Ochoa (hernan@gmail.com)"
webgui = wifizoowebgui.WifiZooWebGui()
webgui.start()
webproxy = wifizooproxy.WifiZooProxy()
webproxy.start()
print "Waiting..."

while 1:
	# mm, would be better to use callback perhaps. TODO
	p = sniff(filter=None, iface=conf.iface, count=1)
	pkt = p[0]

	if not pkt.haslayer(Dot11):
		# this is not a 802.11 packet
		continue

	if pkt.haslayer(Dot11):
		if not pkt.haslayer(PrismHeader):
			# I assume now the card does not output prism headers
			wifiglobals.Info.setHasPrismHeaders(0)
		else:
			wifiglobals.Info.setHasPrismHeaders(1)

	#if not pkt.haslayer(PrismHeader) or not pkt.haslayer(Dot11):
	#		continue

	# try to add to AP & clients list
	#0 = mgmt, 1=control, 2=data
	d = pkt.getlayer(Dot11)
	t= pkt.getlayer(Dot11).type
	if t == 2:
		# if packet FROMDS then dst,bssid,src
		# if packet TODS then bssid,src,dst
		# toDS
		#print d.mysummary()
		#print d.FCfield
		if d.FCfield & 1:
			#print "toDS"
			bssid = str(d.addr1)
			src = str(d.addr2)
			dst = str(d.addr3)
			wifiglobals.Info.addClients(src,dst,bssid)
		# fromDS
		elif d.FCfield & 2:
			#print "fromDS"
			dst = str(d.addr1)
			bssid = str(d.addr2)
			src = str(d.addr3)
			wifiglobals.Info.addClients(src,dst,bssid)
		# if bits are 0 & 0, thn ad-hoc network
		# if bits are 1 & 1, then WDS system
		#print wifiglobals.Info.getClients()
		# is the packet encrypted?
		#if d.FCfield & 0x40 == 0:
		#		print "UNENCRYPTED"
		#else:
		#		print "ENCRYPTED"


	# is it a probe request?
	if pkt.haslayer(Dot11ProbeReq):
		aProbeRequest = WifiZooEntities.ProbeRequest()
		aProbeRequest.setPKT(pkt)
		aProbeRequest.setDST( str(pkt.getlayer(Dot11).addr1) )
		aProbeRequest.setSRC( str(pkt.getlayer(Dot11).addr2) )
		aProbeRequest.setBSSID( str(pkt.getlayer(Dot11).addr3) )
		if wifiglobals.Info.hasPrismHeaders() == 1:
			aProbeRequest.setChannel( pkt.channel )
		else:
			aProbeRequest.setChannel( 0 )

		thetime = datetime.datetime.now()
		aProbeRequest.setFirstSeen( thetime )
		aProbeRequest.setLastSeen( thetime )
		# let's check if the ssid is 'printable'
		assid = pkt.sprintf("%Dot11ProbeReq.info%")
		#print len(assid)
		#for x in assid:
		#	print hex(ord(x))
		#print "===FIN==="
		isPrintable = 1
		for x in assid:
			if not wifiglobals.Info.isAlpha(x):
				isPrintable = 0
				break

		if isPrintable == 0:
			temp = assid
			assid = ''
			for x in temp:
				assid = assid + str(hex(ord(x)))
			
		aProbeRequest.setSSID( assid )
		wifiglobals.Info.addProbeRequest( aProbeRequest )
		wifiglobals.Info.dumpProbeRequests()

	if pkt.haslayer(Dot11ProbeResp):
		#dst,src,bssid
		src = str(pkt.getlayer(Dot11).addr2)
		ssid = pkt.sprintf("%Dot11ProbeResp.info%")
		# this is hardcore :)
		if pkt.sprintf("%Dot11ProbeResp.cap%").find("privacy") != -1:
				isprotected = 1
		else:
				isprotected = 0
		pktChannel = 0
		if wifiglobals.Info.hasPrismHeaders() == 1:
			pktChannel = pkt.channel
		if wifiglobals.Info.addAccessPoint( src, ssid, pktChannel, isprotected ) == 1:
			wifiglobals.Info.dumpAccessPointsList()

	# is it a beacon?
	# if it is, get SSID
	if pkt.haslayer(Dot11Beacon):
		# bssid
		j = pkt.getlayer(Dot11).addr3
		# ssid
		s = pkt.getlayer(Dot11Beacon).getlayer(Dot11Elt).info
		# this is hardcore :)
		if pkt.sprintf("%Dot11Beacon.cap%").find("privacy") != -1:
				isprotected = 1
		else:
				isprotected = 0
		pktChannel = 0
		if wifiglobals.Info.hasPrismHeaders() == 1:
			pktChannel = pkt.channel
		if wifiglobals.Info.addAccessPoint( j, s, pktChannel, isprotected) == 1:
			wifiglobals.Info.dumpAccessPointsList()



	if pkt.getlayer(IP) == 0 or pkt.getlayer(UDP) == 0 or pkt.getlayer(TCP) == 0:
		continue
		
	dot11 = pkt.getlayer(Dot11)
	raw = pkt['Raw']
	ippkt = pkt['IP']
	tpkt = None
	isUDP = 0
	isTCP = 0
	#isUDP = isTCP = 0
	try:
		tpkt = pkt['UDP']
		if tpkt != None:
			isUDP = 1
	except e: 
		print "error in udp"
		isUDP = 0

	if isUDP == 0:	
		try:
			tpkt = pkt['TCP']
			if tpkt != None:
				isTCP = 1
		except ex:
			print "error in tcp"
			isTCP = 0


	if isTCP == 1:
		try:
			if wifiglobals.Info.hasPrismHeaders() == 1:
				print "Channel: " + str(pkt.channel)
			else:
				print "Channel: Unavailable (No PrismHeaders)."
		except Exception, e:
			print e
		(src,dst,bssid) = wifiglobals.Info.getSrcDstBssid(pkt)
		print "bssid=" + bssid + " src=" + src + " dst=" + dst
		print "TCP: " + str(ippkt.src) + "." + str(tpkt.sport) + ' -> ' + str(ippkt.dst) + "." + str(tpkt.dport)

	if isUDP == 1:
		if wifiglobals.Info.hasPrismHeaders() == 1:
			print "Channel: " + str(pkt.channel)
		else:
			print "Channel: Unavailable (No PrismHeaders)."

		(src,dst,bssid) = wifiglobals.Info.getSrcDstBssid(pkt)
		print "bssid=" + bssid + " src=" + src + " dst=" + dst
		print "UDP: " + str(ippkt.src) + "." + str(tpkt.sport) + ' -> ' + str(ippkt.dst) + "." + str(tpkt.dport)


	if raw != None:
		if isTCP:
			for port in tcpHandlers.keys():
				if tpkt.dport == port or tpkt.sport == port:
					tcpHandlers[ port ](pkt)
				
	
		if isUDP:
			for port in udpHandlers.keys():
				if tpkt.dport == port or tpkt.sport == port:
					udpHandlers[ port ](pkt)