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