大家好,又见面了,我是你们的朋友全栈君。
事情起因:同事解决服务器中挖矿病毒的过程
可以看到,病毒的主要起因是利用了Linux预加载型恶意动态链接库的后门,关于Linux预加载的知识可以参考这一篇文章:警惕利用Linux预加载型恶意动态链接库的后门
一、准备工作
我们导出病毒文件 libioset.so ,然后利用 IDA 反编译该 so 文件,得到如下图的函数列表:
可以看到,里面有许多我们熟悉的库函数,例如 fopen(),stat() 之类的。
二、病毒的自我保护
同事提到过当初排查的时候用 ls 命令并没有查看得到 ld.so.preload 和 libioset.so 文件,这是为什么呢?让我们来看一下 ls 的源代码,首先执行命令 which ls :
可以看到 ls 命令在 /bin/ls 下(ubuntu系统),然后执行命令 dpkg -S /bin/ls :
这个结果代表的意思是 ls 命令在 coreutils 包中,接下来我的做法是到GNU的官方网站 www.gnu.org 去下载 coreutils 包然后用source insight 打开,找到 ls.c 文件,分析该文件可以发现,ls 命令主要是通过调用 stat 函数来获取文件的相关信息:
但是前面可以看到,stat 函数已经被病毒恶意修改了,我们来看看 stat 函数的内容:
可以看到,病毒作者很奸诈,当文件名等于 libioset.so,ld.so.preload,ksoftirqds 时并不会执行原来的 stat 函数,而是直接返回 0xFFFFFFFF,这也就是为什么执行 ls 命令并不能看到病毒文件的原因。观察其他被覆写的函数可以发现基本上都是类似的操作,如果文件名不是上面三个就执行原来的操作,如果是的话就直接返回无效值。
同事反应的 netstat 命令也无效了,所以分析一下 netstat 为何无效。通过同样的操作查找到 netstat 所属包是 net-tools,但是GNU上并没有 net-tools 包,搜索发现该包属于单独的项目,下载下来后分析,该函数会读取 /proc/net/tcp 文件:
观察病毒链接库里的 fopen 函数,可以看到对 tcp, tcp6 和 stat 文件进行了特殊处理:
而 forge_proc_net_tcp 和 forge_proc_cpu 覆写了文件已达到伪造的目的(函数前缀是 forge, – -!):
cpu:
tcp:
病毒自我保护的方法就是如此,覆盖原有的库函数,将对自己的操作过滤,以到达保护的目的。
三、病毒的攻击
在第一部分可以看到,该恶意链接库覆盖了比较多的系统库函数,但是其中大部分函数都是为了保护该恶意链接库而覆盖的,具有攻击作用的只有一个函数,就是 access 函数,看一下 access 函数的部分代码(为了安全考虑隐藏了病毒的脚本地址):
可以看到,在 access 函数里,病毒作者丧心病狂的添加了三个 crontab 脚本,该脚本会执行病毒进程 watchdogs,从而达到添加 ld.so.preload 和 libioset.so 的目的。
原本 access 函数的作用是执行文件时判断文件是否可操作的,所以整个系统中调用 access函数的地方非常多而且非常频繁,因此一旦病毒注入成功,那么脚本添加过程就会非常频繁,就会出现删除 crontab 脚本但是过个几秒钟又出现的现象,而删除 crontab 脚本然后立马锁定文件确实能起到一定的抑制病毒的作用。
四、病毒运行过程
到这里大概就可以整理出病毒的整个运行过程了:
首先 watchdogs 病毒进程会添加 ld.so.preload 和 libioset.so,这样就会覆盖掉原有的系统库函数,类似在原有的系统库函数外面加了一个壳,当某个地方执行 access 函数的时候,病毒脚本就会被添加进 crontab ,然后 crontab 执行病毒脚本,而脚本会执行 watchdogs 病毒进程,如此反复。仅删除 crontab 脚本并不能起到作用,然后因为病毒的自我保护措施,覆盖了几乎所有能操作到病毒的命令,所以也很难通过系统命令来清除病毒链接库。
因此,要想解决掉该病毒,可以先清除 crontab 脚本并锁定文件,防止执行病毒脚本,但是因为 access 函数执行非常频繁,所以这个过程必须要快,而且可能需要执行多次,因为可能失败。然后清除病毒链接库,但是因为系统命令都已被劫持,所以平常的调用系统命令并不能起到效果,但是可以通过静态编译 busybox 然后执行命令来达到清除文件的目的。
以上就是该病毒的原理,感谢同事的努力和分享,我才能完成这次病毒分析。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134260.html原文链接:https://javaforall.cn