前言

当企业发生网络安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,同时还需进一步查找入侵来源,还原入侵事故过程,给出解决方案与防范措施,为企业挽回或减少经济损失。

常见的网络安全事件:

  1. Web入侵:挂马、篡改、Webshell;
  2. 系统入侵:系统异常、RDP爆破、SSH爆破、主机漏洞;
  3. 病毒木马:远控、后门、勒索软件;
  4. 信息泄漏:拖裤、数据库登录(弱口令);
  5. 网络流量:频繁发包、批量请求、DDOS攻击;

一个常规的入侵事件后的系统排查思路:

相关步骤的核心如下:

  1. 文件分析
  2. a) 文件日期、新增文件、可疑/异常文件、最近使用文件、浏览器下载文件;
  3. b) Webshell 排查与分析;
  4. c) 核心应用关联目录文件分析;
  5. 进程分析
  6. a) 当前活动进程、远程连接;
  7. b) 启动进程、计划任务;
  8. c) 进程工具分析:Windows 使用 Pchunter、 Linux 使用 Chkrootkit 或 Rkhunter;
  9. 系统分析
  10. a) 环境变量;
  11. b) 帐号信息;
  12. c) History;
  13. d) 系统配置文件;
  14. 日志分析
  15. (a) 操作系统日志:Windows事件查看器、Linux/var/log/
  16. (b) 应用日志分析:Access.log、Error.log。

本文旨在针对常见的攻击事件,结合工作中应急响应事件分析和解决的方法,总结了一些 Linux 服务器入侵排查的思路和方法。

系统分析

对于被入侵的服务器,可对当前主机存在的用户信息、历史命令执行记录、端口占用、异常进程、可疑服务等情况进行排查,从而搜集掌握入侵信息。

用户信息排查

先来看看相关命令:

cat /etc/shadow  #查看密码cat /etc/group   #查看组信息history          #查看root用户执行的历史命令last             #查看最近登录成功的用户及信息lastlog          #显示主机所有用户最近一次登录信息id               #当前用户信息who              #查看当前登录系统的所有用户w                #显示已经登陆系统的用户列表,并显示用户正在执行的指令users            #显示当前登录系统的所有用户的用户列表usermod -L user  #禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头userdel -r user  #删除user用户,并且将/home目录下的user目录一并删除#查看可以远程登录的用户awk '/\$1|\$6/{print $1}' /etc/shadow    #查看拥有sudo权限的用户more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"#查看超级用户(uid=0),有些黑客将普通用户的uid改为0,则该普通用户也拥有了超级权限    awk -F: '$3==0{print $1}' /etc/passwd 

1、来看下与系统用户账户相关的文件格式:

A、用户信息文件:/etc/passwdroot:x:0:0:root:/root:/bin/bashaccount:password:UID:GID:GECOS:directory:shell格式:用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell注意:无密码只允许本机登陆,远程不允许登陆
B、系统影子文件:/etc/shadowroot:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::bin:*:18264:0:99999:7:::daemon:*:18264:0:99999:7:::adm:*:18264:0:99999:7:::格式:用户名:加密后的密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留注意:如果加密后的密码这一栏的第一个字符为!或者*的话,说明这是一个不能登录的账户

可执行 lastlog 命令可显示主机所有用户最近一次登录信息,可以看到除了 root 之外其他账户均为登录过(均为不可登录的账户):

2、查看可以远程登录的用户、拥有 sudo 权限的用户:

3、查看用户执行的历史命令信息:

Linux 系统可以通过 .bash_history 查看帐号执行过的系统命令:
1、查看 root 用户的历史命令:histroy2、打开 /home 各帐号目录下的.bash_history,执行命令:cat .bash_history >> history.txt,可查看普通帐号的历史命令3、为历史的命令增加登录的IP地址、执行命令时间等信息:(1)保存1万条命令sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile(2)在 /etc/profile 的文件尾部添加如下行数配置信息:######jiagu history xianshi#########USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiexport HISTTIMEFORMAT="%F %T $USER_IP `whoami` "shopt -s histappendexport PROMPT_COMMAND="history -a"######### jiagu history xianshi ##########(3)source /etc/profile让配置生效生成效果:    1  2021-07-16 06:19:24 222.129.38.129 root whoami    2  2021-07-16 06:19:36 222.129.38.129 root history    3  2021-07-16 06:20:56 222.129.38.129 root cat /root/.bash_history
4、历史操作命令的清除:history -c注意此命令并不会清除保存在文件中的记录,因此需要手动删除.bash_profile文件中的记录。

