Linux【14】-小技巧2-Linux查杀木马

已经通过top查看到奇怪的进程和用户

一、查找木马

1. tmp 目录下面

查看/tmp特殊目录下有没有可执行程序

ls -l /tmp/

查看临时目录是否存在攻击者入侵时留下的残余文件

tail -n 100 ~/.bash_history | more

#是否存在.c .py .sh为后缀的文件或者2进制elf文件

ls -la /tmp
ls -la /var/tmp
find / -name \*.elf | xargs ls -l

2. 定时任务查找一下 crontab -e

00 * * * * python /root/gpumonitor.py
00 * * * * python /root/cpumonitor.py

G02查看得到这个信息,删掉

其他命令:

[root@linux-node1 ~]# crontab -l
[root@linux-node1 ~]# crontab -e
[root@linux-node1 ~]# vim /etc/crontab 

3. 病毒要下载,查看是否有下载的命令

ps -ef|egrep "curl|wget"  

4. top 一下看一下哪个占用cpu最高

每1秒刷新一次,显示整个命令路径,而不是命令的名称

top -d 1 -c

查找可疑进程(比较奇怪的进程名称)如:sshz、crond.conf、.sshd等

查看到可疑进程 是test3用户,进程15174。这里,可以看到两个信息,一个是用户,一个是进程。

发现可疑进程后,记录PID,然后执行如下命令

[root@linux-node1 ~]# kill -STOP PID       #停止进程,先不要杀掉进程(有可能杀掉之后,木马守护程序会重新打开一个新的木马进程)
[root@linux-node1 ~]# ls -l /proc/PID      #查看exe对应的脚本路径;pwd为病毒进程程序目录,一般在/usr/bin下

例如:
[root@linux-node1 ~]# ls -l /proc/2773     #可以看到病毒程序在/usr/bin/python2.7(图片保是举例)

若某些文件无法直接删除时,使用chattr命令

[root@linux-node1 ~]# lsattr filename
[root@linux-node1 ~]# chattr -aij filename

5. 产看用户文件

检查系统密码文件,查看文件修改日期

ls -l /etc/passwd

查看 passwd 文件中有哪些特权用户

awk -F: '$3==0 {print $1}' /etc/passwd

查看系统里有没有空口令帐户

awk -F: 'length($2)==0 {print $1}' /etc/shadow

进入 /etc/passwd 看到了很多乱七八糟的用户

  • userdel 用户,删掉一些用户以后,一定要NIS更新一下,因为我们开启了NIS服务。
  • 但其中一个用户,居然具有root权限。

紧接着去掉user

vim /etc/passwd

user:x:0:0::/data/user/user:/bin/bash

[root@c01 log]# userdel user
userdel: user user is currently used by process 1

修改密码root密码,删掉/etc/passwd里面这个用户,然后删掉/data/user下面的这个用户

关闭NIS

systemctl stop rpcbind; 
systemctl stop ypbind;
systemctl disable ypbind; 
systemctl disable rpcbind;

systemctl stop ypserv;
systemctl stop rpcbind;
systemctl stop ypxfrd;
systemctl stop yppasswdd.service;
systemctl disable ypserv;
systemctl disable rpcbind;
systemctl disable yppasswdd.service;

#Removed symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service

删掉其他开机自动启动的服务:

ll /etc/systemd/system/multi-user.target.wants

lrwxrwxrwx. 1 root root 39 Apr 23  2018 teamviewerd.service -> /etc/systemd/system/teamviewerd.service
lrwxrwxrwx. 1 root root 37 Jul 19  2017 tuned.service -> /usr/lib/systemd/system/tuned.service
lrwxrwxrwx. 1 root root 40 Apr 26  2016 vmtoolsd.service -> /usr/lib/systemd/system/vmtoolsd.service
lrwxrwxrwx. 1 root root 40 Apr 21  2016 vncserver@:1.service -> /etc/systemd/system/vncserver@:1.service
lrwxrwxrwx. 1 root root 40 Nov 22  2018 vncserver@:2.service -> /etc/systemd/system/vncserver@:2.service

systemctl disable teamviewerd; 这个只是删掉了/etc/systemd/system/multi-user.target.wants/下面的软连接,应该连原来的一起删掉

