sábado, 6 de agosto de 2016

Spammimic es analizador de tráfico?

El otro día participé de un CTF [1] (que nos fué relativamente mal) y una de las pruebas era descifrar un mensaje con esteganografía en spam. ¿Eh? ¿qué es eso?

Hace muchos años yo había pensado en usar spam como método para dificultar el análisis de tráfico, en el sentido de que si yo hago spam a decenas de miles de personas, quien monitorée no podrá saber a quien realmente le estoy enviando el mensaje. Si mi interlocutor además tiene varias cuentas, en cada "campaña" le envío a una o dos, no vaya a ser que el antispam me corte la comunicación y el adversario no hace unión de conjuntos y no sabe quien es mi interlocutor. Pero no le había prestado atención al mensaje en sí y por supuesto nada implementé, no tengo interlocutores secretos.

Spammimic [2] resuelve "a la spam" ese asunto. Se usa un mensaje de spam con nuestro mensaje adentro. Cualquier filtro de spam lo calificará indudablemente como spam y quien lo reciba no podrá recuperar el mensaje original sin la herramienta.


Por ejemplo:


Dear Business person , We know you are interested in
receiving cutting-edge intelligence . This is a one
time mailing there is no need to request removal if
you won't want any more . This mail is being sent in
compliance with Senate bill 2616 ; Title 4 ; Section
308 . This is not a get rich scheme . Why work for
somebody else when you can become rich in 78 WEEKS
. Have you ever noticed people are much more likely
to BUY with a credit card than cash plus nobody is
getting any younger . Well, now is your chance to capitalize
on this ! WE will help YOU sell more and deliver goods
right to the customer's doorstep . You are guaranteed
to succeed because we take all the risk ! But don't
believe us . Prof Anderson who resides in Virginia
tried us and says "My only problem now is where to
park all my cars" . This offer is 100% legal ! For
God's sake, order now . Sign up a friend and you'll
get a discount of 20% ! Thanks . Dear Salaryman , Especially
for you - this cutting-edge information ! We will comply
with all removal requests . This mail is being sent
in compliance with Senate bill 1618 ; Title 2 , Section
301 . This is not multi-level marketing ! Why work
for somebody else when you can become rich in 58 weeks
! Have you ever noticed people will do almost anything
to avoid mailing their bills plus most everyone has
a cellphone ! Well, now is your chance to capitalize
on this ! We will help you SELL MORE and increase customer
response by 170% ! You are guaranteed to succeed because
we take all the risk . But don't believe us . Mr Jones
of Georgia tried us and says "Now I'm rich many more
things are possible" ! This offer is 100% legal ! So
make yourself rich now by ordering immediately ! Sign
up a friend and you'll get a discount of 60% . Best
regards !


Tiene un simpático mensaje para quien lo lea, ni hace falta el decoder...


Lo que sigue puede ser injusto con los autores de spammimic, pero es sólo un ejercicio de maldad de mi parte, quizás sean honestos, no sé.

Sin haber entrado a la página, lo primero que se me ocurrió es que si yo no tengo el código fuente, el mensaje quizás no esté spammimicado. O sea, como servidor, tomo el mensaje que me dá el remitente, genero un spam único que almaceno en una base de datos junto con el mensaje original. Cuando el destinatario me dá el spam, busco el original y se lo doy. No hay algoritmo de esteganografía involucrado.

Leo entonces la FAQ y hallo que no sólo no proveen el código fuente si no que defienden no proveerlo, ni siquiera una aplicación de código cerrado a la cual aplicar ingeniería inversa. Además una actitud bastante "cool" (we seem to busy on other stuff these days), un poquito de FUD (you would still have to trust the plugin not to secretly send your message back to us!), un poquito de distracción (It would also be handier than the current cut'n'paste method), una mención a un libro con el código fuente para comprar pero 404 o ausencia de título. Leé vos:

What about a SpamMimic program I run on my computer

...or a mail client plugin. This would overcome the above two problems (or would it?). It would also be handier than the current cut'n'paste method. But you would still have to trust the plugin not to secretly send your message back to us! If it was really nasty it could even scan the disk of your PC looking for juicy info to send to us - wah ha ha ha. Of course, this trust problem is an issue for all closed-source software (including operating systems) you chose to run. Having said all that we might do a plugin - but we seem too busy on other stuff these days.

What about open-sourcing it - peer review is the only way crypto can be proven secure

If you buy the book mentioned in the credits you have the source for our mimic engine. We have improved it a bit and we're not going the release the grammar. We don't want to make it easy to have it built into firewalls. (Yes, we are trying to make enough money to pay for the hosting with the evil banner ads.)


Está claro que al no haber un secreto de por medio, teniendo el programa, no hay mensajes secretos, pero eso ya lo dijo Kerckhoff hace como 130 años... Igual no reclamo pues no dicen que sea secreto.

Lo que me molesta es que no hay mención al análisis de tráfico[3] y siguiendo mi linea de pensamiento es lo más importante, ya que al estar usando la herramienta online, el adversario (pues, si, lo considero adversario), conoce mi intención de no ser detectado, conoce el mensaje, conoce mi IP y la del destinatario. Esto bien podría ser una herramienta de inteligencia. En síntesis:

Somebody could observe the "secret" message as it's being sent to SpamMimic

Seems unlikely if you use SSL
Quizás "Somebody" sea SpamMimic...


Para seguir investigando, yo haría encoding del mismo mensaje desde distintas direcciones IP, si no dan lo mismo, tengo razón, se están identificando los mensajes para hacer el tracking de IP. Podría ser un poco menos diletante de lo normal y abrir un tails... listo... controlando que la IP no sea la misma, poniendo el mensaje, pegando en pastebin pues no puedo copiar y pegar desde la virtual, comparando con el spam original y... shit! dan lo mismo, quizas mis sospechas sean infundadas.

El siguiente paso es hacer la ingeniería inversa para detectar si el "spam" es sólo un identificador o realmente está el mensaje ahí.

Me da la impresión de que esté encodeado en los saltos de lineas y el agregado u omisión de algunas palabras. Por ejemplo, variando el mensaje anterior en la letra final y aplicando esto:

  $ sentenceA=$(cat spamA.txt )
  $ sentenceB=$(cat spamB.txt )
  $ for word in $sentenceA; do echo $word; done > wordsA.txt
  $ for word in $sentenceB; do echo $word; done > wordsB.txt
  $ diff wordsA.txt wordsB.txt

  190,191c190,191
  < Salaryman
  < ,
  ---
  > Friend
  > ;
  198c198
  < information
  ---
  > info



wordsX.txt tienen 350 palabras y el cambio está por el medio y en realidad habría que comenzar probando con "a", "b", "aa" y así, but we seem too busy on other stuff these days

De todos modos, spammimic sabe que IP manda a que IP.

[1] https://www.cyberex.es/international/

[2] http://www.spammimic.com/

Por las dudas...

https://web.archive.org/web/20160719095421/https://www.spammimic.com/feedback.shtml

https://web.archive.org/web/20160718231658/https://www.spammimic.com/credits.shtml

[3] http://seguridad-agile.blogspot.com/2014/02/medidas-contra-el-anonimato.html

martes, 26 de julio de 2016

Slither - 4 - usb mouse y encoder con edu-ciaa-nxp

Viene de  Slither - 3 - usb mouse con edu-ciaa-nxp

Ahora, hay que combinar el código del mouse [1] con el del encoder [2]. Esto está en [3].

La idea es que al llamar a Mouse_Tasks(), hay que avisarle que ha hecho el encoder.

Me imagino que la forma correcta de programarlo hubiese sido activar las interrupciones de los pines a donde conectemos el encoder y hacer la lógica correspondiente.

Sin embargo, a mi me parece que por como viene el ejemplo

   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


lo que está ocurriendo es que se habilitó la interrupción de USB y cuando __WFI() lo detecta sigue con el bucle, o sea, no se está llamando a ninguna función por la interrupción.

O sea, yo tendría que habilitar las interrupciones sin darle un handler y poner algo como:

   Encoder_Tasks();
   Mouse_Tasks();
   /* Sleep until next IRQ happens */
   __WFI();


Probablemente tendría que agregar lógica en cada *_Tasks() para ver si me llamaron por mi interrupción o por otra.


Como no sé nada de interrupciones aún, voy a poner inline Encoder_Tasks() y mala suerte, ver como responde.

El código resultante es buena parte del encoder, pero tuve que modificar las firmas de Mouse_Tasks() y  Mouse_UpdateReport() para que reciban los valores del encoder.



video




[1] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse

[2] https://github.com/cpantel/ciaa/tree/master/slither.io/encoder

[3] https://github.com/cpantel/ciaa/tree/master/slither.io/STANDALONE/usbDeviceHID_mouse_encoder