2019/11/13

Rescatando un touchpad



Hallé tirado el cadáver vandalizado de una Toshiba Satellite a la que le quedaba la pantalla (b140xw0 v.8), el mother, el cooler, el chip wifi (Atheros AR5B95 Wireless Network Adapter con conector mini-pcie), los mini speakers, seguro que hay una flash por ahí que no pude encontrar y el touchpad, Synaptics 920-001019-02 rev A:



Foto tomada de algún foro ruso


Primero lamenté haber tirado el circuito que había entre el touchpad y el mother, pues me había parecido que sólo le agregaba los botones físicos. Luego, cuando ví esta foto me confundí, pensé... no sé qué pensé.

http://3.bp.blogspot.com/-P5Ez1B_MFrg/UPKVd_DeK_I/AAAAAAAAB6o/dzUWOPNjT_s/s1600/synaptic-apple-mag-g3-2_v1.PNG


Ahí me dí cuenta que esas letras amarillas estan asociadas los pines del chip y no a los test points o al conector,


Tambien me sobran cables con respecto al conector DIN, entonces reflexioné:

¿Y si 4 y 5, botón derecho e izquierdo no son salidas si no entradas al dispositivo? Eso sería razonable, en caso contrario la interfaz del lado de la computadora debería entender por un lado los mensajes del mouse y por otro los botones.

Lo que debe ocurrir es que el chip lee 4 y 5 los codifica en PS/2 data como corresponde.

Seguro que en la documentación está pero siendo un auténtico programador, cuanto más tarde en leerla ¡¡mejor!!



Ayuda que esté en Amazon como un componente aislado, pues entonces no hay dependencias intermedias.



En lo más parecido a una datasheet que hallé dice que puede ser PS/2, ADB o serial, apostaré a PS/2, respaldado por la mención en esta conversación.



Con el tester y comparando con esa datashit hice este mapeo, parece bastante compatible con esto:





pin mini din 6testpointpin chipcomentario
1 +5vT20 T2244
2 dataT103spoiler: clock
3 clkT112spoiler: data
4 switchT67
5 switchT76
6 groundT2345


Esto está respaldado por GIMP, usando pencil tool + shift. Intenté con Fuzzy Select pero la imagen no tiene la suficiente calidad.





Me ofende que con respecto al otro chip estén invertidos data y clk, igual no sé si son los mismos chips...



¿Cómo sigo? ¿Le adapto un conector mini DIN 6 y lo conecto a una PC vieja? ¿Tán fácil? Ni tanto, quizás tendría que cargarle el driver del synaptic, si no me sale nunca voy a estar seguro del motivo de la falla.

El problema es que si mirás el mapeo más arriba, Data y Clock están invertidos, no tengo documentación confiable, tengo que distinguir probando cuál es cada uno.  En las menciones a T10 y T11 en esta conversación todo parece confirmar que el pin chip 2 es data y el 3 clock, tambien en esta y esta, así que será el primer intento.


Le tendría que dar power, clock y mirar que aparece en data, que es el Camino Correcto Más Difícil Pero Más Cierto. Tengo que poner Cierto y no Seguro por que Seguro me transmite una seguridad en todo aspecto y lo más seguro es que queme algo, mejor Cierto como cercano a la Verdad.

Pero, en los programas que hay en esos links y recuerdo en el pdf, hay un protocolo a seguir, me parece improbable que por el simple hecho de darle corriente y clock aparezca algo en data, igual quizás pueda confirmar el pinout.


Los 5v me condenan a usar arduino en lugar de edu-ciaa-nxp. De paso puedo probar que funcione la conexión a PS/2 con algún dispositivo así no tengo dos incógnitas a la vez.


Arduino PS/2 a teclado o mouse


Como tengo un teensy, sigo los pasos para instalar teensyduino, que consiste en bajarse Arduino IDE e instalar, tomando nota de la ruta, bajar el instalador de teensyduino, aplicar udev rules, ejecutar el instalador de teensyduino para ver que versiones de Arduino IDE soporta. En este momento soporta 1.8.10 que es la última, ijuu!!


Next, next, los next que hagan falta y darle la ruta que recordaste antes.

