Android應用可能會使用sockets(TCP、UDP、UNIX)在應用間或者自身應用組件間進行通訊,然而這種通訊方式自己並無提供任何身份認證。
● 當開放端口綁定到0.0.0.0,那麼任何IP均可以訪問。
● 當開放端口綁定到127.0.0.1,那麼同一設備上的應用依然能夠訪問。
一旦端口訪問身份驗證不嚴,就有可能產生漏洞,形成遠程命令執行。瀏覽器
方法一app
(1)使用netstat命令查看端口開放狀況。
含義以下:socket
Listen *:80 Listen 0.0.0.0:80 Listen 127.0.0.1:80 Listen 192.168.0.5:80
The above options show up as:-tcp
:::80 0.0.0.0:80 127.0.0.1:80 192.168.0.5:80
and translate to:-函數
● Listen on any IP address (IPv4 or IPv6) ● Listen on any IPv4 address on that server ● Listen on IPv4 localhost only ● Listen on external IPv4 address 192.68.0.5
(2)選擇感興趣的端口轉換成16進制,查看位於/proc/net/目錄下對應socket套接字,在其中找到使用該端口的uid,經過uid能夠得知應用用戶名。測試
(3)經過用戶名找到appui
方法二url
直接使用netstat plus這個APP進行查看。spa
得知某個應用開放某個端口後,接下來能夠在該應用的逆向代碼中搜索端口號(一般是16進製表示),重點關注ServerSocket(tcp)、DatagramSocket(udp)等類,定位到關鍵代碼,進一步探索潛在攻擊面。線程
以sina微博5.2.0版本爲例,介紹蟲洞漏洞挖掘過程。
咱們經過netstat plus發現sina微博在本地監聽了兩個端口:8967和9527
下面是監聽8967端口的代碼
經過分析代碼可知這是一個普通的socket通訊。
監聽9527端口的代碼在native層,libweibohttp.so的start_httpd()函數中,如圖所示。
該函數調用了另一個函數用來處理http請求:
咱們由此能夠得知,這其實是實現了一個http server,綁定9527端口到127.0.0.1。咱們追蹤這個native函數到Java層代碼,發現它是在一個線程中調用的。
調用initHttpd這個native函數以前,分別實例化了類c和類b。跟進這個兩個類,發現它們都繼承了IMiniPlugin類。類中的isServer和server函數在native代碼中進行了調用:
咱們來看看c類中isServer和server函數的具體實現:
經過這幾個函數調用,咱們知道這段代碼首先判斷傳入的用戶請求路徑是否包含"/query"或者"/si"字符串,而後作出不一樣的處理。經過代碼分析和參數拼接,咱們獲得
http://127.0.0.1:9527/query?appid=com.sina.weibo
http://127.0.0.1:9527/si?act=action
http://127.0.0.1:9527/si?cmp=應用包名_activity名
http://127.0.0.1:9527/si?data=data
再看看b類中isServer和server函數的具體實現:
判斷傳入的用戶請求路徑是否包含"/login"字符串,一樣經過代碼分析和參數拼接,咱們獲得
http://127.0.0.1:9527/login?callback=xxx
咱們把這些url在手機瀏覽器中測試,發現
(1)經過如下連接能夠打開用戶手機上已安裝應用的相關組件:
http://127.0.0.1:9527/si?act=action
http://127.0.0.1:9527/si?cmp=應用包名_activity名
http://127.0.0.1:9527/si?data=data
(2)經過http://127.0.0.1:9527/query?appid=com.sina.weibo能夠獲取到應用的安裝信息,若是沒有安裝則返回「not install」
(3)經過http://127.0.0.1:9527/login?callback=xxx這個應該是獲取登陸用戶信息的,可是不知道爲何老是測試不成功。
應用通訊過程當中應增長身份校驗。