本文主要分享一种本地socket通信过程中存在的身份校验缺陷而产生的绕过方法,以此来实现高权限执行恶意代码。
在上个月中发现360ROOT工具在ROOT的过程中并不会直接去下载ROOT模块来提权,而是先看下设备上有没有运行某一个特定的后台服务端程序,这个后台程序就是首次用360ROOT后而安装的,存放在system目录下以360s命名的文件。如果检查到进程存在的话,就直接连接后台服务端,发送运行指定程序的指令后,就可以获取ROOT权限来做后续的操作。
在对360s反汇编分析并提取关键代码后,自己写了一个客户端去实验测试下能不能直接获取ROOT权限,发现并没有成功,分析后了解到服务端存在校验。下面主要介绍下在通信过程中的一种绕过方法。
在本地socket通信过程中,客户端连接服务端的时候,服务端可以调用getsockopt来获取到连接端的进程凭据信息,比如客户端的pid。360ROOT的服务端就是通过这个来获取连接上来的客户端的pid,然后读取/proc/pid/exe来获取程序路径,然后获取文件的MD5值,通过校验MD5的值来判断客户端是否合法,如果通过的话就执行指定的程序。
绕过方式很简单,主要就是利用linux系统调用fork系列函数,具体就是首先在父进程中创建socket句柄,然后fork,在子进程中调用connect,然后用exec系列函数运行360s程序,然后在父进程中执行发送命令的操作,这样基本上就绕过成功了,主要实现过程如下:
在这里利用的局限性就是运行的客户端程序的uid必须为2000,因此利用的场景比如,在用户手机连接电脑后进行攻击或者某些场所的恶意充电器来实施攻击。由于在卸载360ROOT工具或者恢复出厂设置后此后台程序并不会被卸载掉,因此危害还是有的。
关于poc以及其他更多内容请参考:http://www.jianshu.com/p/f5af0736a6de 以及http://www.jianshu.com/p/fcc143359b97