Por las dudas un blinky primero: ejecutar la IDE, elegir teensy2.0++ como target, buscar el ejemplo de blinky, elegir pin 6 como led, si no baja el programa de una, configurar asi:

  • usb type: serial
  • cpu speed 16 Mhz
  • port: /dev/ttyACM0 serial (teensy 2++)
  • programmer: avr isp o avr isp mkii, tira un error pero funciona...



Luego hay que bajar y copiar las librerías de PS/2 en

~/bin/arduino-1.8.10/libraries


Conectarle un mouse y ver que anda con el ejemplo.


Por suerte tengo un cajón lleno de porquerías, por ejemplo este adaptador de un montón de cosas, incluido mini din 6 pines:


(1) Data, (3) Ground, (4) 5v, (5) Clock


Tuve que usar un teclado pues parece que tiré todos los mouses PS/2 que tenía.


Usé el ejemplo ./libraries/ps2/examples/ps2_kbd/ps2_kbd.pde con

// pin 3 data
// pin 5 clock
// kdbd(clock, data)
PS2 kbd(5,3)


Separé los pines para poder meter las puntas del osciloscopio, muy bonito, otro día exploraré el encoding.

No presté atención a qué tecla oprimí, sólo sé que 71 F0 71 vino por el serial monitor



Arduino PS/2 a touchpad


Como seguimos sin saber cual es clock y cual es data, le voy a poner una resistencia de 4k7 en serie a ver que pasa.


No pasa nada, ni al derecho ni al revés, pruebo sin resistencias:




Lo que cambié con respecto al ejemplo fue ajustar los pines en

./libraries/ps2/examples/ps2_mouse/

// pin 3 data
// pin 5 clock
// kdbd(clock, data)
PS2 mouse(5,3);


y este if para que el monitor no se llene de basura:

   // send the data back up
  if (mx != 0 || my != 0 ) {
    Serial.print(mstat, BIN);
    Serial.print("\tX=");
    Serial.print(mx, DEC);
    Serial.print("\tY=");
    Serial.print(my, DEC);
    Serial.println();
  }


Listo, anda, a otra cosa, algún día lo conectaré a algo. Dos fotitos más para quienes prefieren dibujitos a leer:



 El detalle de los cables y los puntos de soldado en los TP




El sensor pegado a la tapa de una caja de tarjetas


2019/11/05

Para estudiar Free Range VHDL

Estas son los recursos de los que me he servido para estudiar y practicar el fantástico libro Free Range VHDL, que se puede comprar, se puede bajar mediante un formulario que no me anduvo o se puede generar el pdf a partir del latex:

$ sudo apt get latex-full
$ git clone https://github.com/fabriziotappero/Free-Range-VHDL-book.git 
$ cd Free-Range-VHDL-book
$ chmod 755 clean compile
$ ./compile

latex-full es un poco drástico y son 3.5 GB, seguro que hay una opción más óptima o sudo apt remove latex-full al terminar.


El libro no explica como sintetizar ni simular ni generar el bitstream ni programar el dispositivo.

Sintetizar


Probé primero con gvhdl pues está en los repos de la distribución, pero no andaban bien y el Colo me señaló esta conversación y me recomendó ghdl:




$ sudo apt install gnat-5                    ;# 100 MB

$ git clone https://github.com/ghdl/ghdl.git ;# 110 MB
$ cd ghdl
$ git checkout -b v0.36

$ mkdir build
$ cd build
$ ../configure
$ make
$ sudo make install


<nota de color>

El tener que crear el directorio build es medio chancho y se debe a que no está versionado. Hay al menos dos maneras de versionar una carpeta "vacía" en git:


$ touch build/.gitkeep 
$ git add build

o esta un poco más retorcida pero indudablemente más completa, pues si te olvidás de hacer un clean lo que haya adentro no te aparece. Un .gitignore dentro de la carpeta con este contenido:

*
!.gitignore


</nota de color>



Luego es tan sencillo como


$ ghdl -a hello_world.vhdl
$ ghdl -e hello_world
$ ghdl -r hello_world


Que en nada se va a manifestar a menos que usés std.textio o generés waveforms.

Con respecto a los nombres, -e y -r usan el nombre de la entity que haya dentro del vhdl.


Las manifestaciones pueden ser por stdout o volcar las señales a un archivo que entienda gtkwave.

STDOUT

