En primer lugar, daros las gracias por vuestros comentarios en el blog, que me han animado a seguir escribiendo de vez en cuando.
Tengo otros proyectos, pero aún no están acabados o preparados para ver la luz.
Os mantendré informados sobre ellos.
En vista de la buena acogida de mi programa trap.py (Puertos trampa en python con iptables), he decidido ampliarlo al protocolo TCP/UDP.
Ahora será posible monitorizar los puertos que queramos.
La sintaxis del programa viene a ser la misma de antes, pero esta vez podremos especificar el protocolo que deseamos monitorizar:
syntax: trap.py <port> [port[tcp|udp]] ...
</port>
así pues, hacemos :
./trap.py 80/tcp 8080/tcp 161/tcp 161/udp 162/tcp 162/udp
y quien se conecte al servicio ficticio snmp , http o http-alt, quedará baneado sin previo aviso y nos avisará un pitido como viene siendo habitual. Si el pitido no os gusta o funciona, podeis sustituir sin problemas la línea de código:
os.system("beep -f 555 -l 460")
por
os.system("aplay alarma.wav")
por ejemplo.
Si teneis dudas o preguntas sobre el funcionamiento del programa, no dudeis en dejar comentarios en el blog.
Os dejo el listado del programa y un enlace de descarga, como viene siendo habitual.
#!/usr/bin/python
import sys, os, re
import logging
import logging.handlers
import socket
from threading import Thread
import signal
import multiprocessing
event = multiprocessing.Event()
Exit=False
sthreads=[]
def term_handler(signal, frame):
Exit=True
for sthread in sthreads:
sthread.join()
event.set()
def banAddress(my_logger, address, port):
# baneo y registro en syslog
my_logger.critical(''%s:%s blocked! Connection not allowed.'' % (address,port) )
os.system("iptables -I INPUT -s %s -j DROP" % (address))
os.system("beep -f 555 -l 460")
return
class serverThread(Thread):
def __init__(self, ssocket, port, logger):
Thread.__init__(self)
self.socket=ssocket
self.logger=logger
self.port=port
def run(self):
while not Exit:
if self.socket.type==socket.SOCK_STREAM:
self.socket.listen(10)
(clientsocket, (address, port2)) = self.socket.accept()
banAddress(self.logger, address, self.port)
clientsocket.close()
else:
try:
(data, (address,port)) = self.socket.recvfrom(1024)
except:
pass
else:
print address
banAddress(self.logger, address, self.port)
def run():
#
# minimo, un solo parametro, puerto de escucha
#
def bindPort(port, type="tcp"):
if type=="tcp":
stype=socket.SOCK_STREAM
else:
stype=socket.SOCK_DGRAM
serversocket=socket.socket(socket.AF_INET, stype)
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversocket.bind(("", int(port)))
print "port: %s %s" % (port, type)
return serversocket
def tcp(port):
return bindPort(port, "tcp")
def udp(port):
return bindPort(port, "udp")
if len(sys.argv)<2:
print "syntax: trap.py [port/[tcp|udp]] ...\\n"
sys.exit(0)
ports=[]
for i in range(1, len(sys.argv)):
ports.append(sys.argv[i])
#
# inicializacion del syslog logger
#
logger = logging.getLogger(''tcp wrappers'')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address = ''/dev/log'')
logger.addHandler(handler)
#
#Uso de sockets sencillo. Quien se conecta, es baneado y se cierra la conexion
#
print "\\n%s is listening to...\\n" % sys.argv[0]
for port in ports:
rtcp=re.match("(\\d+)/tcp", port, re.IGNORECASE)
rudp=re.match("(\\d+)/udp", port, re.IGNORECASE)
rport=re.match("(\\d+)", port)
if rtcp:
port=rtcp.groups()[0]
ssocket=tcp(port)
elif rudp:
port=rudp.groups()[0]
ssocket=udp(port)
elif rport:
port=rport.groups()[0]
ssocket=tcp(port)
sthreads.append(serverThread(ssocket, port, logger))
sthreads[-1].start()
signal.signal(signal.SIGTERM, term_handler)
event.wait()
return
def godaemon():
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 trapv2.py
blog comments powered by