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()

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.

Saludos y buen finde.

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!