Hay que usar una libreria llamada textio. Luego, se escriben en una variable valores con formato y eventualmente se vuelcan en stdout:


Mensajes a stdout



Además de write() existen hwrite(), owrite() y brite() que imprimen en hexa, octal y binario pero no me los entiende mi ghdl, pese a que están en el código. Son los que hacen falta para imprimir los vectores.

Tambien se puede imprimir a archivos, pero ni lo probé, no sé si intentaré solucionarlo, lo veré cuando explore más a fondo el tema de simulación.

Lo mejor que hallé es https://lauri.võsandi.com/hdl/ghdl.html

Cuidado que --help no dá todas las opciones que si están en las migajas de más abajo.



Waveform


$ sudo apt install gtkwave

Luego, en teoría, si tomás el ejemplo del lauri:

$ ghdl -a full_adder.vhd full_adder_testbench.vhd

$ ghdl -e full_adder_testbench
$ ghdl -r full_adder_testbench \
               --vcd=out.vcd \
               --fst=out.fst \
               --wave=out.wave

deberías poder usar gtkwave, pero pese a lo que dice la documentación, gtkwave no entiende out.wave. Además, los otros dos archivos, aunque son válidos y proveen información de los pines, no hay datos. O eso pensé, luego miré http://enos.itcollege.ee/~vpesonen/lisa/lab_example.html
y aunque no lo dice, logré deducir que hay que pedirle:


  1. elegir un componente en la jerarquía
  2. elegir un pin o bus en las señales
  3. append/insert/replace



Había pensado subir mis resultados de los ejercicios del libro y mis propios ejercicios a github, pero me distraje con otro libro, asi que lo que está es algo muy incompleto.

Lamentablemente no sólo me distraje con ese libro si no con todo mi proyecto de Forzando Brutalmente MD5 y perdí contacto con VHDL, en algún  momento cuando necesite, retomaré.

Para poder hacer todo esto tuve que seguir las migajas:

https://ghdl.readthedocs.io/en/latest/
https://ghdl.readthedocs.io/en/latest/building/Building.html
https://ghdl.readthedocs.io/en/latest/building/mcode/GNULinux-GNAT.html
https://ghdl.readthedocs.io/en/latest/using/Simulation.html
https://vhdlguide.wordpress.com/2017/09/22/textio/

La conversación previamente mencionada me llevó a este interesante documento, http://qucs.sourceforge.net/docs/tutorial/digital.pdf

2019/10/07

Ejemplo de rescate de memoria de cámara

Un pariente borró accidentalmente sus fotos y videos de una cámara que encima tiene rota la tapita de las pilas, detallo acá lo hecho para restaurarlas:

El camino fácil


Primero, obtener una imagen de la memoria, hay que insertarla y ver que dice dmesg cómo encontrarla:

[69.899754] sd 8:0:0:0: [sdb] 7741440 512-byte logical blocks: (3.96 GB/3.69 GiB)
[69.906898] sdb: sdb1


Para ser estrictamente forenses, debimos haber desactivado el automount, para evitar cualquier escritura sobre el disco, en particular en Mint Mate me parece que con

gsettings set org.mate.meda-handling automount false

ya estamos. Recordá que si el disco se monta automáticamente, se hace read write y algo toca, aunque en este caso no debería hacer diferencia.

Luego con fdisk explorarla, por curiosidad y costumbre:


$> sudo fdisk /dev/sdb -l
Disk /dev/sdb: 3,7 GiB, 3963617280 bytes, 7741440 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start     End Sectors  Size Id Type
/dev/sdb1        8192 7741439 7733248  3,7G  b W95 FAT3
2

Otro motivo para no tomar la imagen hubiese sido estar recuperando información de un almacenamiento mayor al espacio disponible.

Para buscar lo borrado, el programa photorec ha resultado muy efectivo,

sudo apt install testdisk

Puede trabajar directamente sobre la memoria con sudo o sobre la imagen, mejor sobre la imagen, de paso no le damos sudo.

photorec sd.img

Con sudo seguramente hubiese mostrado la sd.


Hay que elegir si revisar todo el disco o la partición que encuentra, en este caso la partición. Si se hubiera borrado la tabla de particiones... whole disk.


