zhangguanzhang's Blog

centos6中毒重启后卡在启动页面

字数统计: 871阅读时长: 3 min
2020/03/02
1
2
3
4
5
6
7
8
9
10
⣿⣿⣿⣿⣿⣿⢟⣡⣴⣶⣶⣦⣌⡛⠟⣋⣩⣬⣭⣭⡛⢿⣿⣿⣿⣿
⣿⣿⣿⣿⠋⢰⣿⣿⠿⣛⣛⣙⣛⠻⢆⢻⣿⠿⠿⠿⣿⡄⠻⣿⣿⣿
⣿⣿⣿⠃⢠⣿⣿⣶⣿⣿⡿⠿⢟⣛⣒⠐⠲⣶⡶⠿⠶⠶⠦⠄⠙⢿
⣿⠋⣠⠄⣿⣿⣿⠟⡛⢅⣠⡵⡐⠲⣶⣶⣥⡠⣤⣵⠆⠄⠰⣦⣤⡀
⠇⣰⣿⣼⣿⣿⣧⣤⡸⢿⣿⡀⠂⠁⣸⣿⣿⣿⣿⣇⠄⠈⢀⣿⣿⠿
⣰⣿⣿⣿⣿⣿⣿⣿⣷⣤⣈⣙⠶⢾⠭⢉⣁⣴⢯⣭⣵⣶⠾⠓⢀⣴
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣉⣤⣴⣾⣿⣿⣦⣄⣤⣤⣄⠄⢿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠈⢿
⣿⣿⣿⣿⣿⣿⡟⣰⣞⣛⡒⢒⠤⠦⢬⣉⣉⣉⣉⣉⣉⣉⡥⠴⠂⢸
⠻⣿⣿⣿⣿⣏⠻⢌⣉⣉⣩⣉⡛⣛⠒⠶⠶⠶⠶⠶⠶⠶⠶⠂⣸⣿

昨晚刚整好那个ubuntu,今天下午又一台centos6开机卡主起不来。开机进度条按esc取消进入字符输出如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
      Welcome to CentOS

Setting hostname xxxxxxx: [ OK ]
Checking filesystems [ OK ]
/dev/vda2: clean 70269/2346512 files. 1097438/9385728 blocks

/dev/vda2: clean, 70269/ 2346512 f i les, 1097438/ 9385728
/dev/vda1: recovering journal
/dev/vda1: clean, 45/51200 files, 76087/204800 blocks
[ OK ]
Remounting root filesystem in read-write mode : [ OK ]
Mounting local filesystems : [ OK ]
Enabling /etc/fstab swaps : [ OK ]
init: ck-log-system-start main process (1297) terminated with status 1

挂载iso,修改启动顺序,进rescue mode挂了chroot进去,排查到ck-log-system-start相关的目录丢失

1
2
3
4
5
6
bash-4.1# cd /etc/init
bash-4.1# ls -l
total 72
...
-rw-r--r--. 1 root root 136 May 11 2016 ck-log-system-start.conf
...

查看该文件内容

1
2
3
4
5
6
7
bash-4.1# cat ck-log-system-stop.conf
# Upstart event
# ck-log-system-stop - write system stop to log
#
start on runlevel 0
task
exec /usr/sbin/ck-log-system-stop

手动启动试试

1
2
3
bash-4.1# /usr/sbin/ck-log-system-start

** (process 6906): WARNING **: Couldn't open log file /var/log/ConsoleKit/history (Not a d irectory)

居然不是文件

1
2
bash-4.1# ls -l /var/log/ConsoleKit
-rw-r--r--.1 root root 0 Dec 3 02:13 Consolekit

找了个系统对比下,操作下,权限755所以直接创建目录即可

1
2
bash-4.1# mv /var/log/ConsoleKit{,.bak}
bash-4.1# mkdir -p /var/log/ConsoleKit

重启后字符输出那里最下面没init那个错误了,但是还是依然卡主,看了下 https://blog.51cto.com/1992tao/1852322 的文章介绍了详细的启动顺序,所以应该从/etc/rc.d/rc.sysint里debug入手,启动的字符输出就是这个脚本输出的。
rescue mode挂载进去发现/etc/rc.d/rc.sysint里面的647行为

1
action $"Enableing /etc/fstab swaps: " swapon -a -e

如果对centos6的init熟悉的话可以知道function那个文件里有action的定义,就是启动过程中执行后面的命令,成功则字符 [ OK ]这样
在脚本最后面加上

1
action "Test" date

然后启动,发现显示出Test xxxx,说明该脚本正常执行完,这个时候不应该在该脚本后面紧接着的脚本排查,而应该隔段排查,既然最终没运行到登陆的tty,而在/bin/login前面就是/etc/rc.d/rc.local。该脚本里就只有一句(也就是默认的)

1
touch /var/lock/subsys/local

touch命令会修改文件的三个time,使用stat看了后发现时间是上次的启动时间,说明也未执行到这里,可以把范围缩小在rc相关联的文件这儿了
最后在/etc/init/rc.conf里找到了异常

1
2
3
4
5
6
7
8
9
10
11
12
13
bash-4.1# cat /etc/init/rc.conf
...

start on runlevel [0123456]

stop on runlevel [!$RUNLEVEL]

task

export RUNLEVEL
exec /etc/rc.d/rc $RUNLEVEL
/bin/ttyload
exit 0

可以发现该脚本会去运行/etc/rc.d/rc,对比了下正常的机器最后两行多了,用rpm -qf查了下ttyload不属于任何包,应该是中毒了被添加的。看了下crontab多了个.ssh/ssh的行,还多了个ROOT且uid为0有密码的用户。这个文件还被加了attr的各种权限防止修改,使用chattr去掉权限后把这两行注释了保存,计划任务注释后开机能正常启动。中毒剩下的让他们自己整吧。
这是头一次看见病毒的人改启动流程,一般ddos和肉鸡挖矿的都是crontab里藏在/var/spool/cron/x整个文件保持自己进程活跃和开机rc.d加文件自启动,这个居然还让用户强制无法正常开机

CATALOG