Incident Response, Security and Forensics"

.

sábado, 22 de septiembre de 2012

El huevo del cuco. Un caso de Propiedad Intelectual

Hola lectores,

Hace un tiempo una empresa (vamos a llamarla empresa A) me pidió colaboración para determinar si otra empresa (empresa B) había presuntamente copiado e infringido la propiedad intelectual de la empresa A. El tema es que cada vez que esta empresa sacaba una nueva versión o mejoras de su producto, la empresa B en tiempo récord hacia lo mismo con unos precios mucho más bajos. (Me imagino que esto os sonara o bien conocéis casos similares.)

El problema es que para acusar hace falta pruebas y su señoría o los jueces necesitan de evidencias cosa que la empresa A, de momento no disponía. Por otro lado es evidente que había algo o alguien  que estaba pasando el código.

A groso modo, la solución de estas empresas se basan en un CRM modular a medida, con una arquitectura compuesta de un frontal basado en el gestor de contenidos UMBRACO y  una aplicación cliente que interactúa con páginas web integradas con Webmatrix. La aplicación cliente dispone de un módulo autoinstalable en puestos windows que permite desarrollar workflows a una velocidad impresionante y enviar los datos al gestor de contenidos. Este módulo es el objeto de la discordia y discusión.

Una vez comprendido el alcance del problema y dado que tengo acceso a la estructura de las carpetas, ficheros y programas de la empresa A, os paso a explicar los pasos que se realizaron.

Inicialmente y de forma visual navegando por la web de la empresa B, se aprecia que hay una zona de clientes donde se puede descargar entre otros de forma gratuita los ficheros presuntamente ilegales. Esto según me comentaron esta destinado a clientes con versión demo o de prueba o bien de aquellos cuya licencia les permite incorporar estos módulos.

Quisiera añadir que para la descarga hay que aceptar un formulario aceptando las condiciones del copyright

Con objeto de descargarme, verificar la autenticidad y sin entrar en la ilegalidad me propuse comparar la estructura pública de la web de la empresa A con la B. Para ello utilizo el famoso programa "HTTrack" que me permite la descarga de toda la estructura a disco.



Una vez tengo toda la estructura de la empresa B, utilizo el programa "CheckTool Sum" para poder disponer individualmente de los hash por fichero descargado, de esta forma podré verificar si coincide con los ficheros de la estructura de la empresa A.

En la siguiente imagen podemos apreciar que la empresa A dispone en su estructura web los ficheros 'wflow.exe' y 'wflow.ocx'


Y la empresa B los mismos ficheros pero con huellas diferentes. Es decir aparentemente no es lo mismo.



En este punto podríamos hacer ingeniería inversa, pero ¿y si resulta que es legitimo? La empresa A hubiera pagado una suma importante por el tiempo dedicado y no hubiera valido para nada. Además si es legitimo hubiera infringido el  copyright. Por otro lado aunque pudiera demostrar que es correcto solo valdría para decir que funciona de idéntica manera, pero en ningún caso demuestra que es una copia o robo fehaciente al no disponer los fuentes.

Por lo tanto sigamos por la línea de la investigación.

Es muy común que se dejen los manuales en el sitio web y como también los hemos descargado comprobamos que el hash es diferente al de la empresa (A) pero al abrir su contenido fijaros como apenas hay modificaciones significativas. He puesto en color rojo los cambios , tan solo son estéticos, ni siquiera cambia el tipo y tamaño de letra del título de la empresa, siendo el contenido técnico idéntico.

Empresa A

Empresa B

Como esto huele mal, vamos a ver que dicen los metadatos. Tan solo viendo las propiedades de los PDF's nos encontramos que el autor es un empleado de la empresa A y que todavía trabaja para ellos. ¿Será Manuel un topo?

Empresa B

 Empresa A

Sigamos... dado que ya tenemos los ficheros descargados vamos a integrar 'a pelo' los ficheros 'wflow.exe y wflow.ocx' en la arquitectura (de la empresa A) con la ayuda del Director Técnico y uno de los desarrolladores. Una vez implementado nos da un error. Por lo tanto algo no funciona correctamente. ¿Serán diferentes?


Vamos a resumir lo que tenemos hasta ahora:


  1. Disponemos de módulos de la empresa B en supuesto litigio con la empresa A.
  2. No puedo hacer ingeniería inversa porque vulnero el copyright.
  3. El manual es idéntico en contenido técnico y en los metadatos realizado por el mismo autor.
  4. La aplicación no funciona 'metida a pelo' en la arquitectura de la empresa A
  5. No tenemos claro si la empresa B dispone de un topo en la empresa A


Llegado este punto necesito que me expliquen alguna particularidad de estos ficheros para poder hacer un estudio más concreto y hablando con el director técnico me comenta un poco más en profundidad cómo funciona la arquitectura de estos módulos:


  • El OCX es un control Active X que permite la integración de Outlook, Internet Explorer y permite enviar los datos al gestor de contenidos.
  • El fichero EXE instala la aplicación en windows e inicia un  pool TCP desde el puerto 50248 hasta el 50258 en el que ofrece un servicio de administración central para consultas sobre bases de datos y copia de seguridad de las tareas del workflow y licencias. También contiene un algoritmo de comprensión que junto con el OCX permite el envío de datos casi en tiempo real al gestor.


Por lo tanto dado que la empresa A conoce a la perfección su producto, como se instala, que partes del registro crea, que temporales y puertos a utilizar voy a lanzar el 'wflow.exe' de la empresa B y ver si coincide.

Para ello voy a utilizar un software que utilizo muy a menudo para ver cómo funciona un malware y que partes del sistema 'toca'.

UTILIZANDO CAPTURE BAT

Se trata de una herramienta de análisis de comportamiento lo que significa que no analiza el programa malicioso (en este caso el supuesto programa plagiado), sólo supervisa los cambios que el malware o programas hacen en windows.

Incorpora una serie de mecanismos que permiten filtrar eventos no deseados como por ejemplo la actividad de otros programas en memoria o por ejemplo la actividad de un antivirus, así de esta forma nos permite ver lo que realmente queremos. Esta aplicación la suelo emplear sobre todo para ver que hacen los ficheros de word que son maliciosos.

Capture-BAT, permite guardar un log de los ficheros borrados, actividad del registro de windows, procesos creados y la actividad de la red en concordancia con el programa a analizar.

Actualmente es un proyecto de la "honeynet project" y puede ser descargado desde aquí.

Los comandos de ejecución son sencillos, tan solo tenemos que poner:

CaptureBAT.exe -c -n -l c:\temp\output.txt

Y los parámetros vienen a decir lo siguiente:

-c Registra cualquier borrado o modificación de ficheros
-n Captura la actividad de red
-l Guardo todo en un fichero de Log

A continuación y en otra ventana del CMD lanzo el programa:

C:\temp\wflow.exe

Tras unos segundos de ejecución y tras un error de conexión accedo al los ficheros de registro de capture-BAT obteniendo los resultados:


Option: Capturing network packets
Option: Collecting modified files
Driver already loaded: CaptureProcessMonitor
Driver already loaded: CaptureRegistryMonitor
Loaded filter driver: CaptureFileMonitor
Creating network dumper
Loading network packet dumper
network adapter found: 192.168.1.12
---------------------------------------------------------
file: Write C:\Program Files\Capture\CaptureBAT.exe -> C:\captura.net
process: created C:\Users\Win7\AppData\Local\Temp\is-E5QS4.tmp\wflow.tmp -> C:\Users\Win7\Downloads\wflow.exe
file: Write C:\Users\Win7\Downloads\wflow.exe -> C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp
process: created C:\Users\Win7\Downloads\wflow.exe -> C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp
file: Write C:\Users\Win7\Downloads\wflow.exe -> C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\is-2Q802.tmp
file: Write C:\Program Files\Capture\CaptureBAT.exe -> C:\captura.net
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
process: created C:\Windows\System32\SearchIndexer.exe -> C:\Windows\System32\SearchFilterHost.exe
file: Write C:\Program Files\Capture\CaptureBAT.exe -> C:\captura.net
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\ProgramData\Microsoft\Windows\Start Menu\Programs\wflow\Utilidades\Web-Linker.lnk
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\Users\Win7\Desktop\wflow.lnk
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.exe
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\ProgramData\Microsoft\Windows\Start Menu\Programs\wflow\Desinstalar\Desinstalar wflow.lnk
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: Setup Version
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: App Path
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\InstallLocation
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: Icon Group
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: User
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: Selected Tasks
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: Deselected Tasks
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Inno Setup: Language
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\DisplayName
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\DisplayIcon
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\UninstallString
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\QuietUninstallString
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\Publisher
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\URLInfoAbout
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\HelpTelephone
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\HelpLink
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\URLUpdateInfo
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\NoModify
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\NoRepair
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\InstallDate
registry: SetValueKey C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\wflow_is1\EstimatedSize
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\wflow.url
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write C:\Users\Win7\AppData\Local\Temp\is-CNAS3.tmp\wflow.tmp -> C:\wflow\unins000.dat
file: Write System -> C:\Users\Win7\Desktop\wflow.lnk
file: Write System -> C:\ProgramData\Microsoft\Windows\Start Menu\Programs\wflow\Desinstalar\Desinstalar wflow.lnk
file: Write System -> C:\ProgramData\Microsoft\Windows\Start Menu\Programs\wflow\Utilidades\wflow.lnk
process: created C:\Users\Win7\AppData\Local\Temp\is-E5QS4.tmp\wflow.tmp -> C:\wflow\wflow.exe

Por otro lado mirando el fichero .PCAP que ha creado capture-BAT vemos que efectivamente lanza un pool TCP idéntico al que me han comentado en la empresa A. Para mas pruebas lo cotejo con el comando netstat comprobando las conexiones en el momento de ejecución.



Una vez visto los registros me propongo a ejecutar con capture-BAT el programa de la empresa A, llegando a la conclusión de que efectivamente y a tenor de los resultados  el proceso de instalación, claves del registro y actividad y puertos de red son las mismas en los módulos de ambas empresas.

Con todos estos datos tengo la ligera sospecha de que efectivamente parecen iguales pero las pruebas no son determinantes dado como dije anteriormente no dispongo del código fuente de la empresa B.

Por lo tanto hay que ir por otro lado.

EL LADO OSCURO

La cuestión que se planteo fue la siguiente:

Hablando con los propietarios (de la empresa A) sugerí al director técnico realizar un truco o treta que nos permitiría saber tres cosas:


  1. Si realmente alguien o algo estaba enviando el código fuente a la empresa B
  2. Saber que clientes de la empresa B lo estaban utilizando
  3. Disponer de una prueba en la que los abogados poder apoyarse legalmente


Para ello propuse modificar el código de la aplicación 'wflow.exe' e insertar otro código que contuviera una marca, a ser posible lo mas invisible que se pudiera, escondida entre toda la maraña del código y confiando en la suerte de que no revisarán línea a  línea de una forma exhaustiva y lo llegarán a detectar.

Esta marca debería ser única e irrefutable que permitiera identificar al autor y propietario (en este caso la empresa A). No evitaría la copia pero si lo identificaría ante un proceso pericial.

La empresa A se puso en marcha, aunque no puedo mostrar el código que se añadió os voy a explicar el proceso.


  • Se creó una marca identificable, para ello se propuso diversos escenarios desde poner bytes a cero en ficheros fuente hasta realiza runa función que hiciera un hash de un fichero del proyecto que se modificaba en tiempo de ejecución, se aceptaron diversas ideas.
  • Se modifico el código fuente y se incorporo de tal forma que cuando se ejecuta el programa 'wflow' en el puesto de  trabajo este genera una página dinámica en html con un texto indicando la propiedad del código. A continuación lo envía al gestor de contenidos publicándolo (siempre y cuando no se ejecute por intranet).
  • Se hicieron cambios en las demás aplicaciones y decidieron que la marca saldría escondida en la nueva versión del producto y en actualizaciones las cuales publicitaron con una grandiosa campaña de marketing con nuevas funcionalidades añadidas, confiando que los programadores de la empresa B se fijarían en los nuevos y novedosos cambios sin que el pequeño código de wflow llamase la atención.
  • Tres meses después la empresa B hacia lo mismo: Una campaña de Marketing con su producto.

