1. 程式人生 > >Nginx解析漏洞復現以及哥斯拉連線Webshell實踐

Nginx解析漏洞復現以及哥斯拉連線Webshell實踐

Nginx解析漏洞復現以及哥斯拉連線Webshell實踐 [toc] #1. 環境   kali linux   docker+vulhub   nginx(1.19.6)+php(7.4.15) #2. 過程 ##2.1 vulhub映象拉取   vulhub安裝的話去官網上有安裝教程   https://vulhub.org/   安裝好之後進入到對應的目錄下   執行`docker-compose up -d`   完成之後`docker ps -a`可以檢視容器資訊 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303145238672-2115877712.png) ##2.2 漏洞利用   正常訪問80埠,是一個檔案上傳點,後面webshell就可以走這裡上傳 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303150013074-1302393135.png)   再去看看官網給出的示例,訪問http://192.168.197.128/uploadfiles/nginx.png ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303150113210-867372801.png)   使用Burpsuite抓包看看返回值,發現圖片後加了一句phpinfo ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303150405124-645202583.png)   訪問http://192.168.197.128/uploadfiles/nginx.png/.php ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303150215090-1612803408.png)   新增/.php後會被解析成php檔案,漏洞的成因下面會說,到這裡的話vulhub官網上的漏洞已經復現完成了,下面的內容主要是使用哥斯拉連線Webshell。 ##2.3 webshell上傳   哥斯拉地址:https://github.com/BeichenDream/Godzilla/releases/tag/v1.00-godzilla   這裡就不多介紹了,主要功能就是生成Webshell,連線Webshell(廢話),流量加密通訊,以及後續的Shell管理。   點選管理-生成就可以生成Shell,密碼的話就是通訊時候的引數名稱,金鑰的話就是加密通訊的金鑰,這兩個引數可以自定義,需要記好,後續連線webshell時需要提供。有效載荷的話就選擇PHP。 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303151256462-1636768718.png)   輸個檔名選擇目錄就可以生成了 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303151657963-1508332513.png)   生成結果如下 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303151726503-563063836.png)   檢視Webshell內容 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303151804886-358841533.png)   Webshell生成好了之後下面就是上傳了   ①首先直接修改檔案字尾上傳 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303152053857-99607918.png)   上傳失敗,字尾與MIME的值都沒用   ②製作圖片   既然後綴與MIME都不管用,那應該就是校驗的檔案頭(既然存在解析漏洞,其他的各種繞過就不去試了),直接做一個圖片木馬 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303152540018-140280072.png)   生成圖片內容如下 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303152631779-1272851873.png)   直接上傳圖片,返回路徑 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303152829280-1073981488.png) ##2.4 哥斯拉Webshell連線   點選目標-新增,把之前的配置再輸一遍就行,注意url這裡填的的存在解析漏洞的路徑,也就是/.php,這裡使用http代理,走8080埠,這樣就可以用Burpsuite抓包了。 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303152946344-1961437468.png)   配置完之後右鍵點選進入,就連上了(實際情況在這裡猛踩坑) ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303153304975-219248640.png)   成功介面如下 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303153326445-189322489.png)   到這裡的話流程就走完了,拿到了Webshell,下一步就開始提權了,那就是另外的一回事了。 #3. 原理分析   這一漏洞是因為Nginx中php配置不當造成的,與Nginx版本無關   ①`cgi.fix_pathinfo=1`   這個引數值為1,表示開啟,即當解析遇到不存在的路徑時,就會去掉該項,繼續依次解析,所以當`aaa.jpg/.php`被解析時,便會去掉`/.php`,繼續解析`aaa.jpg`。   ②`security.limit_extensions = .php .jpg`   這個引數限制了可執行檔案的字尾,預設只允許執行.php檔案,配置不當的話就會執行jpg檔案。 #4. 踩坑 ##4.1 Webshell連線不上   開心上傳Webshell後,竟然連不上去,用Burpsuite抓包檢視報了這個錯誤,具體的原因沒有深究,百度了一下解決方法就是修改php.ini配置檔案中的`session.auto_start = 1` ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303153744100-1406234974.png)   之前的phpinfo內有相關路徑(/usr/local/etc/php/conf.d/php.ini) ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303154300370-1833941819.png)   `docker exec -t -i nginx_parsing_vulnerability_php_1`進入php容器   進去之後發現conf.d目錄下沒有php.ini檔案,然後把上級目錄下的php.ini-development這個檔案拷貝過去   `cp php.ini-development /usr/local/etc/php/conf.d/php.ini`   拷貝過去之後準備編輯檔案,發現docker沒有vim,然後一頓操作`apt-get update`,`apt-get install vim`把vim裝好   修改其中的`session.auto_start = 1` ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303154955703-549583847.png)   (修改完之後準備開心連Webshell時,突然想起來這個配置要更新一下,但是之前很少使用docker,也不曉得怎麼重啟容器內環境,就手賤docker restart了php容器,至此前面的所有工作全部白費,再重來一遍)   由於安裝的是php-fpm,支援USER2訊號,這個訊號用於重新載入配置檔案   容器內部執行   `kill -USR2 10`   容器外部執行   `docker exec -it nginx_parsing_vulnerability_php_1 ps aux`   `docker exec -it nginx_parsing_vulnerability_php_1 kill -USR2 10`   這裡的`10`這個值是PID,使用`ps aux|grep php`檢視,這裡又出現了一個問題,docker內也沒有ps,所以想要在容器內部執行這條命令的話需要`apt-get install procps`安裝一下,如果是在容器外部執行命令的話應該沒這個問題 ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303155616027-974743405.png)   這裡看到PID就是10,然後執行`kill -USR2 10` ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303155922656-507078696.png)   到這裡的話配置就更新完畢   再次返回Bursuite發包檢視返回資訊,發現之前的WARNING變成了NOTICE ![](https://img2020.cnblogs.com/blog/1175575/202103/1175575-20210303160049941-1113573517.png)   再次使用哥斯拉就可以連上Web