Liunx木马排查及纠结蛋碎的过程记录

开场白

服务器挂了,原因

纠结的查杀过程

ifconfig

发现网卡的发送、接收数据情况,
网卡eth0累计发送了52.5G 的数据。刚重启不久就这么多数据,不太正常。
另,5M带宽啊,平时最多占用3M,而现在直接跑满,进都进不去。
最后直接被阿里云把服务器停了,说对外进行大量的攻击。。。好吧,纠结,别人不攻击我们就万福了,哪有心情去攻击别人。
这里写图片描述

$ ll -al /usr/bin/bsd-port/

drwxr-xr-x  2 root root  4096 1213 20:01 .
dr-xr-xr-x. 4 root root 28672 1213 20:01 ..
-rw-r--r--  1 root root    73 1213 14:46 conf.n
-rwxr-xr-x  1 root root     5 1213 18:17 getty.lock

绕了很多弯路

根据监测的木马文件,删除

这里写图片描述
有毛用,NND,删了过一会又继续出来新的
全部随机生成到/usr/bin/* /boot/*下面去了,折腾了很久 ,顽强的小强一枚。

网上查了很多资料,用了很多方法,一直没有清理干净

清理的第一步

netstat -an|more

查看当前服务器端口监听情况。
首先解决漏洞,比如redis未授权访问漏洞,memcache,mongod未授权访问漏洞,先把漏洞解决掉再说。
百度一下即可,我的解决方案时这些都是内网访问,所以简单粗暴
1. 全部访问IP绑定成127.0.0.1 禁止外部访问
2. 网上,其他官方推荐加强修复方案:设置访问密码强度、独立这些服务器的访问用户组,禁止使用root权限的用户组。

清理的第二步

这个地方一直没留意,导致前面做了很多无用功

more /etc/crontab

这里写图片描述
看到这个货了没,NND,一个定时计划任务。
木马通过创建时间计划任务来实现启动,并每3分钟检测程序是否运行,如果不存在,会继续通过拷贝副本运行。
木马会起多线程进行网络操作,利用下载文件、更新文件、进行DDos攻击等。XorDdos木马来自中国,攻击的对象也同样来自中国。

没什么说的,删,删,删。记得删完重启服务器,虽然然并卵,但还是这么干吧。

到这里基本完成一半了。

清理第三步,收尾

cd /etc/init.d/

$ ls Db*
DbSecurityMdt  DbSecuritySpt

$ ls sel*
selinux

$ more selinux 
#!/bin/bash
/usr/bin/bsd-port/getty

$ more DbSecuritySpt 
#!/bin/bash
然并卵,我之前删了这个文件,所以没看到它指向到哪里去了,算了,反正也没啥影响了。

$ more DbSecurityMdt 
#!/bin/bash
/root/cmy6

$ more DbSecurityMdt 
#!/bin/bash
/root/cmy6

常规查杀木马一些命令
使用netstat查看网络连接,分析是否有可疑发送行为,如有则停止。
(linux常见木马,清理命令chattr -i /usr/bin/.sshd; rm -f /usr/bin/.sshd; chattr -i /usr/bin/.swhd; rm -f /usr/bin/.swhd; rm -f -r /usr/bin/bsd-port; cp /usr/bin/dpkgd/ps /bin/ps; cp /usr/bin/dpkgd/netstat /bin/netstat; cp /usr/bin/dpkgd/lsof /usr/sbin/lsof; cp /usr/bin/dpkgd/ss /usr/sbin/ss;rm -r -f /root/.ssh; rm -r -f /usr/bin/bsd-port;find /proc/ -name exe | xargs ls -l | grep -v task |grep deleted| awk ‘{print 11}' | awk -F/ '{print NF}’ | xargs killall -9;)

盲人摸象,目前就这样了,总结就一个字:删。 目前问题已解决,如有更好的方式可以交流,偶也想深入学习下。

排查方法精囊妙计

cat /etc/passwd 查看账户信息

目的:查看是否有可疑账户信息。
注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序

root:x:0:0:root:/root:/bin/bash

cat /etc/passwd|grep 用户名

==============详细字段说明介绍================

name:password:uid:gid:comment:home:shell

  • 注册名(login_name):用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的。这与MSDOS/Windows是不一样的。
  • 口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。
    现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。
    此外,需要注意的是,如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。
  • 用户标识号(UID):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用 UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要;而对于用户来说注册名使用起来更方便。在某些特定目的下,系统中可以存在多个拥有不同注册名、但UID相同的用户,事实上,这些使用不同注册名的用户实际上是同一个用户。
  • 组标识号(GID):这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在 passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。
  • 用户名(user_name):包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
  • 用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。在Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每个用户配置了自己的主目录。个人用户的文件都放置在各自的
    主目录下。
  • 命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,
    如/bin/bash。

cat /etc/group 查看用户组信息

组名:加密密码:组ID:所有属于该组的用户。

cat /etc/group|grep 组名
groups 查看当前登录用户的组内成员
groups test 查看test用户所在的组,以及组内成员
whoami 查看当前登录用户名

netstat -anp 查看网络信息

目的:查看进程及PID,是否有异常连接
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
常见参数
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服务状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

  • 列出所有端口 netstat -a
  • 列出所有 tcp 端口 netstat -at
  • 列出所有 udp 端口 netstat -au
  • 只显示监听端口 netstat -l
  • 只列出所有监听 tcp 端口 netstat -lt
  • 只列出所有监听 udp 端口 netstat -lu
  • 只列出所有监听 UNIX 端口 netstat -lx
  • 显示所有端口的统计信息 netstat -s
  • 显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su
  • 显示核心路由信息 netstat -r
  • 找出程序运行的端口 netstat -ap | grep ssh (netstat -an | grep ‘:80’)
  • IP和TCP分析
    • netstat -nat | grep “192.168.1.15:22” |awk ‘{print 5}'|awk -F: '{print 1}’|sort|uniq -c|sort -nr|head -20
  • TCP各种状态列表
    • netstat -nat |awk ‘{print $6}’
  • 分析access.log获得访问前10位的ip地址
  • awk ‘{print $1}’ access.log |sort|uniq -c|sort -nr|head -10

last 查看登录日志

参考http://www.cnblogs.com/kerrycode/p/4223751.html

cat /etc/profile 查看全局的系统变量

与环境变量相关的文件可能还会有/etc/bashrc等,不过这是shell变量,是局部的,对于特定的shell器作用

ls -al /etc/rc.d/rc3.d查看当前级别开机启动项

  • /etc/rc.d/init.d
    该文件夹包含所有服务在各个运行等级中的全部启动脚本。一般来说,它们都是标准的shell脚本,遵守最基本的标准。每个脚本最少接受两个参数start和stop,它们分别代表启动和停止服务(如网页服务)。除此之外,init脚本通常还会接受一些额外的选项,如restart(重启服务器)、status(返回服务当前状态)、reload(告知服务从配置文件中重新载入配置)以及force-reload(强制服务重载它的配置)。当用不带参数的方式运行脚本的时候,一般应该返回一个它会接受的参数列表。

  • /etc/rc.d/rc0.d~/etc/rc.d/rc6.d
    这些文件夹分别包含每个运行等级对应的init脚本。在实际使用中,它们一般通过符号链接到/etc/init.d文件夹下的实际文件。不过要注意的是,这些文件夹下的init脚本都有一些特别的名字,命名都以S(start)、K(kill)或D(disable)开头,后面跟一个数字。当init进入一个运行等级的时候,它会按照数字顺序运行所有以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数。任何以D开头的init脚本都会被忽略—这让你可以在指定的运行等级禁止一个脚本,或者你也可以仅仅移除全部符号链接。所以如果你有两个脚本,S01foo和S05bar,init首先会运行S01foo start,当它进入特定的运行等级后再执行S05bar start。

  • /etc/rc.d/rc.local
    并非所有的发行版都使用了rc.local,通常它是一个留给用户修改的shell脚本。一般会在init进程结束的时候运行它,所以你可以在这里放一些想要运行的额外脚本,而不用再创建自己的init脚本。

  • /etc/rc.d/rc.sysinit
    /etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。

  • /etc/rc.d/rc
    当运行级别改变时,负责启动/停止各种服务。

比如我想把某个已经安装了的服务添加为系统服务,可以执行以下命令:
chkconfig –add 服务名称 (首先,添加为系统服务,注意add前面有两个横杠)
chkconfig -leve 启动级别 服务名 on
(说明,3级别代表在命令行模式启动,5级别代表在图形界面启动,on表示开启)
chkconfig -leve 启动级别 服务名 off
(说明,off表示关闭自启动)
例如:chkconfig -level 3 mysql on (说明:让mysql服务在命令行模式,随系统启动)
也可以使用 chkconfig –del 服务名称 来删除系统服务

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章