Android Root 原理

题外话:最近确实很闲,因此想要升级nexus 7了。可是安装了twrp recovery之后,OTA升级总是不成功,出现error: has unexpected content。前面也讲过怎么擦除后升级。 也可以只擦除system和boot分区,这样不会影响数据。但总这样不是办法,网上说用Philz Touch Recovery,感觉还是不靠谱,索性就换了个cyanogenmod(CM)的ROM。感觉很OK!接下去就了解了一下root的原理。

Root原理

android约等于linux。这就导致android对root的处理方式也类似与linux。看他的su源文件。截取如下:

就是说只有ROOT用户和SHELL用户(adb shell)可以获得root权限,之后启动setuid的shell。这不是坑爹吗。所以我们要改的话要把下面的条件去掉,然后编译。 (怎么编译后面讲) 其实这只对4.3以前的android有效,现在android增加安全方面的考虑,禁止setuid了。而现在的root方式比较复杂,可以看superuser的源代码。

编译su

有人就喜欢动手尝试,我也是。编译这个需要懂交叉编译。有点麻烦,而且编译出来的是静态的,先不管。所以直接使用NDK,Superuser也是采用这种方法。其实可以编译任意c代码。写个helloworld就行了。

替换su

既然su可以用shell运行,那连上电脑不就行了。但是无论是adb shell还是adb root都不行,adbd cannot run as root in production builds,这有点蛋疼。简单方法果然不行,所以还是要用recovery,怎么刷recover,就不提了。我用的是TWRP,总感觉比CWR好用。然后方法就多了,可以先把su复制到普通文件夹,然后在TWRP中移动到/system/xbin。或者直接adb sideload,这个方法要写edify脚本,见链接。

SuperUser

实际上root复杂的多,像SuperUser要对能获取root权限的app进行管理,否则肯定会悲剧。参照源码,可以得到如下流程图(来自http://www.imooc.com/video/2570)。

superuser

编译android

还是闲的蛋疼,所以试着编译android。可是主页上说要16G内存才行,我加上swap才8G。不管先试。tmd,编译了4个多小时,还是没编出来。观察编译过程,主要是chromium在编译,最后内存飙到7G,我也顶不住了,就放弃了。看个内存跳舞的图。android也快出x64的了,详见01.org

memory-building

链接

  1. Edify script language,  Make Flash Zip
  2. android su source code,  superuser su,  linux susuperuser
  3. building
  4. imooc

渗透后记之攻击人性弱点

我7月的时候获取了一台linux主机的本地权限,却没有办法获取root权限。根据我的分析这是一台曾经经常使用的主机,所以必定存在弱点。获取root权限是黑客永恒的追求。即使是没什么技术含量的我,也希望能通过分析人的弱点来突破。毕竟找系统漏洞什么的,交给那些内核大牛。也确实有root privilege escalation,之前已经提过。这次主要是提我利用的人的弱点。

可读权限:

默认linux创建的文件权限都是755的,所以可读。利用这个特点,我就可以遍历可读目录,分析文件内容。这里面蕴含大量信息等着挖掘。因此我花了一个礼拜,当然也发掘出很多关键字,以及邮箱和人物身份,这对破解密码来说是至关重要的。所以说攻击是最好的防御,回去我立刻把默认创建的文件属性改为700。虽然我的电脑只有我这个用户。唠叨一句,这可以通过umask实现。

可写权限:

很多系统都存在开机脚本或者是以root运行的脚本或是是setuid的。这时就可以找到那些可写脚本,运行s时创建setuid的合适可执行文件(vim)就行了。 find . -type f -writable 就能找到可写文件。然后类似的 chmod u+s /bin/vim 就行了,相当于一个后门。那到时直接就可以写该/etc/passwd, /etc/shadow, /etc/sudoers了。

备份文件:

一个好的系统必然有备份,关键是怎么备份的。我用rsync,权限也能备份过来。而那台机器是直接一个tar。虽然只是/etc的备份,那就已经足够了。我就不客气的拿了过来。接下去的就是下一步了。因为etc里保存着密码。

薄弱口令:

有个软件叫john,破解密码神器。但是我没有体会到过。我选了cudaHashcat。你懂的,GPU更快啊。说到密码,经过我的观察,基本上都是数字加小写字母的组合,如果不是我也可以放弃了。因此用cudaHashcat就是 cudaHashcat -a 3 -m 500 --session=jtest passwdshadow -i -1 ?d?l ?1?1?1?1?1?1?1 。大概花了一晚上破了一个7位的密码。效率还是蛮高的,毕竟是 md5(UNIX) 加密。不是简单的md5。获取这个用户的密码,我可以做两件事,一是有个开机启动脚本。而是文件读取权限。然后我就戏剧性的下一步了。如果这里行不通,可以分析主机上的数据库,然后暴力md5就快的多。更有撞库法。获取用户的信息比如常用邮箱什么的,就可以根据网上泄漏的数据库匹配。这种自己找。

命令历史:

shell一般会保存各种命令历史。而这个系统没有sudo,只有su。因此每次都要打密码。我想你也遇到过直接把密码打出了的情况。这个时候就会被记录到.bash_history,然后运气实在太好。居然真的有,然后那机器的root权限就ok了。

顺藤摸瓜:

grep ssh .bash_history ,这样就能波及其他主机,因为这又是人性的弱点,密码基本都一样。然后一个bbs也沦陷了。请叫我吊哥!