Quantcast
Channel: Seguridad Agile
Viewing all 264 articles
Browse latest View live

Usando un touchpad con USB

$
0
0
Me había quedado dormido en el éxito de leer mensajes de desplazamientos sobre un touchpad recuperado de una laptop muerta, sin ningún beneficio tangible.

Para darle utilidad, necesitaría que se comporte como un mouse. Para ello aprovecharé que los teensy saben como comportarse como USBs.

Este código funciona ok eligiendo:

Tools->USB Type->"Serial + Keyboard + Mouse + Joystick"


#include <ps2.h>

PS2 touchpad(5, 3); // (clock, data)

void touchpad_init()
{
 touchpad.write(0xff);  // reset
 touchpad.read();       // ack byte
 touchpad.read();       // blank 

 touchpad.read();       // blank
 touchpad.write(0xf0);  // remote mode
 touchpad.read();       // ack
 delayMicroseconds(100);
}

void setup()
{
 Serial.begin(9600);
 touchpad_init();
 Serial.println("init");
}

void loop()
{
 char mstat, mx,  my;

 touchpad.write(0xeb);  // give me data!
 touchpad.read();       // ignore ack
 mstat = touchpad.read();
 mx = touchpad.read();
 my = touchpad.read();

 if ( mx != 0 || my != 0 ) {
   Mouse.move(mx, my);
   Serial.print(mstat, BIN);
   Serial.print("\tX=");
   Serial.print(mx, DEC);
   Serial.print("\tY=");
   Serial.print(my, DEC);
   Serial.println();  

 }
 delay(25);
}


Se puede jugar invirtiendo las posiciones de mx y my, cambiando los signos y aplicando un factor de escalamiento.

Supongo que no habrás podido dejar de notar la ausencia de botones, es que no me interesaban pues la verdad es que usar un touchpad me resulta bastante espantoso.

Luego lo pensé mejor y me dije: los botones son pulsadores, que probablemente ya tengan el debouncing resuelto.

Además hay muchas patitas, incluso en esta imagen de otro modelo se puede ver que pueden haber otras funcionalidades extra, como page up/down.





¿Quién no ha visto esos mouses que tienen muchos botones?

Si tengo un sistema embebido que necesita un touchpad y botones, capaz que me puedo ahorrar un montón de pines y debouncing si puedo identificar todos los botones que pueda soportar el chip.

Con respecto a "un montón", no hay tal, a lo sumo cuatro pues por fìn me he rendido y he consultado lo más parecido a documentación.

¿Cómo explorar esto?

Primero voy a explorar el comportamiento de los dos pines que supongo que son los botones.




Al ponerlos a tierra que es el modo que la documentación dice, obtengo esta salida:

1001    X=0    Y=0
1001    X=0    Y=0
1001    X=0    Y=0
1001    X=0    Y=0
1001    X=0    Y=0
1010    X=0    Y=0
1010    X=0    Y=0
1010    X=0    Y=0
1010    X=0    Y=0
1010    X=0    Y=0

Así que está claro, un botón es mstat[0] y el otro mstat[1]

Pensé que si no hubiese habido debouncing por hardware y se va a usar un microcontrolador en el medio, éste se puede encargar del debouncing, incluso hay un Bounce.h disponible en

 ./hardware/teensy/avr/libraries/Bounce/Bounce.cpp

pero no tiene mucho sentido ya que por el simple hecho que esté el clock ya va a filtrar



Ahora voy a probar con los botones de up y down, no, no anda, ningún Test Point genera ningún mensaje

testpointpin chipcomentario
T20 T22445V
T23 45ground
T103clock
T112data
T67left
T76right
T58up? no
T49down? no


Este es el código definitivo del loop() con los mensajes de botones del Mouse hacia el host:

void loop()
{
 char mstat, mx,  my;
 static boolean mouse_left = false;
 static boolean mouse_right = false;

 touchpad.write(0xeb);  // give me data!
 touchpad.read();       // ignore ack
 mstat = touchpad.read();
 mx = touchpad.read();
 my = touchpad.read();

 if ( mx != 0 || my != 0 ) {

   Mouse.move(mx, my);
   Serial.print(mstat, BIN);
   Serial.print("\tX=");
   Serial.print(mx, DEC);
   Serial.print("\tY=");
   Serial.print(my, DEC);
   Serial.println();
 }
 if (! mouse_left && ( 1 & mstat)) {
    Mouse.press(MOUSE_LEFT);
    Serial.println("\tLB press ");
    mouse_left = true;
  } else if (mouse_left && ! ( 1 & mstat)) {
    Mouse.release(MOUSE_LEFT);
    Serial.println("\tLB release ");
    mouse_left = false ;
  }
 if (! mouse_right && ( 2 & mstat)) {
    Mouse.press(MOUSE_RIGHT);
    Serial.println("\tRB press ");
    mouse_right = true;
  } else if (mouse_right && ! ( 2 & mstat)) {
    Mouse.release(MOUSE_RIGHT);
    Serial.print("\tRB release ");
    mouse_right = false ;
  }

 delay(25);
}


y estas las fotitos con los botones





Como dispositivo apuntador apesta, pero seguramente lo pueda usar para otra cosa, veremos.

Resolución de problemas sin google.

$
0
0
o los senderos que se bifurcan.

El problemo



Me hallaba instalando MCUXpresso que es una IDE basada en eclipse para desarrollo de sistemas embebidos de NXP para poder programar la mimxrt1020-evk que NXP me regaló. El instalador es un archivo armado con Makeself.



El inicio del instalador

Este archivo es una concatenación entre un enorme comprimido y un encabezado que hace unas verificaciones, descomprime y ejecuta lo que hay en el comprimido.



El inicio del payload binario

En este caso en particular, supongo que usa apt/dpkg para instalar dependencias y dejar todo prolijito. Al final llama a las configuraciones pendientes y tiene una falla que hace meses que está ahí y nunca me había molestado, hasta ahora.


Tomá nota del exit status 6

Momento de decisión: buscar situaciones parecidas con google (no) o escarbar por mis propios medios (si).

Podemos ver que el paquete es kismet y que tiene que ver con un usuario inexistente. Tambien podemos ver que más que una instalación de MCUXpresso es una reinstalación (unpacking xxxx over xxxx) y no vemos que fué lo que instaló, claro, las dependencias ya quedaron en el primer intento y recién se me ocurrió documentar luego.

Me imagino que cuando instalé kismet me mandé alguna macana con los usuarios y kismet ofrece ajustar los permisos para que algunos usuarios puedan hacer cosas que normalmente requieren privilegios sin tener que usar root o sudo.

En los scripts debe haber una linea como:

dpkg -i JLink_Linux_x86_64.deb mcuxpressoide-11.1.1_3241.x86_64.deb

que al final dispara una acción que lleva a ese error.

Para comprobarlo debería descomprimir el payload o instalar y observarlo mientras esté descomprimido, pero prefiero suponer que no tengo acceso o que el instalador está tomando medidas defensivas, también me obliga a entender como funciona Makeself que aunque no debe ser muy misterioso me resulta completamente carente de interés, Makeself es circunstancial, es más productivo aprender del sistema común.


Momento de decisión: analizar y modificar al instalador (no) o replicar comportamiento (si).



Necesito reproducir el comando mínimo con el mismo resultado. No me preguntes de dónde lo sé, evidentemente es el humus estratificado de mi mente, pero sé que:

sudo dpkg --configure kismet

debería servir y así es:




El siguiente paso es ver que archivos está abriendo con strace

sudo strace -f -eopen dpkg --configure kismet

Trae dos cosas interesantes:



Fijate que coincide el 6 con el 6 de la captura.


Un archivo interesante para mirar



Agregando que nos muestre las lecturas:

sudo strace -f -eopen -eread dpkg --configure kismet


Tomá nota del GET kismet/install-users

En los read() de arriba, se ve pasar el nombre del usuario inexistente. Esa forma de letrita por letrita primero apuesto a que es indicio de un pipeline entre procesos. Pero no lo pude reproducir, así que quizás sea algo tipo expect, un proceso pasándole letritas a otro interactivo.


Volviendo al archivo interesante, /var/lib/dpkg/info/kismet.postinst, este hace una llamada que coincide con el GET de más arriba:



Ahí le agregamos a continuación de usermod:

echo "########### group $GROUP x $x "

y ahora tenemos:


El siguiente paso es comprender como funciona db_* para modificar el usuario.

Al inicio se incluye /usr/share/debconf/confmodule, dentro de ese archivo vemos los comandos disponibles:
 

Hay tantos debconf que no podemos menos que preguntar a man debconf de qué se trata:





Para ver debconf-devel hay que instalar debconf-doc.


Momento de decisión: esto tendría que habérseme ocurrido en el primer momento: puedo desinstalar kismet (no), agregar el usuario faltante para que termine la instalación (no) o seguir por este camino (si).


Leemos superficialmente man debconf-devel y deducimos que con db_set nos arreglamos:


. /usr/share/debconf/confmodule
db_get kismet/install-users
echo $RET
db_set kismet/install-users XXXXXX
db_get kismet/install-users
echo $RET



Me vas a tener que creer que primero dice un usuario y luego otro

Apuesto a que el instalador ahora anda:


Gané, me anoto quitar ese echo.




Queda entonces para que google le responda al próximo que no quiera pensar mucho:

dpkg: error processing package
subprocess installed post-installation script returned error exit status 6
Errors were encountered while processing:
E: Sub-process /usr/bin/dpkg returned an error code

Consideraciones de ciberseguridad y coronavirus

$
0
0
Con el asunto de las cuarentenas de coronavirus, comparto algunas reflexiones, algunas con conocimiento de causa, algunas de mi sentido común ciberseguro resultado de mi profesión. Pese a que me había prometido evitar las notas poco técnicas y teñidas de opinión como va a ser esta, me parece que la situación lo amerita.

Esto no es una guía o manual de trabajo y estudio remoto, sólo algunas ideas rápidas que pueden ser útiles. Al no ser muy técnica tambien está orientada más al usuario final que a quien deba armar soluciones.

Cuando digo conferencia me refiero de modo genérico a conferencia, charla, clase, reunión o lo que sea en que varios participantes intercambian streams de audio y video, provenientes de una cámara o de la pantalla.

Si en el correr de los días de la cuarentena ocurre algo interesante, actualizaré.

Primero lo más evidente:

Atención al phishing y las estafas



Han habido estafas que se han aprovechado incluso de las torres gemelas, esta es una oportunidad tan buena como cualquier otra.




Servidores de conferencias


¿Propio o ajeno? ¿cloud u on premise? Si te lo instalás en tu propio servidor (que puede ser cualquier máquina, sólo hace falta que tenga IP pública, no necesariamente fija), el problema que tenés es que ante un ataque dirigido probablemente seas presa fácil, pero ante esquemas de vigilancia generalizada estás mejor, sobre todo si el tráfico está cifrado. Un ataque a un servidor ajeno en cloud tiene la ventaja de que probablemente afecte a innumerables otras personas y empresas, con lo cual el impacto se distribuye, si no sos importante, vas a estar abajo en la lista de explotación.


El cifrado puede ser:

Inexistente: cualquiera con acceso al tráfico que conozca los protocolos y formatos utilizados puede escuchar.

Entre servidor y cliente: el servidor determina las keys utilizadas, es su elección inspeccionar o grabar las conversaciones.

End-to-end, esto es, entre cada cliente: el servidor no entiende las conversaciones.

Sin duda el cifrado aumenta la latencia y el procesamiento, no sé si lo hace de modo significativo.

Lo más probable es que no te importe mucho y termines en google algo o zoom.

Documentos compartidos


Quizás antes no tenías que hacerlo tanto, pero seguramente ahora sí, compartir documentos con terceros. Fijate que hay opciones de acceso, evitá como la peste "todo el mundo" y "cualquiera con acceso al link", a menos que sea tu propósito.

Tambien reducí el acceso de "total" a "lectura" o "comentarios" según corresponda y explorá la posibilidad que al menos google ofrece de no permitir copiar ni salvar, pero no cuentes con eso, siempre se pueden sacar fotos de pantalla desde la compu o afuera.

Tené en cuenta que al estar accediendo a un documento compartido otras personas que accedan simultáneamente te verán y quizás no querías divulgar esa información.

Redes sociales y chats


Imaginate que estás compartiendo tu pantalla con gente de tu organización y de otra y alguien de la otra organización es muy infla pies y alguien de la tuya te hace un comentario al respecto. Y aparece abajo a la derecha el mensajito "qué pesado que es Estaban!!". ¡Qué momento incómodo!


Mitigación: desactivar notificaciones.

Mitigación: virtualizar, el uso de una máquina virtual en una conferencia tiene el efecto colateral extra de evitar los popups con mensajes si tenés las cuentas separadas.

La responsabilidad


Cuando entré a mi trabajo de ciberseguridad, que en ese momento se llamaba de otra manera, una de las primeras cosas que me enseñaron en los pasillos fue: "Siempre cuidate el trasero". No fué exactamente con esas palabras, te podrás imaginar...


Si tu organización te da unas herramientas de acceso remoto, usá esas y no otras, si algo sale mal, siempre podés decir "yo seguí los lineamientos dictados". Puede parecer señal de cortedad de entendederas, pero que tu astucia no te haga ser instrumento de un ataque.

Si hay alguna actividad que no podés hacer o es muy incómodo o te lleva mucho tiempo de modo remoto sin violar las reglas de la organización, no la hagas, mala suerte, elevá y que la organización resuelva.

Que no te pase como a alguien que me contaron que puso su número personal de celular en el contestador del trabajo como contacto de emergencia siendo una persona sin rango ni responsabilidad por que el dueño no puso el suyo.

Registro


¿Vas a querer que lo ocurrido quede registrado o no? Si así lo deseás, no olvidés revisar y activar las opciones que la plataforma te brinde. Está bueno hacer algunos ensayos hasta dominar esas opciones a encontrarte con que perdiste el registro.

Si perdés le registro, decimos que afecta a la Disponibilidad de la Información.

En caso contrario, no hagas la actividad, ya que no importa lo que la aplicación te prometa, que no almacena, que borra, con una simple cámara de video apuntando a la pantalla de cualquier participante va a haber registro.

La Confidencialidad de la Información abarca al registro no deseado, una vez que ésta es comprometida, tambien lo es el registro. Si te preocupa la confidencialidad sobremanera, no hagas la actividad.


Amo de mis silencios, esclavo de mis palabras.


Pérdida colateral de información


Tenés que detectar toda la información que estás compartiendo, evaluar que aporta compartirla y en qué te afecta. Si no aporta, aunque no te afecte, no la compartas, no sabés si en el futuro lo puede, ese banderín de tu partido o tu arco iris de respeto de género se te puede cobrar si los vientos cambian.

...o el afiche de New Kids on The Block...


La experiencia más imporante de pérdida accidental de información que he presenciado es que es común mostrar en pantallas compartidas en vivo credenciales, por lo general de acceso a alguna aplicación o a la plataforma de conferencias.


Mitigación: usar keepass o similar, que permite copiar y pegar url, usuario y clave sin que se muestren en pantalla y además tras unos segundos se borra del portapapeles el dato, reduciendo la posibilidad de pegarlo accidentalmente luego. Es lo mejor ya que las claves están cifradas y la ventana de ataque dura desde que se copia el dato en el portapapeles hasta unos pocos segundos despues.


Mitigación: esta es la más, usar fondo del mismo color que la letra para que no se vea accidentalmente. Es un excelente ejemplo de camouflage, seguridad por oscuridad. Aunque es increiblemente inseguro, es muy efectivo contra el escenario de exposición accidental, observá:

Usuario: el usuario
Clave: la clave

Este invento se debe a la gente de CESE/CAPSE/CEIoT.

Un aspecto extra de pérdida de información es que estás mostrando los contenidos de tu máquina. He visto varias veces que alguien busca en su sistema de archivos algo para mostrar y de paso vemos nombres de proyectos y empresas que quizás no era la idea mostrar.



Mitigación: armar una máquina virtual con la información necesaria para la conferencia. Si algo falta, suspender el modo compartido, transferirlo y retomar.


Otro aspecto es qué estás mostrando en el fondo de tu cámara o el ruido ambiental del micrófono. Podés estar revelando información personal, caras de familiares, gustos, composición familiar.

Mitigación: elegir el fondo de cámara, acordar si es posible con el resto de las personas habitantes que no se acerquen ni manifiesten. Ya sé que en lugares pequeños o en ciertas circunstancias de cuidado con niños se dificulta, pero la idea es hacer la evaluación aunque luego no puedas cumplir.

Hay un reflejo que he notado que es ocultar rápido lo que ha sido expuesto accidentalmente. No tiene mucho sentido, si hay registro basta pausar y con que haya quedado en al menos un cuadro, ha sido perdido.

Hay que cambiar las credenciales.

Más sobre esto he escrito en antes y antes.

En pocas palabras...

  • Evaluar la información que se va a compartir de modo directo e indirecto.
  • Usar protección de credenciales.
  • Actuar ante detección de falla.
  • Virtualizar para reducir exposición de información.
  • No correr riesgos que no te paguen.

 

Reflexión final


Nunca olvides que los grandes líderes y empresarios VIAJAN para resolver sus chanchullos, esto no es sólo por la ventaja del cara a cara, donde pueden seguir el lenguaje corporal, si no por que tienen el control real sobre la situación, pueden tener conversaciones realmente confidenciales y sin registro.

Por más que exista un producto carísimo que provea confidencialidad, no olvides que no lo hiciste vos, por que te dedicás a otra cosa y aunque te dedicaras probablemente lo harías mal.




Ya sé, ya sé que vos y yo somos perejiles, pero los fenómenos mejor se comprenden en las situaciones extremas.


Protector facial con muy bajos recursos y en situación de aislación

$
0
0




Esta experiencia que voy a compartir carece de respaldo científico, sólo estoy haciendo lo que muchas otras personas están haciendo. Para evaluar la efectividad de usar un dispositivo como este, buscá en los sitios de medicina oficial.

Dicho eso, lo que comparto es cómo hacer protectores faciales con acetatos y gorras, prácticamente ninguna herramienta, sin un espacio adecuado ni tantas otras cosas que los hobbystas damos por sentado (¿quién no tiene un taladro y una remachadora, por el amor de dios?), ni siquiera mucha destreza, casi nada diría.

Llamo "acetato" al plástico transparente que todo el mundo llama acetato y que obtengo de radiografías viejas o tapas de carpetas.

Tras mucho reflexionar y hacer ensayos, algunos mentales y otros reales que involucraron cortes medidos de acetato, remaches, adhesivos y broches, en casa llegamos a una solución extremadamente sencilla que consiste en enganchar el acetato a la visera de la gorra con algo que puede ser un alambrecito.

La idea es que si tenés una gorra, un clavo, moneda, fuego y un acetato te puedas hacerte tu protector o máscara facial.

Me imagino que a otras personas se les ha ocurrido algo similar o incluso lo mismo, pero no me alcanza la vida para estar mirando todo lo que ocurre.


Con respecto a otras soluciones, las ventajas de ésta son:
  • Prácticamente no requiere uso de herramientas.
  • No requiere precisión.
  • Es sencillo reemplazar el acetato.
  • Es sencillo lavar la gorra.
  • Una vez que tenés el acetato, se arma en dos minutos
  • Queda espacio entre la cara y el acetato.

Las desventajas
  • No tiene cierre hermético por arriba, no sé si hace falta.
  • No es muy ajustable.
  • Podría rotar y caer sobre la cara en determinadas posiciones.

A evaluar
  • Parece resistente

Al final está el listado de materiales.



Proceso


Una vez obtenido el acetato, perforarlo en las esquinas con una perforadora o la cabeza de un clavo caliente. En caso de usar perforadora, podés ir haciendo pruebas apretando suave y fijándote donde va a quedar el agujero antes de hacerlo definitivo.

Hemos hecho dos tamaños distintos, brindando el más grande mayor protección lateral. Ambos tamaños se pueden usar con la misma gorra.


Perforar los puntos de anclaje en la gorra con la perforadora. Si no tenés perforadora o no entra la visera, usar un clavo y una moneda.




Link al video en youtube

Al armar los ganchos mariposa van para afuera para que no te agarren el pelo, aunque estéticamente no queden tan bien como al revés.

El recurso de la perforadora lo vengo usando desde las ganzuas descartables para la oficina

Detalles del acetato a partir de una radiografía.


El propósito de esta sección era contar como usando muy poca lavandina se podría limpiar aceptablemente, por si vas a hacer muchas limpiezas, tiene sentido que usés muy poca lavandina pues en este momento es un bien escaso.

Esto es considerando que no necesariamente contás con una bañadera o recipiente suficientemente amplio.

Una de las pruebas fue tipo una lasaña de radiografías y lavandina, pero al igual que otras pruebas, no resultaron. Aún así, compartiré lo que aprendí, igual de esto hay innumerables recursos en internet "cómo blanquear radiografía", "cómo limpiar radiografía"

Hay dos tipos de materiales de estudios médicos cuyos nombres ignoro, pero uno, el mas moderno, evidentemente tiene la imagen adentro del material, no en la superficie. La lavandina remueve sólo el material de la superficie, así que el material de las tomografías e incluso radiografías modernas no sirve.

Para determinar si sirve, poné en una zona bien oscura un micro poquitito de lavandina, esperá unos segundo y pasá la uña. Si sale algo negro, sirve.

Ponés la radiografías en agua con un chorro de lavandina, no sé cuánto es lo óptimo, cada tanto las vas moviendo para que no se peguen así circula le agua y tras varias horas de ambos lado va a salir con mayor o menor ayuda y si te cuidás de no rayarlas, mejor.

Leí por ahí que las placas de tomografías dejadas al agua mucho días se blanquean, dejé unas de prueba, con un poquito de lavandina por el denge. Aviso que pasa luego.


Precauciones con la lavandina


  • Hacé lo de la lavandina al aire libre o ventilá.
  • Fijate que donde pongas lavandina no haya habido ningún tipo de jabón, se produce un gas tóxico.

  • Si vas a hacer muchas pruebas y/o limpiezas, protegete las manos, la piel no se lleva bien con la lavandina.



Lo que vas a necesitar


Materiales:
  • Gorra con visera.
  • Acetato.
  • Alambre o gancho mariposa.

Herramientas:
  • Perforadora o 
  • Clavo, moneda y fuego.

En caso de obtener el acetato de una radiografía:
  • Contenedor.
  • Cepillo para ropa.
  • Lavandina.
  • Aire libre o ventilación.

Si querés compartir por pantalla esto:



Bienvenidas modificaciones y sugerencias.

Gracias a la participación y paciencia de https://lanilunatejidos.blogspot.com/

Evitando sudo con capabilities

$
0
0
Tanto cuando te estás instalando herramientas de pentest como cuando alguien te pide en algún servidor que se las instales, surge el problema de los permisos, que antes se arreglaba dándole root a todo el mundo y luego mejoró, dándole sudo de un modo un poco menos indiscriminado.

Dejando de lado que tengo poca o nula experiencia configurando sudo, una de mis tantas tareas del backlog, hay muchas herramientas que no necesitan root para todas sus funciones si no para algunas muy específicas.

En el caso de pentest suele tener que ver con acceso a la red, ya sea para enviar paquetes arbitrarios salteándose las restricciones que imponen las interfaces o accediendo a la interfaz de red directamente para ver el tráfico.

Las herramientas más comunes para estos escenarios son nmap y tcpdump correspondientemente.

Existe un riesgo adicional el ejecutar estas aplicaciones con permisos adminstrativos y es que siendo aplicaciones complejas no carecen de bugs y se pueden convertir en puntos de entrada para tomar el control de tu máquina, si sos un usuario común el ataque queda más contenido que si sos root, donde el éxito lleva al control total, a menos que tengas SELinux, que es mucho más complicado y me pesa tambien no saber, cuando sea grande aprenderé SELinux.

Lo que sí sé de SELinux es que parece que es más apropiado para ambientes poco cambiantes tipo servidores, no para estaciones de trabajo.

La idea entonces es otorgar permisos granulares o capacidades a un programa tal que pueda hacer cosas reservadas a root sin ser root y ajustar los permisos de modo tal que sólo los usuarios pertenencientes a un grupo puedan ejecutarlo, manos a la obra.



Crear un grupo

$ addgroup networkaudit


Identificar los programas:

$ which nmap
/usr/bin/nmap

$ which tcpdump
/usr/sbin/tcpdump


Cambiarles el grupo:

$ chgrp networkaudit /usr/bin/nmap
$ chgrp networkaudit /usr/sbin/tcpdump


Medida extra, cambiarle los permisos:

$ chmod 750 /usr/bin/nmap
$ chmod 750 /usr/sbin/tcpdump


Setear las capabilities:


$ setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
$ setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip  \
    /usr/bin/nmap

nmap en particular necesita que lo ejecutes luego con --privileged pues como está preparado para tomar caminos alternativos si no sos root, te dice que no tenés permisos sin intentar hacerlo.

También podés poner en .profile

export NMAP_PRIVILEGED=""



wireshark te ofrece acomodar todo el instalar, pero puede ser que te olvides:






Asi que cuando ejecutes y quieras capturar te va a decir que no y cómo solucionarlo.




$ sudo dpkg-reconfigure wireshark-common

Luego, para cada usuario:

$ sudo usermod -a -G wireshark $user


Tras ejecutar las instrucciones, veamos a quien tocó:


$ getcap $( which wireshark )

nada... ok, es razonable, wireshark es un animal bastante grande, quizas hay un componente, si le preguntamos a synaptic...





...podés copiar y pegar:

$ cat << EOF | while read file; do getcap "$file"; done
> /usr/bin/capinfos
> /usr/bin/captype
> /usr/bin/dumpcap
> /usr/bin/editcap
> /usr/bin/mergecap
> /usr/bin/mmdbresolve
> /usr/bin/randpkt
> /usr/bin/rawshark
> /usr/bin/reordercap
> /usr/bin/text2pcap
> EOF


O menos chancho, le preguntas a dpkg


$ dpkg -L wireshark-common | grep bin | while read file; do \
   getcap "$file"; done


En ambos caso te trae

/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Con lo cual te podés arreglar con:

$ setcap cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap




Esto ha sido para networking, pero puede ser útil para otros contextos.

Me he servido de man capabilities y al menos:

https://peternixon.net/news/2012/01/28/configure-tcpdump-work-non-root-user-opensuse-using-file-system-capabilities/


https://diego.assencio.com/?index=e48aa7b74bd7acb76c30de0a240108c2

Generador precario de señales cuadradas con FPGA

$
0
0

Contexto



No estabas leyendo aún pues no terminé con mi intento de hacer que un 8051 recuperado de un disco rígido ejecutara un programa mío usando la ROM externa, cuando nos vimos en la necesidad de demultiplexar datos y direcciones de la ROM y no teníamos un 74ls373 sino un 74ls374 que tiene señal de clock entonces le queríamos dar ese clock, muy alto y no sabemos electrónica básica así que vamos usar una FPFA en forma de iCEstick.

Va a estar en uno de estos días en
https://seguridad-agile.blogspot.com/2020/04/rescatando-un-8051.html

Mejor explicado:


Quiero usar una FPGA como generador de señales con frecuencias de hasta 12 Mhz, que por un lado es lo que necesito para otro proyecto y por el otro es lo que me da un iCEstick.


Para programar necesito usar Lattice iCEcube2 que tengo instalado en una máquina virtual con una licencia que venció en el 2018, casi sin usarla, lamentablemente no me di cuenta y la "quemé" por decir de una manera.

Lo más fácil debe ser obtener una nueva licencia, pero eso es un conocimiento de gestión y burocracia, no quiero decir que no lo necesite, pero no tengo ganas de adquirirlo o reforzarlo, así que tomaré un

<desvío>

y le cambiaré la fecha para que iCEcube piense que el tiempo no ha pasado.

Cuando arranque debo tener la precaución de que no tome la fecha y hora por NTP y setearle en el BIOS la fecha que quiero.

Para lo primero basta con desconectar de la red:



Ejemplo sobre otra máquina virtual cualquiera


Luego fijarse cuándo fué la última vez que la encendiste poniéndo el cursor sobre la máquina, como para que no viaje al pasado, luego calculás el tiempo y le cambiás el BIOS:








VBoxManage modifyvm "CIAA Linux" --biossystemtimeoffset  -69379200000

siendo  -31536000000 * 2.2 =  -69379200000,  esto es un año y 10 semanas para atrás, no fué tan difícil, ni califica de subdesvio.



</desvío> 

La vida no es fácil, en esa virtual no tenía mi proyecto de blinky que es el que pienso adaptar, está en otra cuya clave no recuerdo y es Windows 10 y debo tomar otro

<desvío>

Quise montar con una recetita que tenía para luego ejecutar chntpw, pero no, así que tomé otro camino, arrancar desde un linux, pero por ser uefi se resistó.

Mi receta fué:
  • Decirle a virtualbox que no arranque del disco, sólo de cdrom.
  • Conectarle un boot uefi, tenía un puppy.
  • Ver las particiones con fdisk
  • Montarla con mount
  • Ubicarme en el lugar correcto 
  • Ejecutar chntpw -i y pedirle blanqueo, que es lo que no sé ve pues es lo que sigue, pero ya me aburrí de esto.
 



    </desvío>

    Habiendo tomado el control de la situación, sólo tengo que adaptar el ejemplo de blinky para que en lugar de prender y apagar leds a una velocidad humanamente perceptible, prenda y apague pines a varios Mhz.

    ¡Maldición! No es Verilog, es VHDL, que es lo que había aprendido originalmente de FPGA y luego olvidé por falta de uso. Tengo entonces varios desafíos:

    • Recuperar VHDL, no debería haber problema pues es sólo mirar fijo.
    • Obtener el clock más alto posible, fácil, mirando el archivo .scf del proyecto hallé definido un clock CLK_32MHZ.
    • Identificar los pines, no hay problema, es sólo mirar una tablita en algún lado.
    • Grabarlo desde la virtual, supongo que ya lo hice antes sin problemas.
    • Hacer la adaptación eléctrica, dado que el alto es 3.3 y no va a leer, no debería haber problema.



    Al blinky original lo había toqueteado para mostrar sequencias de leds distintas, pero eso fue hace ya dos años antes de saber casi nada.


    Aunque a un nivel muy íntimo entiendo bastante lo que hice y los porqués, no quiero intentar explicarlo pues probablemente esa explicación no sólo sea mala si no perjudicial.

    Estos son los pasos que seguí, más que nada como nota para mí, no estoy haciendo un tutorial de VHDL en iCEcube2 Lattice, ahora estoy en sintonía con Verilog en Vivado Xilinx. Podría mejor partir del ejemplo Verilog, pero está bueno ponerle un poco de dificultad, de hecho mi primer lenguaje fué VHDL.


    Asi que esto, a menos que tengas exactamente el mismo equipo probablemente no te sirva para nada y puedas saltar hasta el código VHDL.

    Si hubiese querido (podido) usar un proyecto nuevo, tendría que haber:


    • New Project
    • Device Family: iCE40
    • Device :       HX1K
    • Device Package: TQ144
    • Next
    • Buscar la carpeta del proyecto
    • Crear un archivo .v
    • Incorporarlo a design files
    • Abrir el archivo y copiar y pegar todo lo que quieras


    No se pueden abrir dos proyectos a la vez, pero si dos IDEs a la vez cada una con su proyecto.

    No pude hacer un proyecto de cero. Tomé entonces el camino habitual de tomar el blinky que funciona y tras bastante renegar llegué a esto:


    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;

    entity Blink is
      port(
        pmod1  : out std_logic;
        pmod2  : out std_logic;
        pmod3  : out std_logic;
        pmod4  : out std_logic;
        clk    : in  std_logic
      );
    end Blink;

    architecture Behavior of Blink is
      signal count : std_logic_vector(23 downto 0);
    begin
      pmod1 <= clk;
      pmod2 <= count(0);
      pmod3 <= count(1);
      pmod4 <= count(2);

      process(clk)
        begin
          count <= count + 1;
        end process;
    end Behavior;

    Si algo te parece raro puede ser por que quité el código que a la vez hace un blink rotativo con los cuatro leds y blinky central.

    No es mucha magia, en pmod1 tenés la 12Mhz, en pmod2 6Mhz y así...

    Puse esto en los constraints, pero no me preguntes exactamente en qué archivos:

    define_clock -name {icetest|clk} {p:icetest|clk} 
       -period 7.838 -clockgroup Autoconstr_clkgroup_0
       -rise 0.000 -fall 3.919 -route 0.000

    set_io clk 21

    set_io pmod1 78
    set_io pmod2 79
    set_io pmod3 80



    Le das a

    Run all

    y tenés un

    Bit Stream Generator succeeded

    Fijate que si modificaste un archivo y no lo salvaste, iCEcube2 es bastante incapaz... de avistarte.

    Luego abrís el Diamond Programmer, todo lo que sigue está en:

    https://www.latticesemi.com/icestick -> documentation -> iCEstick User Manual

    • Blank project
    • Detect cable ( a mi me aparece cable HW-usbn-2b (ftdi) port ftusb-0 )
    • device family ice40
    • device ice40hx1k
    • operation
      • access mode: spi flash programming
      • vendor: micron
      • device spi-n25q032
      • package : 8 pin vdfpn8
    •  file: implmnt -> sbt -> outputs -> bitmap -> file.bin


    Si tenes la IDE en una virtual como yo, no te olvides de (re)conectar el dispositivo con:

    • virtual box -> devices -> sub -> lattice ftusb





    Si la próxima vez que intentar programar la FPGA te equivocás por que no ajustaste todo bien, tipo dispositivo y método de acceso y de ahí en más te dice error de programación, configurás bien y le das un "erase all", restaurás la configuración y si tenés la misma suerte que yo, vuelve a andar

    Sólo me queda el último punto, que la salida de 3.3v pueda alimentar un chip de 5v como un arduino o un 8051 y a la vez no se dañe.

    Para eso tengo que mirar fijo los siguiente conceptos:

    • HMOS por el lado del 8051
    • SB_LVCMOS por el lado del iCEstick
    ¿SB_LVCMOS? ¿Cómo me enteré que el iCEstick usa eso? Muy fácil, por el reporte de pines:

    78, PIO, pmod1, Output, , SB_LVCMOS, No Pull Up, Simple Output, rightBank
    79, PIO, pmod2, Output, , SB_LVCMOS, No Pull Up, Simple Output, rightBank
    80, PIO, pmod3, Output, , SB_LVCMOS, No Pull Up, Simple Output, rightBank
    81, PIO, pmod4, Output, , SB_LVCMOS, No Pull Up, Simple Output, rightBank

    ¿HMOS? más fácil aún, lo dice la datasheet del 8051.

    He expresado al menos últimamente mi aversión a usar google para resolver problemas, pero mi electrónica es tan precaria y llevo tantas horas a lo largo de tantos días acercándome a un final tan incierto que estoy dispuesto a casi cualquier cosa.

    how to connect a SB_LVCMOS output to a HMOS input

    O no se llama así o a nadie le ha interesado hacer o es tán fácil que nadie lo ha publicado o google no sabe.

    Puedo aflojar un poco ahora que aprendí que HMOS es High Density NMOS y quitar SB, pues en todos los resultado previos aparece LVCMOS.

    how to connect a LVCMOS output to a NMOS input

    Mis conocimientos de electrónica son muy básicos e insuficientes para resolver esto con un transistor, cosa que intenté, pero sólo funcionó hasta unos 180Khz, para frecuencias mayores hace falta saber más.

    Lo que hice entones fué usar un 74ls08, que es una puerta AND y que dice según su datasheet que con 2v le alcanza para pensar que es un true y que tiene una frecuencia de trabajo mucho mayor.



    Fijate que cuadradita que estaba la señal azul en la imagen anterior

    Quedó horrible la adaptación a 5v, apuesto a que eso se debe a la ausencia de algunos capacitores en los lugares apropiados, si alguien de embebidos o que sepa electróncia lee esto y se apiada de mí, me va a corregir.

    Conclusión

    • He podido obtener una POC de un generador de señales cuadradas usando un FPGA que daba por inaproblechable.
    • Para usarlo con 3.3v está ok.
    • Tiene hardcodeadas la cuatro frecuencias, algún día encararé generarle algún tipo de posibilidad de variar.
    • Con la adaptación a 5, está horrible, luego sabré si funciona para mi proyecto de 8051

    Diagnosticando avrdude + USBasp + arduino IDE

    $
    0
    0
    Estaba intentando programar un ATMega328p para un proyecto y quise usar ArduinoIDE en lugar del baremetal que había usado para otro proyecto de próxima publicación.


    Elegí:

    Board: Arduino Duemilanove por que tiene ATMega328p
    Processor: ATMega328p
    Port: /dev/ttyS0
    Programmer: USBasp



    Cuando quise hacer el burn con Sketch -> Upload Using Programmer, me dijo:


    An error occurred while uploading the sketch
    avrdude: Warning: cannot open USB device: Permission denied
    avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'



    Pensé que la corrección había sido modificar una regla de udev tal que agregara un symlink, pero al final probé sin ese symlink y ArduinoIDE pudo programar ok, ya que según comprendí luego, avrdude sabe como hallar el programador, probablemente utilizando libusb.

    Realmente no sé que fué lo que cambió para que funcionara.




    Lo que sigue son mis aventuras diagnosticando y probando, habiendo asumido  que tenía que aparecer /dev/ttyACM0.


    Lo primero fue fijarme si aparecía de algún modo como dispositivo usb, si:

    $ lsusb
    Bus 003 Device 007: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb

    Luego con más detalles

    $ sudo lsusb -v

    Bus 003 Device 007: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               1.10
      bDeviceClass          255 Vendor Specific Class
      bDeviceSubClass         0
      bDeviceProtocol         0
      bMaxPacketSize0         8
      idVendor           0x16c0 Van Ooijen Technische Informatica
      idProduct          0x05dc shared ID for use with libusb
      bcdDevice            1.02
      iManufacturer           1 www.fischl.de
      iProduct                2 USBasp
      iSerial                 0
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           18
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          0
        bmAttributes         0x80
          (Bus Powered)
        MaxPower               50mA
        Interface Descriptor:
          bLength                 9
          bDescriptorType         4
          bInterfaceNumber        0
          bAlternateSetting       0
          bNumEndpoints           0
          bInterfaceClass         0 (Defined at Interface level)
          bInterfaceSubClass      0
          bInterfaceProtocol      0
          iInterface              0
    Device Status:     0x0000
      (Bus Powered)


    Para verificar si aparecía en algún lado de /dev, hice unos finds y diffs:



    $ find /dev > ~/antes

    conecté el programador

    $ find /dev > ~/despues

    diff ~/antes ~/despues --side-by-side

    $ diff ~/antes ~/despues  --side-by-side | grep ">"

                            >    /dev/vboxusb/003/007
                            >    /dev/char/189:262
                            >    /dev/bus/usb/003/007


    Ese vboxusb me hizo pensar que quizás virtualbox estaba apropiándose del dispositivo, tal como le pasó a alguien con modemmanager.


    $ sudo service virtualbox stop
    $ sudo service virtualbox-guest-utils stop

    ¿Podría ser que aún estando apagada alguna virtual tuviera un filtro y me estuviera tomando el dispositivo? Revisé la configuración de cada virtual y ninguna tenía configurados filtros usb.

    Tambien ejecuté :

    $ VBoxManage list usbfilters
    Global USB Device Filters:
    <none>

    Luego hice el mismo proceso para un teensy que anda ok:



        >    /dev/serial
        >    /dev/serial/by-path
        >    /dev/serial/by-path/pci-0000:00:12.0-usb-0:1:1.0
        >    /dev/serial/by-id
        >    /dev/serial/by-id/usb-Teensyduino_USB_Serial_12345-if00
        >    /dev/ttyACM0
        >    /dev/vboxusb/003/007
        >    /dev/char/166:0
        >    /dev/char/189:262
        >    /dev/bus/usb/003/007

    No es virtualbox.


    Pasé a ver que ocurría con udev.



    $ sudo udevadm monitor

    # USBasp

    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb))



    # Como curiosidad, iCEstick con máquina recién iniciada

    KERNEL[x.x] add /module/usbserial (module)
    KERNEL[x.x] add /bus/usb-serial (bus)
    KERNEL[x.x] add /bus/usb/drivers/usbserial (drivers)
    KERNEL[x.x] add /bus/usb/drivers/usbserial_generic (drivers)
    KERNEL[x.x] add /bus/usb-serial/drivers/generic (drivers)
    UDEV  [x.x] add /module/usbserial (module)
    UDEV  [x.x] add /bus/usb-serial (bus)
    UDEV  [x.x] add /bus/usb/drivers/usbserial (drivers)
    UDEV  [x.x] add /bus/usb/drivers/usbserial_generic (drivers)
    UDEV  [x.x] add /bus/usb-serial/drivers/generic (drivers)
    KERNEL[x.x] add /module/ftdi_sio (module)
    KERNEL[x.x] add /bus/usb/drivers/ftdi_sio (drivers)
    KERNEL[x.x] add /bus/usb-serial/drivers/ftdi_sio (drivers)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0 (usb-serial)
    UDEV  [x.x] add /module/ftdi_sio (module)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0 (tty)
    UDEV  [x.x] add /bus/usb-serial/drivers/ftdi_sio (drivers)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1 (usb-serial)
    UDEV  [x.x] add /bus/usb/drivers/ftdi_sio (drivers)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1/tty/ttyUSB1 (tty)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1 (usb-serial)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.1/ttyUSB1/tty/ttyUSB1 (tty)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0 (usb-serial)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0 (tty)

    # iCEstick antes de reiniciar, los demás drivers ya los había cargado hace semanas.

    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0/ttyUSB0 (usb-serial)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.0/ttyUSB0/tty/ttyUSB0 (tty)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1/ttyUSB1 (usb-serial)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:10.0/usb5/5-2/5-2:1.1/ttyUSB1/tty/ttyUSB1 (tty)


    # Así se vé un teensy:

    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.1 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.1 (usb)
    KERNEL[x.x] add /module/cdc_acm (module)
    UDEV  [x.x] add /module/cdc_acm (module)
    KERNEL[x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0/tty/ttyACM0 (tty)
    KERNEL[x.x] add /bus/usb/drivers/cdc_acm (drivers)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0 (usb)
    UDEV  [x.x] add /bus/usb/drivers/cdc_acm (drivers)
    UDEV  [x.x] add /devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.0/tty/ttyACM0 (tty)


    Información específica del dispositivo, el número cambia con respecto a otros listados por ser distintas inserciones

    $ sudo udevadm  info -a -n /dev/bus/usb/003/003 ;

      looking at device '/devices/pci0000:00/0000:00:12.0/usb3/3-1':
        KERNEL=="3-1"
        SUBSYSTEM=="usb"
        DRIVER=="usb"
        ATTR{authorized}=="1"
        ATTR{avoid_reset_quirk}=="0"
        ATTR{bConfigurationValue}=="1"
        ATTR{bDeviceClass}=="ff"
        ATTR{bDeviceProtocol}=="00"
        ATTR{bDeviceSubClass}=="00"
        ATTR{bMaxPacketSize0}=="8"
        ATTR{bMaxPower}=="50mA"
        ATTR{bNumConfigurations}=="1"
        ATTR{bNumInterfaces}==" 1"
        ATTR{bcdDevice}=="0102"
        ATTR{bmAttributes}=="80"
        ATTR{busnum}=="3"
        ATTR{configuration}==""
        ATTR{devnum}=="3"
        ATTR{devpath}=="1"
        ATTR{idProduct}=="05dc"
        ATTR{idVendor}=="16c0"
        ATTR{ltm_capable}=="no"
        ATTR{manufacturer}=="www.fischl.de"
        ATTR{maxchild}=="0"
        ATTR{product}=="USBasp"
        ATTR{quirks}=="0x0"
        ATTR{removable}=="unknown"
        ATTR{speed}=="1.5"
        ATTR{urbnum}=="9"
        ATTR{version}==" 1.10"



    Probé un montón de combinaciones de rules, sin éxito, en particular comprobé que estaba siendo llamda con un RUN:


    SUBSYSTEM=="usb", ACTION=="add", RUN+="/trigger.sh"


    trigger.sh sólo imprime un archivo.


    Miré con más detalle:


    $ sudo udevadm monitor -k -u -p


    UDEV  [1025.922712] add      /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    ACTION=add
    BUSNUM=003
    DEVNAME=/dev/bus/usb/003/003
    DEVNUM=003
    DEVPATH=/devices/pci0000:00/0000:00:12.0/usb3/3-1
    DEVTYPE=usb_device
    DRIVER=usb
    ID_BUS=usb
    ID_MODEL=USBasp
    ID_MODEL_ENC=USBasp
    ID_MODEL_FROM_DATABASE=shared ID for use with libusb
    ID_MODEL_ID=05dc
    ID_REVISION=0102
    ID_SERIAL=www.fischl.de_USBasp
    ID_VENDOR=www.fischl.de
    ID_VENDOR_ENC=www.fischl.de
    ID_VENDOR_FROM_DATABASE=Van Ooijen Technische Informatica
    ID_VENDOR_ID=16c0
    MAJOR=189
    MINOR=258
    PRODUCT=16c0/5dc/102
    SEQNUM=2787
    SUBSYSTEM=usb
    TYPE=255/0/0
    USEC_INITIALIZED=1025910393



    Compará con un Teensy:



    UDEV  [1129.307311] add      /devices/pci0000:00/0000:00:12.0/usb3/3-1 (usb)
    ACTION=add
    BUSNUM=003
    DEVNAME=/dev/bus/usb/003/004
    DEVNUM=004
    DEVPATH=/devices/pci0000:00/0000:00:12.0/usb3/3-1
    DEVTYPE=usb_device
    DRIVER=usb
    ID_BUS=usb
    ID_MM_DEVICE_IGNORE=1
    ID_MM_PORT_IGNORE=1
    ID_MODEL=USB_Serial
    ID_MODEL_ENC=USB\x20Serial
    ID_MODEL_FROM_DATABASE=Teensyduino Serial
    ID_MODEL_ID=0483
    ID_REVISION=0100
    ID_SERIAL=Teensyduino_USB_Serial_12345
    ID_SERIAL_SHORT=12345
    ID_USB_INTERFACES=:020201:0a0000:
    ID_VENDOR=Teensyduino
    ID_VENDOR_ENC=Teensyduino
    ID_VENDOR_FROM_DATABASE=Van Ooijen Technische Informatica
    ID_VENDOR_ID=16c0
    MAJOR=189
    MINOR=259
    MTP_NO_PROBE=1
    PRODUCT=16c0/483/100
    SEQNUM=2791
    SUBSYSTEM=usb
    TYPE=2/0/0
    USEC_INITIALIZED=1129295449





    Me fije que no estuviera en blacklist

    $ grep -i 16c0 /lib/udev/rules.d/77-mm-usb-device-blacklist.rules
    $ grep -i 05dc /lib/udev/rules.d/77-mm-usb-device-blacklist.rules



    Listé el hardware:

    $ sudo lshw

                  *-usb:0 UNCLAIMED
                       description: Generic USB device
                       product: USBasp
                       vendor: www.fischl.de
                       physical id: 1
                       bus info: usb@3:1
                       version: 1.02
                       capabilities: usb-1.10
                       configuration: maxpower=50mA speed=1Mbit/s

    Bien, es lo que estaba suponiendo.

    Finalmente asocié el UNCLAIMED con ID_MODEL_FROM_DATABASE=shared ID for use with libusb, dejé de intentar que aparezca /dev/ttyACM0 y probé y funcionó. Así que todo esto servirá para diagnosticar otro problema en otro momento.


    Me he servido al menos de:


    • https://andreasrohner.at/posts/Electronics/How-to-fix-device-permissions-for-the-USBasp-programmer/
    • https://forums.virtualbox.org/viewtopic.php?f=35&t=82639
    • https://wiki.webevaluation.nl/arduino_programmers_errors
    • https://opensource.com/article/18/11/udev

    Twister del azar

    $
    0
    0
    El problema es cómo obtener un buen random para claves temporarias para usuarios o tokens para flujos. Lo típico en una recuperación de contraseñas o cuando un workflow pasa por un mail.

    Si uno llama random() no sirve, ya que el (pseudo) azar, da siempre la misma secuencia. Eso en sí no está mal, si uno está haciendo un juego o una simulación y quiere testear componentes que usen azar, lo bueno sería que ese azar sea el mismo en cada ejecución de un mismo unit test.

    Luego en producción, hay que darle una semilla para que arranque en algún lugar distinto de la secuencia.

    En basic creo recordar (no pienso mirar en google) que era randomize(). En opencobol, que es justo con lo que estaba haciendo las pruebas es random(valor) para cambiar la semilla y random() para obtener el valor al azar.

    Esa semilla suele ser tomada de la fecha/hora, lo cual no es muy bueno:

    A lo largo de todo el año hay 365x24x60x1000 = 31.536.000.000, ok.

    Pero como más o menos se puede saber el día y quizas la hora se reduce a 60x60x1000=3.600.000, no tan ok.

    Y si más o menos sabés el minuto 2x60x1000=120.000, mucho menos ok.

    Dependiendo del escenario, algunos ataques serían factibles. Por lo general los online no, ya que hay otras medidas de control, por ejemplo no aceptar más que un cierto número de conexiones en un lapso determinado desde una misma IP.

    Si a eso se le suma que el token tiene un tiempo de vida y está correctamente calculado según el número de conexiones y el tiempo por IP, está mitigado.

    Pero si el ataque es offline o no disponemos de mecanismos adicionales, estamos en el horno.

    Podemos agregar un "secreto" a este número y recuperamos la fortaleza inicial, ¿no? Salvo que ese secreto forma parte del código y aunque no compartimos ni descuidamos el código, damos por sentado que está comprometido.



    A falta de un mainframe, he aquí una implementación en linux con opencobol que usa los "milisegundos" como semilla.


           IDENTIFICATION DIVISION.
    PROGRAM-ID. principal.
    ENVIRONMENT DIVISION.
    DATA DIVISION.

    WORKING-STORAGE SECTION.
    01 SEED PIC 9(08).
    01 WS-TIME.
    03 DUMMY PIC 9(06).
    03 MILLISECONDS PIC 99.
    01 IDX PIC 9.
    01 RVALUE PIC 9(09) COMP-3.

    PROCEDURE DIVISION.
    PROGRAM-BEGIN.
    DISPLAY "Generando random sin seed...".
    PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX = 5
    COMPUTE RVALUE = FUNCTION RANDOM * 1000000000
    DISPLAY RVALUE
    END-PERFORM.

    DISPLAY "Generando random con seed...".
    ACCEPT WS-TIME FROM TIME.
    MOVE MILLISECONDS TO SEED(1:2).
    ACCEPT WS-TIME FROM TIME.
    MOVE MILLISECONDS TO SEED(3:2).
    ACCEPT WS-TIME FROM TIME.
    MOVE MILLISECONDS TO SEED(5:2).
    ACCEPT WS-TIME FROM TIME.
    MOVE MILLISECONDS TO SEED(7:2).
    COMPUTE RVALUE = FUNCTION RANDOM(SEED).

    PERFORM VARYING IDX FROM 1 BY 1 UNTIL IDX = 5
    COMPUTE RVALUE = FUNCTION RANDOM * 1000000000
    DISPLAY RVALUE
    END-PERFORM.

    PROGRAM-DONE.
    STOP RUN.



    Ejemplo de ejecuciones sucesivas, obsérvese el patrón de repeticiones en amarillo:


    ?> make && ./principal
    Generando random sin seed...
    180428938
    846930886
    168169277
    171463691

    Generando random con seed...
    146627632
    119773096
    977866279
    695807865

    ?>./principal
    Generando random sin seed...
    180428938
    846930886
    168169277
    171463691

    Generando random con seed...
    169097225
    730835526
    213552898
    116350005

    ?> ./principal

    Generando random sin seed...
    180428938
    846930886
    168169277
    171463691

    Generando random con seed...
    395357036
    623986740
    139161360
    104338109


    La mejor solución es un auténtico random, que en cobol en mainframe se obtiene accediendo a la placa criptográfica, si la hay.

    Como poder usar un mainframe no suele ser sencillo, ¿qué tal un microcontrolador? Es más barato y entra en una mano.

    Hay un juego muy simpático, que consiste en ir poniendo manos y pies en unos círculos de colores, terminando los participantes muy enredados. El problema que tiene es que tiene una ruleta que tiene que manipular una persona externa al juego, que suele ser algún progenitor.

    Para evitar mi responsabilidad como progenitor, lo que hice fué este simpático muñeco, que mediante leds de colores indica a los jugadores donde poner sus extremidades, al azar, claro, si no no lo mencionaría en este post.


    Frente




    Espalda





    El código está en github, una versión baremetal sin azar y una arduino con azar, ambas se queman con USBasp.


    El código es bastante sencillo:
    • En baremetal main() / arduino setup() se configuran los puertos como salidas. 
    • fullBlink() prende y apaga todo.
    • heartbeat() invierte todo.
    • set() dependiendo de la posición a mostrar, lo mapea a uno de los pines.
    • main() hace un poco de circo de comienzo y luego alterna entre elegir y la extremidad/color.



    Lo que importa es obtener el seed, para lo cual tuve horribles sufrimientos.

    Primero pensé en utilizar un micrófono, pero mi ignorancia analógica me lo impidió. Luego quise leer un fotorreceptor infrarrojo, pero no sé que falló. Por último decidí medir el tiempo hasta que alguien oprimiera un botón y eventuales rebotes, con el ruido del ADC ni hace falta apretar el botón, que está conectado a A0.

    Velo en ejecución:





    Ah, me olvidaba, para los tokens, estas son algunas medidas útiles:


    ComposiciónRango de valoresValores posibles en cada posiciónPosiciones necesarias segun bits
    100128256
    Hexadecimal0-910303977
    Números0-9A-F16253264
    LetrasA-Z26212754
    Letras y números0-9A-Z36192550
    Todas la letras y números0-9A-Za-z52172143

    Los números salen de acá, pegar en una hoja de cálculo como fórmula:

    CDEF
    3
    100128256
    410=LOG(POTENCIA(2;D$3);$C4)=LOG(POTENCIA(2;E$3);$C4)=LOG(POTENCIA(2;F$3);$C4)
    516=LOG(POTENCIA(2;D$3);$C5)=LOG(POTENCIA(2;E$3);$C5)=LOG(POTENCIA(2;F$3);$C5)
    626=LOG(POTENCIA(2;D$3);$C6)=LOG(POTENCIA(2;E$3);$C6)=LOG(POTENCIA(2;F$3);$C6)
    736=LOG(POTENCIA(2;D$3);$C7)=LOG(POTENCIA(2;E$3);$C7)=LOG(POTENCIA(2;F$3);$C7)
    852=LOG(POTENCIA(2;D$3);$C8)=LOG(POTENCIA(2;E$3);$C8)=LOG(POTENCIA(2;F$3);$C8)

    Y acá un caso concreto de wordpress del 2015, lo primero que encontré.

    Si notás una cierta falta de ritmo en esta entrada, puede ser debido a que la hice en 2017, no pude hacer funcionar el azar bien rápido y algo me distrajo. Luego, con #quedateencasa me puse a hacer cosas y tuve que programar con USBasp y esté era el único ejemplo que tenía, así que lo reviví y acá está.


    Encuestas: autenticidad débil y desanonimización

    $
    0
    0
    Suelen haber encuestas en Internet que nos llegan de modo indirecto, tal como el ejemplo de OISTE, que llegó al grupo de embebidos.

    En el marco de un estudio, la institución generó una encuesta y la divulgó. Eso le llegó a una persona del grupo y ésta lo publicó. Llegaron dos links, el formulario y la landing page de la institución. Por reflejos busqué en la página de la institución si estaba el link, pero no lo hallé.

    No es garantía de autenticidad, pero que el link esté en la página es un poquito mejor a que no esté. Yo podría ahora hacer una encuesta de algo que considero importante y todo el mundo puede estar de acuerdo, pero, ¿quién me respondería, si soy un perejil?

    Entonces hago un mail de alguien "importante" y lo cito enviándolo a otras personas. Éstas, de buena fé, llenan mi encuesta pensando que soy esa institución.

    Si el único problema acá es que me estoy "robando" la imagen para poder hacer una encuesta que considero importante, como que es sólo una trampita, la persona que la llena seguramente no sufre ningún perjuicio, en todo caso la institución.

    Sin embargo, lo más normal de este tipo de engaños, sería obtener información de la persona, tornándose en ésta la víctima.

    De un modo u otro, recomiendo a la institución que al enviar una solicitud, se deje en el sitio alguna referencia. En particular OISTE fué avisado, estuvieron de acuerdo y pronto lo corregirán.

    A la persona, que nunca siga el link recibido por el mail, que vaya al sitio y lo tome de ahí. Esto no significa ninguna garantía de autenticidad, es sólo una dificultad para el atacante, que no lo será si tiene bajo su control el sitio y las cuentas institucionales. Queda en tí si al llenar la encuesta la información solicitada corresponde con el tema de la encuesta.

    Esto me lleva a compartir algunas reflexiones que tenía guardadas de hace años con respecto a las encuestas "anónimas":

    Hay encuestas que no dicen ser anónimas y aún así pueden serlo si quien la construye no tiene interés en identificar a las personas. Otras que dicen serlo por diversos motivos, como pueden ser legales o te van a preguntar cosas que no contestarías si no fueran anónimas.

    El problema es, ¿quién te garantiza que sea anónima? Veamos algunos recursos que pueden servirle al atacante para desanonimizar. La idea es que sea para tí un ejercicio mental de entrenamiento de paranoia útil, no que intentes necesariamente aplicar las defensas.

    Tecnológicos básicos


    La dirección IP, el useragent, cookies, ciertas configuraciones, en fin, lo que se llama "browser fingerprinting"

    Para evitar esto, acceder por TOR, pero sólo sirve si eso no va a producir que te identifique por ser la única persona que usaría TOR. Una vez que usás TOR hay técnicas avanzadas pero quizás estén fuera del alcance del atacante común, como cortar segmentos de red para interrumpir el tráfico en tu ciudad e ir achicando... no, mucha complicación.

    La navegación privada puede servir, aunque tengo entendido que hay ataques sofisticados que podrían cancelarla.


    El link


    Supongamos que lo anterior está descartado. Si todas las personas reciben el mismo link, no se pueden identificar. Pero se le podría enviar un link a cada persona. Por ello puede ser mejor entrar por una página que tenga el link que por un mail, si esta página no es en un sitio autenticado.

    Compará tu link con el de otras personas.

    El tiempo


    Supongamos que lo anterior está descartado. Ahora el atacante envía el link y espera a que contestes, luego envía el siguiente y así.

    Esperá un tiempo a que otras personas hayan recibido el link.

    Preguntas canario


    Supongamos que lo anterior está descartado. El atacante puede poner preguntas muy específicas o combinaciones de las cuales ya sé la respuesta de cada persona, la identifico.

    Esto se arregla... mintiendo.


    Segmentación


    Esto es algo parecido al canario pero más genérico: si especificás tu género (a la antigua F-M), das tu rango de edad, (<30, 30-60, >60), el barrio y así, rápidamente se reducen las opciones.

    Esto se arregla... mintiendo o con una cierta falta de precisión.

    No sé si todas conocemos el juego de los animales, en que una persona piensa un animal y el resto hace preguntas de si/no. Si tenés seis patas sos un insecto y me ahorré una pregunta.




    Campana de gauss


    Si tus respuestas estan en los costaditos, vas a llamar la atención. La pertenencia a grupos reducidos te identifica, por ejemplo que seas hincha de Chicago.



    Texto libre para análisis de estilo


    He leido de varias fuentes (perdón, estoy muy vago para ponerme a buscar) que haciendo análisis de estilo de textos se puede identificar si uno nuevo corresponde a los conocidos.

    Me parece que eso se soluciona copiando y pegando frases, se va a leer medio raro. Tambien pidiéndole a otras personas que lo modifiquen un poco.


    Ojo al mentir


    Existe algo que se llama "consistencia": si sos varón no te pregunto tu edad de menarca, si sos daltónico, desconfío si tu color favorito es el rojo


    Toda la encuesta o preguntas de a una


    Las encuestas como los exámenes pueden ser "adaptativos", me han dicho que en algunas certificaciones cuando metés la pata en un respuesta se ensañan y te siguen haciendo preguntas cercanas como para dejarte afuera.

    Es mucho más fácil mentir cuando tenés toda la encuesta a la vista pues podés mantener la consistencia. Es como los exámenes de respuestas múltiples, me ha ocurrido llenar algunos de temas que no conocía y sacar más puntos que los que corresponden al azar, pues nuestro sistema de reconocimiento de patrones "descubre" algunas respuesta correctas en función de otras preguntas. Supongo que a todos nos ha pasado.

    El problema de fondo



    Es que si el encuestador es o representa al adversario, está ganando información para ganarte.


    PS


    No bien había terminado de escribir esto y ya casi a punto de publicar, hubo otra consulta que tiene algo parecido.







    Adaptación de Los Microcontroladores AVR de ATMEL a ATmega328p

    $
    0
    0

    En el 2012 Felipe Santiago Espinosa escribió un muy buen libro del tema y en 2017 lo compartió para que todos podamos leerlo. Cubre los micros atmega8 y atmega16, que son muy similares al que yo uso, ATmega328p.


    Quería leerlo en la kindle pero se rompia al convertirlo y en algún momento le ofrecí que me pasara el documento original para convertirlo correctamente y compartirlo pero él prefirió no hacerlo. Como no estaba en ese momento en condiciones de leer fuera del horario de viaje, kindle, olvidé el asunto.

    Ahora que he tenido que lidiar bastante con el ATmega328p para leer y escribir una PROM, estoy en mejores condiciones de estudiar el libro y de paso agregar la adaptación a ATmega328p. Esta lectura tambien me ha servido para decidir aspectos del Cooler para Switch, de próxima publicación y espero me sirva para diagnosticar una falla de comunicación serial con edu-ciaa-nxp.

    Comprenderás que mi conocimiento está muy alejado del de Felipe, ciertas comparaciones y adaptaciones no las podré hacer, otras serán incompletas e incluso erradas, espero que poco.


    No pienses que sé mucho o tengo mucha experiencia, cuando digo cosas como "Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE." no es que haya alguna vez usado free running, conceptualmente lo entiendo nada más y hasta ahí


    Pude haber buscado "ATmega328p atmega8 differences", pero poco hubiese aprendido. Sin embargo al final sí lo busqué para ver de no haber malinterpretado nada.

    No he estudiado el libro, no he leido con absoluta atención los temas generales de los cuales ya tengo conocimiento previo por haber leido a Tanenbaum, Hennessy & Patterson y haber cursado algunas materias, me he concentrado en las partes específicas AVR y más en las que pueda haber diferncia con ATmega328p.

    Espero en algún momento hacer algunos de los ejercicios pues están muy buenos.


    Muchos conceptos parecen corresponder a AVR core o Mega, así que quizás hay diferencias que se me escapan pues asumí que son comunes. No creo que haya hallado todo, para esa tarea se requiere la experiencia y conocimiento de alguien como el autor original.

    El que haya hecho esto no implica que entienda todo ni mucho menos. Por ejemplo las partes de assembly las miré por arriba, siendo el dominio de este lenguaje una de mis deudas con la vida.

    Ha sido una experiencia EXTREMADAMENTE instructiva, leer el libro y a la vez estar mirando la datasheet y adaptando, pero cuando iba por la página 50 de las 360 ya me quería matar, si no me creés, hacé la prueba. Como en casi todas si no todas mis notas publicadas, te recomiendo que en lugar de leer la nota lo hagas, la nota es para la gente más vaga y recordatorio de lo que he hecho. Lo interesante es que al haber terminado, no lo necesito más, o sea, si tuviera que repetir esta experiencia con otro libro y microcontrolador, he quedado mejor equipado mentalmente para no necesitar que correspondan.



    Suficiente introducción, estos son mis hallazgos, siguiendo la siguiente nomenclatura:

    [pXX] número de página sin tag, es por que corresponde a la extensión del texto a ATmega328p que es el objetivo inicial de todo esto. Las referencias al datasheet son a ATmega48A/PA/88A/PA/168A/PA/328/P 8271G–AVR–02/2013 que no es la última pero es la que tenía a mano, luego lo noté.

    [pXX adaptación ] no digo que está mal, sólo que me despista, estoy acostumbrado a leer estos temas en inglés y no me molesta que en las traducciones se usen palabras de otros idiomas sin traducir, como cache, buffer, pipeline, stack, heap. Eso produce que al leer textos en español, ya sean nativos como este o traducidos, tenga momentos de pánico al no comprender alguna palabra.

    [pXX actualización] si el libro fuera escrito ahora, habría que actualizar algunos datitos generalmente sin importancia

    [pXX mi opinión] Ejemplos faltantes, no me puedo resistir, es mi manera de aprender.

    [pXX errata] errorcitos de tipeo.


    Sección 1.5.1 La Unidad Central de Procesamiento (CPU)

     

    [p22 adaptación] segmentación es pipeline


    Sección 1.5.4 Temporizador/Contador

     

    [p26 errata] para programar la tarea cada VEZ que

    Sección 1.6 Clasificación de los Microcontroladores 

     

    [p29 actualización] 4, 8, 16, 32 y hasta 64 bits

    [p29 mi opinión] ejemplo faltante de Pila, JVM

    [p29 mi opinión] ejemplo faltante de Acumulador, la instrucción div de 8086


    Sección 1.7 Criterios para la Selección de los Elementos de Procesamiento 

     

    [p31 actualización] (costo de microcontrolador) 0.5 a 1000 u$s

    Sección 2.1 Características Generales

     

    [p36]
    Memoria de código:  32KB.
    Memoria de datos:  2KB.
    Terminales para entrada/salida: 23.
    Frecuencia máxima de trabajo: 20Mhz.
    Voltaje de alimentación: de 1.8 a 5.5 V .
    Temporizadores: 2 de 8 bits y 1 de 16 bits.
    Canales PWM: 6.
    Fuentes de interrupción: 23.
    Interrupciones externas: 2.
    Canales de conversión Analógico/Digital: 8 de 10 bits.
    Reloj de tiempo real. NO TIENE.
    Interfaz SPI Maestro/Esclavo.
    Transmisor/Receptor Universal Síncrono/Asíncrono (USART).
    Interfaz serial de dos hilos.
    Programación “In System”.
    Oscilador interno configurable.
    Watchdog timer. 


    [p36] ATmega328p está disponible en los encapsulados 28-pin PDIP, 32-lead TQFP, 28-pad QFN/MLF and 32-pad QFN/MLF y es pin compatible con ATmega8 al menos para 28-pin PDIP-

    [p37] El ATmega8 y el ATmega328p incluyen 3 puertos, 2 de 8 bits y 1 de 7 bits

    2.3 Memoria de programa 

     

    [p40] 32KB de Flash, rango hasta 0x7FF

    [p40] 23 fuentes de interrupción

    [p41] Vectores de interrupción [datasheet p65 TAble 12-6]


    2.4 Memoria de datos 

     

    [p43] Figura 2.8 [datasheet p18 Figure 8-3]

    2.4.1 Espacio de SRAM 

     

    [p43] concluye en 0x08ff, tiene además 150 Registros Extendidos de I/O(que no sé lo que son) y 2048 de propósito general.

    2.4.1.1 Registros I/O 

     

    [p44] actualizar figura 2.9


    2.4.2 Espacio de EEPROM 

     

    [p48] EEPROM mide 1KB

    [p49] existe EEAR9 por pasar de direccionar 512B a 1024B


    2.6 Sistema de Interrupciones 

     

    [p57] 10 interrupciones por temporizadores, una por watchdog

    [p58 mi opinión] al comparar las direcciones de ATmega8 vs ATmega16 diria que las direcciones ocupan un byte y dos respectivamente.

    2.7 Inicialización del Sistema (reset) 

     

    [p61] ATmega328p tiene un handler de interrupción específico para WDT

    [p61] ATmega328p no tiene reset por JTAG.

    [p62] El registro MCUCSR es MCUSR.

    2.8 Reloj del Sistema 

     

    [p64 - p70] Las tablas de ajustes para los diversos clocks me superan, ver [datasheet p26].

    2.9 Modos de Bajo Consumo de Energía

    [p70] Comparte los modos de sleep de ATmega16.

    [p72] Los bits de SE y SM[2:0] están en el registro SMCR[3:0] en 0x33 [datasheet p43].


    3.1 Repertorio de instrucciones 

     

    [p75] Para la ISA de ATMEL entiendo que existen "familias" tal como se vé en acá, así que toda esta sección ATmega328p corresponde a ATmega16 por ser de la misma familia, Enhanced Core with up to 128K ("AVR5", "AVR5.1").

    4.1 Interrupciones Externas 

     

    [p119-127] Acá hay varios temas, como tengo muy poca experiencia con interrupciones en general y no hice ninguna prueba, tomalo con precaución.
    Por un lado, ATmega328p tiene dos interrupciones externas como ATmega8 y los registros están un poco cambiados.

    Por el otro, ATmega328p soporta generar interrupciones a partir de prácticamente todos los pines [datasheet p71], agrupadas por puertos.

    Una vez generada tenés que determinar cuál fué concretamente el pin que la generó. Acá hay una buena explicación.


    4.1.1 Configuración de las Interrupciones Externas 

     

    [p120] Los bits de MCUCR[3:0] de las interrupciones externas estan en EICRA[3:0] [ datasheet p 72]


    4.1.2 Habilitación y Estado de las Interrupciones Externas

     


    [p121] Los bits de GICR[7:6] están en EIMSK[1:0] [datasheet 73]

    [p121] Los bits de GIFR[7:6] están en EIFR[1:0] [datasheet 73]


    4.2 Temporizadores 

     

    Parece que el tiempo no es lo mío, sólo pongo lo más evidente pero sin intentar desarrolla lo que implica.

    4.2.3    Pre-escalador



    [p133] No existe registro SFIOR ni bits PSR2 o PSR10, quizás sea CLKPR, pero no sé en qué me estoy basando.


    4.2.5 Registros Compartidos por los Temporizadores

     


    [p134 - 162] Varios registros como TIFR, TIMSK, TCCRx están duplicados o triplicados con A y B o 0-2.


    4.1.3 Organización y Registros del Temporizador 2



    [p144] ASSR tiene los bits movidos


    4.3.1 Generación de PWM con los Microcontroladores AVR



    [p155] para los modos PWM no hallé la info para llenar la tabla 4.17


    5.1.4 El ADC de un AVR 

     

    [p176] Aunque el bit ADFR está en un diagrama del datasheet, el bit de free running es ADATE.


    5.1.5 Registros para el Manejo del ADC



    [p178] ADTSx de SFIOR está en ADCSRA y B

    [p186] AMCE de SFIOR está en ADCSRB

    6.1 Comunicación Serial a través de la USART

     

    Toda esta sección parece ser compatible pero los registros y los bits tiene los nombres muy levemente cambiados, por lo general tienen un cero, como si los del ATmega8/16 estuvieran pensados para ser únicos y los de ATmega328p para tener múltiples puertos, salvo que tiene uno solo.


    6.1.4 Registros para el Manejo de la USART



    [p200] Dice que el registro UBRRH comparte su dirección UCSRC. En ATmega328p son registros separados y con nombres UBRR0H y UCSR0C.

    7.1.1 Registro para el Manejo del WDT 

     

    [p252] El registro WDTCR es WDTCSR, tiene el WDIF (interrupt flag) y WDIE (interrupt enable) debido a que según lo visto en página 57 se puede disparar una interrupción con el WDT y un bit de prescaler extra, WDP3.

    7.2.1 Organización de la Memoria Flash 

     

    [p254] Las páginas de la memoria Flash de ATmega328p son de 64 words, tal como ATmega16.

    [p255] La tabla 7.2 para ATmega328p es [datasheet p282 table 27-13]

    [p255] El registro GICR[1:0] es MCUCR[1:0]


    7.2.3.2 Capacidades para Leer-Mientras-Escribe 


    [p260] La tabla 7.5 para ATmega328p es [datasheet p282 table 27-14]
     


    7.2.3.3 Escritura y Borrado en la Memoria Flash


    [P262] El registro SPMCR es SPMCSR


    7.2.3.4 Direccionamiento de la Flash para Autoprogramación



    [p265] En la tabla debe corresponder a ATmega16

    7.3 Bits de Configuración y Seguridad

     

    [268] La tabla 7.9 es [datasheet 288 Table 28-8]

    [268] La tabla 7.10 es [datasheet 288 Table 28-9]

    7.4.2 La Interfaz JTAG y los Mecanismos para la Depuración en un AVR

    [270] ATmega328p no tiene JTAG


    Y eso es todo amigues.

    Métodos para identificar el pinout de puertos seriales de dispositivos embebidos

    $
    0
    0
    Nos hallamos ante un dispositivo, por ejemplo un router, al que queremos acceder por el puerto serial. El enfoque que voy a desarrollar parte de unos conocimientos muy limitados de electrónica en general y digital en particular.

    ¿Por qué el puerto serial? Quizás es la única puerta abierta.



    Buscar en el manual


    Claramente es la fuente más confiable, mejor comprobar que las versiones correspondan.

    En el caso de computadoras y microcontroladores es relativamente sencillo, pues la UART es una opción explícita, por ejemplo en la raspberry, pero en otros dispositivos donde no está expuesta y suele estar como canal de diagnóstico.



    Buscar en Internet


    Suele ocurrir que alguien ya lo investigó, nuevamente, comprobar que corresponda al equipo que tenemos. Por ejemplo es lo que hice en el análisis del  router al que le cayó un rayo, hallé el pinout en un video Bricked TP-Link WDR4300 Router Recovery Using UART Serial Converter Part #1



    En este caso, el modelo no correspondía exactamente pero por todos lados decía eran equivalentes y comprobé primero la continuidad con el tester de Vcc y GRD y luego aposté que Rx y Tx estaban identificados correctamente.

    Identificar los componentes


    Esto nos permite hallar datasheets que usaremos luego, además de verificar que realmente haya un puerto serial. Entiendo que podría estar implementado por GPIO y no por un circuito dedicado, ya sea un chip o como parte del SoC, pero me imagino que debe ser una rareza, sobre todo en equipos más modernos.

    Tengo por ejemplo el caso fallido del firmware de SENAO - Long Range Multiclient Bridge, un dispositivo que me regalaron y que estoy seguro que aunque no funcionaba prendía, cosa que no ocurrió cuando quise hacer esta exploración.

    Tiene varios componentes interesantes:




    UBICOM IP2022 Wireless Network Processor

    ATMEL 0441, no sé qué es, supongo que es memoria flash

    Una placa PCMCIA con antenas. Si existiera y yo pudiera conseguir una placa PCMCIA a puerto paralelo o GPIO y si pudiera intervenir el firmware, tendría una excelente oportunidad de cambiar el propósito del dispositivo.

    Hay tres conectores, uno de ellos parece ser rs232 pero le falta el chip.






    La datasheet el UBICOM dice cuáles pines pueden ser los seriales:




    Aplicando el siguiente método, continuidad, comprobé que desde los pines hay pistas hasta el chip ausente, sólo me faltó el empeño de suponer que chip es y si los pines serían los apropiados.




    Al documentar esto saqué las fotos y he descubierto que me hubiese ayudado
    mucho mirar la foto bien grande mientras seguía las pistas.



    En este caso bien puede ocurrir que el firmware no esté usando la UART pues el chip ni está, pero hasta prenderlo, no sabés.


    Inspección visual y continuidad


    Con un tester o un led, rastrear entre el pin, el conector y los chips si hay pistas que conecten de modo consistente.





     

     

    Señales

     

    Hasta acá nos manejamos con el dispositivo apagado, llegó la hora de prenderlo y ver que hace. Puede hacer falta conectarle algo al puerto serial, por ejemplo la parallella afirma que si no hay nada conectado al arrancar, no se habilita. Esto no lo comprobé.

    Niveles

    Con el tester podemos comprobar que Vcc y GND lo sean. Luego, en Rx no debería haber nada y en Tx un nivel alto.

    Si estuviera transmitiendo como una consola serial de un sistema operativo al arrancar, Tx estaría cambiando pero muy rápido como para verlo con un tester.



    Analizador lógico

    Si los niveles eléctricos corresponden, podemos conectarle un analizador lógico como este, mencionado en esta conversación.


    Esa captura se hace con sigrok-cli y luego se puede ver y decodificar con pulseview.

    Ejemplo de decoder con sigrok-cli:

    sigrok-cli  -d fx2lafw --time 3000 \
        --config "samplerate=1 MHz" \
        --triggers 0=1 --wait-trigger \

        -P uart:baudrate=9600

    Start bit
    1
    1
    1
    0
    0
    1
    1
    0
    g
    Stop bit
    Start bit
    0
    0
    1
    0
    1
    1
    1
    0
    t
    Stop bit
    Start bit
    1
    1
    0
    1
    0
    1
    1
    0
    k
    Stop bit
    Start bit
    1
    1
    1
    0
    1
    1
    1
    0
    w
    Stop bit
    Start bit
    1
    0
    0
    0
    0
    1
    1
    0
    a
    Stop bit
    Start bit
    0
    1
    1
    0
    1
    1
    1
    0
    v
    Stop bit
    Start bit
    1
    0
    1
    0
    0
    1
    1
    0
    e
    Stop bit


    En verde el mensaje transmitido.



    Si no corresponden los niveles se puede hacer una adaptación que prefiero delegar a alguien que sepa.


    Osciloscopio

    El más caro de los métodos, si tenés dos canales podés ver ambos sentidos y si además tiene decodificador, podés ver pasar las letritas, pero tenés que acertarle al baudrate. En el osciloscopio que tengo yo eso no es gran problema, pues el decoding se hace sobre lo que ya está capturado en memoria, no hace falta recapturar.







    Finalmente, de un modo u otro, una vez que tenemos identificados los pines, a jugar.

    En las serie de artículos Jugando con los rayos, muestro en particular el uso para explorar el firmware.

    Acá hay un ejemplo de como pasar de la UART a RS-232, que no he probado. Consiste en agregarle un chip y un par de conectores.

    Y acá hay un ejemplo de modding muy intersante, mucho más ambicioso, pero en linea con mi objetivo estratégico de aprendizaje.

    Conexión directa


    Un último recurso es, habiendo identificado los niveles, conectar el Tx del dispositivo al Rx de una compu o microcontrolador, considerando correctamente la adaptación eléctrica que pueda haber e ir probando los distintos baudrates.


    Asshley Modison

    $
    0
    0
    (Nota del futuro 2020

    En el marco de #quedateencasa me puse a revisar notas viejas no publicadas y no recuerdo bien por qué no lo había hecho con esta, así que el "Un poco tarde" de abajo, escrito en 2015, es más que apropiado)


    Un poco tarde, noticia vieja, perdón por no estar en la cresta de la ola. Es que hacer esto me llevó un buen rato, tanto hacerlo en sí como hallarle un momento entre otras cosas.


    Continuando con la decadencia de este blog, hoy miro un rato el dump de asshley modison. No avisés, ya sé que está mal escrito, lo que pasa es que no quiero aparecer en la primera página de ningún buscador, hay gente a la que le molesta que se haga leña del árbol caido.

    Como de costumbre voy a repetir la recomendación de no repetir credenciales para evitar que al ser comprometido un sitio caigan todas tus cuentas en los otros sitios.

    No voy a repetir la recomendación de vivir en el mundo real.

    Como dice la publicidad, no uses el celular cuando estés conversando.


    Como siempre, no uses los servicios online para verificar si estás en el dump, no tenés manera de saber si es buena gente o están recolectando mails para spam [adobe], si es de tu interés, busca el torrent y divertite.


    Al grano

    Complica el análisis que AM no verifique los mails.


    En relación a la estafa que puede ser este sitio se menciona que en la proporción 30 a 5 de mujeres subscriptas declaradas, apuesto a que hay que ajustar a una inmensa cantidad de falsas cuentas femeninas.

    En una nota [gizmodo] muestran como analizando el mail y la IP se descubren decenas de miles de cuentas falsas, pero no alcanzan para el 9 a 1 de la declaración de Impact Team[reddit]. Luego, analizando los campos mail_last_time, chat_last_time y reply_mail_last_time llega a que la relación es 1000 a 1.

    Sin embargo, hay casos de mujeres que le avisan a la autora que si existen.

    Para mi hay que analizar la fecha de alta del primer uso en relación a la fecha de not null de esos campos. Como desarrolladores bien sabemos que las bases de datos evolucionan y eso hace aparecer nules no significativos.

    Lo mejor sería cargar en una base y hacer las consultas con sql, pero para qué tenemos grep si no lo usamos, ¿no?

    tr ",""\n"< aminno_member_email.dump | grep "@" | grep -v " SET " | cut -d"@" -f 2 | sed -e "s/'//"> mails.txt

    esto convierte cada coma en un salto de linea, toma cada linea con @ y quita cada linea con " SET ", parte cada linea en la arroba, toma el segundo campo, elimina la comilla y pone el resultado en mails.txt


    Algunos números interesantes:



    Hay una noticia cuyo título menciona a 150 argentinos [clarin]. En el cuerpo de la noticia dice que 148 y sólo de organismos .ar, pero a mi me da otra cosa...


    grep -e "go[vb].ar'$" mails.txt  | sort | uniq | wc -l
    144

    quizas me faltan?

    grep -e "mil.ar'$" mails.txt  | sort | uniq | wc -l
    2


    mmmh, la primera consulta sin el uniq me da

    grep -e "go[vb].ar'$" mails.txt  | wc -l
    156

    ¿Habrá sido esta la lista reportada tras borrar algunas direcciones?


    No se puede confiar en las computadoras.


    Los argentinos no importantes somos un poquito más, sin incluir gmail.com, yahoo.com y otros dominios que no son .ar:

    grep -e ".ar'$" mails.txt  | sort | uniq | wc -l
    69974


    Me gustó un comentario en [reddit], aunque no representa mi visión:


    I don't agree with your methods. Say we have 3 interested parties here. The company A..... M....., people cheating on their spouse (possibly hurting them) and people just looking for fun because sex is fun (not hurting anyone). I'm pretty sure you've hurt the most innocent people worst of all because now their names are on your list despite never hurting anyone. A.... M.... will move on. Cheaters will move on. You haven't really accomplished much of anything, besides maybe forcing me to explain to my girlfriend that I signed up before I met her.

    (No estoy de acuerdo con vuestros métodos. Hay tres protagonistas aca. AM, los tramposos y los que se quieren divertir sin molestar. Han lastimado a los últimos pues AM va a seguir sus negocios, los tramposos seguirán trampeando y los que sólo nos queriamos divertir ahora tenemos que explicarle a nuestras novias que nuestra cuenta es anterior a ellas)





    [boxeadores] http://seguridad-agile.blogspot.com/2015/07/boxeadores-en-la-cabina-de-un-avion.html


    [adobe] http://seguridad-agile.blogspot.com/2013/11/leak-adobe.html

    [clarin] http://www.clarin.com/sociedad/argentinos-escrachados-escandalo-Ashley-Madison_0_1415858680.html

    [gizmodo] http://gizmodo.com/almost-none-of-the-women-in-the-ashley-madison-database-1725558944

    [reddit] https://www.reddit.com/r/AnythingGoesNews/comments/3h71ar/we_are_the_impact_team_we_are_releasing_the/

    El tiempo y las vulnerabilidades

    $
    0
    0
    El otro día en una sesión de un producto de seguimiento y gestión de vulnerabilidades me hallé de modo explícito con un concepto que me estaba rondando por la mente hace un buen tiempo y no se había cristalizado aún: aging, con el tiempo aumenta (cambia) la criticidad de una vulnerabilidad.

    Tengo muchas preguntas, no sé si suficientes respuestas ni si son correctas, pero las comparto para la reflexión.

    Antes repasemos un poco que es una vulnerabilidad y cómo se calcula su criticidad. Dicen los manuales algo asi como:

    Una vulnerabilidad sobre un activo es una falla que puede ser explotada por un atacante para ejecutar acciones sobre un equipo.

    Estas afectan la Confidencialidad, Integridad y Disponibilidad de la información si lo vemos desde el punto de vista de la Seguridad de la Información.

    Mejor aún si ampliamos a la visión de Dependability (ni idea de cómo traducir a algo lindo eso), tambien afecta a Safety, que es una visión mejor, pues dentro de la primera triada, ¿dónde entra que se bloquéen los frenos de un auto en la ruta a 120 kmph? Quizas la información del vehículo no se destruye aunque si sus ocupantes.

    Ok, entonces, en términos de impacto sobre esas palabritas, se puede determinar la criticidad de una vulnerabilidad. Unos intentos pretéritos cercanos fueron DREAD y STRIDE, el primero ya abandonado y el segundo se sigue usando según entiendo para modelado de riesgos.

    • Damage – qué tan malo puede ser el ataque?
    • Reproducibility – qué tan fácil es de reproducir?
    • Exploitability – cuánto trabajo implica el ataque?
    • Affected users – a cuánta gente le pega?
    • Discoverability – qué tan fácil es descubrir que tenés esa vulnerabilidad?

    Estas ambas metodologías no son muy precisas y no contemplan muchos, muchos factores y son bastante subjetivas.


    Amenazaen spanishSe arregla con..
    Spoofinghacerse pasar por...Autenticidad
    TamperingAdulteraciónIntegridad
    RepudiationYo no lo hice...No Repudio
    Information disclosurePérdida de informaciónConfidencialidad
    Denial of ServiceDenegación de servicioDisponibilidad
    Elevation of PrivilegeElevación de privilegiosAutorization

    Fijate que STRIDE ya contempla Confidencialidad, Integridad y Disponibilidad. De ahora en más, la llamaré "CIA".

    Para remediar esas falencias, el estado actual metodológico se llama CVSS versión 3.1 pero voy a usar la 3.0 pues los valores actuales están más en esa y estoy más familiarizado. Y me gusta más la de FIRST, voy a ir alternando las capturas para molestarte un poquito.

    Te recomiendo que abras una o dos pestañas con ambas calculadoras y vayas probando, partiendo de esta situación:

    https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H


    La calculadora tiene tres zonas de métrica, una de base que es la vulnerabilidad en abstracto, como es completamente aislada de las circunstancias y el tiempo.




    ¿Qué quiere decir esto? Que si la vulnerabilidad es altísima y es de un protocolo que no tenés no deja de ser altísima pues si instalaras ese protocolo la tendrías. Que si ya existe corrección, si no la aplicás, sigue siendo altísima.


    La otra zona es la del entorno concreto que aplica en tus circunstancias. En ésta determinás como te pega a vos realmente, no sólo a tu sistema si no a cada punto. Podés tener dos equipos con la misma vulnerabilidad pero distintos requerimientos de seguridad, cambia la criticidad. O siendo iguales uno puede estar expuesto a Internet y el otro no, ahí cambia.

    Supongamos una vulnerabilidad con 10 de puntaje, es explotable desde tal lejos como Internet. Pero si tu máquina está desconectada de la red, disminuye.




    Recordá, para el puntaje de base no vale "ah, pero a mi...", no. Es en condiciones de laboratorio.

    El núcleo de CVSS es el impacto CIA. Jugá con los parámetros y vas a ver que si el impacto en CIA es cero, la criticidad es cero. Eso tambien ocurre con el puntaje de entorno (Environmental), podés bajarla a cero si no tenés VOS impacto.

    El detalle de cada elemento lo dejaré para otra oportunidad, quizás nunca, así no se hace tan largo esto, sin embargo voy a hacer unos mínimos comentarios por si el tema es nuevo para vos. Si pasás el cursor del mouse sobre los botones de las calculadoras te explica. Si no te alcanza, me preguntás y voy agregando detalle.


    Attack Vector (AV)


    Vector de ataque tiene que ver con las condiciones de acceso, va desde Internet a tener que ponerle las manos encima al equipo.

    Attack Complexity (AC)


    Complejidad de ataque, si hay condiciones fuera del control del atacante, si hay que ponerse en el camino de red por ejemplo.

    Privileges Required (PR)


    Privilegios requeridos, ¿hace falta ser admin? usuario normal, nada?

    User Interaction (UI)


    Interacción del usuario, puedo plantar un ejecutable en un servidor, pero luego tengo que hacer que un usuario lo ejecute, mediante una comunicación falsa que así lo solicite.

    Scope (S)


    Alcance, ¿el ataque afecta este componente o hace sapito? En caso de sapito lo que sigue se debe definir para el blanco final. Por ejemplo, si puedo hace que un componente haga denegación de servicio contra otro, cambia el alcance.

    (Este es un punto que nunca me termina de cerrar, por que si en esta denegación de servicio el componente de entrada ¿tambien es víctima...?)

    Confidentiality (C) Integrity (I) Availability (A)


    Son nuestras viejas conocidas.



    En la zona de puntaje de entorno, es adaptar a tus circunstancias como ya expliqué. La diferencia es que la parte base por lo general la recibís, las otras tenés que ajustarlas vos.

    Hay un grupito extra, los CIA requirements. Este sirve para hacer un ajuste extra que es este.

    Primero tenemos que el impacto CIA es el abstracto de base, luego lo ajustamos con los Modified, que tiene que ver con que quizás no tengo información alcanzable por la explotación de esa vulnerabilidad. Finalmente, quizás tenga información alcanzable, pero NO ME IMPORTE.

    ¿Hay más?


    Lo que he notado con el tiempo es que hay dimensiones que no han sido consideradas explícitamente, por ejemplo:


    ¿A quién afecta?


    No es lo mismo a un operador final que a un administrador de sistemas.

    ¿Quién es el responsable?


    No es lo mismo un producto externo que hay que esperar el parche a un producto interno que hay que elaborarlo, o si la falla se manifiesta en el browser completamente bajo el control del atacante o en la db, bajo nuestro control. Si está expresado en "Scope", es muy retorcido.

    ¿Quién reporta?


    No es "Report Confidence", es si te la reportó un cliente quizás sea más importante resolverla antes que lo que viene por un EH, pues este cliente puede generar impacto reputacional si no está contento con la resolución.


    Esto está más desarrolado en otras notas.


    Y ahora, por fín, llego al tema que quería:


    El tiempo



    En CVSS el tiempo está contemplado de las siguientes maneras

    Report Confidence (RC)


    Confianza en el reporte, a medida que pasa el tiempo debería crecer, de un rumor a una comunicación oficial del owner del producto, aumenta el puntaje.

    Remediation Level (RL)


    Solución disponible, comienza con un hack, termina con una nueva versión bien corregida e integrada, disminuye el puntaje.

    Exploit Code Maturity (E)


    Madurez del ataque, va desde "es teóricamente posible" a un script que puede usar cualquiera,  aumenta el puntaje.



    Mi cuarto factor es el tiempo de vida de la vulnerabilidad, ¿pero cual?


    • desde que existe la vulnerabilidad
    • desde que está presente en mi sistema
    • desde que fue detectada
    • desde que fue incorporada al sistema de seguimiento


    Evidentemente la última no es, el sistema de seguimiento debe tomar al menos la fecha de detección, pudo haber venido en un batch corrido hace un mes.

    Y acá es donde llega el momento de pensar y que aún no me decido, veamos un ejemplo:

    Detecto una vulnerabilidad en un sistema legacy que está instalado hace diez años y la vulnerabilidad tiene once, ponele.

    ¿Es crítica? ¿Tiene sentido que salga corriendo a corregirla si han habido diez años de oportunidad para explotarla? Esto haría que el tiempo atenúe la criticidad.

    Si acabo de instalar el sistema SI es crítico que lo arregle ya. Esto es congruente con que ante una crítica de algo que ayer era un Zero Day, tengo que arreglarlo ya mismo.

    Entonces me estaría quedando con que el tiempo es el de presencia, atenuante.


    Por otro lado, a medida que pasa el tiempo aumentan la probabilidades de que sea explotada y fundamentalmente aumenta el nerviosismo de las altas esferas, ¿¿¿¿cómo puede ser que tengamos esa vulnerabilidad desde hace tanto tiempo??? Este había sido el motor de este aspecto en mis pensamientos precristalizados.


    Quiza la forma es creciente durante un tiempo y luego atenuante.



    Expresaré con grafiquitos lo dicho hasta ahora:

    El tiempo pasado entre la existencia pública de la vulnerabilidad y la detección en el sistema, el reporte, es breve:

    sistema =========================================
    vulnerabilidad    ===============================
    reporte             =============================
                                  crece crece decrece

    La vulnerabilidad está presente hace mucho en el sistema pero recién nos enteramos: sistema

    sistema  =========================================
    vulnerabilidad ===================================
                          reporte ====================
                                       decrece decrece


    La parametrización de esos crecen y decrecen, para mi debe ser resultado de un estudio estadístico de qué ha ocurrido en la realidad, probablemente exista pero no me muero de ganas de buscarlo ahora (en realidad busqué y no apareció nada rápido). Si no existe, puede ser el tema de tu tesis, no te olvides de mencionar que yo te dí la idea.




    De paso te digo que cuanto mayor haya sido el tiempo de exposición, mayor esfuerzo hay que dedicar a determinar si la vulnerabilidad ha sido explotada.


    Y lo que nunca te puede pasar  esto:

    sistema                =============================
    vulnerabilidad =====================================

      Time and vulnerabilities

      $
      0
      0
      This post is a dirty, quick and lazy translation from the original in spanish, es lo que hay.


      While attending a vulnerability tracking and management tool demo, I found a concept that was lurking in my mind for a long time: aging affects a vulnerability score.


      I have a lot of questions, not enough neither correct answers, but I share them

      But first, recall what a vulnerability is and how to score it, from the manual:

      An asset vulnerability is a glitch that can be exploited by an attacker in order to act upon this asset.

      That action affects information Confidentiality, Integrity and Availability 
      if we mind Information Security point of view.


      Better yet, if we extend to  Dependability it also affects Safety. That is a better angle, where does Information Security fit when a 90mph vehicle blocks its breaks? May be we can recover the information but not the people inside.


      Based upon impact over CIA we can score the vulnerability. Some earlier methods were DREAD and STRIDE, the first once gone and the second used still used in risk modelling, I've been told.


      • Damage – how bad would an attack be?
      • Reproducibility – how easy is it to reproduce the attack?
      • Exploitability – how much work is it to launch the attack?
      • Affected users – how many people will be impacted?
      • Discoverability – how easy is it to discover the threat?

      Both methods are not fit to scientific purposes.

      ThreatDesired property
      SpoofingAuthenticity
      TamperingIntegrity
      RepudiationNon-repudiability
      Information disclosureConfidentiality
      Denial of ServiceAvailability
      Elevation of PrivilegeAuthorization


      Take note that STRIDE considers the CIA Triad.

      The current method is CVSS version 3.1  but I will use the 3.0 because I like it more, in particular another calculator from FIRST.



      Now it is time to open both calculators and play with them, starting with the worst case:



      https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H


      The calculator has three zones, one of them is the base, it is abstract, isolated from context and time.




      What does it mean? If the score is high but you do not have an affected asset, nevertheless it remains high, as soon as you install it, you have the vulnerability. If it is fixed but you do not apply the patch, it is still high.


      Environmental zone is you, not only your system but each point of it. Two assests can have the same vulnerabilty, but different security requirements or been one in the perimeter and the other protected by a firewall, score changes.


      A 10 point critical vulnerability in a device facing Internet drops to 7.6 high when disconnected from the network:






      CIA lies at the heart of the scoring sisytem. Play with the parameters, if CIA impact is zero, score is zero.

      Hover the mouse pointer over the buttons of the calculator and you will see the definitions.

      CIA requirements allows you to adjust to what value has the information in this asset to you. CIA modifiers is what the impact is in this asset, perhaps you do not have any information. Can you tell the difference between "modifiers" and "requirements"?

      In this particular device, you have read only storage, Integrity is safe, score lowers. But you have an extra requirement that there can not be changes, scores raises.


      Any more?


      I've been noticed that there are more dimensions, not explicitely considered:

      Who is affected?


      It is not the same a final user that the sysadmin.


      Who must fix it?


      It is not the same waiting for the patch of an external product that having to produce it for your own system. Neither if the failure is exploited in the browser, out of your control that in the db, yours.

      Thing about XSS vs SQLi.

      Where does the report come from?


      It is not "Report Confidence". If a costumer reports it, you can have reputational impact if she is not happy with your solution.


      More on another post in spanish.

      Time



      CVSS deal with tiem in this way:

      Report Confidence (RC)


      Given more time, from rumor to official declaration, it raises the score.

      Remediation Level (RL)


      It starts with a hack, ends with a new fixed and integrated version of the software, the score gets lower.

      Exploit Code Maturity (E)


      From a POC to a script kiddie too, score raises again.




      My fourth dimension is aging, but which one?


      • from vulnerability existence
      • from being present in my system
      • from detection in my system
      • from the discovery in my system

      It is not the last one, a vulnerability tracking system must use the detection timestamp.

      From this point, it is only half cooked thinking.

      Does it raise the score an eleven year old vulnerability discovered now in a ten year old legacy system? There has been plenty of time to be exploited, time attenuates.


      If my system is installed right now, any day makes exposition worst

      Another factor is CEO Happines: How can it be that we have this vulnerability going for so long? First thing you have to do is forensic analysis in order to tell if it has been exploited.


      Graphically:

      Time between vulnerability existence and detection is short


      system =========================================
      vulnerability    ===============================
      report             =============================
                                   grows grows shrinks
       The same time is long:

      system  =========================================
      vulnerability ===================================
                            report ====================
                                        shrinks shrinks

      This grows and shrinks parametry only can be the result of a statistical analysis of what have happened in the reality, a good topic for research, do not forget to mention that you have read this post ;')


      What must never happen to you:

      system                =============================
      vulnerability =====================================




        FSM vs SQL, algunas consideraciones de correlación de eventos

        $
        0
        0

        Hace como un año comencé a desplegar unas alarmas en el trabajo utilizando FSM para procesar los logs y obtener alertas tempranas ante ciertos incidentes.

        Luego me dí cuenta que pude haberlo hecho utilizando consultas SQL, lo cual me llevó a reflexionar mucho sobre el tema, hacer algunas prueba y preparar una charla que dí en el trabajo de modo virtual pero no podré dar afuera por que todas las conferencias medio que están caidas.

        Esto viene a ser un resumen de lo que pudiste haber visto en FLiSOL, H4CK3D, OWASP Latam Tour, LACNIC y no digo Ekoparty por que nunca me aceptan nada.

        Voy a asumir que tenés una idea de los temas, que sólo te estoy aportando las relaciones entre las ideas. Además yo no soy ninguna autoridad de conocimiento, sólo estoy expresando opiniones más o menos bien sustentadas.



        Voy a usar el siguiente vocabulario, los dos primeros corresponden al uso común y el último lo uso para manejarnos ahora.

        Evento: cada cambio sin connotación positiva o negativa
        Incidente: un cambio con connotación negativa
        Caso: conjunto de eventos en análisis que conducen a un incidente.

        Un caso simple


        Partamos de un sencillo requerimiento atemporal, no hay tiempo ni información variable involucradas.


        Si hay una conexión a la IP_perimetral en el puerto 8081 desde una IP_externa que no está en la red 211.10.10.0/24 y tiene cierto "DATO", quiero una alarma, evitarlo o incluso agredir.

        Esta es un típica regla stateless, se puede resolver con lógica combinacional:

        [grafico logico]

        IP destino en IP_perimetral
           AND
        puerto es 8081
           AND
        IP origen NOT en red 211.10.10.0/24
           AND
        mensaje contiene "DATO"

        Tambien con una consulta SQL:

        SELECT * FROM conexiones 
           WHERE
              ip_destino IN (SELECT  ip FROM red_perimetral)
           AND
             port_destino = 8081
           AND
             ip_origen NOT IN ( SELECT ip FROM red_externa)
           AND
             datos like “%DATO%”;


        O con una FSM de un solo estado, que contendría la lógica combinacional previamente citada, en pseudo-C:

        if ( 
          pertence( IP_destino , IP_perimetral) )
          & puerto == 8081
          & ! pertenece(IP_origen, 211.10.10.0.24)
          & strpos("DATO", mensaje) {
            generar_alerta();
        }



        Algunos atributos apropiados para nuestros ejemplos:
        • Origen
        • Destino
        • Tipo de mensaje
        • Contenido del mensaje
        • Longitud del mensaje
        • Horario

        Un caso complejo



        Si hay un scan desde una IP_externa y desde esa misma IP hay luego una conexión con un DATO y luego se ve ese DATO en una copia entre nodos internos de una IP_interna_origen a una IP_interna_destino y finalmente hay una conexión saliente de esa ip interna de destino con ese DATO, quiero una alarma, evitarlo o incluso agredir.

        Que es difícil de leer, mejor no lo leas, leé esto:

        Si se da la siguiente secuencia de eventos
        • Scan desde una IP_externa
        • Conexión desde esa IP_externa con un DATO
        • Copia de datos entre dos nodos con ese DATO desde una IP_interna_origen a una IP_interna_destino
        • Conexión saliente de la IP_interna_destino con ese DATO
         entonces quiero una alarma, evitarlo o incluso agredir

        Fijate que las partes coloreadas no están predefinidas, son variables que deben
        concidir entre las distintas partes de la reglas

        A los atributos previamente mencionados se suma "Relación entre los mensajes".

        Lógica combinacional


        Este es el terreno de Boole, es prácticamente instántanea, corre a la velocidad máxima de propagación entre compuertas si está implementada en hardware, que es factible usando FPGA. Si corre en software, son pocas y simples instrucciones. Cuando se le agrega memoria, se llama secuencial, siendo un caso particular es la FSM.

        FSM


        Dice wikipedia que:

        Un autómata finito (AF) o máquina de estado finito es un modelo computacional que realiza cómputos en forma automática sobre una entrada para producir una salida.

        Que es lo mismo que hace cualquier proceso o programa, lo específico es que es un cierto modelo computacional, mirá los componentes de una FSM:


        • estados
        • entradas
        • salidas
        • función estado(estado,entrada)
        • función salida(estado,entrada)
        • estado inicial

        Un proceso genérico no tiene necesariamente la función de estado, ni siquiera estados.

        Las funciones de entrada y salida son combinacionales, quizás con efectos colaterales cuando hay más memoria que estado en sí.


        Un ejemplo muy natural por decir de algún modo es un operating system scheduler que es su expresión más baja se reduce a esto:




        Lo que está diciendo es que cuando se crea un nuevo proceso, va al estado "Ready To Run". Cuando el OSS decide que corra, Running, del cual puede salir cuando termina, cuando se le termina el tiempo asignado de ejecución y el OSS lo regresa a R2R o cuando pide una operación que implica largos tiempos de espera como acceso a un periférico. El sistema operativo detecta eso y elije mandarlo a dormir para liberar la CPU para otro proceso. Cuando la operación de entrada salida concluye, el proceso pasa nuevamente a R2R y así.


        Como se implementa, puede ser como en mi demo con el estado atributo en la instancia, pero tambien puede estar el objeto (o estructura) en una tabla y una de sus columnas ser el estado. Tambien y me gusta más intuitivamente pues nunca implementé un OSS, en tablas o listas separadas, una para cada estado.

        Consulta SQL


        Asumo que sabés al menos que es un join sencillo.

        En el contexto de lo que estamos analizando, estas son las principales características para comparar entre FSM y consulta SQL:

        En la FSM el tiempo está implícito, hace falta que los eventos lleguen ordenados, falla si no. No hace falta guardar estos eventos, sí algún que otro dato para parametrizar las reglas y para el reporte final. Esos datos y el overhead de las instancias de cada caso genera un consumo creciente de memoria. Dado que da una respuesta de muy baja latencia, puede ser usada en situación de bloqueo, esto es que no sólo alerte sino impida la acción final del ataque. Es más difícil de programar pues es... programar, justo.

        Las Consultas SQL por su lado necesitan el tiempo pero este está explícito en el timestamp del mensaje y necesita conservar los mensajes, de lo cual se encarga el DB Engine con todo sus ventajas de escalamiento. No lo veo mucho en situación de bloqueo, quizás si para un sistema transaccional pero no para algo donde la latencia sea crítica. Es más fácil de programar pues no es programar, es escribir SQL, lo cuál al comienzo es más difícil cuando es complejo, pero luego es más de lo mismo.


        Una FSM puede alimentarse de un batch ordenado. O sea que tambien se puede usar para detectar en archivos históricos. Me imagino que no debe ser más eficiente que DB pues las DB estan diseñadas para ser eficientes en ese escenario.

        Como machete, FSM vs Query SQL:



        FSM
        Query SQL
        Tiempo
        Implícito
        Explícito
        Orden de eventos
        Indispensable
        Indiferente
        IO
        Stream
        Stream/batch
        Almacenamiento
        Descartable
        Indispensable
        Memoria
        Creciente si no se purga
        DB Engine (*)
        Real Time
        Hard (sniffer)
        Soft
        Modo
        Detección y Bloqueo
        Detección
        Escalamiento
        Provisto por S.O.
        Provisto por DB
        Conocimientos
        Programación
        SQL
        Cambios lógica
        Difícil
        Fácil
        Embebible
        Si
        Mmmh


        Con embebible me refiero a que se podría tomar un microntrolador y/o FPGA y hacer un modulito que se conecte a la red y cumpla alguna función digna de mención, no tanto con una DB, para la cual hace falta un sistema operativo detras, mmmh, por eso, mmmh, no.

        Características compartidas

        • Hay que tener en cuenta un "tiempo de vida", un "timeout", tras el cual un caso debe ser desestimado en el caso de FSM o una antigüedad de log ignorada en el de SQL. Esto reduce el tamaño de la DB/espacio en memoria.
        • Pueden haber alertas intermedias, en el caso de FSM simplemente emitir mensajes en estados previos al final, en el de SQL consultas que no incluyan las últimas condiciones, una especie de copiar->pegar->podar de la consulta.

        Para SQL hay un optimización híbrida, en lugar de ejecutar siempre toda la consulta, buscar la condición del último evento, en nuestro ejemplo una conexión hacia el exterior, si existe, hacer la consulta completa. Quizás las optimizaciones que hacen los DB Engines hacen eso o se les puede sugerir, sé muy poco de DB.

        Dicho de otra manera, cuando llega el último evento, me fijo si han ocurrido las condiciones para llegar hasta ahí.

        Hice una demo que está en github, te cuento:

        Modificá export.php y generás la base de datos para las Consultas SQL, que están en el archivo... consultas.sql.

        SimpleFSM.java es una POC para casos no solapados, es para concentrarse en un ejemplo de FSM y en la lógica y cuestiones secundarias como leer de STDIN.

        FSM.java es la implementación más correcta, donde una una colección de casos, de paso, las clases deberían llamarse CasoSimple y Caso, no el nombre de la implementación, pero cuando lo hice estaba mas concentrado en la FSM que en las recomendaciones de Domain Driven Design.

        Fijate que al pasar de SimpleFSM a FSM el evento que lleva al primer estado es extraido de la  lógica común. Para entender bien mirá la evolución por el paso intermedio, FSM2, que debería llamarse FSM_fail, donde estoy haciendo dos cosas a la vez: la FSM y la gestión de la colección.

        Lo correcto es hacer FSM y de ahí fijarse como optimizar para que los loops terminen antes si pueden y esas cositas.

        xzoom mejora a Zoom

        $
        0
        0
        El título es sólo un juego de palabras y un engaño para atraerte, pero si tras mi confesión seguís leyendo, vas a ver que debería ser "xzoom mejora videoconferencia", no es tanto engaño.

        Para los que somos torpes compartiendo pantallas y ventanas, en parte por torpeza natural y en parte por usar múltiples monitores, se me ocurrió una idea para facilitarnos la vida y las presentaciones en vivo.

        Sé que existen herramientas como OBS pero me supera ponerme a aprender a usarla, parece que implica conectarse a streamers, es más para alguien que va a estar haciendo broadcasting, no utilizando una plataforma existente. Lo dejaré para cuando sea grande y famoso y tenga mi canal de YouTube.

        Lo que he ideado, que probablemente no sea una idea original pero no pude hallar en menos de quince minutos algo equivalente, tiene la ventaja de ser independiente de la aplicación utilizada, sirve para cualquiera sistema que pueda compartir una ventana.

        La idea es compartir una sola ventana y que esta muestre lo que tiene detras, una ventana al escritorio, podríamos decirle. Esto es en lugar de tener que estar eligiendo si compartir todo el desktop, ir eligiendo que ventana y si prender o no la cámara.

        Parece que algunas aplicaciones tipo teamviewer o [por favor no usar] zoom permiten elegir full screen y luego ajustar a una región, con hangout no pude, pero quizás tenga que ver con tener múltiples monitores o con mi falta de destreza ya mencionada.

        Como implementación pensé en tomar una terminal y definirle una transparencia total y usarla como ventana y anda bien localmente como es de esperar, pero evidentemente la transparencia se hace por fuera de la ventana, entonces en lo compartido se ve la ventana como si no fuera transparente.


        Esto es lo que deseaba


        Pensé en desarrollar una aplicación en gtk o qt que lo haga, un marco que iría desplazando por el escritorio pero a contramano de mi práctica habitual me ganó lo poco que tengo de ingeniero no recibido y no rehice lo que ya existe.


        Finalmente arribé a una implementación que anduvo como piña: usar una lupa sin magnificación.

        Este es el procedimiento:

        • apt install xzoom (una sola vez, pero si te lo tengo que aclarar, mmmh, estamos en distintas sintonías)
        • xzoom -mag 1
        • Ajustás tamaño.
        • Determinás la región a mostrar.
        • Ubicás en algún lado cómodo la ventana de zoom para ver lo que estás mostrando, no es indispensable.
        • Le pedís a esa ventana que tenga "Always on top" y "Always on visible Workspace"




        • Preparás todos los contenidos en distintos workspaces o como te guste.
        • Abrís un vlc conectado a la cámara en lugar de darle la cámara al sistema de videoconferencia por si querés mostrar tu carita o lo que tengas detrás tuyo, una pizarra. Le ponés "minimal interface" para evitar los botones.
        • Compartís la ventana, por ahora siempre se me llamó "xzoom x1"
        • Ponés y sacás en la región observada lo que querés que se muestre y/o cambiás de workspace.
        • Sobre la marcha podés cambiar el tamaño de la ventana y así variar la zona de captura, por si pasás de un contenido que requiera más o menos pantalla que otros.
        • Al achicar de tamaño la ventana de xzoom funciona como lupa pues el sistema de videoconferencia maximiza el tamaño de la ventana,
        • Si no querés que haga de lupa, mantené una de las dimensiones al redimensionar

        Algunos ajustes


        La elección de la región a mostrar me costó al comienzo, de hecho no sé como me funcionó la primera vez y me pareció un desperdicio explorar ese camino, asi que me arreglé con:


        xzoom -mag 1 -source 640x480+200+1200

        Ahí le estoy diciendo que haga 640 por 480 de captura, 200 pixel desde la izquierda y 1200 desde arriba, en mi caso que tengo un monitor encima del otro viene a ser arriba de el de abajo.

        La medida inicial, 640 por 480 luego se puede ajustar simplemente cambiando el tamaño de la ventana de zoom.

        Luego, al otro día, al ver que el cursor cambiaba estando sobre la ventana de xzoom pensé que por algo sería, hice click e hice click, primero en la ventana y luego en mi cabeza, es el modo de cambiar la región, tal como lo dice man xzoom, ¡qué cosa esta de no leer la documentación aunque sea media página!

        Y luego, cuando miraba el código fuente para ver si le podía agregar que muestre el cursor, vi las opciones de linea de comando, es muy manejable:

        $> xzoom --help
        Usage: xzoom [ args ]
        Command line args:
        -display displayname
        -mag magnification [ magnification ]
        -geometry geometry
        -source geometry
        -x
        -y
        -xy

        Window commands:
        +: Zoom in
        -: Zoom out
        x: Flip right and left
        y: Flip top and bottom
        z: Rotate 90 degrees counter-clockwize
        w: Next '+' or '-' only change width scaling
        h: Next '+' or '-' only change height scaling
        d: Change delay between frames
        q: Quit
        Arrow keys: Scroll in direction of arrow
        Mouse button drag: Set top-left corner of viewed area



        Te permite hacer el zoom in y out y mover la región observada con el teclado.

        Otra optimización es pedirle a vlc que arranque sin decoraciones y abra la cámara:

        vlc --qt-minimal-view  v4l2:///dev/video0


        Limitaciones


        Un problemita que hay es que xzoom no muestra el cursor de la región ampliada en su ventana, otras herramientas de captura ofrecen hacerlo o no.

        Me he arreglado con un hack, que es arrastrar una carpeta con el ícono cambiado:

        FakeCursor en acción


        Hay que tener cuidado de no soltarla, si lo hacés sobre un navegador te va a abrir esa carpeta.

        Actualización: modifiqué el programa para que me muestre el cursor



        No he probado en windows ni mac herramientas equivalentes, pero el concepto es el mismo. En linux estoy con Mint Mate, no veo motivo para que no funcione en cualquier otro desktop o distribución.


        Resultados


        Lo he probado con hangout, meetup, dí una charla de una hora en el trabajo, lo usé en varios calls, ya ni me doy mucho cuenta.

        xzoom mejorado

        $
        0
        0
        Me había quedado muy incómodo con el hack de arrastrar la carpeta para que se viera en la ventana magnificada el cursor, así que me puse a investigar. A diferencia de lo que suelo hacer que es ir mostrando todos los caminos equivocados que tomé y lo que aprendí, voy a mostrar sólo el camino feliz.

        Entre la m y la p, hay una región en negativo


        Tras algunos intentos fallidos aprendí a bajar el código fuente, tan fácil como:

        $> mkdir sources
        $> cd sources
        $> apt source xzoom


        Conviene crear la carpeta contenedora por que te tira todo donde estés. Para crear el Makefile:

        $> xmkmf

        Si no existe lo arreglás con el sudo apt get que te sugiere. Luego compilás con:

        $> make


        Yo quería apoyarme en lo existente y hacer un fork para luego proponer un pull request, me puse a buscar y hallé:


        Le mandé mail al creador original, parece ser un proyecto que ha muerto en su origen, si me constesta, actualizaré.



        Me quedé entonces en investigar y se me ocurrió mirar la versión de mbarakatt, ¡bingo! tiene casi todo el código necesario, sólo tuve que acomodarlo y ver como dibujar el cursor.

        Para que le sirva a mbarakatt incorporé primero la funcionalidad de prender y apagar el follow mouse y luego seguí construyendo encima.

        Lo que voy a hacer para que le sirva a mbarakatt es primero incorporar la funcionalidad de prender y apagar follow mouse, así me queda el código incorporado, luego agregaré lo que quería.


        Proceso definitivo




        $> mkdir xzoom
        $> cd xzoom/
        $> apt source xzoom
        $> rm *
        $> mv xzoom-0.3/* .
        $> rmdir xzoom-0.3/
        $> git init .
        $> git add .
        $> git commit -m "Initial commit ..."

        Hice un branch follow_mouse y en master dejé lo del cursor.

        Finalmente, para actualizar el binario:

        $> which xzoom 
        /usr/bin/xzoom
        $> sudo chown root.root xzoom
        $> sudo cp xzoom /usr/bin/xzoom


        El código está en https://github.com/cpantel/xzoom.

        El código aportado


        Para procesar las nuevas opciones de linea de comando:


        if(!strcmp(argv[0], "-follow")) {
          follow_mouse = True;
          continue;

        }

        if(!strcmp(argv[0], "-no-follow")) {
          follow_mouse = False;
          continue;
        }

        if(!strcmp(argv[0], "-cursor")) {
          show_cursor = True;
          continue;
        }
         

        if(!strcmp(argv[0], "-no-cursor")) {
          show_cursor = False;
          continue;
        }



        El cambio de las opciones en tiempo de ejecución:


        case 'c':
          show_cursor = ! show_cursor;
          break;
         

        case 'f':
          follow_mouse = ! follow_mouse;
          break;




        Le agregué los condicionales a seguir el mouse:

        if (follow_mouse || show_cursor ) {
          for (i = 0; i < number_of_screens; i++) {
            result = XQueryPointer(display, root_windows[i], 

                       &window_returned, &window_returned,
                       &root_x, &root_y, &win_x, &win_y,
                       &mask_return

                     );
            if (result == True) {
              break;
            }
          }
          if (result != True) {
            fprintf(stderr, "No mouse found.\n");
            return -1;
          }
          if (follow_mouse) {
            xgrab = root_x - width[SRC]/2;
            ygrab = root_y - height[SRC]/2;
          }

        }


        Y el corazón, que fué medio tiro al arco zen, por puro instinto, inspirándome en una pregunta que encontré por ahí:


        if (show_cursor) {
          long pixel = 0;
          int cursor2x = ( root_x - xgrab ) * magx;
          int cursor2y = ( root_y - ygrab ) * magy;
         

          if (cursor2x < CURSOR_RADIUS)
            cursor2x = CURSOR_RADIUS;
          if (cursor2y < CURSOR_RADIUS)

            cursor2y = CURSOR_RADIUS;

          if (cursor2x > ximage[DST]->width)

            cursor2x = ximage[DST]->width - CURSOR_RADIUS;
          if (cursor2y > ximage[DST]->width)
            cursor2y = ximage[DST]->height - CURSOR_RADIUS;

          for (int x = cursor2x - CURSOR_RADIUS;

               x < cursor2x + CURSOR_RADIUS 
                 && x < ximage[DST]->width;
               x++
              ) {
            for (int y = cursor2y - CURSOR_RADIUS;

                 y < cursor2y + CURSOR_RADIUS
                   && y < ximage[DST]->height;
                 y++
                ) {
              // Invert the color of each pixel
              pixel = XGetPixel(ximage[DST], x, y);
              XPutPixel(ximage[DST], x, y, ~pixel);
            }
          }
        }



        Los limitantes entre 0 y width y height estan para que el cursor se detenga en el borde y te dé un indicio de dónde está. El de 0 tambien está por que si no crashea.

        El código es horrible, son mil lineas, todo en main, variables globales. Si fuera a completar lo faltante que es que funcione correctamente mostrar cursor cuando hay rotación, lo refactorizaría todo, pero difícil que ocurra.

        Curso Akamai Kona Site Defender

        $
        0
        0



        Akamai en general es mucho más que lo que voy a comentar, que sólo es lo que me resultó útil o interesante, no es mi idea reproducir la información institucional o el curso, más por que hay partes confidenciales. ¿A qué se debe esta confidencialidad? Pues a que el conocimiento de ciertos detalles de cómo se usa la herramienta, podrían ser beneficiosos para un atacante. No uno de alto nivel, que simplemente contrata y toma el curso, si no para los script kiddies.

        Lo administrativo, son 13.5 horas brutas en dos días, quedan unas doce netas.

        Es un curso bastante pesado, tiene un poco del inevitable humito de venta, un ratito breve al comienzo, aceptable. Lo bueno es que no profundiza en explicar las vulnerabilidades, solo un checkpoint. Es que está orientado no sólo a quien sabe si no tambien a un perfil más operativo, que bien puede ser capaz de lidiar con el problema en general de configurar la herramienta aunque no entre en el detalle y termine de comprender cada vulnerabilidad y ataque.

        Los labs son del tipo haz como te digo  paso a paso y luego algunos casos haz igual a lo que te dije.

        Antes despreciaba esa metodología, pero cuando transité leer y practicar zynq book y mpsoc zynq book aprendí a apreciarla, cuando el tema es muy difícil como en ese caso o la cabeza ya no te dá para tanto como este, si los labs hubiesen sido de los copados tipo arreglate para hacer esto con estos recursos, no estoy seguro de que hubiese entendido aún de haber logrado hacerlos.

        Cada alumno contaba con una cuenta con su "sitio", hubiese estado bueno que tuvieran alguna manera de inyectar tráfico tal que pudieramos ver algo en los reportes, les tiré la idea y quizás futuros cursantes lo tengan.

        Durante el curso hubieron muchas recomendaciones de oficio, resultado de la experiencia de los instructores. Esto es realmente el valor del curso, la diferencia de leer el manual.

        El examen es multiple choice, no particularmente difícil, saqué entre 80% y 90%, sufriéndolo pues estaba cansado y no había tomando muchas notas o al menos que me sirvieran para las preguntas.


        Y ahora un poco de Akamai


        Tráfico normal en Internet


        En Internet normal, cuando alguien quiere acceder a un sitio, pasa por los routers que hagan falta hasta llegar a este.

        La red TOR en Internet




        Mi mejor manera de entender Akamai es la red TOR. TOR es una red montada encima de la red Internet con sus propias reglas de enrutamiento con el objetivo de anonimizar a los participantes. Se generan circuitos virtuales con varios pasos donde se logra el anonimato mediante un sencillo protocolo que he explicado en una charla dada hace años de la cual no he publicado ningún material pues es extremadamente interactiva. En la imagen podemos ver el primer paso en que la usuaria se conecta a un nodo y luego verías si tuvieras todas las imágenes como va pasando por los otros encirculados en amarillo y regresa la comunicación. Toda esa conexión es evidentemente transparente para la persona que navega, que sólo decide usar TOR.


        La red Akamai en Internet



        Akamai es una red montada encima de la red Internet con sus propias reglas de enrutamiento con el objetivo de ser el punto de entrada de los servidores que protege. Está instalado en prácticamente todos los ISPs del mundo (Edge Servers) y enruta toda petición a un dominio por sus nodos hasta llegar al servidor. En esos Edge Servers tiene la capacidad de cachear con discernimiento de PII, dar contenido alternativo en caso de server caido y entendí que tambien aplicar reglas como para que no lleguen al Site Shield.

        Nuevamente, todo este manejo es transparente para quien navega. Para el servidor hay un par de diferencias, como que el tráfico le llega de Akamai y debe buscar la IP original en un encabezado extra, debe agregar una ACL para sólo aceptar tráfico de la red Akamai y no de cualquier lado por si alguien tuviera su IP.

        El tráfico TLS entre el cliente y el Edge Server es bajo el certificado del dominio, el ES es endpoint TLS para poder aplicar reglas. Luego usa nuevamente TLS hasta llegar al Site Shield y el servidor.




        La herramienta


        Por lo dicho antes, no voy a entrar en mucho detalle pero tiene todo lo que uno esperaría, reglas por ip, geo, encabezados, reputación de clientes. Se pueden combinar lógicamente y en modo alerta y bloqueo, etc...

        Lo que no tiene según comprendí es el tema de correlaciones complejas, esto es, dada una regla activada tomar un valor y usarlo como input de otra regla.



        Finalmente, por haber aprobado el curso, me dieron un Bagde en Acclaim, que no sé cómo usar, pues me pide que conecte mi cuenta de Linkedin, cosa que no pienso hacer. En algún lado debe haber un link para compartir, ya lo voy a encontrar...

        Programando EPROM con ATMega328p

        $
        0
        0





        En el marco del aún incompleto proyecto de tomar el control de un viejo 8051  me encontré con que tenía que escribir un programita en una EPROM para que la CPU lo leyera. EPROMs tengo de sobra, EEPROM [1] una sola y no tengo la datasheet.


        Planes y conceptos

        Lectura


        Para leer la memoria tengo varias opciones:

        FPGA


        Tengo el problema de adaptación de voltajes, aunque a baja velocidad no debería traerme problemas, pero se me complica luego interactuar con la memoria de modo arbitrario. No tomaré este camino.

        Microcontrolador ATMega328p


        Usa 5v igual que la memoria pero no me alcanzan los pines, en el mejor de los casos tiene 23, necesito 8 para datos + 11 para direcciones + 3 o 4 de control y no estoy en el mejor de los casos, luego vemos el número exacto, mientras veamos como lidiar con ello.

        Adaptador serie/paralelo


        Primero había pensado no hacerlo, pero es algo que entiendo bastante bien desde hace décadas y nunca practiqué, así que lo haré.


        Y ahí me preguntarías por qué no usás esta adaptación en los datos así es más simple el programa y yo te contestaría por que necesito leer tambien, adaptación paralelo/serie.

        Reducción de direcciones


        Puedo no acceder a todas las posiciones de memoria, las lineas altas de direcciones las puedo resolver son switches a mano, no es muy cómodo pero me sirve parcialmente ahora y completamente para resolver lo del 8051, donde sólo necesito ocho bytes, son 3 lineas de direccionamiento.


        Acceso secuencial


        Este me encanta. Usar un contador y con sólo dos pines, clock y reset, puedo ir direccionando toda la memoria. En mi cajón tengo un 4060 de 14, pero son  solo accesibles 10 bits y no contiguos (4-10, 12-14). Un 4020 que son 12 accesibles no contiguos (1, 4-14) estaría mejor.

        De un modo u otro, haría algo mixto, la parte alta con contador, la baja con GPIO.  Con el 4060 me pude haber arreglado pues el rango 4 a 10 son las siete lineas que necesito, pero para cada incremento tengo que meter ocho ticks. Me he comprado un 4040 que es de 12 bits todos juntos para simplicarme la vida, pero este camino no será tomado.

        El borrado 

        El problema con la EPROM es borrar sin lámpara UV. Para ello pienso usar el sol a ver que pasa. Tengo que leer la EPROM, ponerla al sol, volverla a leer y ver que pasó.


        La escritura



        El acceso es igual que la lectura, pero hay que poner las lineas de control del modo adecuado y darle un pulso, ya veremos.


        Problemas con el borrado y reescritura


        Si encontrara que hay borrado pero no completo con encontrar 8 direcciones seguidas que tengan FF ya estoy, probablemente al final del espacio de memoria. Esto estaría bueno pues me desbloquea el proyecto del 8051.

        FF y no 00 porque:


        Initially, and after each erasure, all bits of the 27C16 are in the ‘‘1’’ state. Data is introduced by selectively program- ming ‘‘0s’’ into the desired bit locations. Although only ‘‘0s’’ will be programmed, both ‘‘1s’’ and ‘‘0s’’ can be presented in the data word. The only way to change a ‘‘0’’ to a ‘‘1’’ is by ultraviolet light erasure.

        que se reduce a que si hay un cero no lo puedo tocar y si hay un uno puedo dejarlo como está o ponerlo en cero.

        Igual no puedo confiar mucho en esa datasheet, pues tambien dice que se programa a 25v.

        Si no puedo borrar, usaré el método de la sobreescritura.

        Extensiones

        Ok, supongamos que el borrado no funciona o lleva mucho tiempo y que la sobreescritura tampoco y no hay 8 FFs seguidos, con que hayan 8 FFs "seguidos" en cualquier orden en que se direccione la memoria, aumentan las chances.

        Supongamos la siguiente situación, queremos encontrar 4 direcciones con FFs seguidas en un espacio de 32 direcciones. Lo ideal sería lo marcado en verde:





        Pero tambien sirve lo amarillo si negamos el bit más significativo en rojo y tambien lo naranja si hacemos constantes los bits en rojo (3,2 y 0) y usamos 4 y 1 para direccionar.

        Esto tambien vale para el orden de los bits dentro de los bytes.

        La fantasía es entonces hacer un algoritmo que dado un dump de memoria y el programa que quiero superponer, halle el direccionamiento y ordenamiento de bits tal que sea posible.

        La realidad es que sólo voy a hacer la parte de direccionamiento y con poca creatividad.

        Plan prudente


        O cobarde. Primero voy a leerlo a mano, con unos switches en las direcciones y unos leds en los datos. Si una misma dirección me da el mismo dato siempre, puedo asumir que lo estoy haciendo ok



        Luego voy a escribir a mano, usando switches para los datos y el ATMega para el pulso.




        The 27C16 is in the programming mode when the V PP power supply is at 25V and OE is at VIH . It is required that a 0.1 mF capacitor be placed across Vpp , Vcc to ground to suppress spurious voltage transients which may damage the device.

        The data to be programmed is applied 8 bits in parallel to the data output pins. The levels required for the address and data inputs are TTL.

        When the address and data are stable, a 50 ms, active high, TTL program pulse is applied to the CE/PGM input.

        A program pulse must be applied at each address location to be programmed.

        You can program any location at any time, either individually, sequentially, or at random. The program pulse has a maximum width of 55 ms.

        The 27C16 must not be programmed with a DC signal applied to the CE/PGM input.





        Mezclando lo anterior con varias cosas que ví en diversos sitios, entiendo que necesito que Vpp = Vcc cuando esté leyendo y al programar que Vpp = 12.5v, Vcc = 6.5 y que OE no esté conectado a nada y que además el micro controlador se entere y pueda validar.




        Resumiendo:

        • Para cada chip
          • Limpiar la ventanita
          • Rotular
          • Leer la memoria completa y guardar asociando al rótulo
          • Volver a leer y comparar para comprobar que no es basura
        • Para cada chip
          • Leer la memoria completa y guardar
          • Repetir 
            • Ponerla al sol (horas, dias...)
            • Leer la memoria completa y comparar 
            • Hasta que hayan cambios o FF total o me aburra


        En paralelo, aprovechando que tenemos los dumps de memoria, hacer el análisis buscando 8 bytes en FF o aptos para sobreescritura.


        Para lograr en entorno de trabajo tengo que hacer lo siguiente, en tu caso si siguieras mis pasos tendrías que adaptarte según el microcontrolador que uses. 


        • Recuperar capacidad de programar ATMega328p
          • ~/Documents/research/avr/bare_programming
          • controlar pinout
          • tras programar voy a saber cuantos pines tengo disponibles
        • Programa
          • serial
          • armar REPL base
        • lectura EPROM
          • comprender
          • leer 
        • escritura EPROM
          • comprender  
          • generar pulso escritura 
          • adaptación 5v - 25v
          • escribir
        • Ya podría soldar las partes
        • Comandos completos del programa
          • incrementar contador
          • leer valor
          • escribir valor
          • lectura y transmisión de un rango por serial con formato hexa
          • transmisión y escritura de un rango por serial con formato hexa de este me acobardé, estoy tan cansado que con grabar mis 8 bytes de a uno me contento.

        Acciones y resultados


        Lectura manual


        Tras conectar todas las direcciones a GND salvo algunas con unos switches para elegir Vcc, todos los datos a leds, Vpp = Vcc, OE = CE = GND, sucede la magia barata.


                    +------------------+
              
        GND  -> A7         Vcc  - 5v
           
        switch  -> A6    2     A8 <- GND
            switch  -> A5    K     A9 <- GND
            switch  -> A4    B    Vpp  - Vcc
           
        switch  -> A3          OE <- GND
           
        switch  -> A2    E    A10 <- GND
           
        switch  -> A1    P     CE <- GND
            switch  -> A0    R     D7  -> led
               led <-  D0    O     D6  -> led
               led <-  D1    M     D5  -> led
               led <-  D2          D4  -> led
               GND  -  GND         D3  -> led
                    +------------------+


        Para leer varias direcciones, es muy tedioso usar los switches, se me van a romper. Me voy a adelantar un paso y voy a usar el atmega328p con un REPL[2] para desde la compu poder operar.

        Lectura con microcontrolador


        Más fácil dicho que hecho, comenzando con que la comunicación via serial desde uno de mis tantos inconclusos proyectos, estoy acostumbrado a hacerla con una edu-ciaa-nxp. Tambien estoy acostumbrado a que la raspberry pi, el router, la parallella, usan todos 3.3v a diferencia del mundo arduino que usa 5v.

        Tuve un momento de horroroso pánico cuando no veía lo que quería en la comunicación y pensé que había quemado parte de la edu-ciaa-nxp hasta caí en cuenta del error.

        Tras unas consultas privadas a Eric, es que me da mucha vergüenza no saber electrónica analógica, me explicó un poco y me referenció a un muy buen blog. Tomé el camino del divisor de tensión. Tras mucho probar me quedó esto:


        Amarillo tiene escala 1v, el resto 2v. El primer decoder es lo que transmite la edu-ciaa-nxp, en azul.



        Sigue sin funcionar pero es siempre lo mismo, eso es bueno.

        El amarillo es tal como sale del atmega328p. El magenta en el divisor, lo que le llega a la edu-ciaa-nxp. El azul es el caractar enviado desde ésta.

        En la terminal tambien está roto, apuesto a que es por usar Serial de arduino que no le está pegando bien a alguna configuración.

        Tras estudiar un poco como funciona el ATmega328p, me puse a escarbar un poco, le mandé este programa:

        void setup() {
          Serial.begin(9600);
          DDRC = DDRC | B00111111;
          DDRB = 0xff;
        }
        void loop() {
          PORTB = UCSR0A; delay(1000);
          PORTB = UCSR0B; delay(1000);
          PORTB = UCSR0C; delay(1000);
          PORTB = UBRR0H; delay(1000);
          PORTB = UBRR0L; delay(1000);
          blink();
        }

        Nota: cuando veas lo que sigue vas a pensar que la tengo recontrareclara pero la verdad es que lo entendí en el momento que lo necesité y mirándolo luego me cuesta mucho comprenderlo.

        Obtuve:

        UCSR0A: 
        0010 0010

        RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0
        0    0    1     0    0    0    1    0

        |    |    |     |    |    |    |    no multiproc 
        |    |    |     |    |    |    double baud rate
        |    |    |     |    |    no parity error 
        |    |    |     |    no data overrun 
        |    |    |     no frame error
        |    |    buffer emtpy
        |    no transmit complete
        no received

        UCSR0B:

        1001 1000
        RXCIE0 TXCIE0 UDRIE0 RXEN0 TXEN0 UCSZ02 RXB80 TXB80
        1      0      0      1     1     0      0     0

        |      |     |      |    |    |     |     no ninth bit to transmit
        |      |     |      |    |    |     no ninth bit received 
        |      |     |      |    |    char size 8 bit ok 
        |      |     |      |    transmitter enabled 
        |      |     |      receiver enabled
        |      |     no empty data register interrupt
        |      no tx complete interrupt
        no rx complete interrupt

        UCSR0C:

        0000 0110
        UMSEL01 UMSEL00 UPM01 UPM00 USBS0 UCSZ01/UDORD0 UCSZ00/UCPHA0 UCPOL0
        0       0       0     0     0     1             1             0

        |       |      |     |     |    |            |     clock polarity 
        |       |      |     |     |    |            char size 8 bit ok 
        |       |      |     |     |    char size 8 bit ok
        |       |      |     |     1 stop bit
        |       |      |     no partiy
        |       |      no partiy 
        |       Async usart ok
        Async usart ok




        Hasta acá todo está ok, pero con los baudrates hay algo mal, fuí probando distintos divisores:



        UBRR0H:         0000 0000
        UBRR0L:   9600  1100 1111 (207)
                 19200  0110 0111 (103)
                115200  0001 0000  (16)


        Tomado de la datasheet


        Hay algo mal en alguna cuenta que hace Arduino IDE, pues cuando le agregué a setup() UBRR0L = B01100111 el decoder empezó a entender y la comunicación con la edu-ciaa-nxp se corrigió.

        Pero pensemos un poco, qué sabemos:

        Está en double speed) (UCSR0A[U2X0])

        Arduino IDE no me ofrece aunque juraría que en algún lugar alguna vez ví que si, cambiar la velocidad del procesador.

        Haciendo las cuentas de los baudrates tenemos que dados esos baudrates y esos UBRRn's, 




        foscbaudrateUBRR
        80000009600103.1666666667
        80000001920051.0833333333
        80000001152007.6805555556



        foscUBRRbaudarate
        80000002074807.6923076923
        80000001039615.3846153846
        80000001658823.5294117647



        UBRRbaudratefosc
        207960015974400
        1031920015974400
        1611520015667200



        corresponden a un

        #define F_CPU 16000000UL


        Evidentemente Arduino IDE piensa que tengo un Arduino Nano, es razonable, es lo que le dije.

        Si le pido

        #define F_CPU 8000000UL

        me dice

        warning: "F_CPU" redefined

        Otro día veré como arreglarlo, ahora le piso UBRR0L = B01100111

        El pulso de escritura lo saco de un delay(), tengo que usar 25 en lugar de 50.


        Habiendo tomado el control del ATmega328p vía serial puedo implementar el REPL, para leer necesito que:

        • El bus de datos de ATmega328p esté en modo input, mejor Z.
        • En Address esté la dirección a consultar.
        • El CE de EPROM pase a Vlow.
        • El OE de EPROM pase a Vlow.
        • Leer
         
        y anda perfecto. Hubo una primera versión, una POC, que no vale la pena detallar. En la segunda versión, tengo 10 de 11 lineas de dirección controladas, la última con un switch manual.





                    +------------------+
               PD5  -> A7         Vcc  - 5v
               PD4  -> A6    2     A8 <- PD6
               PD3  -> A5    K     A9 <- PD7
               PD2  -> A4    B    Vpp  - Vcc
               PC3  -> A3          OE <- PC5
               PC2  -> A2    E    A10 <- GND
               PC1  -> A1    P     CE <- PC4
               PC0  -> A0    R     D7  -> PB7
               PB0 <-  D0    O     D6  -> PB6
               PB1 <-  D1    M     D5  -> PB5
               PB2 <-  D2          D4  -> PB4
               GND  -  GND         D3  -> PB3
                    +------------------+



                  +---------------------+
           RESET  -> PC6           PC5  -> OE
              RX  -> PD0    A      PC4  -> CE
              TX <-  PD1    T      PC3  -> A3
              A4 <-  PD2    m      PC2  -> A2
              A5 <-  PD3    e      PC1  -> A1
              A6 <-  PD4    g      PC0  -> A0
              5v  -  Vcc    a      GND  - GND
             GND  -  GND    3     Aref  -
              D6  -> PB6    2     AVcc  -
              D7  -> PB7    8      PB5 <-  D5
              A7 <-  PD5    p      PB4 <-  D4
              A8 <-  PD6           PB3 <-  D3
              A9 <-  PD7           PB2 <-  D2
              D0  -> PB0           PB1 <-  D1
                  +---------------------+





        Esta es su interfaz:



        #####################################################
        MENU Version 2 half memory
        #####################################################
        a  set address               : (0400)
        d  set data                  : (19)
        s  set read size             : (0001)
        r  read
        w  write 

        @  print current address values
        +  increment current address
        -  decrement current address
        i  autoincrement mode        : (ON)


        Size? (xxxx): 0010
        Reading address from: 0400 to : 0410
        0400  F3  31  EA  40  ED  56  21  00 
        0407  40  11  00  40  D9  FD  21  EE 
        040F 
         



        El "autoincrement" es que tras leer se incremente la dirección de memoria. La "read size" es para leer. Anda re bien. Tengo consistencia de lecturas a lo largo de los días y tras conectar y reconectar.


        Escritura con microcontrolador


        Ahora necesito generar las condiciones de escritura


        • Vpp a 25v
        • CE a Vlow
        • El OE  pase a Vhigh.
        • En Address esté la dirección a consultar.
        • El bus de datos de ATmega328p esté en modo output.
        • Dato en el bus de datos.
        • Pulso en CE de 50ms.
        • OE a Vlow
        • Vpp a Vcc


                    +------------------+
               PD5  -> A7         Vcc  - 5v
               PD4  -> A6    2     A8 <- PD6
               PD3  -> A5    K     A9 <- GND
               PD2  -> A4    B    Vpp  - 25v
               PC3  -> A3          OE <- PC5

               PC2  -> A2    E    A10 <- GND
               PC1  -> A1    P     CE <- PC4   pulso de 50ms
               PC0  -> A0    R     D7
        <- PB7
               PB0 
        -> D0    O     D6 <- PB6
               PB1  -
        > D1    M     D5 <- PB5
               PB2  -
        > D2          D4 <- PB4
               GND  -  GND         D3
        <- PB3
                    +------------------+



                  +---------------------+
           RESET  -> PC6           PC5  -> OE
              RX  -> PD0    A      PC4  -> CE
              TX <-  PD1    T      PC3  -> A3
              A4 <-  PD2    m      PC2  -> A2
              A5 <-  PD3    e      PC1  -> A1
              A6 <-  PD4    g      PC0  -> A0
              5v  -  Vcc    a      GND  - GND
             GND  -  GND    3     Aref  -
              D6 <-  PB6    2     AVcc  -
              D7 <-  PB7    8      PB5  -> D5
              A7 <-  PD5    p      PB4  -
        > D4
              A8 <-  PD6           PB3  -
        > D3
             R/W<-  PD7           PB2  -
        > D2
              D0 <-  PB0           PB1  -
        > D1
                  +---------------------+






        Escribí algunos 0x00, 0xF0 y 0x0F

        Logré primero tras mucho intento haciendo la transición de modo lectura a modo escritura a mano, tenía que reprogramar el chip ya fuera a leer o escribir y pasar Vpp a 5 y 25 v con un switch. Como POC está ok, pero necesito que lo haga el progama.


        Primero había entendido que


        Vpp = Vcc < - > 12.5 v
        Vcc  = 5v < - > 6.5v
        OE   = DC < - > desconectado

        Luego, se redujo a

        Vpp = Vcc < - > 25v


        Lo del OE desconectado no sé de dónde lo saqué, pero fué el mismo lugar que los 6.5v.

        El 12.5v fue por que todas las EPROMs que tengo afuera dicen 12.5v, salvo estas que estoy usando.

        Preparado entonces para tres cambios, busqué un relé que tengo de cuatro switches y tras lograr que funcione me encontré con que usa 18v, no puedo meter otro voltaje más.



        Del cajón del futuro


        Me puse a revisar la basura y rescaté varios relés pero de un punto. Luego revisé unas placas que había encontrado cartoneando, partes de una centralita telefónica siemens sobre la que algún día tendré que hacer algo. Y en una de ellas hallé relés de mercurio, me supera, tienen que estar verticales para funcionar.




        Fijate que dice "up"


        Y en varias encontré microcontroladores 8051, el círculo se cierra, no olvides que todo esto comenzó al querer tomar el dominio de un 8051.



        Creeme que dice 8051a


        Y otra cosa buena, al estar revolviendo buscando modems que estoy seguro tienen relés y tambien que los tiré, hallé un panel que dice Tango1 y tiene unos max485 que seguro me van a servir para otro proyecto, pero ya me estoy yendo muy por las ramas, por eso me cuesta tanto terminar cada proyecto. Los modems que encontré no tienen relés, salvo uno muy bonito, pero mirando mejor una placa de la centralita, la segunda desde la derecha en la foto del cajón del futuro, hallé 16 relés RA5WN-K, me alcanza para toda la vida, una pena por que no quería canibalizar esa placa antes de estudiarla, pero bueno....



        Tras horribles sufrimientos que de algún modo quedaron plasmados en la abrumadora ayuda que recibí del foro de embebidos logré hacerlo andar de modo correcto.


        Habiendo llegado el momento de hacer que el programa cambie el voltaje con el relé, me hallé con que necesito un pin para controlarlo, así que por el momento perdí la dirección A9 en PD7, no importa, luego cuando use el contador o el conversor serie paralelo será irrelevante.

        Tengo entonces un prototipo supuestamente correcto, pero no está grabando a diferencia del manual o al menos no esta grabando lo que quiero. Además, al igual que en la prueba manual, se cuelga y se resetea y eso probablemente tenga relación con la escritura inconsistente.

        La hoja de datos dice poner unos capacitores de un uF, no me preguntes por qué  tenía, deben estar ahí en ese cajón desde hace 30 años.

        No es muy estable, algunos chips no toman las escrituras, otros algunas si otras no, llegó el momento de direccionar todo el chip para poder sacarlo del protoboard, hay algunas inconsistencias que pueden ser debidas al cablerio infernal.

        Desprolijo pero suele andar


        Acceso completo a todas las direcciones



        Ahora necesito poder direccionar toda la memoria para hallar un segmento apropiado para la sobreescritura.


        • Lo dudo,quizás en el futuro usaré chips más grandes.
        • Por ello, las direcciones más bajas serán vía el serie a paralelo
        • Dos patitas para el conversor.
        • Tres patitas para el resto del direccionamiento.
        • Cuatro patitas libres.
        • Reset : entiendo que si lo uso como I/O vía fusibles pierdo la capacidad de reprogramar el ATmega328p


                     +---------------+
               BIT   -> A1   7  Vcc  -  5v
                5v   -> A2   4   Qh  -> A7
                A0  <-  Qa   H   Qg  -> A6
                A1  <-  Qb   C   Qf  -> A5
                A2  <-  Qc   1   Qe  -> A4
                A3  <-  Qd   6  RST <-  5v
               GND   -  GND  4  CLK <-  CLK
                     +---------------+


                    +------------------+
                Qh  -> A7         Vcc  - 5v
                Qg  -> A6    2     A8 <- PC0
                Qf  -> A5    K     A9 <- PC1
                Qe  -> A4    B    Vpp  - 25v
                Qd  -> A3          OE <- PC5

                Qc  -> A2    E    A10 <- PC2
                Qb  -> A1    P     CE <- PC4   pulso de 50ms
                Qa  -> A0    R     D7
        <- PB7
               PB0 
        -> D0    O     D6 <- PB6
               PB1  -
        > D1    M     D5 <- PB5
               PB2  -
        > D2          D4 <- PB4
               GND  -  GND         D3
        <- PB3
                    +------------------+


                  +---------------------+
           RESET  -> PC6           PC5  -> OE
              RX  -> PD0    A      PC4  -> CE
              TX <-  PD1    T      PC3  -
                  -  PD2    m      PC2  -> A10
                  -  PD3    e      PC1  -> A9
                  -  PD4    g      PC0  -> A8
              5v  -  Vcc    a      GND  - GND
             GND  -  GND    3     Aref  -
              D6 <-  PB6    2     AVcc  -
              D7 <-  PB7    8      PB5  -> D5
             BIT<-  PD5    p      PB4  -
        > D4
             CLK<-  PD6           PB3  -
        > D3
             R/W<-  PD7           PB2  -
        > D2
              D0 <-  PB0           PB1  -
        > D1
                  +---------------------+


        Me olvidé de sacarle foto al protoboard con el adaptador serial paralelo, mala suerte.


        Armado definitivo

        Las lecturas son inconsistentes, siempre tengo algún bit cambiando por acá o por allá. Para descartar que sean falsos contactos, armé la placa soldada.





        Con esta placa todo parece andar bien. Para lo que necesito del 8051, este es el programa:

             mov A,#254
        loop:
             mov 144, A
             rlc A
             sjmp loop


        (74 FE F5 90 33 80 FB)

        Tras varias pruebas, la situación es que parece que no puedo escribir dos direcciones seguidas, aquí grabo el programa en direcciones sucesivas:

        Address? (xxxx): 0020
        Size? (xxxx): 0010
        Reading address from: 0020 to : 0030
        0020  1E  00  18  17  FF  FF  FF  FF 
        0028  FF  FF  FF  FF  FF  FF  FF  FF 

        Address? (xxxx): 0028
        Data? (xx):74
        Writing 74 in 28
        ok

        Data? (xx):fe
        Writing FE in 29
        ok

        Data? (xx):f5
        Writing F5 in 2A
        ok

        Data? (xx):90
        Writing 90 in 2B
        ok

        Data? (xx):33
        Writing 33 in 2C
        ok

        Data? (xx):80
        Writing 80 in 2D
        ok

        Data? (xx):fb
        Writing FB in 2E
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0038
        0028  10  10  11  10  11  00  FB  11 
        0030  FF  FF  FF  FF  FF  FF  FF  FF 



        Sólo quedó el último bien, así que fuí cambiando la secuencia:


        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  FF  FF  FF  FF  FF  FF  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  3E  
        0048 

        Data? (xx):74
        Address? (xxxx): 0030
        Writing 74 in 30
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FF  FF  FF  FF  FF  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  3E  
        0048  

        Address? (xxxx): 0034
        Data? (xx):33
        Writing 33 in 34
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FF  FF  FF  33  FF  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  
        0048  

        Address? (xxxx): 0031
        Data? (xx):fe
        Writing FE in 31
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FE  FF  FF  33  FF  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  
        0048  

        Address? (xxxx): 0035
        Data? (xx):80
        Writing 80 in 35
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FE  FF  FF  33  80  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  
        0048  

        Address? (xxxx): 0032
        Data? (xx):f5
        Writing F5 in 32
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FE  F5  FF  33  80  FF  FF  
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  
        0048  

        Address? (xxxx): 0036
        Data? (xx):fb
        Writing FB in 36
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FE  F5  FF  33  80  FB  FF
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  
        0048  

        Address? (xxxx): 0033
        Data? (xx):90
        Writing 90 in 33
        ok

        Address? (xxxx): 0028
        Size? (xxxx): 0020
        Reading address from: 0028 to : 0048
        0028  10  10  11  10  11  00  FB  11  
        0030  74  FE  F5  90  33  80  FB  FF
        0038  C3  4E  01  D3  1E  D3  1A  10  
        0040  63  D3  10  3E  49  D3  11  10  



        Apagué, desconecté, volví a conectar:


        Address? (xxxx): 0010
        Size? (xxxx): 0040
        Reading address from: 0010 to : 0050
        0010  40  31  EA  40  D3  01  DB  05 
        0018  24  22  52  05  3E  40  D3  01 
        0020  1E  00  18  17  FF  FF  FF  FF 
        0028  10  10  11  10  11  00  FB  11 
        0030  74  FE  F5  90  33  80  FB  FF 
        0038  C3  4E  01  D3  1E  D3  1A  10 
        0040  63  D3  10  3E  49  D3  11  10 
        0048  45  D3  12  3E  97  D3  13  3E


        Éxito parcial


        Habiendo llegado a este punto, considero un éxito este proyecto, pues el objetivo era escribir unos poco bytes para el 8051.


        Me queda la duda si pude haber puesto Vpp siempre a 25v y leer, la gráfica de la página 6 de la datasheet así lo insinúa.

        No importa, aprendí y practiqué un montón de cosas.


        El código en github.

        Me queda el ver de grabar de un modo más cómodo y un montón de ajustes que difícilmente haga y el asunto del borrado.


        Borrado solar


        Para saber si el borrado solar funciona, tengo que leer, guardar, asolear, leer y comparar.

        El problema que detecté es que sin el sol de por medio tengo lecturas distintas. Los motivos que se me ocurrieron fueron:

        Tiempos: quizás me faltaba algún delay por ahí.
        Interferencia por luz ambiente:  la ventanita está abierta...
        Malas conexiones: tengo todo en un protoboard con un cablerío infernal.

        El método que utilicé fue
        Leer varias veces y comparar (tiempos)
        Leer, desconectar y volver a conectar, leer y comparar

        La comparación es si algo cambio, con diff o md5sum y cuantos bits están prendidos, espero que el sol los lleve de "1" a "0" tal como dice la datasheet. Para contar los bits me hice un programita que está en el repo.





        for file in chip1.0*; do
          ./bitCount < "$file"
          md5sum "$file"
        done
         

        $ ./compare.sh
        Bit count : 4315 42229ab8e512cd808e95c3680837826d  chip1.00.dump
        Bit count : 4356 b0d405a0d2e4029e69290bde79c64da8  chip1.01.dump
        Bit count : 4368 27ea92c7d3b7f6dc32c36e3799d72ed5  chip1.02.00.dump
        Bit count : 4368 27ea92c7d3b7f6dc32c36e3799d72ed5  chip1.02.01.dump



        La convención es

        chipID.sol.medición

        o sea, si hay asoleado cambia el número "sol", si no, cambia el número "medición".


        No he llegado a nada con esto, si algún día consigo que alguien me borre los chips, haré más pruebas.


        Notas sueltas


        Miré por encima https://dragaosemchama.com/en/2016/10/arduino-mega-eprom-programmer/ que hallé mientras buscaba por EPROM, no hay nada por EPROM, todo es para EEPROM.

        No use las operaciones bitSet(), bitClear() y similares que provee arduino pues entre mis objetivos de aprendizaje se halla adquirir cierta soltura en el uso de operaciones con bits y eso se logra practicando.

        En el camino he tenido varios cambios, por ejemplo reemplazar la edu-cia por un ttl-usb dongle, con la ciaa me sentía rehacker, con un sencillo programa haciendo la adaptación, estoy usando una computadora intermedia, pero la verdad es que el dongle me trajo un gran alivio, siempre estaba con el temor de romper la educiaa ya sea por cuestiones eléctricas o físicas y además ocupa mucho menos lugar.







        [1] EPROM, EEPROM:

        ROM: Memoria de sólo lectura, es un término genérico
        Mask ROM: Es una ROM que viene ya con los datos de fábrica
        PROM: Programmable ROM
        OTP ROM: One Time Programmable ROM, la podés programar una vez y así queda

        EPROM: Erasable ROM, la podés borrar con luz UV
        EEPROM: Electrically EPROM, la podés borrar con electricidad


        [2] REPL (Read Execute Print Loop): un patrón de programación que consiste en esperar un comando, al recibirlo ejecutarlo, imprimir sus resultados y volver a esperar...

        Curso Akamai Bot Foundation

        $
        0
        0
        Este curso no es la continuación del otro, deben ser parte de un grupo de cursos paralelos que comparten la intro y hacen referencias cruzadas.

        No logro distinguir claramente que parte es confidencial y cuál pública, para discernirlo tendría que leer la documentación pública que debe ser interminable, así que me voy a limitar a comentar el efecto del curso sobre mí, expresando más mi visión sobre el tema que lo visto.


        Trata de detección y prevención del accionar de bots, los cuales no dejan de ser automatizaciones de acciones humanas y pueden tener un mayor o menor parecido al accionar de un humano. Esta diferencia de parecidos es lo que permite detectarlo.

        Según las cifras provistas, la mitad del tráfico de Internet es bot, siendo mitad y mitad "bueno" y "malo".

        Bueno viene a ser google indexando, chat bots, feed fetchers, herramientas de monitoreo de salud de servicios

        Malo robo y explotación de credenciales, intermediarios de datos, scrappers para recopilación de información por fuera de APIs, automated inventory purchasers que son los que compran cuando se abre una oferta limitada para la reventa y por supuesto, no me olvido de DDoS

        Claramente, lo bueno y malo puede ser difuso.


        Una navegación desde un navegador deja una traza de eventos con un patrón que la distingue de una herramienta de descarga como pueden ser wget o curl. Estas últimas pueden bajar elementos de más o de menos, más probable. No ejecutan el código javascript, lo que produce falta de mensajes y descargas.

        Tambien hay múltiples maneras de detectar un bot por sus headers, tanto presencia como orden, ausencia y valores utilizados.

        Un recurso más completo es usar headless browsers, como puede ser webdriver, lo que se usa con selenium. Este método reproduce el patrón, pero no de forma humana, no hay movimientos del cursor en la pantalla, no hay demoras o son fijas entre las interacciones.

        Desde el servidor es improbable detectarlo, pero agregando un poco de javascript en algunos puntos cruciales se detecta a mejor. Supongo que siguiendo este link eventualmente llegarás a una demo que no pongo pues aún no me han contestado si puedo mostrar capturas de pantalla.


        Otro recurso es por reputación de IP, pero no es decisivo, podés estar navegando legítimamente desde una máquina que tiene un bot haciendo un 5% de tráfico. O podés estar junto con mil personas y un bot mas detrás de un NAT y ahí se complica.

        Una vez que detectaste un bot, ¿qué hacés? Bueno, depende de si es bueno o malo y de lo que esté haciendo. Si es bueno pero no se está portando bien, lo frenás o le dás contenidos cacheados, entendiendo que no te quiere molestar, sólo está mal configurado.

        Si es malo, depende de la inteligencia que haya detrás, siempre es bueno que cuando te atacan lo hagan por donde conocés. Si vos le decís que ya sabés que es un bot y lo rebotás, estás haciendo que busque otro lugar por donde molestar. Entonces quizás sea mejor darle diversas respuesta, todas inhabilitantes pero que no revelen que ha sido descubierto como bot. Podés negarle a veces, demorarle otras, mandarle a contenido alternativo o a un honey pot.





        Como en todo curso y más tan pautado como son estos de tipo corporativo, lo más importante es el área docente y la interacción del resto del alumnado, lo que hace la diferencia con leer el material provisto. En la intro previamente mencionada se mencionó algo que quizás me perdí en el otro, no creo pues nació de una pregunta.

        Llega una petición al Edge y después de un INCREIBLE manoseo sin salir del Edge y quizás sumado a otro manoseo al llegar al Site, recién ahí llega al servidor protegido, la pregunta es, ¿cómo afecta eso a la latencia?

        Da justo la casualidad que estoy leyendo un breve libro de los liberados por ACM debido al covid que se llama

        Heterogeneous Computing: Hardware and Software Perspectives, Mohamed Zahran

        en el cual se menciona que uno de los más importantes factores a considerar es la comunicación entre los nodos que procesan la información, al punto que pueden haber operaciones que te conviene hacer en este nodo ineficiente en lugar de en el optimizado para no perder tiempo en la transferencia de los operandos y el resultado.

        Menciona por ejemplo los cores de aceleración que están en el mismo silicio como los APU de AMD en contraste con tener que ir vía PCI hasta la otra placa.

        Eso ya se adivina en el chip Epiphany de la placa parallella, que tiene un sistema de mensajería interno entre los 16 cores. Y parece ser la tendencia al usar los Zynq y los MPSocZynq por el lado de Xilinx y tambien por Intel.

        Volviendo a Akamai, lo que explicaron es que por un lado no es tanto tiempo el de procesamiento en comparación a viajar por Internet, lo cual queda compensado por no utilizar el enrutamiento normal si no el suyo propio.

        Recordá que esto es sólo TCP, en particular 80 y 443, no te sirve usar Akamai para evitar el lag en UrbanTerror o el FPS de tu preferencia.




        Viewing all 264 articles
        Browse latest View live