Me llamó la atención la aplicación para SO Android SheepGuard, que previene ataques de tipo mitm en redes wifi.

Algún vecino, de esos que se hacen querer :p , gustaba de hacer ese tipo de ataques en mi red local.

Aparte de desactivar el wifi, ya que no es seguro, a mi modo de ver, he desarrollado una aplicación para linux, en python, que tiene funcionalidad similar a SheepGuard.

Para ponerla a funcionar, sólo teneis que editar la parte del programa marcada entre comentarios. Os comento los cambios que hay que realizar: primero, instalar dependencias:

 

aptitude install alsa-utils zenity scapy

segundo, editar los valores marcados en el programa:

macrouter="xx:xx:xx:xx:xx:xx" # mac de tu router

puedes usar arping para saber la mac de tu router

arping router_ip
WAVFILE="/usr/share/sounds/purple/alert.wav"

path completo a archivo wav o mp3 en nuestro sistema de archivos. Este sonido se ejecutará cuando se detecte un man in the middle en nuestra red. Las acciones recomendadas son estas, ya que son las únicas que pude poner en funcionamiento:

ACTIONS=(BEEP, VISUALALERT, DISCONNECT)

Aunque podeis ajustarlas a vuestro gusto. La siguiente variable, indica la frecuencia con la que se chequea la red local en busca de tráfico de tipo arp poisoning (mitm), a mayor valor, mas tardará cada chequeo.

SLEEPSEC=10

A continuación, paso a publicar el código del programa.

#!/usr/bin/python

from scapy.all import conf
from scapy.layers.l2 import *
import scapy.layers.inet as inet
import re, time, os, sys


BLOCK=1
BEEP=2
DISCONNECT=3
VISUALALERT=4
RECOVER=5

# --------EDIT---------
macrouter="xx:xx:xx:xx:xx:xx"
WAVFILE="/usr/share/sounds/purple/alert.wav"
ACTIONS=(BEEP, VISUALALERT, DISCONNECT)
SLEEPSEC=10
# --------DO NOT EDIT---------
iface=""
macpc=""
fakemac=""
gway=""
arpgw=None
DEBUG=False

def doPing(src, dst):
    global arpgw
    
    ip=inet.IP()
    icmp=inet.ICMP()
    ip.src=src
    ip.dst=dst
    pkt=inet.sr1(ip/icmp, verbose=False, count=1)
    
def sniffARP(gw):
    global arpgw
    
    p=sniff(filter="arp and src host %s" % gw, count=1)
    if len(p.res)>0:
        try:
            if p.res[0][ARP].op==2:
                if re.search("^%s$" % (p.res[0].src),macrouter, re.IGNORECASE ):
                    arpgw=p.res[0]
            return p.res[0].src, p.res[0].dst
        except:
            return macrouter, macpc
        
    else:
        return macrouter, macpc

def correctARP():
    if arpgw is not None:
        send(arpgw, verbose=False, count=7)
    
def arping(src, dst):
    ether=Ether()
    arp=ARP()
    arp.src=src
    arp.dst=dst
    ping=srp1(ether/arp, verbose=False)
    return ping

def routePrint(route, smac, dmac):           
    print "\\n%s -> %s[%s] gw %s[%s]" % (route[0], route[1], dmac, route[2], smac)

def responseMitm():
    
    if RECOVER in ACTIONS:
        os.system("arp -d %s -i %s" % (gway, iface))
        os.system("arp -s %s %s -i %s pub" % (gway, macrouter, iface))
        
    if BLOCK in ACTIONS:
        os.system("iptables -A OUTPUT -m mac --mac-source %s -j DROP " % fakemac)
        os.system("iptables -A INPUT -m mac --mac-source %s -j DROP " % fakemac)

    if BEEP in ACTIONS:
        os.system("aplay -q %s &" % WAVFILE)
    
    if VISUALALERT in ACTIONS:
        os.system(''zenity --warning --text "MitM Attack on %s from %s!" > /dev/null &'' % (iface, fakemac))
    
    if DISCONNECT in ACTIONS:
        os.system("ifconfig %s down &" % iface)
        print "Disconnected... Quitting.."
        print "Dont forget to do ''ifconfig %s up'' as root to reactivate networking" % iface
        sys.exit()

def checkArpPingRouter():
    global macpc, fakemac, iface, gway
    
    ether=Ether()
    arp=ARP()
    route=arp.route()
    gway=route[2]
    smac,dmac=sniffARP(gway)
    macpc=arp.hwsrc
    if not re.search("^%s$" % macrouter, smac, re.IGNORECASE):
        print "Mitm attack detected from %s!!!" % smac
        fakemac=smac
        iface=route[0]
        responseMitm()
    else:
        if DEBUG:
            print "arp ok!"
            
    return route, smac, dmac


def run():
    global arpgw
    
    route, smac, dmac = checkArpPingRouter()
    routePrint(route, smac, dmac)
    while True:
        checkArpPingRouter()
        time.sleep(SLEEPSEC)


def godaemon():
        print "going to background..."
        pid = os.fork()
        if(pid == 0):
                os.setsid()

                pid = os.fork()

                if(pid ==0):

                        os.chdir("/")
                        os.umask(0)

                        run()

                else:
                        os._exit(0)
        else:
                os._exit(0)


if __name__ == "__main__":
    godaemon()

Descargar mitmprot.py

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!