heimliche USB-Eingabegeräte

Alles rund um sicherheitsrelevante Fragen und Probleme.
Antworten
Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

heimliche USB-Eingabegeräte

Beitrag von smutbert » 10.10.2014 21:02:23

Hallo liebe paranoide Debianfreunde,

in letzter Zeit stolpere ich auffallend oft über das Thema USB-Sticks/Tassenwärmer/Ventilatoren/Leuchten/Raketenwerfer, die sich unerwartet und heimlich als Eingabegerät melden und im Auftrag von wemauchimmer die Kontrolle über den Rechner übernehmen könnten. Unabhängig davon wie realistisch das Angriffsszenario ist, habe ich ein kleines Skript geschrieben, dass es einem USB-Stick und ähnlichen Geräte etwas schwerer machen soll sich unbemerkt als Eingabegerät zu melden.

Das ganze besteht aus einer udev-Regel, die das Skript aussführen soll, wenn ein neues Eingabegerät am Rechner angeschlossen wird und dem Skript selbst:

/etc/udev/rules.d/71-input-notification.rules

Code: Alles auswählen

ACTION=="add", KERNEL!="event*", SUBSYSTEM=="input", RUN+="/usr/local/bin/input-notification"
/usr/local/bin/input-notification

Code: Alles auswählen

#!/bin/sh

for SESSIONID in $(loginctl --no-legend list-sessions | awk '{print $1}')
do
        SESSION=$(loginctl show-session ${SESSIONID})

        USERNAME=$(echo "${SESSION}" | sed -ne 's/^Name=//p')
        DISPLAY=$(echo "${SESSION}" | sed -ne 's/^Display=//p')
        TYPE=$(echo "${SESSION}" | sed -ne 's/^Type=//p')
        REMOTE=$(echo "${SESSION}" | sed -ne 's/^Remote=//p')
        ACTIVE=$(echo "${SESSION}" | sed -ne 's/^Active=//p')
        if [ ${ACTIVE} = "yes" ] && [ ${TYPE} = "x11" ] && [ ${REMOTE} = "no" ]
        then
                export XAUTHORITY="$(getent passwd ${USERNAME} | cut -d: -f6)/.Xauthority"
                export DISPLAY
                su ${USERNAME} -c "notify-send -u critical -i keyboard -c device.added 'neues Eingabegerät' ${NAME}"
        fi
done

Wenn ihr es ausprobieren wollt, nicht vergessen das Skript ausführbar zu machen und ein

Code: Alles auswählen

# udevadm control --reload-rules
um dem System die neue Regel bekannt zu machen. Neustart braucht es keinen. So wie es hier steht schickt das Skript eine Benachrichtigung an alle Nutzer, die lokal in X11 angemeldet sind und deren Status active ist (das ist er afaik genau dann, wenn das VT auf dem dieses X11 läuft, angezeigt wird) — normalerweise ist das genau der eine Nutzer, dem dieser Hinweis im Augenblick helfen könnte ☺

lg smutbert
Zuletzt geändert von smutbert am 02.12.2014 10:07:40, insgesamt 1-mal geändert.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: heimliche USB-Eingabegeräte

Beitrag von Cae » 10.10.2014 22:32:49

Gute Idee, gerade unter dem Hintergrund von BadUSB.

Das eval da wuerde ich nicht haben wollen, da kann "zu viel" versehentlich mit ausgefuehrt werden (was fuer alle eval()-Aequivalente gilt). Z.B. waere es denkbar, dass ich mein $DISPLAY irgendwie umbenennen kann als User. Zum Beispiel wuerde Display="$(usermod -aG 0 1000)" den Benutzer mit der UID 1000 in die Gruppe 0 (== root) aufnehmen. Nicht so doll. Hier waere es besser, die Ausgabe gegen read zu pipen (Scope beachten!) oder mit awk oder aehnlich nachzubearbeiten.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: heimliche USB-Eingabegeräte

Beitrag von dufty2 » 11.10.2014 13:48:02

Cae hat geschrieben:Z.B. waere es denkbar, dass ich mein $DISPLAY irgendwie umbenennen kann als User. Zum Beispiel wuerde Display="$(usermod -aG 0 1000)" den Benutzer mit der UID 1000 in die Gruppe 0 (== root) aufnehmen. Nicht so doll.
?
Sessions werden von system-logind gesteuert, was interessiert dem logind, was irgendein user in seinem environment hat?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: heimliche USB-Eingabegeräte

