xixitalk's snippet

Post Longer Than 140 Characters Tweets

Aug 30, 2016 - Comments

产品中多个不明可执行程序dvrHelper

一个数据类产品,测试报告描述:FTP上传下载加浏览器看视频,一个小时内必死机。

死机现场初步分析:死机直接原因是系统内存耗尽,但是发现进程里多了三个奇怪的进程,进程名都像是随机字符串,两个死机现场都有,并且进程名还随机的不一样。

有人去分析内存问题,我来分析三个奇怪的进程。

这三个进程父进程是Init,执行的命令是dvrHelper,开始我怀疑版本自带的程序,查看了版本编译后的文件系统,没有这个文件,在整个版本代码里搜索这个字符串,没有找到任何踪迹。这时候有人告诉我版本的根文件系统里多了dvrHelper文件,重烧版本是没有这个文件的。手动运行这个文件,提示

listening tun0

运行结束后,进程列表里就多了三个奇怪的进程。父进程是Init,这是linux守护进程惯用的机制。我把dvrHelper上传到https://www.virustotal.com在线扫描,55个杀毒软件,有2个提示异常。通常VPN会使用tun0tup0这样虚拟网口,这应该是一个网络包监控/分析/过滤程序。

SHA256:	c483618671766847fc75ea79fdc201df2e4a93f501dc98ec9c6f283fb1d4336c
File name:	dvrHelper
Detection ratio:	2 / 55
Analysis date:	2016-08-29 08:51:11 UTC ( 22 hours, 56 minutes ago )

AVG	Linux/Fgt.CA	20160829
ESET-NOD32	a variant of Linux/Gafgyt.SE	20160829

通过file命令查看文件属性,说是ARM格式的ELF文件。反汇编没有任何调试信息,汇编上看不出功能。

$ file dvrHelper
dvrHelper: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped

这时候基本确认,dvrHelper文件是个木马程序了。引入这个木马的路径分析只有两个,一个通过adb push,一个就是telnet

先禁用了adb功能,发现问题还是出现了。
同时禁用adbtelnetd,问题不出现了

现在问题聚焦在telnetd服务上。

telnet是一个远程协议,telnetd是一个实现telnet协议的服务程序。

PC上用wireshark抓包,没有抓到PC上应用程序登录telnetd的证据。后来突然想到pppoe功能可能会分配一个公网IP,ifconfig一看,果然电信分配了一个公网IP。用手机登录这个公网IP的telnet,也果然登录到这个产品里了。这样就怀疑产品是通过公网IP登录产品的telnetd服务,把木马上传到产品里了。

同时在内核fs/open.c里加代码,如果打开dvrHelper文件就panic死机。死机显示在通过busybox执行cp /bin/echo dvrHelper,顺着父进程一直往上找,找到了telnetd进程。这样也再次排除了adb的嫌疑。

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
        if(strstr(filename,"dvrHelper"))
            panic("[testcode] dvrHelper found\n");
}

tenetd是包含在busybox工具包里,在telnetd.c里增加代码,用getpeername获取登录客户的IP是0.0.0.0,不知道为什么。按说accept后调用getpeername没有问题啊。我对网络不熟,如果有人知道请赐教。

struct sockaddr_in sa;
int len = sizeof(sa);
FILE *fp;

/*something*/
fd = accept(master_fd, NULL, NULL);
if (fd < 0)
	goto again;
close_on_exec_on(fd);

if(!getpeername(fd, (struct sockaddr *)&sa, &len))
{
  fp = fopen("/cache/login.log","ab+");
  fprintf(fp,"[testcode] accept  from %s \n", inet_ntoa(sa.sin_addr));
  fclose(fp);
}

这时候只好祭出了tcpdump工具,在产品内部运行tcpdump,只抓取公网网口的23端口数据包。

tcpdump -i ppp0 port 23

十几分钟的时间,就抓到了来自台湾 泰国 巴西 印度的telnet登录,再一会根目录就多了dvrHelper文件。

修改意见:
1. 发货版本禁用telnetd服务 2. 开发版本用iptables设置禁止ppp0网口的23端口访问,不用admin:admin这样简单的账号密码,telnetd可以不用默认23端口,换成4589这样端口号

PS:因特网真是太危险了


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。