0x00 前言
主要介绍下Linux下入侵排查的基础姿势;
0x01 入侵现象
异常现象
-
服务器异常现象
-
CPU/内存飙升
-
服务器卡顿
-
异常流量
-
异常网络连接
-
服务器无法登录
-
......
-
僵尸网络
-
DNS服务器报毒
-
挖矿
-
......
-
主机失陷
-
XnoteDDoS病毒
-
挖矿
-
......
0x02 入侵排查基础
排查思路
-
使用工具进行日志分析
-
查看进程和CPU负载情况
-
使用
lsof -i -PnR
命令查看网络通信情况 -
使用lsof+md5sum命令确认elf文件hash并通过搜索引擎获取相关威胁情报
系统信息
uname -a # 查看系统信息
who # 查看当前用户
ifconfig # 查看网络信息
端口连接
查看黑客是否进行进行远控,DDOS,篡改网卡类型,进行流量嗅探等操作;
步骤
1、可使用netstat命令分析可疑端口、可疑IP、可疑PID及程序进程,当然可灵活配合grep命令,获取需要的信息
netstat –an # 查看系统所有活动的socket连接
netstat -utnpl # 端口监听情况
netstat -antlp | more
netstat -anop | grep -i listen # -p可打印出进程PID
netstat -antlp | grep LISTEN | grep 1080 # 检测本地socks代理
lsof -i tcp # 查看TCP连接信息
lsof -i udp # 查看UDP连接信息
lsof -i:{port} -PnR # 查看端口连接及相关进程
2、从安全网关或者其它途径获取可疑IP后,可监控与可疑IP通信的进程
while true; do netstat -antp | grep {ip}; done
3、有时检测到可疑域名,可在host文件中添加规则使可疑域名重定向到一个随机的IP地址,然后对其进行监控并获取到与之通信的进程
vim /etc/hosts
192.168.53.23 xxx.evil.com # 写入/etc/hosts尾部
while true; do netstat -antp | grep 192.168.53.23; done # 获取通信进程
4、查看相关进程文件
ip link | grep PROMISC # 正常网卡不该在promisc模式,可能存在sniffer
arp -a # 查看arp记录是否正常
lsof -i:port -PnR # 显示使用该端口的进程PID
ls -l /proc/$PID/exe # 查看pid对应进程文件路径
file /proc/$PID/exe # 查看pid对应进程文件路
5、流量抓取
Linux下可使用tcpdump抓包并在windows下使用wireshark、科来等软件进行分析,tcpdump抓包具体可参考该博客;
应急处理
在确认有可疑网络连接后可使用iptables屏蔽相关网络ip或域名;
iptables -A OUTPUT -d {IP} -j DROP # 屏蔽IP
iptables -I INPUT -p tcp --dport 443 -m string --string "xxx.xxx" --algo bm -j DROP #封锁域名
进程排查
定位进程
1、查看进程
ps -aux
ps -ef
top -c
top -b -n 1 # 只显示异常所有进程信息
pstree -a
2、查看进程关联文件
lsof -p {pid} # 查看进程所打开的端口和文件
lsof -i:port # 查看端口对应进程
lsof -c {progressname} # 查看进程关联文件
lsof -g {gid} # 查看相关联的lib文件
strace -f -p {pid} # 跟踪分析目标进程
ls -al /proc/$PID/exe # 查看pid对应进程文件路径
file /proc/$PID/exe # 查看pid对应进程文件路径
lsof filename # 查看打开目标文件的所有进程
pmap -q {pid} # 分析可疑进程内存
3、检测/etc/inetd.conf文件,内容为本机所开启的远程服务;
查看隐藏进程
ps -ef | awk '{print}' | sort -n | uniq >1
ls /proc | sort -n | uniq >2
diff 1 2
应急处理
1、清除可疑进程的进程链
ps -elf {pid}
kill -9 {pid}
2、删除病毒文件
ls -al /proc/{PID}/exe
rm -rf {exe_path}
服务排查
基础
1、进程PID有以下默认分配规则:
-
0:不使用;
-
1-1023:系统保留,只能由root用户使用;
-
1024-4999:由客户端自由分配;
-
5000-65535:由服务器端程序自由分配;
2、可通过查看/etc/services文件来获取网络服务,内容字段从左往右依次为:“服务名称”、“使用端口”、“协议名称”以及“别名”;
服务启动设置
1、使用chkconfig [-level 运行级别] [独立服务名] [on|off]
命令设置,例如:
chkconfig -level 2345 httpd on # 开机自启
关于level如果未指定默认是2345,其中数字含义如下:
-
0:关机
-
1:单用户模式
-
2:无网络连接的多用户命令行模式
-
3:有网络连接的多用户命令行模式
-
4:不可用,系统保留
-
5:图形界面下的多用户模式
-
6:重启
notes:可通过runlevel
命令查看系统运行级别;
2、修改/etc/rc.d/rc.local文件,加入以下内容:
/etc/init.d/httpd start
3、使用ntsysv命令管理自启动,可管理独立服务和xinetd服务;
应急处理
1、查看服务
chkconfig --list # 查看服务自启动状态,可看到所有RPM包安装服务
chkconfig --list | grep "3:on|5:on"
ps aux | grep crond # 查看当前服务
service --status-all # 查看所有服务
systemctl | grep -E ".service.*running" | awk -F. '{ print $1 }' # 查看所有服务
2、查看源码包安装的服务,一般是以下目录
-
/usr/local/
-
/etc/rc.d/init.d/
3、删除相关服务
chkconfig --del servicename # 删除RPM包服务
启动项排查
基础
-
init:文件名,是系统启动的第一个脚本;
-
init.d:目录名,目录内存放各个服务的启动脚本,例如sshd, httpd等;
-
rcX.d:目录名,X代表运行级别,目录内有每个服务在init.d内启动脚本的链接文件,根据链接文件的名字来的启动状态;
-
K开头表示系统加载时时关闭的服务,S开头表示系统加载时启动的服务;
当需要开机自启动程序时,只需要将脚本复制到/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可。例如:
ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh
排查
Linux下启动项路径一般有:
/etc/init.d/
/etc/xinetd.d
/etc/init.d/rc.local
/etc/rc.local
/etc/rc.d/rc[0~6].d
/etc/profile.d/
1、查看这些目录下有无可疑脚本,例如:
ls -alt /etc/init.d/
2、查看这些目录修改时间,如:
stat /etc/rc.local
计划任务排查
基础
默认编写的crontab文件会保存在 /etc/crontab或/var/spool/cron/username下;
1、计划任务查询命令如下:
crontab -u username -l # 列出目标用户cron服务的详细内容
crontab -r # 删除每个用户cront任务(谨慎:删除所有的计划任务)
crontab -e # 使用编辑器编辑当前的crontab文件
2、使用anacron实现异步定时任务调度:
vim /etc/anacrontab
@daily 10 example.daily /bin/bash /home/backup.sh
排查
使用more
命令查看以下目录中是否有恶意脚本:
-
/var/spool/cron/*
-
/var/spool/anacron/*
-
/var/log/cron
-
/etc/crontab
-
/etc/cron.d/*
-
/etc/cron.daily/*
-
/etc/cron.hourly/*
-
/etc/cron.monthly/*
-
/etc/cron.weekly/*
-
/etc/anacrontab
账户排查
当前活动账户
1、使用w
命令查看当前用户活动会话,并显示用户正在执行的指令;
2、使用who
命令查询utmp文件并报告当前登录的每个用户,who的缺省输出包括用户名、终端类型、登录日期及远程主机(tty本地登陆 pts远程登录);
3、使用users
命令打印当前登录的用户,每个用户名对应一个登录会话;
4、使用uptime
命令查看机器开机时间、用户数和负载情况:
系统账户
通过查看/etc/passwd和/etc/shadow文件可获取系统中所有有效账户;
1、/etc/passwd中一行表示一个账户,其形式如下:
root:x:0:0:root:/root:/bin/bash
其组成形式为:用户名:密码:用户ID:组ID:用户说明:主目录:登陆之后shell
notes:无密码只允许本机登陆,远程不允许登陆;
2、/etc/shadow存储了用户密码HASH,其形式如下:
root:$6$Bd3Hypzt$Vm2ryb4lXyFBO/tJeYcs6CFir46/PulD/thwhOX1hyS7qLRn8riOeblxFv8gG74z11YuBy/HMKQcICRpK7Oz60:16662:0:99999:7:::
组成形式为:户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
3、可通过/etc/sudoers文件查看具有sudo特权的账户
more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)" # 查看看具有sudo权限的账户
用户登录检查
主要命令如下:
last # 查看系统的成功登录、关机、重启等情况,数据源为/var/log/wtmp, var/log/btmp
lastb # 查看登录失败情况,读取var/log/btmp
lastlog # 查看用户上一次登录情况,读取/var/log/lastlog
last -x reboot # 查看重启记录
last -x shutdown # 查看关机记录
notes:/var/log/lastlog记录登录的用户,/var/log/secure记录大多数应用的账户和密码与登录成功与否。/var/log/messages记录运行信息和认证信息,对于追查恶意用户的登录行为有很大帮助;
应急处理
1、查看特权、新增、修改账户
less /etc/passwd # 查看是否有新增用户
ls -l /etc/passwd # 查看passwd最后修改时间
awk -F: '$3==0 {print $1}' /etc/passwd # 查看是否存在特权用户
awk '/$1|$6/{print $1}' /etc/shadow # 查看可远程登录账户
cat /etc/passwd | grep -E "/bin/bash$" # 查看可登陆账户
more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)" # 查看看具有sudo权限的账户
awk -F: '{a[$3]++}END{for(i in a)if(a[i]>1)print i}' /etc/passwd # 检查UID相同的用户,防止克隆用户
more /etc/group | grep -v '^#' | gawk -F: '{if ($1!="root"&&$3==0) print $1}' # 检测root组用户
more /etc/ssh/sshd_config |grep PermitEmptyPassword | grep -v "#"
awk -F: 'length($2)==0 {print $1}' /etc/shadow # 查看是否存在空口令用户
notes:需要检查/etc/passwd文件权限,其默认权限为644。另外UID为0的账户不一定为可疑账户;
2、禁用或删除多余及可疑账户
usermod -L username # 禁用账户,账户无法登录
userdel username # 删除用户
userdel -r username # 删除用户,并将/home/username目录一并删除
历史命令排查
通过.bash_history查看账户执行过的命令。运气好可能通过记录关联到如下信息:
-
wget 远程某主机(域名&IP)的远程文件;
-
尝试连接内网主机(ssh, scp),便于分析攻击者意图;
-
打包某敏感数据或代码(tar, zip等命令);
-
对系统进行配置,包括命令修改、远控木马类,可由此找到攻击者关联信息;
历史记录查看
1、使用history命令查看root的历史命令;
2、打开/home各账户目录下的.bash_history,查看对应账户的历史命令;
常见的过滤命令如下:
more /root/.bash_history | grep -E "((wget|curl).*.(sh|pl|py))" | grep -v grep # 查看下载的脚本文件
history | egrep "(useradd|groupadd)" | grep -v grep # 查看新增用户
history | egrep "(userdel|groupdel)" | grep -v grep # 查看已删除账户
history | grep sz | grep -v grep | awk '{print $3}' # 查看文件下载历史记录
more /root/.mysql_history # mysql操作历史
history | grep -E "(whois|sqlmap|nmap|beef|nikto|john|ettercap|backdoor|proxy|msfconsole|msf)" | grep -v grep # 查看可疑命令
打开/home目录下各账户目录下的.bash_history,可查看该账户执行的历史命令,运气好可找到如下信息:
-
对系统进行配置,包括命令修改、远控木马类,可找到攻击者关联信息;
-
尝试连接内网某主机(sshscp),便于分析攻击者意图;
-
打包某敏感数据或代码,tarzip 类命令;
-
wget远程某主机(域名&IP)的远控文件;
notes:如果黑客使用history -c
清理相关的日志,使用cat ~/.bash_history仍可查看相关的记录;
加固
1、保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
2、为历史命令增加登录IP、执行命令时间等信息
在/etc/profile文件尾部添加如下配置信息:
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"
3、配置生效
source /etc/profile
文件排查
webshell检测
直接将web服务打包服务到windows下然后使用D盾查杀,或直接用命令匹配关键字;
RPM check检测
1、检测rpm安装包命令是否被篡改
rpm -Va # 列举全部软件包的变化情况
如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串。每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。验证内容中的8个信息的具体内容如下:
-
S:文件大小是否改变
-
M:文件的类型或文件的权限(rwx)是否被改变
-
5:文件MD5校验是否改变(可以看成文件内容是否改变)
-
D:设备中,从代码是否改变
-
L :路径是否改变
-
U:文件的属主(所有者)是否改变
-
G:文件的属组是否改变
-
T:文件的修改时间是否改变
2、如果检测出命令被替换,可使用以下命令还原回来:
rpm -qf /bin/ls # 查询ls命令属于哪个软件包
mv /bin/ls /tmp
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.e16.i686.rpm | cpio -idv ./bin/ls # 提取rpm包中的ls并复制到到当前目录
cp ./bin/ls /bin/
敏感文件检测
1、敏感目录分析
查看是否存在文件变更或篡改:
-
/tmp, /var/tmp, /dev/shm, /etc/init.d/目录下是否有可疑文件;
-
/usr/bin, /usr/sbin目录是否存在命令替换;
2、可通过计算文件的md5值来判断常用命令(ls, find ,ps, top, who, last, chsh, passwd, cat, crontab, netstat等)是否被修改或替换
whereis ps
md5sum /usr/bin/ps
3、可用stat和ls命令查看命令文件修改日期来判断其是否被修改
ls -alt /bin/ # 按时间逆序查看文件
stat /usr/local/bin # 查看文件详情
4、对敏感目录文件进行文件类型检查
file {filename}
5、查找特权文件
find / *.jsp -perm 4777
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;
6、查找隐藏文件
ls -al /tmp
7、分析新增/修改文件(如某网站在一天前被篡改,根据确定时间去反推变更的文件)
find /var/www/html -iname "*" -atime 1 -type f # 找出一天前访问过的文件
find / -ctime 2 # 最近使用文件
find /etc/ /usr/bin/ /usr/sbin/ /bin/ /usr/local/bin/ -type f -mtime 7 # 最近修改文件
8、确定可疑文件后,查找打开该文件的进程
lsof {filename} # 查看打开目标文件的所有进程
Others
系统配置检查
1、分析系统路径和配置,查看有无可疑信息
echo $PATH
cat /etc/profile
cat /etc/profile.d/
cat /etc/bashrc
2、分析用户配置
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_login
cat ~/.bash_logout
3、查看DNS配置和HOSTS文件
cat /etc/resolv.conf
cat /etc/hosts
4、查看预加载库
echo $LD_PRELOAD
unset $LD_PRELOAD # 如发现该变量被篡改,可解除该变量
./busybox cat /etc/ld.so.preload # 绕过hook后门隐藏
strace -f -e trace=file /bin/cat # 跟踪文件系统调用
access("/etc/ld.so.preload",R_OK)
lsattr /etc/ld.so.preload # 清理后门配置
echo > /etc/ld.so.preload
5、文件分析
strings /usr/bin/.sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.' # 二进制文件字符串检索
readelf {filename} # elf文件分析
ldd {filename} # 文件分析
ssh后门检测
1、配置检查
strings /usr/bin/.sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.' # 查看sshd文件是否包含IP信息
ssh -V # 查看ssh版本
stat /usr/sbin/sshd # 查看sshd文件时间
stat /etc/ssh/sshd_config # 查看ssh配置文件时间
2、跟踪ssh进程
ps aux | grep sshd | grep -v grep # 获取ssh进程pid
strace -o aa.out -ff -p {PID}
grep open aa.out* | grep -v -e No -e null -e denied| grep WR
3、查看ssh相关目录是否存在可疑的公钥
ls -la /etc/ssh
more ~/.ssh/id_rsa
more /root/.ssh/id_rsa
ls -la /root/.ssh/*.pub
find / -name authorized_keys
stat /root/.ssh/authorized_keys
PAM后门检测
1、检查pam_unix.so的修改时间
stat /lib/security/pam_unix.so # 32位
stat /lib64/security/pam_unix.so # 64位
2、pam配置文件检查
stat /etc/pam.d/sshd
vim /etc/pad.d/sshd
3、通过strace跟踪ssh
ps aux | grep sshd # 获取ssh进程pid
strace -o out.txt -ff -p {PID}
grep open out.txt* | grep -v -e No -e null -e denied| grep WR
strace后门排查
1、使用alias命令即可发现异常;
2、strace跟踪strace
ps -aux | grep strace
strace -o out.txt -ff -p {PID}
之后再调用内核ptrace特性来进行排查;
0x03 重要安全处置命令
1、有些病毒文件会自动修改crontab,这时可使用chattr命令来锁定目录:
chattr +i {pathname}
2、使用lsattr可显示文件属性:
lsattr filename
输出结果若为:----i--------,则表明没有删除权限;
3、在删除一些病毒文件时要先去除其执行权限,避免在删除操作时被恶意攻击:
chmod 000 {filename}
0x04 总结
Linux下恶意软件以僵尸网络蠕虫和挖矿病毒为主。由于Linux大多作为服务器暴露在公网,且Web应用漏洞层出不穷,所以很容易遭受大范围入侵,如常见的病毒:DDG, systemdMiner, BillGates, watchdogs, XorDDos等。平时使用时要使用高强度密码,并及时升级系统(包括使用的组件)、打补丁,做好安全防范;
原文始发于微信公众号(98KSec):Linux主机入侵排查基础
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论