最近,Pocket應(yīng)用的開發(fā)人員修復(fù)了幾個泄露數(shù)據(jù)的漏洞,黑客可從服務(wù)器上獲取敏感信息。這里獻(xiàn)上教程,供大家學(xué)習(xí)交流。
Pocket是什么
我已經(jīng)很多年沒把Firefox當(dāng)作我的主力瀏覽器了,所以其實之前我都沒有聽說過Pocket,直到我在Bugzilla看到這么篇帖子,講的就是Mozilla基金會在所有版本的Firefox中預(yù)裝了Pocket插件,并且這個插件無法卸載。盡管這引起了用戶們的強烈抗議,基金會還是固執(zhí)地綁定Pocket。
Pocket的功能就是讓用戶保存網(wǎng)頁“稍后閱讀”。Pocket可以將你要閱讀或者一時沒有讀完的網(wǎng)頁標(biāo)記下來,接著同步到服務(wù)器端,然后你就可以在不同的設(shè)備上閱讀。作為信息安全從業(yè)者,我發(fā)現(xiàn)這種功能通常都會導(dǎo)致安全問題,所以我就打算檢查一下Pocket有沒有問題。
事實上,這些漏洞中,大部分就可以被攻擊者利用了。攻擊者想要利用這些漏洞都不需要什么復(fù)雜的工具,甚至連腳本的知識都不需要。
嘗試1:協(xié)議處理程序
用戶可以通過Pocket網(wǎng)站上的隊列管理功能添加URL到隊列中。由于應(yīng)用的用途主要是瀏覽網(wǎng)上的網(wǎng)頁,所以這些URL理應(yīng)被限制,應(yīng)該只允許http和https鏈接。所以首先我嘗試在隊列中添加以下鏈接:
file:///etc/passwd
ssh://localhost
telnet://localhost:25
很遺憾,經(jīng)過測試,這些都沒成功
嘗試2:利用Pocket功能作為內(nèi)網(wǎng)代理
我之前在Apache服務(wù)器的狀態(tài)頁面看到過一條Apache錯誤信息。這種錯誤信息通常是.htaccess或者Apache配置文件限制了localhost或一些信任的網(wǎng)段訪問server-status的時候才會出現(xiàn)的:
Forbidden
You don't have permission to access /server-status on this server.
我在我的Pocket隊列中加了一條新鏈接:http://127.0.0.1/server-status。加入后,后端服務(wù)器就會發(fā)送HTTP請求獲取內(nèi)容。Apache會信任來自localhost的請求嗎?
事實證明,這一招很管用,之后我就在Pocket隊列中看到了如下信息:
Apache Server Status for 127.0.0.1
Server Version: Apache/2.2.29 (Unix) DAV/2
Server Built: Mar 12 2015 03:50:17
Current Time: Tuesday, 28-Jul-2015 10:07:45 CDT
Restart Time: Tuesday, 28-Jul-2015 03:20:12 CDT
Parent Server Generation: 12
Server uptime: 6 hours 47 minutes 32 seconds
Total accesses: 241913 - Total Traffic: 4.1 GB
CPU Usage: u1209.24 s110.06 cu0 cs0 - 5.4% CPU load
9.89 requests/sec - 177.5 kB/second - 17.9 kB/request
40 requests currently being processed, 14 idle workers
...
服務(wù)器狀態(tài)情況的全部輸出被同步到了我的Android上。Apache的mod_status可以顯示出大量有用的信息,包括內(nèi)部來源和目標(biāo)IP地址,發(fā)送的請求中的URL的參數(shù),還有查詢參數(shù)。對于Pocket應(yīng)用,請求的URL包括Pocket用戶們正在瀏覽的URL,因為這些請求是通過HTTP GET方式進(jìn)行的。
要隱藏上述的這些服務(wù)器信息,我們可以關(guān)閉Apache中的ExtendedStatus。大部分Pocket的后端服務(wù)器都關(guān)閉了ExtendedStatus,但是很小一部分的服務(wù)器還是開著,所以就導(dǎo)致攻擊者可以獲取到這些有用的信息。
另外,通過修改server-status 的GET參數(shù),攻擊者可以強制然Pocket重新下載頁面,這樣黑客就有可能獲取到不同服務(wù)器的信息。
http://127.0.0.1/server-status?meaningless_parameter=1
http://127.0.0.1/server-status?meaningless_parameter=2
http://127.0.0.1/server-status?meaningless_parameter=3
Pocket搭建在亞馬遜EC2上
既然Pocket存在漏洞可以讓用戶獲取到Pocket后端服務(wù)器的相關(guān)信息,我們就看看利用這個漏洞我們還能獲取到哪些信息。簡單使用dig命令,我們就可以知道Pocket用的是亞馬遜的EC2服務(wù)器。亞馬遜的EC2有個實例元數(shù)據(jù)服務(wù)。這個服務(wù)只能從內(nèi)部訪問,無需驗證,在所有的EC2實例上都有。我們可以嘗試使用這個服務(wù)獲取更多的信息:
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/hostname
http://169.254.169.254/latest/meta-data/ami-id
在Pocket隊列中添加了上面的這些鏈接后,我就能看到完整的服務(wù)器回應(yīng)了。EC2的元數(shù)據(jù)包括很多對攻擊者有用的信息,包括IAM登錄信息,還有關(guān)于這個instance的細(xì)節(jié)信息,包括可用區(qū)、instance類型、網(wǎng)絡(luò)類型、MAC地址,塊存儲器的信息等。
攻擊者還可以干什么呢?
對localhost的HTTP服務(wù)進(jìn)行端口掃描,這可以繞過EC2的防火墻規(guī)則
對端口掃描的結(jié)果進(jìn)行分析,識別開啟的web應(yīng)用
在Pocket內(nèi)部環(huán)境下進(jìn)行漏洞利用
很多大企業(yè)或者小公司都會有只能通過內(nèi)部訪問的web應(yīng)用,這些應(yīng)用通常無需驗證,因此很容易會被攻擊者利用。
server-status中的這些內(nèi)部IP地址能用來干什么呢
從亞馬遜EC2元數(shù)據(jù)上可以看出,Pocket使用的EC2服務(wù)器是在us-east-1(美東1區(qū))區(qū)域,網(wǎng)絡(luò)類型是classic(EC2有兩種網(wǎng)絡(luò)類型可選:EC2-Classic 和VPC。VPC更好一些,有些實例類型也只有VPC上才有。VPC在創(chuàng)建子網(wǎng)絡(luò)和訪問控制列表(ACL)的時候更加靈活)。
由于Pocket用的是EC2-Classic,要訪問server-status中的內(nèi)部IP地址,只需要在us-east-1區(qū)域租個2美分/小時的t1.micro實例。這樣攻擊者就可以使用RFC-1918地址訪問這些實例上運行的服務(wù)了,例如ssh和http,甚至還可以進(jìn)行端口掃描。
使用這些內(nèi)部IP地址訪問后端服務(wù)器有幾個優(yōu)點:
可以繞過前端負(fù)載平衡器和前端的WAF防火墻之類的東西,在有前端負(fù)載平衡器的情況下,攻擊者可以通過設(shè)置X-Forwarded-For修改源IP地址,黑客可以通過這種方法避開ACL或者偽造log。
輸入重定向
像Pocket這一類的應(yīng)用在處理HTTP重定向鏈接的時候很有可能會忽視某些問題,造成安全隱患。那在URL隊列中加入重定向鏈接會發(fā)生什么呢?我輸入了file:///etc/passwd,后果很嚴(yán)重:
HTTP/1.1 301 Moved Permanently
Location: file:///etc/passwd
Content-Length: 52
Date: Tue, 28 Jul 2015 18:42:58 GMT
Connection: keep-alive
Moved Permanently. Redirecting to file:///etc/passwd
我在Android機上刷新了Pocket應(yīng)用后,隊列中就增加了file:///etc/passwd。點擊之后,/etc/passwd完整的內(nèi)容就呈現(xiàn)在了我眼前。
應(yīng)Pocket的要求,/etc/passwd內(nèi)容已刪除
漏洞能夠造成什么影響可以留給讀者考慮。
有了/etc/passwd之后能干什么
在測試Pocket的時候,我用這個重定向漏洞請求了file:///proc/self/status文件,這個文件可以用來獲取正在運行的進(jìn)程的更多信息。
下面就是部分進(jìn)程狀態(tài)信息:
Uid: 0 0 0 0
Gid: 0 0 0 0
以root身份運行這個進(jìn)程能夠造成什么后果也留給讀者考慮。
把漏洞結(jié)合起來
Pocket針對我的報告快速做出了回應(yīng),所以我沒能夠把這些漏洞結(jié)合起來。但是設(shè)想如果真的有個心懷不軌的攻擊者發(fā)現(xiàn)了這些漏洞,他能做些什么呢?
1. 通過301重定向獲取file:///etc/passwd文件,然后獲取EC2用戶的home目錄
2. 從用戶home目錄獲取ssh私鑰
3. 使用/server-status獲取內(nèi)部IP地址
4. 租一個EC2實例,地區(qū)設(shè)置在US-EAST-1地區(qū)
5. 用獲取的到的ssh私鑰連接Pocket后端服務(wù)器的IP地址
接下來能做什么,你懂的^_^
Pocket的漏洞披露政策還是很負(fù)責(zé)的,我把所有的漏洞細(xì)節(jié)第一時間提交給了Pocket官方,而漏洞披露時間是由提交者自行決定的,不過要在漏洞提交后的21天后,好讓Pocket有時間處理漏洞?,F(xiàn)在漏洞都已經(jīng)修復(fù)。