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/[tcp|udp]> [port[tcp|udp]] ...

 

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

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!