5. 查找目标文件

查找1天内的新文件

find / -mtime -1

发现有些文件根本不是服务本身需要修改的。 木马进程可能会换到不同的目录下生成新程序,一般其用到的目录有 /bin /usr/bin /tmp /etc /etc/.java /etc/cron.hourly /etc/init.d 以上目录在我处理过程中都提前chattr +i ,再进行kill -9。

6. /etc/passwd下面的文件用户哪些可以登录

去掉不正常的可以登录用户/bin/bash

7.查看 /etc/rc.local 用户下面的开机自启动

并木有异常

8. 查看密钥是否被人动了

删除密钥没用的.redis中毒后果.

9. 检测ps、netstat、ss、lsof命令是否替换。正常的文件大小不会超过1MB,如下按时间排序,重新关注前几行。

[root@linux-node1 ~]# ls -lhtSr  /etc/init.d/
[root@linux-node1 ~]# ls -lhtSr /bin/
[root@linux-node1 ~]# ls -lhtSr /sbin/
[root@linux-node1 ~]# ls -lhtSr /usr/bin
[root@linux-node1 ~]# ls -lhtSr /usr/sbin

10. 执行lsof看看有无可疑的进程名

[root@linux-node1 ~]# lsof

[root@localhost bin]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      29184/master        
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      62908/smbd          
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      62908/smbd          
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd  


netstat –an
netstat –rn
ifconfig –a

11.登陆分析

查看正常情况下登录到本机的所有用户的历史记录(/var/log/wtmp):

last

查找/var/log/secure文件中的登录记录:

grep "Accept" /var/log/secure

弱口令登录

#过滤出成功登录系统的用户名和IP地址,分析IP是否可疑,如有国外IP登录,或者IP不是常驻地,比较可疑。

[root@linux-node1 ~]# cat /var/log/secure* | grep sshd | grep Acc | awk '{print $9,$11}' 

test3 127.0.0.1
test3 127.0.0.1
test5 127.0.0.1
test3 127.0.0.1
test2 127.0.0.1
test2 127.0.0.1

#过滤可疑IP地址的登录时间 [root@linux-node1 ~]# cat /var/log/secure* | grep sshd | grep 1.1.1.1

Apr  8 15:41:55 C01 sshd[19698]: Disconnected from 127.0.0.1 port 58968 [preauth]
Apr  8 15:41:55 C01 sshd[19903]: Invalid user xguest from 127.0.0.1 port 59152
Apr  8 15:41:55 C01 sshd[19903]: input_userauth_request: invalid user xguest [preauth]
Apr  8 15:41:55 C01 sshd[19903]: pam_unix(sshd:auth): check pass; user unknown
Apr  8 15:41:55 C01 sshd[19903]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost
Apr  8 15:41:55 C01 sshd[19905]: Invalid user xguest from 127.0.0.1 port 59154
Apr  8 15:41:55 C01 sshd[19905]: input_userauth_request: invalid user xguest [preauth]
Apr  8 15:41:55 C01 sshd[19905]: pam_unix(sshd:auth): check pass; user unknown
Apr  8 15:41:55 C01 sshd[19905]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost
Apr  8 15:41:55 C01 sshd[19906]: Invalid user xguest from 127.0.0.1 port 59156
Apr  8 15:41:55 C01 sshd[19906]: input_userauth_request: invalid user xguest [preauth]
Apr  8 15:41:55 C01 sshd[19906]: pam_unix(sshd:auth): check pass; user unknown
Apr  8 15:41:55 C01 sshd[19906]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost
Apr  8 15:41:55 C01 sshd[19700]: Failed password for invalid user student from 127.0.0.1 port 58976 ssh2
Apr  8 15:41:55 C01 sshd[19700]: Received disconnect from 127.0.0.1 port 58976:11: Normal Shutdown, Thank you for playing [preauth]
Apr  8 15:41:55 C01 sshd[19700]: Disconnected from 127.0.0.1 port 58976 [preauth]
Apr  8 15:41:55 C01 sshd[19702]: Failed password for invalid user student1 from 127.0.0.1 port 58982 ssh2
Apr  8 15:41:55 C01 sshd[19702]: Received disconnect from 127.0.0.1 port 58982:11: Normal Shutdown, Thank you for playing [preauth]