SEIS MESES DESPUÉS...

Pasado este tiempo volvimos a la guerra, pero en esta ocasión teníamos evidencias, entre ellas la más divertida es que la empresa B tenía actualizado el componente y visible desde su gestor de contenidos en internet.


Pero lo más gracioso de todo es que Google había indexado alguna página y podíamos preguntar por ellas


Por fin había motivos suficientes para los abogados de la empresa A.

CONCLUSIONES

Ante un proceso de vulneración de la propiedad intelectual se tiene que tener en cuenta que las acusaciones han de ir acompañas de pruebas. En el caso que nos ocupa las pruebas iniciales son muy débiles y podían no ser lo suficientemente fuertes de cara a una denuncia y por ello se hizo lo que se hizo confiando en la buena suerte.

Proteger el código fuente de una empresa es un proceso de titanes y muy complejo mas cuando tienes un equipo de desarrollo y un alto volumen de cambios. Controlar lo que se programa, la ubicación del código, la compilación y la falta de protocolos de pases de desarrollo a test y de test a producción todavía lo complican.

Ofuscar el código fuente o utilizar claves de cifrado es una tarea muy complicada de mantener, si ofuscas y tienes un error tienes que desofuscar y el cifrado no vale cuando estas editando código, pudiendo copiar y pegar. Me consta porque así lo hice para enseñarles a los directivos de la empresa A,  lo sencillo que es obtener el código fuente de un exe o .net

Al final la solución no ha sido de las mejores pero la trampa fue efectiva, confiamos en la providencia y nos ajustamos a la legalidad sin tener que aplicar ingeniería inversa por otro lado capture-BAT nos proporciono una ayuda adicional para verificar que la instalación es la misma, creando carpetas y ficheros de configuración idénticos. La marca puesta fue una chorrada pero hoy en día ha evolucionado a un verdadero programa de comprobación de propiedad intelectual.

Hoy la empresa tiene un ejército de abogados redactando las demandas y por fin han visto luz pero en nuestro caso hay mas sombras que luces, quedan preguntas sin respuesta como ¿quién roba el código?, ¿como lo hace?, ¿es un empleado o un hacker?, ¿hay puertas traseras o bombas lógicas en el código?.

La verdad es que le toca a la empresa hacer un esfuerzo para releerse el código fuente, verificarlo y darlo por 'limpio' y quizás tienen que poner el mayor esfuerzo en controlar la peor vulnerabilidad que puede haber en una empresa y para ello no hay antivirus ni soluciones mágicas que puedan parar a un 'troyano humano'.

6 comentarios:

Excelente Post. Magnifico.
Gracias por tomarte un tantito de tu tiempo libre y publicar. :)

Mucha Suerte

Siendo un poco retorcido, se podría introducir algún servicio oculto en todos los equipos de la empresa que, ante la copia de determinados archivos, introdujera una "marca" parecida a la que han usado, pero personalizada según la cuenta de usuario que se esté empleando. No creo que sirviera de prueba, pero descubriría quién es el "topo".

Gracias por compartir este caso.

Por cierto cuando será la segunda parte del caso Pavlov, quedé enganchado por el relato

Saludos y buena suerte!!!!

Gracias a todos,

De momento lo siento por Pávlov, tendrá que esperar a que el Juez dictamine sentencia :-(

Reitero lo dicho Gracias a todos

Pedro

Si, aguardamos a Pavlov, ese relato si que es alucinante, la cuspide es cuando dices que aguardaron en Defcom I, de pelicula :-)

El sitio espectacular.


Saludos

Muy bueno el Post. Muy bien explicado y detallado.
Gracias