Hay que elegir el formato, en este caso sabemos


 Elegimos que busque en toda la partición


 Y finalmente donde dejar lo rescatado




En el caso de esta vieja Kodak, recuperó imágenes y videos como esperábamos y además unos xmls, .ini y sqlite que como no aportan nada los ignoré.

Las fotos que comienzan con f son fotos, las que comienzan con t son previews.

Para ver el resultado, en Mint y parecidos con abrir la primera imagen se puede ver con el visor y luego pasar a modo galería o ir avanzando con la flecha. Como detalle de calidad se pueden rotar las imágenes que lo necesiten y al salir de visor ofrecerá guardar

Como no estaba seguro del orden, ejecuté el siguiente script que extrae la fecha de la metadata y compone un nuevo nombre:



Pongo una imagen en lugar de texto en parte por que se vé mas lindo, en parte por mala gente así tenés que tipear, lo cual te ayuda a familiarizarte con bash.


Con respecto a videos rotados, se pueden corregir con:


ffmpeg -i f0316864.avi -vf "transpose=2"  fixed.avi


o mejor aún con:


mencoder -vf rotate=2 f0316864.avi -oac copy -of lavf -lavfopts format=mpeg4 -ovc lavc -lavcopts vcodec=mpeg4 -o fixed2.avi


que conserva la calidad. El format y el vcodec dependeran del formato del video.

He visto recomendado usar avidemux pero ya teniendo ffmpeg y memcoder instalados, preferí no seguir instalando cosas. Quizás avidemux resuelva automáticamente lo del formato.

El camino difícil


No me gustan mucho los hubiese, seguramente, hubiera, supongo que dejé  más arriba, así que borré la tabla de particiones de la sd y trabajé directamente sobre ésta, para recorrer el camino de sudo y la falta de espacio.

Mirando más arriba la salida de fdisk dice que la partición empieza en 8192 * 512 y mirando lo primero que encontré, la tabla de particiones está bien al comienzo.



sudo dd if=/dev/zero bs=1024 count=1 of=/dev/sdb

Ojo que si te equivocás con of podés perder el disco. Si me dedicara a esto probablemente siempre usaría una virtual o una máquina de descarte. Si te equivocás con count o bs lo suficiente, te metés con los datos, por ello es mejor trabajar sobre la imagen previamente obtenida, pero no olvidemos que esto es un ejercicio, nunca necesitaríamos borrar la tabla de particiones.

Tampoco uses if=/dev/null, ya que como input no te da nada y nada escribe, necesitás ceros.




sudo photorec /dev/sdb



Si no le decís explícitamente la ruta, te muestra lo que haya.




Le dás Search, Other... (me faltó la captura y ya me aburrí)



 y anda otra vez.




Detalles de terminación


Además, la cámara estaba un poco rota, la tapita no cerraba por que volaron las muesquitas en la bisagra y en la punta contraria.



Lo bueno es que tiene para atornillar, sólo hay que hallar la pieza apropiada y el tornillo apropiado para no usar cinta adhesiva, para algo llevo años juntando tornillos y todo tipo de basura, como un perfil de aluminio de mosquitero:




Los comandos acá utilizados y otros de utilidad los comparto en github.

2019/09/22

Cambiando de grupo sin reiniciar sesión

¿Te ha pasado que acabás de instalar un programa que accede a hardware y te dice que para poder usarlo tenés que reiniciar a la windows viejo?

Algunas situaciones pueden ser VirtualBox para conectarle los USB, wireshark para acceder a las interfaces sin ser root, acceso al puerto serial y quizás al scanner.

Lo que ocurre es que necesitás pertenencia a un grupo, no es algo que se aplique así no más, hay varias maneras:

Reiniciar la sesión

Es lo que no queríamos hacer, pero si eres tan gallina, es lo tuyo.

Iniciar una nueva sesión

Artera comadreja, ok, no cerraste la sesión y te abrís una al lado con otro usuario. Te dejo de ejercicio fijarte si podés iniciar dos sesiones de XWindows del mismo usuario.

"Iniciar" una nueva sesión

¡Es la opción correcta! Una vez que estás en el grupo con, por ejemplo, addgroup, hacés su --login USER y estás adentro




Esto es para esta terminal, en las otras aplicaciones seguís afuera, pero desde esta terminal podés abrir el programa que acabás de instalar.