Beitrag von Cae » 11.10.2014 17:07:47

dufty2 hat geschrieben:
Cae hat geschrieben:Z.B. waere es denkbar, dass ich mein $DISPLAY irgendwie umbenennen kann als User. Zum Beispiel wuerde Display="$(usermod -aG 0 1000)" den Benutzer mit der UID 1000 in die Gruppe 0 (== root) aufnehmen. Nicht so doll.
?
Sessions werden von system-logind gesteuert, was interessiert dem logind, was irgendein user in seinem environment hat?
Ich sag' ja nur, wenn da irgendwelche Variableninhalte von nicht-root erzeugt werden, hast du mit deinem eval 'ne local privilege escalation. Wie der Output genau aussieht und woher er stammt, kann ich nicht sagen, da ich hier zum Glueck noch nicht auf die Seuche namens systemd angewiesen bin.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: heimliche USB-Eingabegeräte

Beitrag von scientific » 11.10.2014 17:11:03

Welche Version von systemd hast du laufen? Bei mir schaut es so aus:

Code: Alles auswählen

user@debian: $ loginctl --no-legend list-sessions | awk '{print $1}'
loginctl: Unbekannte Option »--no-legend«

Code: Alles auswählen

user@debian:~ $ dpkg -l|grep systemd
ii  libpam-systemd:amd64                         204-14~bpo70+1                         amd64        system and service manager - PAM module
ii  libsystemd-daemon0:amd64                     204-14~bpo70+1                         amd64        systemd utility library
ii  libsystemd-journal0:amd64                    204-14~bpo70+1                         amd64        systemd journal utility library
ii  libsystemd-login0:amd64                      204-14~bpo70+1                         amd64        systemd login utility library
ii  systemd                                      204-14~bpo70+1                         amd64        system and service manager
ii  systemd-sysv                                 204-14~bpo70+1                         amd64        system and service manager - SysV links
lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 11.10.2014 17:23:34

unstable:

Code: Alles auswählen

$ dpkg -l | grep systemd
ii  libpam-systemd:amd64                  215-5+b1                           amd64        system and service manager - PAM module
ii  libsystemd0:amd64                     215-5+b1                           amd64        systemd utility library
ii  systemd                               215-5+b1                           amd64        system and service manager
ii  systemd-cron                          1.3.1+ds1-1                        all          systemd units to provide minimal cron daemon functionality
ii  systemd-sysv                          215-5+b1                           amd64        system and service manager - SysV links
ii  systemd-ui                            3-2                                amd64        graphical frontend for systemd

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: AW: heimliche USB-Eingabegeräte

Beitrag von scientific » 11.10.2014 17:50:01

Na da hammas ja :grin:
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: heimliche USB-Eingabegeräte

Beitrag von dufty2 » 11.10.2014 20:20:41

testing hat seit einer Woche oder so auch schon systemd-215

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 11.10.2014 21:54:14

Mit dem Einwand, dass eval keine so gute Idee ist, habe ich fast gerechnet, aber anders habe ich es bis jetzt nicht geschafft und ich habe auch keine Möglichkeit entdeckt als normaler Benutzer die Ausgabe von loginctl zu manipulieren. Jedenfalls paßt die Ausgabe von loginctl show-session perfekt

Code: Alles auswählen

$ loginctl show-session 1
Id=1
Name=smutbert
Timestamp=Sam
2014-10-11
15:59:56
CEST
TimestampMonotonic=4031592
VTNr=7
Display=:0
Remote=no
Service=lightdm
Scope=session-1.scope
Leader=141
Audit=1
Type=x11
Class=user
Active=yes
State=active
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
aber ich schaffe es nicht, die Ausgabe anders auszuwerten, weil mir beim Speichern der Ausgabe in einer Variablen die Zeilenumbrüche verloren gehen:

Code: Alles auswählen

$ ausgabe=$(loginctl show-session 1)
$ echo $ausgabe
Id=1 Name=smutbert Timestamp=Sam 2014-10-11 15:59:56 CEST TimestampMonotonic=4031592 VTNr=7 Display=:0 Remote=no Service=lightdm Scope=session-1.scope Leader=141 Audit=1 Type=x11 Class=user Active=yes State=active IdleHint=no IdleSinceHint=0 IdleSinceHintMonotonic=0

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: heimliche USB-Eingabegeräte

Beitrag von catdog2 » 12.10.2014 03:12:30

aber ich schaffe es nicht, die Ausgabe anders auszuwerten, weil mir beim Speichern der Ausgabe in einer Variablen die Zeilenumbrüche verloren gehen:

Code: Alles auswählen

$ ausgabe=$(loginctl show-session 1)
$ echo "$ausgabe"
Unix is user-friendly; it's just picky about who its friends are.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: heimliche USB-Eingabegeräte

Beitrag von scientific » 12.10.2014 03:28:51

catdog2 hat geschrieben:
aber ich schaffe es nicht, die Ausgabe anders auszuwerten, weil mir beim Speichern der Ausgabe in einer Variablen die Zeilenumbrüche verloren gehen:

Code: Alles auswählen

$ ausgabe=$(loginctl show-session 1)
$ echo "$ausgabe"

Code: Alles auswählen

root@pluto[03:27]:~ # ausgabe=$(loginctl show-session 2)
root@pluto[03:27]:~ # echo $ausgabe 
Id=2 Timestamp=Sam 2014-10-11 17:53:14 CEST TimestampMonotonic=108638394 DefaultControlGroup=systemd:/user/1000.user/2.session VTNr=7 Display=:0 Remote=no Service=lightdm Leader=3694 Audit=2 Type=x11 Class=user Active=yes State=active KillProcesses=no IdleHint=no IdleSinceHint=0 IdleSinceHintMonotonic=0 Name=jakob
Nun... nach mitgenommenen Leerzeichen sieht das nicht aus...
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: heimliche USB-Eingabegeräte

Beitrag von catdog2 » 12.10.2014 03:30:58

Man beachte die "…"
Unix is user-friendly; it's just picky about who its friends are.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: heimliche USB-Eingabegeräte

Beitrag von scientific » 12.10.2014 03:45:21

catdog2 hat geschrieben:Man beachte die "…"
Sorry, ich weiß jetzt leider nicht, was du damit meinst. :?:
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

dufty2
Beiträge: 1714
Registriert: 22.12.2013 16:41:16

Re: heimliche USB-Eingabegeräte

Beitrag von dufty2 » 12.10.2014 10:04:47

Code: Alles auswählen

$ echo $ausgabe
versus

Code: Alles auswählen

$ echo "$ausgabe"

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 12.10.2014 20:46:47

:idea: Danke, so sieht es ohne eval aus. Besser?

Code: Alles auswählen

»siehe erster  Post«
Zuletzt geändert von smutbert am 02.12.2014 10:08:29, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 22.10.2014 21:03:21

Hat irgendjemand mein Skript und die udev-Regel ausprobiert?

(ich bin gerade darauf gestossen, dass mein Skript beim Anstecken einer Maus offensichtlich 3 Mal aufgerufen, aber nur einmal und zwar das dritte Mal, mit den richtigen Umgebungsvariablen, zumindest erhalte ich unter mate 2 leere und eine richtige Meldung. Unter e17 dagegen gibt es nur eine einzelne Meldung, ich glaube ich muss einmal ausprobieren ob es trotzdem 3 Mal aufgerufen wird…)

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: heimliche USB-Eingabegeräte

Beitrag von scientific » 22.10.2014 22:03:02

Ich habs gerade mit einem Testprogramm getestet, welches einfach "Hallo" ins syslog schreibt.

Dann hab ich meinen kleinen Bluetooth-Lautsprecher per USB angesteckt, welcher auch als Input-Device registriert wird (hat Play, Prev und Next-Knöpfe!)

Es wird zweimal die Udev-Regel aufgerufen...

Code: Alles auswählen

user@debian: $ udevadm monitor --kernel --udev|grep input
KERNEL[7939.648303] remove   /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0006/input/input15/event14 (input)
KERNEL[7939.668183] remove   /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0006/input/input15 (input)
UDEV  [7939.669898] remove   /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0006/input/input15/event14 (input)
UDEV  [7939.670749] remove   /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0006/input/input15 (input)
KERNEL[7947.290408] add      /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16 (input)
KERNEL[7947.290516] add      /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16/event14 (input)
UDEV  [7947.353068] add      /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16 (input)
UDEV  [7947.355107] add      /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16/event14 (input)
Sprich, die Regel springt an bei input und beim event.

Mit

Code: Alles auswählen

ACTION=="add", KERNEL=="event*", SUBSYSTEM=="input", RUN+="/usr/local/bin/tp"
gibts das "Hallo" nur einmal im Syslog.

Und

Code: Alles auswählen

user@debian: $ cat /usr/local/bin/tp 
#!/bin/sh
echo Hallo|logger 
Vielleicht hilft dir das weiter.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 23.10.2014 10:28:18

Danke, ja. Jetzt ist mir die Ursache klar. Ein einzelnes Eingabegerät erzeugt ja ziemlich viele Events beim Anstecken, bei meiner Maus immerhin 14… da müsste ich mir noch etwas überlegen…

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: heimliche USB-Eingabegeräte

Beitrag von rendegast » 27.11.2014 01:09:40

Code: Alles auswählen

cat /proc/bus/input/devices | grep -i sysfs

udevadm info --attribute-walk ...
bemühen und damit weiter eingrenzen?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 27.11.2014 19:47:34

Danke, so finde ich die Attribute eines beliebigen angeschlossenen Geräts und aller Parents. Ich bin mir aber nicht sicher inwiefern mir das weiterhilft, denn ich will ja über alle neu angeschlossenen Eingabegeräte informiert werden und deswegen nicht auf die Attribute eines bestimmten Geräts eingrenzen.

Beim IR-Receiver meines DVB-Empfängers komme ich auf 2 udev-Events, wenn ich mich auf das input-Subsystem beschränke, mein Skript wird dann 2 Mal ausgeführt. Bei meiner Tastatur sind es dagegen bereits 4 udev-Events und Benachrichtigungen.
Also weiß ich einfach nicht in welcher Form ich weiter eingrenzen könnte ohne Gefahr zu laufen, dass mir neue Eingabegeräte entgehen.

Ich habe mir schon überlegt das Skript 1 Sekunde warten zu lassen und mir dann eine Zusammenfassung der Ereignisse anzeigen zu lassen…

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: heimliche USB-Eingabegeräte

Beitrag von rendegast » 28.11.2014 10:26:30

Wichtig sind bei der Geräteklasse wohl nur die Tastaturen.
In obiger Liste die input15 und input16 werden sich doch wohl irgendwie unterscheiden?
Daher die Ausgaben gegenüberstellen

Code: Alles auswählen

vimdiff ausgabeinput15 ausgabeinput16
Dem Skript können (dynamische) Parameter mitgegeben werden, Bsp.

Code: Alles auswählen

$ egrep -o " RUN.*" /etc/udev/rules.d/* -h
 RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
Auf diese Parameter können im Skript dann Aktionen/Tests folgen.


Weiterhin
KERNEL[7947.290408] add /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16 (input)
KERNEL[7947.290516] add /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16/event14 (input)
UDEV [7947.353068] add /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16 (input)
UDEV [7947.355107] add /devices/pci0000:00/0000:00:1d.0/usb3/3-1/3-1:1.4/0003:E3B4:0811.0007/input/input16/event14 (input)
hier werden die Nachrichtenquellen aufgeführt (KERNEL/UDEV),
was wohl den debugging-Charakter des Tools ausmacht.
Es wird da für input16 wohl nicht zweimal das Skript aufgerufen,
Kontrolle: zBsp. sowas in das Skript einfügen

Code: Alles auswählen

DTE=$(date +%s.%N) 
TMPF=$(mktemp /tmp/$DTE.XXXXX)
echo "$0 $@" > $TMPF
set >> $TMPF
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
smutbert
Beiträge: 8363
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: heimliche USB-Eingabegeräte

Beitrag von smutbert » 29.11.2014 13:56:26

:facepalm:

Danke, jetzt hab ich es. Im Grund hatte scientific ja schon meine Problemlösung gepostet, aber ich habe es, ob der (für mich) verwirrenden Verzeichnisstruktur in /sys nicht erkannt. Anders als er vorgeschlagen hat, habe ich jetzt ein

Code: Alles auswählen

KERNEL!="event*"
zur Regel hinzugefügt und jetzt wird das Skript für jedes Eingabegerät genau einmal aufgerufen. Sobald ich mein Skript und die Regel wieder aufgeräumt und von dem ganzen Fehlersuch-Code bereinigt habe, werde ich Skript und Regel im ersten Beitrag aktualisieren.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: heimliche USB-Eingabegeräte

Beitrag von scientific » 02.12.2014 09:10:37

Wenn ich badusb richtig verstanden habe, kann sich ein usb-speicherstick ja auch als netzwerkkarte o.ä. ausgeben...

Werd mir das auch mal anschauen...

Lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Antworten