相关命令执行效果如下:

进程端口排查

同样先来看看相关命令:

netstat -antlp               #检查端口连接情况netstat -antlp | grep 18176  #查看端口连接情况,过滤含有字符“18176”的行top                          #动态查看进程ls -l /proc/18176/exe        #查看PID为18176的进程的可执行程序lsof -p 18176                #查看PID为18176的进程打开的文件lsof -c sshd                 #查看进程sshd打开的文件lsof -i:33946                #查看33946端口对应的一些进程fuser -n tcp 33946           #查看33946端口对应的进程PIDpstree                       #查看进程树ps aux                       #静态查看进程ps aux | grep ssh            #查看与ssh相关的进程ps aux --sort -pcpu          #静态查看进程,根据cpu使用情况排行,从高到低ps aux --sort -pmem          #静态查看进程,根据内存使用情况排行,从高到低ps -p PID -o lstart          #查看进程的启动时间点kill -9 pid                  #强制杀死进程

1、使用netstat -antlp命令检查异常端口:

2、使用ps aux --sort -pcpu命令查看系统进程(根据 CPU 使用情况排行,从高到低,如果 CPU 占用率超过 70% 且名字可疑,大概率是中了挖矿病毒了):

木马排查实例

1、检查端口连接情况,查看到名为 kali-6666.elf 的异常连接,疑似外连木马:

2、使用 ps 命令,匹配进程,得到相应 pid 号:

3、查看 pid 所对应的进程文件路径:

4、应急处置:针对以上案例,进一步可使用kill -9 6071强制杀死进程,并 rm -f kali-6666.elf 将木马文件删除,同时应该溯源分析木马文件是如何被传到服务器的。

系统服务排查

1、检查是否存在可疑服务,执行命令service --status-all,枚举主机所有服务,查看是否有恶意服务:

另外chkconfig -list 命令也可列出所有的服务:

2、当发现入侵杀掉了恶意进程后,过一段时间如果恶意进程又会重新启动,则说明该进程有守护进程,此时应检查是否存在可疑定时任务,可使用cat /etc/anacrontab查看 anacron 异步定时任务,同时使用crontab -l 枚举定时任务:

3、检查服务器开机启动项:

核查部分启动项如下:

例子:当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可:

root@localhost ~]# ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh

此处的 sshd 是具体服务的脚本文件,S100ssh 是其软连接,S 开头代表加载时自启动;如果是 K 开头的脚本文件,代表运行级别加载时需要关闭的。

4、RPM 软件包检查(RPM 包是预先在 Linux 机器上编译好并打包好的软件安装包),Linux 系统完整性可以通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了:

如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与 RPM 数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。

验证内容中的8个信息的具体内容如下:        S         文件大小是否改变        M         文件的类型或文件的权限(rwx)是否被改变        5         文件MD5校验是否改变(可以看成文件内容是否改变)        D         设备中,从代码是否改变        L         文件路径是否改变        U         文件的属主(所有者)是否改变        G         文件的属组是否改变        T         文件的修改时间是否改变

日志分析

Linux 系统日志检查:

  1. 日志默认存放位置:/var/log/;
  2. 必看日志:secure、history;
  3. 查看日志配置情况:more /etc/rsyslog.conf;

核心日志文件及其作用如下:

/var/log/cron   记录了系统定时任务相关的日志/var/log/cups   记录打印信息的日志/var/log/dmesg   记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息/var/log/mailog   记录邮件信息/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件/var/log/btmp   记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看/var/log/wtmp   永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看/var/log/utmp   记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询/var/log/secure   记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

SSH暴力破解

Linux 记录了 SSH 日志信息的文件:

这两个文件关于 SSH 的内容基本⼀致,记录了验证和授权方面的信息,只要涉及账号和密码的程序都会记录下来。下面以 Centos 系统的/var/log/secure日志文件为例进行日志分析演示。

1、先来查看下该日志文件的后 15 行:

2、定位有多少 IP 在爆破主机的 root 帐号:

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

执行结果如下图所示:

3、查看成功登录过主机的 IP 有哪些:

grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

执行结果如下图所示:

4、查看登录成功的日期、用户名、IP:

grep "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

执行结果如下图所示:

5、汇总下与 SSH 登录日志分析相关的命令:

cat /var/log/secure* | grep Accepted   #查看登录成功的记录cat /var/log/secure* | grep Failed     #查看登录失败的记录grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'  #查看登录成功的日期、用户名及ipgrep "Failed password for root" /var/log/secure | awk '{print $11}'  #查看有哪些ip在爆破主机的root账号grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr  #查看爆破用户名字典

Web应用日志

一般如果网络边界做好控制,通常对外开放的仅是Web服务,那么需要先找到Webshell,可以通过如下途径:

1、Webshell搜索

检查最近创建的 php、jsp 文件和上传目录,例如要查找 24 小时内被修改的 jsp 文件:

find ./ -mtime 0 -name "*.jsp"

相关的依据时间检索文件的命令还有:

# -atime 文件的访问时间# -mtime 文件内容修改时间# -ctime 文件状态修改时间(文件权限,所有者/组,文件大小等,当然文件内容发生改变,ctime也会随着改变)# 要注意:系统进程/脚本访问文件,atime/mtime/ctime也会跟着修改,不一定是人为的修改才会被记录 # 查找最近一天以内修改的文件:find / -mtime -1 -ls  | more # 查找50天前修改的文件:find ./ -mtime +50 -ls

2、工具扫描特征

通常入侵行为会伴随着踩点和扫描行为,那么可以查一下具有扫描行为的日志。

例如使用AWVS扫描:grep 'acunetix' /var/log/httpd/access_log
例如使用sqlmap,但是没有使用–random-agent,UA中带有sqlmapgrep 'sqlmap'   /var/log/httpd/access_log

Linux 系统中,Apache 的访问日志默认位置为 /var/log/httpd/access.log

应急工具

以上是纯手工命令排查服务器入侵痕迹,下面介绍几款 Liunx 系统应急响应的工具,用于提高应急排查的效率。

GScan

GScan 是一款开源的 Linux 应急响应工具,Github项目地址。本程序旨在为安全应急响应人员对Linux主机排查时提供便利,实现主机侧 Checklist 的自动全面化检测,根据检测结果自动数据聚合,进行黑客攻击路径溯源,此程序的特点:

  1. 程序检测的逻辑和方法,均是由一线安全应急人员根据多年实战经验总结出来的;
  2. 程序包括10W+的恶意特征信息,用于恶意文件的比对和查杀;
  3. 结果自动化分析,进行黑客攻击溯源。

自动化程序的 CheckList 项如下:

1、主机信息获取2、系统初始化alias检查3、文件类安全扫描  3.1、系统重要文件完整行扫描  3.2、系统可执行文件安全扫描  3.3、临时目录文件安全扫描  3.4、用户目录文件扫描  3.5、可疑隐藏文件扫描4、各用户历史操作类  4.1、境外ip操作类  4.2、反弹shell类5、进程类安全检测  5.1、CUP和内存使用异常进程排查  5.2、隐藏进程安全扫描  5.3、反弹shell类进程扫描  5.4、恶意进程信息安全扫描  5.5、进程对应可执行文件安全扫描6、网络类安全检测  6.1、境外IP链接扫描  6.3、恶意特征链接扫描  6.4、网卡混杂模式检测7、后门类检测  7.1、LD_PRELOAD后门检测  7.2、LD_AOUT_PRELOAD后门检测  7.3、LD_ELF_PRELOAD后门检测  7.4、LD_LIBRARY_PATH后门检测  7.5、ld.so.preload后门检测  7.6、PROMPT_COMMAND后门检测  7.7、Cron后门检测  7.8、Alias后门  7.9、SSH 后门检测  7.10、SSH wrapper 后门检测  7.11、inetd.conf 后门检测  7.12、xinetd.conf 后门检测  7.13、setUID 后门检测  7.14、8种系统启动项后门检测8、账户类安全排查  8.1、root权限账户检测  8.2、空口令账户检测  8.3、sudoers文件用户权限检测  8.4、查看各账户下登录公钥  8.5、账户密码文件权限检测9、日志类安全分析  9.1、secure登陆日志  9.2、wtmp登陆日志  9.3、utmp登陆日志  9.4、lastlog登陆日志10、安全配置类分析  10.1、DNS配置检测  10.2、Iptables防火墙配置检测  10.3、hosts配置检测11、Rootkit分析  11.1、检查已知rootkit文件类特征  11.2、检查已知rootkit LKM类特征  11.3、检查已知恶意软件类特征检测12.WebShell类文件扫描  12.1、WebShell类文件扫描

