標籤:
0x00 關於root
linux和類Unix系統的最初設計都是針對多使用者的作業系統,對於使用者權限的管理很非常嚴格的,而root使用者(超級使用者)就是整個系統的唯一管理員,擁有等同於作業系統的所有許可權。所以一旦擷取到root許可權,就可以對整個系統進行訪問和修改。而在Android下擷取root許可權之後就可以自己定製系統,卸載一些預裝軟體,完全掌控自己的裝置。
0x01 setUID
在討論root的原理之前,有一個非常重要的概念,就是檔案的setUID許可權。linux下普通的檔案許可權大家都很清楚,可讀,可寫,可執行,很清楚的一個普通的可執行檔root的許可權,r(可讀),w(可寫),x(可執行)。
但是,要考慮一種情況,比如說,一個使用者是有權修改自己的密碼的,但是記錄密碼的檔案/etc/shadow只有root使用者才是可寫的,那普通使用者如何才能修改自己的密碼呢?這一切都要歸功於setUID的設定,修改密碼時使用的命令passwd對應的二進位程式是/usr/bin/passwd
可以看到passwd的二進位檔案的許可權位中不僅僅是rwx了,多了一個s許可權,而這個s許可權就是我們的主角,setUID許可權。
由於passwd有setUID許可權,所以linux系統可以臨時把這個檔案的所有者(root)身份角色賦給普通使用者,以達到讓普通使用者可以修改自己密碼的目的。
那如何設定setUID許可權呢?
平常使用的普通檔案許可權位是由3、3、3共9位的位元字組成 ---|---|---,分別對應檔案所有者,檔案所有者同一使用者組許可權和其他使用者權限。最開始的名為root的可執行檔的許可權為rwxrwxr-x,所對應的二進位位就是111 111 101 ,然後每三位對應421換算成16進位,就是775。而新增的setUID許可權是在前面新增了三位,分別表示setGID、setUID、stick bit許可權,而我們現在只關心setUID許可權。因此加上setUID許可權之後,檔案的許可權應該由4位元字組成,例如之前的root檔案加上setUID許可權就是4755。而修改密碼的passwd檔案對應的許可權位就是4755。
可以通過一個小例子來直觀的感受一下,平常使用的cat命令對應的二進位檔案是沒有setUID許可權的:
可以在普通使用者下嘗試使用cat去讀取/etc/shadow檔案的內容:
提示許可權不夠,再給cat加上setUID許可權之後再去讀取/etc/shadow的內容:
是可以讀出來的,但是/etc/shadow中的內容都經過加密處理。
0x02 Linux 下的root
平常使用的linux發行版,需要切換到root使用者時,直接使用su命令,然後輸入su使用者的密碼就可以切換到root使用者了。
0x03 Android 的root
但是在未root的Android裝置上是沒有su的二進位檔案,直接執行su命令會提示"su not found"。
再進入已經root過的裝置上查看,平常在adb shell中用的命令對應的二進位檔案都是在/system/bin目錄下,是存在su檔案的:
可以看到這裡的su只是一個指向/system/xbin/的一個連結。
可以看到這裡的su是有setUID許可權位的。
而要在系統磁碟分割 /system/xbin 中添加檔案本身就是需要root許可權,而且設定su檔案的所有者為root使用者也是需要root許可權的,設定setUID許可權同樣也需要root許可權。
這就進入到了一個死迴圈當中,要利用su,首先要有root許可權。因此這時就需要利用到Android存在的漏洞,Android系統本身存在著很多以root許可權啟動並執行原生進程,而這些root進程中如果存在可以利用的漏洞,就可以利用進程的root身份:
拷貝su檔案到/system/xbin系統磁碟分割;
設定su檔案所有者為root使用者;
設定su檔案的setUID許可權,便於自己的進程執行su命令擷取root許可權。
關注華清遠見,回複“乾貨”400元電子書相贈,每天下午5點30,精彩內容餵飽你。
華仔解說:Android root 原理