Unirte al grupo


Esta opción es medio rara, no la usa nadie y consiste en que a un grupo se le puede dar una clave con gpasswd, que queda en /etc/gshadow, igual que /etc/shadow, luego haces newgrp.



Ejemplo de acceso a la carpeta de USB de VirtualBox:


Esta tambien es para la terminal y te dejo como ejercicio fijarte si altera a las aplicaciones ya abiertas.

Resultado


Este es el comportamiento para acceder a USB desde VirtualBox

Primero no estás en el grupo vboxusers.


La VM arranca todo bien, pero cuando le querés conectar algo...







De cualquiera de las maneras, una vez que estás en vboxusers


Podés conectarle lo que haya en USB



Siempre...


...es mejor tomar una de estas acciones y evitar como la plaga usar sudo, pues está vez te va a funcionar, pero la próxima que hagas login, quizás te creó archivos en tu home con permisos de root y vas a tener que limpiar el desastre.

Además siempre que puedas ejecutar algo sin ser root (ni sudo) es más seguro pues tenés una defensa adicional frente a un ataque, que es que obligás a quien te ataca a escalar privilegios.

Fijate que ni mencioné la posibilidad de hacer login como root. Es de adolescentes, sentir el poder, la adrenalina. Pero una vez que aprendiste a usar *nix, madurás y sólo usás tu poder cuando hace realmente falta.


Y ya que estamos...



Como me molesta que me digan a la windows, reinicie para que los cambios sean tomados, aviso que cuando se instalan los drivers de virtualbox para poder entre otras cosas cambiar el tamaño de la pantalla, no hace falta reiniciar el sistema completo, sólo X-Windows, o sea, que con hacer logout y login alcanza, ya lo probé varias veces.

Para poder acceder a shared folders,

sudo addgroup USER vboxsf


Y más


Si quisieras crear grupos interesantes como kismet, docker y wireshark antes de instalar esos paquetes, no sé para qué, tenés que crearlos con el parámetro

--system.


2019/09/19

Juegos de cálculo seguro distribuido

En ECI 2018 hubo un curso de cripto donde mostraron varias maneras de que un grupo de adversarios puedan ejecutar cálculos con información que tienen sin compartirla, por ejemplo, empresas pueden calcular promedio de fraudes  sin que ninguna revele sus cifras.

Para mostrarlo de modo intuitivo tanto para charlas internas en el trabajo como para H4CKED 2019, he desarrollado dos juegos que paso a compartir.


En ambos casos se supone que la transmisión es completamente secreta.

Con azar

La idea es que hacemos una ronda de personas, donde la primera toma su número y le suma otro al azar, guardando ambos en secreto. El resultado se lo pasa a la siguiente participante, que le suma su número y así hasta dar la ronda completa. La primera persona le resta el número al azar a lo obtenido y tiene la sumatoria de todas las participantes, que ya puede compartir. Cualquiera divide por la cantidad de participantes y ya tenemos el promedio que queríamos.






La debilidad de este algoritmo es que cualquier par de participantes separadas por una sola persona puede atacar a esta, pues saben el valor de entrada y el de salida, cuya resta es el valor de la víctima.


Con descomposición

Una mejor versión invulnerable al ataque anterior consiste en que cada participante descompone su valor en tantos sumandos al azar como participantes hayan y envía uno a cada participantes. Cada participante toma los sumandos recibidos, los suma y comparte el resultado. Estos resultados se suman, se divide por la cantidad de participantes y nuevamente tenemos el promedio que buscábamos.








El escenario de ataque factible para este caso es que todas las participantes menos una se pongan de acuerdo para atacar a esa. Sabiendo el total, se le resta el acumulado por las atacantes y tenemos el valor de la víctima.

Multiplicación


Tambien se puede multiplicar de esta manera, con factores, salvo que si alguien tiene un cero, al menos una participante va a saberlo. Quizás habría que agregar algunas rondas de intercambio, pero para un juego ya se complica innecesariamente.

En el caso del primer juego, se puede multiplicar un cero cerca del comienzo es más identificable que al final.


Otras maneras


Hay otras maneras pero no son tan intuitivas, al menos para quienes no sabemos más que matemáticas básicas, así que no son candidatas para juegos didácticos como estos. Tampoco sé si resuelven el problema del cero en la multiplicación.

