在levelUp上發(fā)表完“Doing Recon Like a Boss”和更新了一篇Hackerone上同樣主題的帖子后,我決定開(kāi)始挖一些公開(kāi)項(xiàng)目漏洞,看看這種方法是否仍然適用于公開(kāi)項(xiàng)目。作為其中的一部分,我決定看看Slack和Snapchat的漏洞賞金項(xiàng)目,并按照演講中描述的那樣準(zhǔn)確地完成偵察任務(wù)。
Step #1 –子域名爆破
子域收集通常在大型漏洞賞金項(xiàng)目中是一個(gè)好的開(kāi)頭,但不幸的是我發(fā)現(xiàn)的子域并不是很有趣,所以我決定找到更“有趣”的東西。跳到第二階段。
Step #2 – Amazon網(wǎng)絡(luò)服務(wù)(AWS)
Amazon一直都是一個(gè)不錯(cuò)的起點(diǎn),但了解到的是Snapchat很大程度上依賴(lài)于Google,而且他們?cè)贖ackerone漏洞賞金項(xiàng)目中已經(jīng)聲明了他們的APP是托管在Google上的。那么我們不要繼續(xù)在s3 buckets上浪費(fèi)時(shí)間了,看看還有什么吧!
Step #3 ?– HackerOne上Snapchat的披露報(bào)告
作為偵察任務(wù)的一部分,我通常喜歡尋找已知或披露的漏洞。我快速瀏覽了一下他們的Hacktivity并發(fā)現(xiàn)如下內(nèi)容:
– render.bitstrips.com
– blog.snapchat.com
– accounts.snapchat.com
– fastly.sc-cdn.net
– sc-corp.net(感謝Shubs)
“sc-cdn.net”和“sc-corp.net”都引起了我的注意。我的第一反應(yīng)就是子域名爆破,但這是在自欺欺人。這些是corp / cdn域名,而且很有可能大多數(shù)這些有趣的子域名都有特定的模式?,F(xiàn)在的問(wèn)題是我該如何發(fā)現(xiàn)他們?
Step #4: Censys / Shodan
在Censys.io上查找證書(shū)一般是個(gè)很好的方式。通常我在censys上使用類(lèi)似于這樣的查詢(xún)條件:
443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:domain.com
在通過(guò)暴力破解不能找到有趣的子域名情況下,再用這種方法就足夠了。通過(guò)這些結(jié)果,我發(fā)現(xiàn)了一個(gè)子域名:REDACTED-jenkins-Environment.sc-corp.net,該域名要求用戶(hù)登錄才能查看具體內(nèi)容。這個(gè)時(shí)候,我想知道是否存在生產(chǎn)環(huán)境??隙ㄓ泻芏啵屛覀冋乙幌掳?。為了加速我的進(jìn)程,我用了能查找以下不同REDACTED-jenkins-$env.sc-corp.net序列列表的腳本:
“dev, alpha, stage, prod, beta, local,test”。正如我所期望的那樣,其中一些結(jié)果返回了302響應(yīng)碼,這暗示他們可能需要登錄。
Step #5:從這里我能干什么呢?
我最初的想法是很明顯地嘗試登錄這個(gè)產(chǎn)品實(shí)例,但這并沒(méi)有成功(感謝preben_ve)。因此,讓我們下移列表,并在其他實(shí)例上嘗試相同的方法。這就是所有樂(lè)趣開(kāi)始的地方。算我幸運(yùn),我發(fā)現(xiàn)的其中一個(gè)實(shí)例允許我使用gmail帳戶(hù)登錄到Jenkins實(shí)例。現(xiàn)在,我已經(jīng)通過(guò)了它們的Jenkins實(shí)例身份驗(yàn)證,我認(rèn)為它可能只給了最小的權(quán)限允許我做一些事情,更不用說(shuō)允許我訪(fǎng)問(wèn)“Script Console(腳本控制臺(tái))”了。這時(shí)候,我運(yùn)行了一個(gè)允許我從這臺(tái)服務(wù)器讀取一份文件的腳本,然后立刻停止所有測(cè)試并將細(xì)節(jié)提交給了Snapchat團(tuán)隊(duì)。沒(méi)有必要執(zhí)行其他腳本來(lái)證明影響,因?yàn)槲乙呀?jīng)可以讀取系統(tǒng)上的任意文件了。為了證明RCE(遠(yuǎn)程代碼執(zhí)行),我在報(bào)告中包含了一份允許執(zhí)行命令的腳本,并要求他們自己冒險(xiǎn)進(jìn)行測(cè)試。我們晚一點(diǎn)兒討論這些腳本。
Step #6:利用Jenkins漏洞
我寫(xiě)這篇帖子不只是為了討論我提交給Snapchat的報(bào)告,因?yàn)槠鋵?shí)大多數(shù)信息能通過(guò)我在HackerOne上的限制公開(kāi)披露并做一些簡(jiǎn)單的偵察猜到。我寫(xiě)這篇帖子的目的是深入探討利用Jenkins的漏洞,并討論它是否真的值2萬(wàn)美元。為了實(shí)現(xiàn)這個(gè)目的,我用自己的Jenkins實(shí)例來(lái)演示不同的攻擊場(chǎng)景(截圖與我提交給Snapchat的報(bào)告無(wú)關(guān)):
Example #1:已知漏洞(只是為了突出一些)
CVE-2016-9299– Jenkins Java 反序列化遠(yuǎn)程代碼執(zhí)行漏洞
CVE-2015-8103– Jenkins CLI – RMI Java 反序列化(Exploit)
Example #2:訪(fǎng)問(wèn)構(gòu)建信息:
通常有權(quán)訪(fǎng)問(wèn)Jenkins的構(gòu)建信息則說(shuō)民可能會(huì)讓你訪(fǎng)問(wèn)憑據(jù),api_keys / secrets這里是源碼:

Example #3:插件
Jenkins
允許你安裝不同的插件,比如Github OAuth,你可以允許用戶(hù)使用你的組織進(jìn)行登錄,這可能泄露你的Github令牌:

使用Github API可以訪(fǎng)問(wèn)更多數(shù)據(jù)。比如:https://api.github.com/orgs/ORG_NAME/repos?access_token=XXXXX
Example #4: Groovy腳本
正如我之前提到的,腳本控制臺(tái)允許你使用一行代碼來(lái)讀取文件:

通過(guò)以下代碼你也能在這臺(tái)服務(wù)器上執(zhí)行一條命令:
def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'ls /etc/'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

關(guān)鍵點(diǎn):
1. Jenkins允許你有不同的用戶(hù)權(quán)限。這意味著你得通過(guò)Jenkins實(shí)例登錄認(rèn)證,它不保證你可以執(zhí)行遠(yuǎn)程代碼。
2.如果需要通過(guò)Github或Google OAuth認(rèn)證,不要被嚇到。
3.你的訪(fǎng)問(wèn)權(quán)限可能有限(沒(méi)有腳本,構(gòu)建信息等),但是你可以訪(fǎng)問(wèn)“People”列表中的用戶(hù)。這也許能讓你通過(guò)暴力破解的方式獲取登錄憑證(我沒(méi)有那么極端)。
4.通常Jenkins被用于部署,所以查一下IP,主機(jī)名等。如果你拿下了Jenkins而且想進(jìn)一步測(cè)試(在漏洞賞金項(xiàng)目中盡量避免,完全沒(méi)必要而且會(huì)違反大多數(shù)項(xiàng)目規(guī)則),值得注意的是Jenkins服務(wù)器最有可能有權(quán)限訪(fǎng)問(wèn)生產(chǎn)環(huán)境或內(nèi)網(wǎng)環(huán)境。在運(yùn)行的服務(wù)器上找找私鑰和主機(jī)。
5.不要在你的報(bào)告中使用“公開(kāi)可訪(fǎng)問(wèn)的Jenkins”,除非你可以利用上面的一個(gè)或多個(gè)例子。
6. Snapchat立刻移除了這個(gè)實(shí)例并獎(jiǎng)勵(lì)了我。他們也非常友善地同意我寫(xiě)這篇關(guān)于這個(gè)漏洞的帖子。
感謝閱讀,挖洞愉快!