Puertos trampa, con python e iptables

  • por javier
  • 22 de Marzo de 2023

Otro quick&dirty script en python. En éste caso, vamos a crear los "puertos trampa" que queramos, de manera que quien se conecte, se bloqueará mediante una sencilla regla de iptables. Para ello, nuestro firewall deberá estar basado en iptables, caso contrario, no funcionará el invento. Sin más dilación, os muestro el script, que os podeis descargar al final del artículo.

>#!/usr/bin/python

import sys, os
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:
				self.socket.listen(10)
				(clientsocket, (address, port2)) = self.socket.accept()
				banAddress(self.logger, address, self.port)
				#data=clientsocket.recv(1024)	
				clientsocket.close()



def run():
	
	#	
	# minimo, un solo parametro, puerto de escucha
	#

	if len(sys.argv)<2:
		print "syntax: trap.py <port> [port] ...\\n"		
		sys.exit(0)

	ports=[]
	for i in range(1, len(sys.argv)):
		ports.append(int(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)


	for port in ports:
		serversocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
		serversocket.bind(("", port))
		sthreads.append(serverThread(serversocket, 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()
	#run()
</port>

Utiliza varias técnicas como multithreading para cada puerto abierto, control de envío de señal TERM para finalizar el daemon, logging en /var/log/syslog , beep en cada conexión y poco más. Comentaros que podeis modificarlo a vuestro gusto y utilizarlo libremente. Lo dejo como licencia MIT, para quien quiera sacarle el jugo.

Descargar script: trap.py

Nada más por hoy.

 

blog comments powered by Disqus

Puertos trampa, con python e iptables. (v2)

  • por javier
  • 22 de Marzo de 2023

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:

Update cookies preferences