Acá tenés las tarjetas por si querés jugar







2019/09/06

Diagnostico de HTTP Headers con Polymer y Node Express dentro de TLS


El Problema

Estoy haciendo una miserable aplicacioncita con Polymer del lado del cliente y Node Express como API, siendo servidas de distintas URLs, ambas con TLS.

Al intentar agregar un Custom HTTP Header en lugar de ver un:

api_1 | { connection: 'upgrade',
api_1 |   host: 'api.techu.example',
api_1 |   'user-agent': 'Mozilla/5.0 ...Firefox/57.0',
api_1 |   accept: 'text/html,application....9,*/*;q=0.8',
api_1 |   'accept-language': 'en-US,en;q=0.5',
api_1 |   'accept-encoding': 'gzip, deflate, br',
api_1 |   'access-control-request-method': 'GET',
api_1 |   'access-control-request-headers': 'content-type',

api_1 |   'X-Practitioner-Auth': '2',
api_1 |   origin: 'https://www.techu.example' }



veo


api_1 | { connection: 'upgrade',
api_1 |   host: 'api.techu.example',
api_1 |   'user-agent': 'Mozilla/5.0 ...Firefox/57.0',
api_1 |   accept: 'text/html,application....*;q=0.8',
api_1 |   'accept-language': 'en-US,en;q=0.5',
api_1 |   'accept-encoding': 'gzip, deflate, br',
api_1 |   'access-control-request-method': 'GET',
api_1 |  'access-control-request-headers': 'content-type,x-practitioner-auth'
api_1 |   origin: 'https://www.techu.example' }



y un 

NetworkError: A network error occurred

en la consola del browser.



Como no entiendo en absoluto por qué esta ocurriendo esto, quiero descartar capas intermedias, quiero ver el tráfico de red, pero está con TLS.


No me interesa tanto mostrar la solución al problema que es CORS sino el camino seguido, centrándome en la dificultad de que haya TLS de por medio.


Alcance y consideraciones


Tengo la clave privada del servidor pues estoy en un ambiente de test y yo generé las CAs.


Tuve suerte, la ciphersuite que acordaron el servidor y el cliente es descifrable por wireshark. Según leí por ahí, hay ciertas combinaciones que lo son y otras que no. Hay maneras de forzarla.

Linux Mint 19.x.

Para variar, no sé casi nada de Polymer, Node, CORS, pero se parece a cosas que he aprendido y olvidado varias veces.


Instalar wireshark 


sudo apt install wireshark-qt

Cuando pregunta si permitir a usuarios comunes capturar en modo promiscuo, decile que si.

Luego hay que agregar el usuario al grupo y reiniciar la sesión.

sudo addgroup practitioner wireshark

Configurar el browser


Pedile al browser que deje disponibles las claves de sesión en un archivo:


SSLKEYLOGFILE=/home/practitioner/sslkeylog.log firefox


Para un launcher es parecido:


Si lo estás editando



Si lo estás creando





Una vez arrancado el browser, hay que identificar en que interfaz capturar. Podés usar ANY, pero estando con Docker mejor ser más especìfico. Sospecho que localhost es el lugar, pero comprobémoslo generando tráfico:


Tráfico en localhost y algunas interfaces de Docker


Localhost ok.


Luego hay que pedirle a wireshark que mire el archivo del browser:


(Pre)-Master-Secret log filename


y las private del sitio o sitios, yo tengo API y www, claro, si este problema se trata de algo de cross domain...



Private Keys



Mejor vaciar la cache, cerrar y volver a abrir el browser, para que no esté lleno de 304 y que agarre toda la sesión TLS.




Si tuviste éxito, vas a ver una solapita abajo que dice "Decrypted SSL"

No están de más algunos filtros como:

tcp.port == 443 && ssl.record.length > 66

La primera parte es para sacarse de encima lo que no es TLS, pero sólo si tenés la certeza que tu tráfico es sólo TLS.

Para tener esa certeza tendrías que activar en el servidor HSTS


La segunda es para eliminar los keep alives y otra información administrativa del canal. No hallé o al menos no busqué mucho como filtrar dentro del tráfico TLS, por ejemplo si quisieras sólo los GET, frame matches xxx no anda. No digo que no haya.

Con "Follow HTTP Stream" se pone mucho más amigable



Me apoyé en varias fuentes, fundamentalmente https://packetpushers.net/using-wireshark-to-decode-ssltls-packets/, donde hay más detalles relativos a las ciphersuites soportadas y como ajustarlas.

A diagnosticar

El encabezado sale "mal" desde el browser, no es problema de la API.



¿Qué estoy haciendo en el browser? Hago lo natural:


request.setRequestHeader('X-Practitioner-Auth', 'tok');

¿Qué hay de malo con eso?

Leyendo https://www.html5rocks.com/en/tutorials/cors/ inferí que el problema probablemente viene por el preflight fallido de CORS, que es ese OPTIONS sin GET posterior.

O sea que lo que puse en amarillo en realidad está ok, no me había dado cuenta que era en OPTIONS.... mejor no voy a decir nada por que no sé bien, aunque lo haya arreglado.



Supuse que la falla era tener en el middleware:


app.use(function(req,res,next) {
  res.setHeader('Access-Control-Allow-Origin','https://www.techu.example');
  res.setHeader('Access-Control-Allow-Headers','Content-Type');
  next();
});


en lugar de

app.use(function(req,res,next) {
  res.setHeader('Access-Control-Allow-Origin','https://www.techu.example');
  res.setHeader('Access-Control-Allow-Headers','Content-Type','X-Practitioner-Auth');
  next();
});



Pero no, no anda ni a palos. Despues de muchas vueltas llegué a que hay que usar CORS y listo:

npm install cors 

y en la API

const cors = require('cors');
var corsOptions = {
  origin: ['https://www.techu.example'],
  allowedHeaders: ['Content-Type', 'Autorization']
}

app.use(cors(corsOptions));


Un poco de CORS:


En resumen, en el comienzo todo era caos y promiscuidad, luego hubo SOP (Same Origin Policy) por motivos de seguridad pero eso complicaba la operativa así que hoy hay CORS (Cross Origin Resource Sharing), que es un mecanismo para que un servidor le diga a un navegador que puede ser llamado desde código provisto por otro sitio.

Que quede claro que CORS no afecta a una herramienta como Postman, en los navegadores incluso se puede deshabilitar. Dicen por ahí que con  --disable-web-security en chrome, no way firefox.

Me parece mejor implementarlo bien.


Mucho más largo, algún día...

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS




2019/08/22

H4CK3D 2019 - The missing pieces


Otra vez en H4CK3D, gracias a Javier Vallejos y Fabián Portantier de Securetia y a la UP


Cuesta trabajar y asistir a todo el evento, pero pude verla a Yamila Levalle (@ylevalle) exponer algo muy razonable: los SIEMs tienen que estar correctamente desarrollados y configurados, no dejan de ser aplicaciones, que fué lo que mostró en... Blackhat usa 2019 qué capa!

Tambien a Diego Bruno y Jorge Martín Vila, mostrando OSINT relacionado a lavado de dinero, les costó meter todo el tema en el tiempo asignado, jiji.

Finalmente Gerardo D'onofrio expuso la herramienta EJBCA, para certificados, muy interesante. Y ahí me tuve que ir y no pude volver.

El nerd de Schrödinger...


Con respecto a lo que yo expuse, ha sido rara la experiencia, normalmente todo el mundo siempre te dice que salió bien, nadie que mal.

Tambien suelen haber fallas técnicas y no técnicas, como una OWASP hace mucho en la que estando a punto de mostrar un ataque, no pude encontrar el archivo pese a tener la ruta escrita delante de mis ojos. Fallas técnicas que me hayan ocurrido a mi no recuerdo pero si a otras personas.

Esta vez hubo una falla técnica de origen humano. En una de las partes de SDR con gqrx iba a escuchar una radio y el audio de un canal de TV, pero no tenía audio. Esta ausencia m hizo desistir de mostrar la transmisión de radio con un adaptador USB-VGA.

Eso en realidad fue el impacto de la falla, que fue que el battery pack se apagara y que no recordara que eso podía ocurrir, la falla humana original.


Pienso que actué correctamente al no ponerme a diagnosticar la falla, que como siempre ocurre es ínfima, pese a los resultados espectaculares.

