Detecta dispositivos USB no autorizados en Linux (Extensible Python Snippet)
- por javier
- 21 de Marzo de 2023
La proliferación de dispositivos USB maliciosos, para hacerse con el control de nuestra máquina están a la orden del día.
Los hay muy variados y de diferente funcionalidad, y permiten un amplio rango de posibilidades a la hora de hackear nuestra máquina.
Contra esto, hay varias soluciones, como USBGuard, que no funciona bien en distros estables por problema de dependencias.
También hay otras soluciones como USB Canary que permite twittear y enviar sms con Twilio para avisarnos de dichos ataques.
No obstante, me he permitido el lujo de crear un snippet algo más abierto y sencillo para que modifiqueis a vuestro antojo y en base a vuestras necesidades.
Se me ocurre integrarlo con OSSEC, por ejemplo, con una regla e incorporarlo vuestro sistema de alertas..
El código en Python ...
#!/usr/bin/python
from pyudev import Context, Monitor, MonitorObserver
import os, sys, syslog
from datetime import datetime
import daemon
import time
from pygame import mixer
FILENAME = "/var/log/usbs.log"
SNDFILE = "/usr/share/sounds/purple/alert.wav"
def deviceEvent(device):
# uncomment next statement to watch variables
"""for key, value in device.items():
print "%s %s" % (key, value)"""
# log event
did = "%s:%s" % (device.get("ID_VENDOR_ID"), device.get("ID_MODEL_ID"))
sid = "%s %s %s" % (did, device.get("ID_MODEL_FROM_DATABASE"), device.get("ID_VENDOR"))
sdate = datetime.now().isoformat()
if device.action == "add":
msg = "[%s] usb connected %s" % (sdate, sid)
elif device.action == "remove" or device.action == "offline":
msg = "[%s] usb disconnected %s" % (sdate, sid)
else:
return
# on file
open(FILENAME, "a").write(msg + "\n")
syslog.syslog(msg)
print msg
# play sound
mixer.init()
mixer.music.load(SNDFILE)
mixer.music.play()
def protect():
context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb', device_type='usb_device')
while True:
device = None
while device is None:
device = monitor.poll(timeout=3)
deviceEvent(device)
if __name__ == "__main__":
with daemon.DaemonContext():
protect()
blog comments powered by Disqus