這篇文章類似於“傻瓜系列之利用緩衝區溢位”。在這類漏洞中,我們的做法是利用網路,程式控制器,輸入等等,傳送超大的資料緩衝區給程式,覆蓋程式記憶體的重要部分。在這些緩衝區覆蓋程式記憶體之後,我們可以重定向程式的執行流並執行注入程式碼。
首先,我們需要做的是查明程式的哪一部分可以用來重寫記憶體。處理這個任務的過程叫作“fuzzing”。我們可以為Metasploit框架中的各種協議找到若干個fuzzer(執行fuzzing任務的工具)。
接下來這個例子中,我們用metasploit對一個ftp伺服器進行fuzz:
Fuzzer執行幾分鐘後,程式就崩潰了,見下圖:
在Metasploit視窗中,我們可以看到崩潰緩衝區的長度:
在分析所有輸出內容之後,我們可以得出:在ftp伺服器通過使用者命令傳送了一個大於250的緩衝區後,程式崩潰了。
我們可以使用python來重現崩潰:
現在,我們重新實施這次攻擊,但是首先要將FTP SERVER程式附加到一個偵錯程式上,在這裡我們用的偵錯程式是OLLYDBG。
在實施攻擊之後,我們可以很直觀地看到ESP,EDI和EIP暫存器被覆蓋。
稍微研究一下,大家可以發現:EIP控制程式的執行流,如果可以重寫EIP,那麼就可以手動重定向程式的執行流。EIP指向下一個待執行地址。
在這裡,我們需要知道要重寫的EIP緩衝區長度。我們可以在metasplpit中用pattern_create建立一種模式,並且作為一個緩衝區使用,來獲取重寫EIP的4個位元組的位置。
把這些命令新增到我們的利用程式碼中,並再次執行:
現在,我們可以看到程式記憶體中的模式。
現在需要使用pattern_offset(偏移量模式)來找到那4個位元組的準確位置(只要把4個位元組作為一個指令碼引數貼上到EIP裡面)。
由於在EIP之後ESP就被重寫,我們可以寫出這樣一段利用程式碼如下:
並且,如果重新載入,在OLLY裡面,可以看到它執行得很好。
在EIP之後,是這樣改寫ESP的:
那麼在EIP裡面我們需要做什麼呢?將我們的惡意程式碼放到重寫EIP的程式碼後面,然後需要做的只是簡單的JMP ESP。
記住,EIP將包含下一條待執行指令的地址,所以此時需要做的是找到包含JMP ESP的地址。我們可以在OLLY(在E標籤頁)中進行查詢。
一個簡單的命令檢索將會返回給我們一個地址。
現在,我們拷貝這個地址:
最後,我們需要做的是,在實行攻擊之後,加入並執行我們的shell程式碼。我們可以用metasploit生成這些shellcode。
現在我們的利用程式碼如下。注意一下案例中CPU的ENDIAN,在EIP暫存器中我們會用到小端格式。
現在,如果我們再次實行攻擊,將會執行我們的shellcode。
好的,現在我們可以生成另外的shellcode來執行不同的任務。
我們可以生成一段反向連線的shell程式碼,來訪問我們的受害主機。
把這行程式碼我們的利用程式碼中,
最後執行利用程式碼:
提示:注意一些特殊字元。如果在緩衝區中間,利用程式碼被截斷,可能是由於一些特殊字元導致的。特殊字元諸如“xa0″、 “|x00″等,會截斷shellcode,你必須通過測試找到這些字元,並且在shellcode中避免用到,可別說我沒提醒過你!