Tambien hubo otra falla leve, al intenter leer la banda magnética el lector estaba lejos de la antena y otra que en lugar de leer el controlador de la alarma de una asistente debí haber traido uno del que ya tuviera identificada la frecuencia.

Estas fallas que me persiguirán en mis pesadillas hasta el fin de los tiempos, bajaron un poco el nivel técnico pero tembien me obligaron a hacerla más entretenida. No hubo menos información, faltaron pruebas, no es lo mismo decir que esa franja naranja es el audio que escucharlo.



Ahora, las missing pieces.



Lector mental

 

El componente es mindwave mobile, no el dos:

https://store.neurosky.com/

El programa:

git clone https://github.com/robintibor/python-mindwave.git

Hay que ejecutar primero blueman-manager




Me encantaría explorar la API, pero tiene baja prioridad, vuelve al cajón del futuro.



Sintonizando


Esta fue la parte sin audio, usando un receptor de DVB-T
 

Esta es una radio común:



Y esto el audio del canal 13:





La captura de pasar la banda magnética, no ha vuelto a dejar trazas pese a que puse la antena bien cerca.

La alarma del auto, las franjas:




Saquen sus teléfonos



Mientras me divertía un poco a costa de los asistentes, mostré un artefacto que había levantado de un volquete unos días antes cerca del trabajo. Es parte de una central inteligentísima de fines de los ochenta, HABIMAT HT-X.


http://www.aeby-tec.ch/htx/






Tiene un 68k y en el medio esa cosa roja y blanca es un eprom con ventanita montado en un adaptador, muy bueno, todo de alta calidad, las roscas de los tornillos en el plástico son de bronce, este equipo tiene como treinta años y se abrió con un soplo, mirá el destornillador que usé por que era lo que tenía a mano, normalmente busco algo con mango más grande para poder hacer fuerza.





Separada la pantalla, que es lo que más me interesa, en un primer examen no pude identificar el modelo.


Ver lo que hay en el chip o descifrar el protocolo de la pantalla son ambos muy buenos ejercicios, pero por el momento van al cajón del futuro, a menos que cambie de idea en un impulso repentino.


USB VGA


Vale poco y con este programita anda, con un delay de tres o cuatro segundos:


git clone git://git.osmocom.org/osmo-fl2k

sudo apt install libusb-1.0-0-dev
mkdir build
cd build/
cmake ../ -DINSTALL_UDEV_RULES=ON
make -j 5
sudo make install
sudo ldconfig
sudo udevadm control -R
sudo udevadm trigger
sudo apt install sox pv






Hay que obtener el nombre de lo que se está escuchando:


pacmd list-sources | grep name | grep monitor
    name: <alsa_output.pci-0000_00_1f.3.analog-stereo.monitor>



y usarlo

 


pacat -r -d alsa_output.pci-0000_00_1f.3.analog-stereo.monitor |\
sox -t raw -r 44100 -e signed-integer -L -b 16 -c 2 - -c 1 -e signed-integer -b 16 -t raw - \
biquad 4.76963 -2.98129 0 1 0.788833 0 sinc -15k loudness 5 | \
fl2k_fm - -s 130e6 -c 35e6 -i 44100



Probablemente sacado de https://www.rtl-sdr.com/setting-up-and-testing-osmo-fl2k/


SDR

 

En general para SDR, que fué lo anterior, los componentes que usé no son muy útiles, si realmente fuera a estudiar, investigar o trabajar algo de SDR usaría algo como HackRF One. que es un poco carita, u$s 315 y mucho peor en ML, u$s 365 usado o u$s 750 nuevo.

El juego del cálculo distribuido seguro


Lo dejo aparte en... pronto...

Las claves compartidas


Gracias a que la charla es para una hora, mis varios extravíos no previstos y la participación de la audiencia, esto quedó afuera, pero la idea es sencilla:


Si queremos que de un grupo de personas hagan falta al menos dos para destrabar algo que está con una clave, repartimos entre las personas puntos de una función. El sistema autenticador conoce la función pero no sabe a que altura está, la clave real es la intersección de esa función con el eje Y.

¿Querés más personas necesarias? Aumentás el grado.



Fin



Si te interesa algún detalle extra, preguntás.