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:

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 Disqus

LanWatcher. Controla tu red Local

  • por javier
  • 21 de Marzo de 2023

Cuantas veces he leido por ahi: ¿Como puedo ver que equipos hay conectados a mi red wifi o red local cableada?
La respuesta es LanWatcher.
LanWatcher es un pequeño script programado en Python que escanea cada cierto tiempo la red local especificada por nosotros y muestra los equipos conectados, su mac, ip y hostname.

Tiene funciones de ataque a equipos no identificados:

Update cookies preferences