🚨 应急响应 | Emergency Response for Linux

  • Naykcin
  • 16 Minutes
  • January 2, 2020

🚨 应急响应 | Emergency Response for Linux

📍 0x00 前言

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

常见的应急响应事件分类:

web 入侵:网页挂马、主页篡改、webshell

系统入侵:病毒木马、勒索软件、远控后门

网络攻击:DDOS 攻击、DNS 劫持、ARP 欺骗

💡 0x01 思路

  1. 账号安全
  2. 历史命令
  3. 异常端口
  4. 异常进程
  5. 开机启动项
  6. 定时任务
  7. 服务
  8. 异常文件
  9. 系统日志

📍 0x02 姿势

⚙️ 0x02-1 账号安全

基本使用:

// 1

$ cat /etc/passwd
// 用户信息文件
root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell

nick:x:1002:1002::/home/nick:/bin/bash

用户名:密码:用户ID:组ID:用户说明:家目录:登录之后的shell
无密码账户只允许本地登录,远程不允许登录

// 2
$ cat /etc/shadow
// 影子文件
nick:$6$4mIUt9di$NNvAt6PPzz97sod8jtSr3geO/sQFxTdAX.0JyV02F2VLHZEkBqV88ftezzHvyF3u8TaoczhuujgX1vBcnibJ50:18173:0:99999:7:::

用户名:密码Hash:密码最后一次修改日期:两次密码修改的时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
// 查看当前登录用户(tty 本地登录/pts 远程登录)
$ who
// 查看系统信息,某一时刻用户的行为
$ w
// 查看登录时间、多少用户、负载
$ uptime

屏幕快照 2020-01-08 下午2.39.17

排查:

1.查询特权用户,其中特权用户的uid为0
$ awk -F: '$3==0{print $1}' /etc/passwd

2.查询可以远程登录的账号信息
$ awk '/\$1|\$6/{print $1}' /etc/shadow

3.查询除root账户外,其他账号是否存在sudo权限,如非管理需要,普通账号应该删除sudo权限
$ more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

4.禁用或删除多余及可疑的账号
// 禁用账号,账号无法登录,/etc/shadow第二栏为!开头
// -U 为解锁
$ usermod -L user
// 删除user账户
$ userdel user
// 删除user用户,并且将/home目录下的user目录一同删除
$ userdel -r uesr

⚙️ 0x02-2 历史命令

基本使用:

查看 .bash_history 可能会有惊喜,查看账号执行过的系统命令
1. root的历史命令
$ history
2. 打开/home目录查看各账户目录下的.bash_history,查看普通账号的历史命令

为历史的命令增加登录的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" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
######### jiagu history xianshi ##########

3) source /etc/profile 使配置生效

效果:
1 2018-07-10 19:45:39 192.168.204.1 root source /etc/profile

3. 历史操作命令的清除
$ history -c
但是该命令不会清除保存在文件中的记录,所以需要手动删除 .bash_history 中的记录

可以将命令历史记录导出成文件来进行分析
$ cat .bash_history >> /root/history.txt
// 这里要注意 >> 是追加续写,> 是直接覆盖

⚙️ 0x02-3 检查异常端口

// 分析对外连接、可以端口、IP、PID
$ netstat -pantu | more

// 查看 PID 对应的进程文件路径($PID 为对应的 PID 号)
$ ls -l /proc/$PID/exe

$ file /proc/$PID/exe

⚙️ 0x02-4 检查异常进程

ps -aux

⚙️ 0x02-5 检查开机启动项

基本使用

0					关机
1 单用户模式,可以理解为Windows的安全模式,主要用于系统修复
2 不完全的命令行模式,不含NFS服务
3 完全的命令行模式
4 系统保留
5 图形模式
6 重启动
// 查看运行级别命令
$ runlevel

系统默认允许级别

vim /etc/inittab
id=3:initdefault 系统开机后直接进入哪个运行级别

开机启动配置文件

/etc/rc.local
/etc/rc.d/rc[0~6].d

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

$ ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh

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

排查启动项文件:
more /etc/rc.local /etc/rc.d/rc[0~6].d ls -l /etc/rc.d/rc3.d/

⚙️ 0x02-6 检查定时任务

基本使用

1. 利用 crontab 创建计划任务

// 列出某个用户 cron 服务的详细内容,默认编写的 crontab 文件会保存在 /var/spool/cron/用户名 比如/var/spool/cron/root
$ crontab -l

// 删除每个用户的 cron 任务(谨慎:这将删除所有计划任务)
$ crontab -r

// 使用编辑器编辑当前的 crontab 文件
$ crontab -e

比如:
*/1 * * * * echo "hello world" >> /tmp/test.txt
每分钟写入文件

2. 利用 anacron 实现异步定时任务调度

例如,每天运行 /home/backup.sh 脚本:
$ vim /etc/anacrontab @daily 10 example.daily /bin/bash /home/backup.sh
当机器在 backup.sh 期望被运行时是关机的,anacron 会在机器开机十分钟之后运行它,不用再等待7天。

入侵排查

重点关注以下目录中是否存在恶意脚本

/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*

技巧

// 查看目录下所有文件
$ more /etc/cron.daily/*

⚙️ 0x02-7 检查服务

服务自启动

第一种修改方法:

$ chkconfig [--level 运行级别] [独立服务名] [on/off]

// 开机自启动
$ chkconfig -level 2345 httpd on

// 默认 level 是 2345
$ chkconfig httpd on

第二种:

修改 /etc/re.d/rc.local 文件
加入 /etc/init.d/httpd start

第三种:

利用 ntsysv 命令管理自启动,可以独立管理服务和 xinetd 服务
// 安装 ntsysv
$ yum install ntsysv

// 开启 ntsysv
$ ntsysv

然后即可管理服务

入侵排查

1. 查询已安装的服务
// rpm 包安装的服务

// 查看服务自启动状态,可以看到所有的 RPM 包安装的服务
$ chkconfig --list

// 查看当前服务
$ ps -aux | grep crond

// 系统3与5级别下的启动项
// 中文环境
$ chkconfig --list | grep "3:启用\|5:启用"

// 英文环境
$ chkconfig --list | grep "3:on\|5:on"

2. 源码包安装的服务
查看服务的安装位置,一般是在 /usr/local
$ service httpd start
搜索 /etc/rc.d/init.d/ 查看服务是否存在

⚙️ 0x02-8 检查异常文件

  1. 查看敏感目录,如 /tmp 目录下的文件,同时要注意隐藏文件夹,以「.」开始命名的文件夹具有隐藏属性。

  2. 如果发现了 webshell/远控木马的创建时间,如何找出同一时间范围内创建的文件?

    利用 find 命令

    // 找出 /opt 下一天前访问过的文件
    $ find /opt -iname "*" -atime 1 -type f
  3. 针对可疑文件可以用 stat 进行创建修改时间。

⚙️ 0x02-9 检查系统日志

日志默认存放位置

/var/log/

查看日志配置情况

more /etc/rsyslog.conf
日志文件说明
/var/log/cron
记录了系统定时任务相关的日志

/var/log/cups
记录打印信息的日志

/var/log/dmesg
记录了系统在开机时内核自检的信息,也可以使用 dmesg 命令直接查看内核自检信息

/var/log/mailog
记录邮件信息

/var/log/message
记录系统重要信息的日志。这个日志文件中会记录 linux 系统的绝大多数重要信息

/var/log/btmp
记录错误登录日志,该文件是二进制文件,不能直接用 vim 查看,需要使用 lastb 命令来查看

/var/log/lastlog
记录系统中所有用户最后一次登录时间的日志,该文件是二进制文件,不可直接用 vim 查看,