项目的具体介绍在 Github 写得很仔细,此处不再继续展开:

1、直接在 Kali 虚拟机下载并解压缩,运行程序:

2、我在桌面先用 MSF 生成并存放了一个 Liunx Backdoor 文件 Tr0e.elf ,然后执行python GScan.py --pro开始扫描,查看结果与处理方案:

识别出了部分风险,但是没有桌面的 Backdoor……

3、其中检测出来的 setuid 风险指的是:

病毒查杀

1、Rootkit 查杀

Rootkit 是一种系统内核级病毒木马,其进入内核模块后能获取到操作系统高级权限,从而使用各种底层技术隐藏和保护自身,绕开安全软件的检测和查杀。

Linux 系统可以使用 chkrootkit 工具(网址:http://www.chkrootkit.org)进行 Rootkit 查杀,其使用方法:

wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gztar zxvf chkrootkit.tar.gzcd chkrootkit-0.52make sense#编译完成没有报错的话执行检查./chkrootkit

在 Kali Liunx 虚拟机进行工具测试:

执行./chkrootkit命令,扫描后的结果:

2、病毒查杀

ClamAV 的官方下载地址为:http://www.clamav.net/download.html,安装使用如下:

1、安装zlib:wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz tar -zxvf  zlib-1.2.7.tar.gzcd zlib-1.2.7#安装一下gcc编译环境: yum install gccCFLAGS="-O3 -fPIC" ./configure --prefix= /usr/local/zlib/make && make install
2、添加用户组clamav和组成员clamav:groupadd clamavuseradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
3、安装Clamavtar –zxvf clamav-0.97.6.tar.gzcd clamav-0.97.6./configure --prefix=/opt/clamav --disable-clamav -with-zlib=/usr/local/zlibmakemake install
4、配置Clamavmkdir /opt/clamav/logsmkdir /opt/clamav/updatatouch /opt/clamav/logs/freshclam.logtouch /opt/clamav/logs/clamd.logcd /opt/clamav/logschown clamav:clamav clamd.logchown clamav:clamav freshclam.log
5、ClamAV 使用: /opt/clamav/bin/freshclam 升级病毒库./clamscan –h 查看相应的帮助信息./clamscan -r /home  扫描所有用户的主目录就使用./clamscan -r --bell -i /bin  扫描bin目录并且显示有问题的文件的扫描结果

3、Webshell 查杀

Linux 系统:

  • 河马 Webshell 查杀:http://www.shellpub.com;
  • 深信服 Webshell 网站后门检测工具:http://edr.sangfor.com.cn/backdoor_detection.html。

(1)首先在 Kali Linux 虚拟机上的 Apache 网站目录下存放了冰蝎 Webshell 文件:

(2)官网下载 Linux 版本的河马工具并解压缩,运行程序./hm scan /var/www/html开始扫描,成功检测到 Webshell 文件:

总结

一个企业的信息安全建设,最基本的无非是要做好三件事:

  • 第一件是事前的安全基线,从源头尽可能保证新上线的系统的安全性;
  • 第二件是建立事中的监控能力,各种多维度的入侵检测,做到有针对性、及时的救火;
  • 第三件是做好事后的应急响应能力,让应急的时间成本更短,溯源和根因分析的能力更强。

可见在企业信息安全建设中,应急响应是很关键的一个环节。

服务器被入侵原因通常有几个:系统漏洞、中间件漏洞(程序漏洞)、代码漏洞、安全设置不正确、网络层面 没有限制等。

  1. 如果是系统漏洞和中间件漏洞,需要使用没有发现漏洞的系统和中间件进行升级;
  2. 如果是程序/代码漏洞,需要修改程序代码进行修改,或者部署waf防火墙;
  3. 如果是安全设置不正确,需要进一步检查安全配置。;
  4. 如果是网络层面没有限制,需要在防火墙和 IPS 上进行检查。

业界有个应急响应参考模型,叫做 PDCERF 方法,它把应急响应体系分为六个阶段来处理。这六个阶段分别是 准备(Perparation) 、检测(Detection) 、遏制(Containment) 、根除(Eradication)、 恢复(Recovery) 、跟踪(Follow-up)。方法论的东西,看看就好,其实我们做的也基本都是根据这几个步骤来的。应急响应讲求的是快、准、稳。在最短的时间内定位安全问题,排查安全问题,保障业务系统的稳定性和安全性。