ProFTPD1.3.0/1.3.0a(mod_ctrlssupport)LocalBufferOverflowExploit漏洞及攻擊程式碼分析(留個坑,以後自己埋)

來源:互聯網
上載者:User

ProFTPD1.3.0/1.3.0a(mod_ctrlssupport)LocalBufferOverflowExploit漏洞及攻擊程式碼分析(留個坑,以後自己埋)

攻擊代碼網址:http://www.exploit-db.com/exploits/3330/


1、運行環境:
1、ProFTPD 1.3.0/1.3.0a
2、編譯ProFTPD時,--enable-ctrls選項必須開啟
./configure --enable-ctrls
3、本機使用者需要有通過Unix Socket串連的許可權
2、運行參數:
revenge@darklight~$ ./revenge_proftpd_ctrls_24.pl /usr/local/var/proftpd/proftpd.sock 1
第一個參數是客戶在登陸ProFTPD伺服器後產生的,用於本地進程通訊的.sock檔案的絕對路徑,使用find / -name proftpd.sock,找到本機上該檔案的路徑。而proftpd.sock也是ProFTPD伺服器處理序間通訊所使用的檔案,本程式將shellcode注入該檔案,以此實現緩衝區溢位攻擊。

最終運行命令為:

3、程式碼分析:
3.1構造緩衝區溢位字串
使用libShellCode庫,產生shellcode,內容大致為:
setuid(0) setgid(0) bind(/bin/sh) on port 31337
在shellcode前串連無意義字串,在shellcode後串連想要返回的目標地址,最終完成用於緩衝區溢位的字串構造。
3.2建立本地socket串連並發送資料

76行,新建立描述符為SOCK的連線導向的協議族為PF_UNIX的通訊端。PF_UNIX協議族,用於同一機器的處理序間通訊。它並非通過IP地址而是通過本地檔案(通常為.sock,本程式中使用proftpd.sock)來實現進程間的通訊。
77行,將變數$rsock($rsock = /usr/local/var/proftpd/proftpd.sock)打包為sockaddr結構的網路通訊地址。

85行,使用connect()函數,串連到proftpd伺服器主機。指定串連到proftpd.sock。
漏洞的存在。 由於是驗證性的代碼,在實施了攻擊之後,並沒做更多的攻擊性操作。根據我對該程式和ProFTPD源碼ftpdctl.c(/root/proftpd-1.3.0a/src/ftpdctl.c)以及ctrls.c(/root/proftpd-1.3.0a/src/ctrls.c)的理解,猜測:
proftpd.sock是ProFTPD伺服器上某兩個進程通訊的檔案。3330.pl將shellcode寫入proftpd.sock後,會有進程通過本地socket串連進行資料通訊,而通訊的過程中會把proftpd.sock的檔案內容寫入記憶體,正是在這個過程中執行了緩衝區溢位攻擊。
4.2猜測的依據
在ftpdctl.c的116行定義變數socket_file並賦值為proftpd.sock。然後在187行通過函數pr_ctrls_connect(socket_file) 函數建立本地socket串連。
而pr_ctrls_connect(char *socket_file)函數在ctrls.c的874行定義,它的主要作用是,建立AF_UNIX類型的流式通訊端,並串連到伺服器,用於串連的本地通訊端地址為ctrl_sock。而ctrl_sock是struct sockaddr_un結構,它有兩個參數sun_family、sun_path。sun_family是協議族,賦值為AF_UNIX,用於本地處理序間通訊。sun_path是本地檔案的路徑。在程式中使用socket_file對sun_path賦值。不幸的是在進行賦值時,也就是構造ctrl_sock.sun_path時,會將socket_file的檔案內容一併寫入大小為sizeof(ctrl_sock)的記憶體地區&ctrl_sock中。
ctrl_sock是在函數pr_ctrls_connect()中定義的局部變數,發生函數調用時電腦會在動態儲存裝置區為之開闢大小為sizeof(ctrl_sock)的記憶體儲存區,與此同時動態儲存裝置區也會用於儲存函數調用時的現場資訊和函數返回地址,這就為緩衝區溢位攻擊創造了條件。可以看到在程式的923行寫入記憶體的函數為strncpy(ctrl_sock.sun_path,socket_file,strlen(socket_file)),很顯然這個函數並沒有對寫入的資料進行邊界檢查,也就是說可以向大小為sizeof(ctrl_sock)的記憶體地區寫入任意長度的資料,所以這就是緩衝區溢位點。
總的來說,3330.pl是偽造通訊資料,構造了包含攻擊指令的超長的資料,寫入proftpd.sock。而在ProFTPD的伺服器處理序通過該檔案進行通訊時,利用ctrls.c中的沒有進行邊界檢查的strncpy()函數,將shellcode寫入記憶體,實施溢出攻擊。
5、疑問
1,如果是3330.pl只負責把shellcode寫入.sock,那我不通過socket,而是直接把構造好的shellcode寫入.sock會不會同樣能導致緩衝區溢位?如果溢出了,又能說明什麼問題?是不是跟394.c的代碼的方式有一定的聯絡,聯絡一下是否可以看出端倪?如果沒有溢出,那就說明跟socket有關係,查看socket的receive機制是如何?偵聽資料寫入的。
,2,strncpy(ctrl_sock.sun_path, socket_file, strlen(socket_file))是將路徑名字寫入sun_path而不是.sock檔案內容,所以之前的理解有問題。在394.c中提到,可以通過控制strlen(socket_file)將用於溢出的資料copy到目標數組。跟send有關係。send SOCK, $buffer,0;是把資料發到了哪裡,是.sock檔案還是別的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.