不断的尝试新的用户?

12.检查系统中的 core 文件

find / -name core -exec ls -l {} \;

13.检查系统文件完整性

# rpm -Vf /bin/ls
# rpm -Vf /usr/sbin/sshd
# rpm -Vf /sbin/ifconfig
# rpm -Vf /usr/sbin/lsof

# md5sum –b 文件名
# md5sum –t 文件名

14.在web目录下运行

#查看是否有木马
grep -r "getRuntime" ./

#运行的时候被连接或者被任何程序调用
find . -type f -name "*.jsp" | xargs grep -i  "getRuntime"

#返回ip地址字符串
find . -type f -name "*.jsp" | xargs grep -i  "getHostAddress"

#创建WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量
find . -type f -name "*.jsp" | xargs grep -i  "wscript.shell"

#gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针
find . -type f -name "*.jsp" | xargs grep -i  "gethostbyname"

#调用系统命令提权
find . -type f -name "*.jsp" | xargs grep -i  "bash"

#Jsp木马默认名字
find . -type f -name "*.jsp" | xargs grep -i  "jspspy"

#检查是否有非授权访问管理日志
find . -type f -name "*.jsp" | xargs grep -i  "getParameter"

#要进中间件所在日志目录运行命令
fgrep –R "admin_index.jsp" 20170702.log > log.txt   #递归地读取每个目录下的所有文件

#查看是否出现对应的记录
fgrep –R "and1=1" *.log > log.txt
fgrep –R "select " *.log > log.txt
fgrep –R "union " *.log > log.txt
fgrep –R "../../" *.log > log.txt
fgrep –R "Runtime" *.log > log.txt
fgrep –R "passwd" *.log > log.txt

#查看是否有shell攻击
fgrep –R "uname -a" *.log > log.txt
fgrep –R "id" *.log > log.txt
fgrep –R "ifconifg" *.log> log.txt
fgrep –R "ls -l"  *.log > log.txt

15、安装chrootkit,检查是否有rootkit

rootkit是入侵者经常使用的工具,这类工具可以隐秘、令用户不易察觉的建立了一条能够总能够入侵系统或者说对系统进行实时控制的途径。

yum install -y glibc-static
mkdir chrootkit
cd chrootkit/
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz 
cd chkrootkit-0.52/
make sense       #编译
./chkrootkit     #检测命令,若出现INFECTED那就要小心了(./chkrootkit | grep INFECTED)

检测脚本,放到定时任务里面即可

#!/bin/bash
#sript name:chkrootkit.sh

TOOLKITSPATH=/usr/local
MAILUSER=root@localhost
file_chkrootkit_log=chkrootkitcron.log
servername=`hostname`
date=`date +%Y-%m-%d`

cd ${TOOLKITSPATH}/chkrootkit
./chkrootkit > ${file_chkrootkit_log}
[ ! -z "$(grep INFECTED ${file_chkrootkit_log})" ] && \
grep INFECTED ${file_chkrootkit_log} | mail -s "[chkrootkit] report in ${servername} ${date}" ${MAILUSER}

备注:登录的时候提示信息在 /etc/motd 文件里面

16、bash shell 漏洞

1、测试代码,有问题的

[root@localhost ~]# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test

2、修复(下面是参考网上的东西,不知道效果怎么样)

[root@localhost ~]# yum -y install yum-downloadonly
[root@localhost ~]# yum -y install bash-4.1.2-33.el6_7.1.x86_64.rpm

3、重新测试

[root@localhost ~]# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
this is a test

当我们输入 env x='() { :;}; echo vulnerable'; bash -c “echo this is a test” 又可以出来不一样的效果

二、应对

1.文件设置登录sshd的IP设置.

cat /etc/hosts.allow  

2.锁定 定时任务

chattr +i 锁定 定时任务 锁定/root/.ssh/auth_key等文件

锁定 /etc/passwd文件

3.修改了root账号密码

  • cat /etc/passwd 关闭没有用的账户
  • 修改了sshd默认端口
  • 修改Nginx用户nologin
  • 发现系统服务器存在bash严重漏洞、破壳漏洞(Shellshock)并修复
  • 系统登录方式改为公钥认证方式,避开密码认证的缺陷。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn