El comando xinput
permite configurar y probar dispositivos de entrada
para las XWindow. Podemos obtener un listado de los dispositivos de
entrada:
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=15 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Laptop_Integrated_Webcam_2M id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
↳ Dell WMI hotkeys id=13 [slave keyboard (3)]
También podemos obtener más información de algún dispositivo en concreto, por ejemplo, del teclado, cuyo identificador, en mi caso, es el 11:
$ xinput list --long 11
AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
Reporting 1 classes:
Class originated from: 11
Keycodes supported: 248
También podemos probar el teclado:
$ xinput test 11
key release 36
key press 45
kkey release 45
key press 38
akey release 38
key press 27
rkey release 27
key press 33
pkey release 33
key press 32
okey release 32
key press 45
kkey release 45
key press 26
ekey release 26
Y el touchpad:
$ xinput test 12
motion a[0]=2565 a[1]=3570
motion a[0]=2568 a[1]=3568
motion a[0]=2571 a[1]=3567
motion a[0]=2573 a[1]=3567
motion a[0]=2575 a[1]=3568
Todas las teclas que pulsemos, estemos o no en el terminal, aparecen en el terminal.
- XWindows no implementa ningún mecanismo de aislamiento entre aplicaciones que pertenecen a la misma sesión X y, por tanto, una aplicación con acceso a la sesión puede monitorizar las teclas pulsadas, o los movimientos de ratón.
- En principio, sólo será un problema si algún programa que utilicemos
está comprometido o es malicioso. Para aprovechar
xinput
como keylogger es necesario tener acceso a la sesión X. - Utilizando
AppArmor
se puede reducir el riesgo, haciendo más difícil instalar un keylogger de forma permanente. Sin embargo, no puede evitar que una aplicación registre las pulsaciones de teclado, y si ésta tiene acceso a internet, podría enviarlas a un servidor remoto. - SELinux podría solucionar el problema. Sin embargo, las extensiones XSELinux no se cargan por defecto, no todas tienen una madurez para incluirlas en un entorno de producción, ni cuales pueden interferir negativamente en otras aplicaciones.
Esta potencial vulnerabilidad podría ser aprovechada, por ejemplo, por:
-
este script en Perl ^[1]^, que hace más sencillo reconocer qué teclas se están pulsando:
$ perl keylog2.pl Keyboard ID: 11 Watching
xinput test 11
k(shift key: 0) [45] press: k (shift key: 0) [45] release: k a(shift key: 0) [38] press: a (shift key: 0) [38] release: a r(shift key: 0) [27] press: r (shift key: 0) [27] release: r p(shift key: 0) [33] press: p (shift key: 0) [33] release: p o(shift key: 0) [32] press: o (shift key: 0) [32] release: o k(shift key: 0) [45] press: k (shift key: 0) [45] release: k e(shift key: 0) [26] press: e (shift key: 0) [26] release: e [105] press: {Ctrl} ^C -
este programa en C++,
$ g++ -lX11 keylogger.cpp -o keylogger $ ./keylogger Keylogger started
Info about X11 connection: The display is:::0.0 Width::1680 Height::1050 Connection number is 3 You’ve got a coloured monitor with depth of 24 Logging started. 1311301288.99731492996215820312: 36 k1311301290.27069497108459472656: 45 1311301290.30860710144042968750: 45 a1311301290.34145402908325195312: 38 1311301290.37259697914123535156: 38 1311301290.40374803543090820312: 27 1311301290.40377688407897949219: 38 r1311301290.43391704559326171875: 27 1311301290.43394398689270019531: 38 1311301290.46408295631408691406: 27 1311301290.46410894393920898438: 33 p1311301290.49424099922180175781: 27 1311301290.49426794052124023438: 32 33 o1311301290.52452206611633300781: 32 33 k1311301290.55576109886169433594: 32 33 1311301290.55580902099609375000: 45 1311301290.58594703674316406250: 32 1311301290.58597397804260253906: 45 1311301290.61610102653503417969: 45 e1311301290.67649888992309570312: 26 1311301290.71751308441162109375: 26 1311301291.60019397735595703125: 105 ^C
-
o este proyecto, iXKeyLog,
1 El script en Perl utiliza el módulo IO::Pty::Easy
, y para poder
probarlo en Ubuntu, no basta con la librería libio-pty-perl
que hay en
los respositorios, necesitaremos instalar el módulo de CPAN.