Gitlab中任意文件讀取漏洞的示例分析

這篇文章主要介紹了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)!

Gitlab 任意文件讀取漏洞(CVE-2016-9086)

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ì)按照如下步驟處理:

  1. 服務(wù)器根據(jù) VERSION 文件內(nèi)容檢測(cè)導(dǎo)出文件版本,如果版本符合,則導(dǎo)入。

  2. 服務(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)境

如下測(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ò)誤)。

漏洞復(fù)現(xiàn)

環(huán)境運(yùn)行后,Web 端口為 10080,ssh 端口為 10022。訪(fǎng)問(wèn) http://your-ip:10080,設(shè)置管理員(用戶(hù)名 root)密碼,登錄。

Gitlab中任意文件讀取漏洞的示例分析

新建一個(gè)項(xiàng)目,點(diǎn)擊 GitLab export

Gitlab中任意文件讀取漏洞的示例分析

將 test.tar.gz上傳,將會(huì)讀取到 /etc/passwd文件內(nèi)容:

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

漏洞修復(fù)

官方先移除了導(dǎo)入包里的軟連接,其次,讀取 VERSION 的內(nèi)容和 project.json 的內(nèi)容出錯(cuò)后將內(nèi)容輸出到日志里而非返回到前端。

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

感謝你能夠認(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)

成都做網(wǎng)站