红炉点雪

Linux应急响应知识总结

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
uname -a #查看内核/操作系统/CPU信息
head -n 1 /etc/issue #查看操作系统版本
dpkg --print-architecture #查看系统架构(只适用于基于Debian和Ubuntu的Linux发行版)
cat /proc/cpuinfo #查看CPU信息
hostname #查看计算机名
bash -version #查看bash版本
env x='() { :;}; echo CVE-2014-6271 ' bash -c "echo test" #破壳漏洞本地验证
lsmod #检查内核模块

env #查看环境变量资源
echo $PATH #系统环境变量
cat $HOME/.ssh/authorized_keys #查看ssh永久链接文件
free -m #查看内存使用量和交换区使用量
grep MemTotal /proc/meminfo #查看内存总量
grep MemFree /proc/meminfo #查看空闲内存量
du -ah 可选关键词 #查看当前目录下所有文件的大小
du -sh 目录名 #查看指定目录的大小
stat 文件名 #查看文件属性
find / -ctime 24小时数 #指定时间内被更改的文件或目录,单位以24小时计算
find ./ -mtime 0 -name "*.jsp" #查找24小时内被修改的JSP文件
find / *.jsp -perm 777 #查找777权限的jsp文件
strings -14 文件名 #在对象文件或二进制文件中查找长度超过14的可打印字符串
strings /usr/bin/.sshd|egrep '[1-9]{1,3}.[1-9]{1,3}.' #分析sshd文件是否包括IP信息

iptables -L #查看防火墙设置
route -n #查看路由表
netstat -ap #查看所有端口的通信情况(“p”显示PID和进程名称)
netstat -ap|grep ':22' #筛选22端口的进程
netstat -lntp #查看所有监听端口
netstat -antp #查看所有已经建立的连接
netstat -s #查看网络统计信息进程
netstat -t -c 2 #每隔一秒输出网络信息

top #实时显示进程状态用户
ps -ef #查看所有进程
ps -axjf #树状显示进程信息
ps -u test #查看用户test的进程
ps -f -C getty #格式化输出getty进程的信息
ps -aux|grep python|cut -d ‘ ‘ -f 2|xargs kill #杀死python相关进程
lsof -p PID #查看进程所打开的端口及文件
lsof -c 进程名 #查看指定程序打开的文件
lsof -i tcp(udp) #列出tcp(udp)连接
lsof -i:22 #22端口的进程
kill -9 PID #终止进程,-9不给进程留下善后的机会,-15则相对温和
pkill -9 进程名 #杀掉所有进程名的进程
pkill -u 用户名 #杀掉所有用户名的进程
pkill -vu root #杀掉除root用户外的所有进程
chattr –i 文件名 #改变文件属性,不得任意更动文件或目录
lsattr -adR 文件名 #显示文件隐藏属性
rm -rf 文件名 #删除命令

#隐藏进程查看
ps -ef|awk '{print}'|sort -n|uniq >1
ls /proc|sort -n|uniq >2
more diff 1 2
ps -eo pid,user,args #谁登入过服务器
ps -U root -u root u #格式化输出root用户进程信息
history #查看历史执行命令
history -c #清除历史记录(不会删除.bash_profile文件)
more cat .bash_history(/root/.bash_history) #查看命令历史记录文件
w #查看活动用户
who #查看当前登录用户(tty本地登陆,pts远程登录)
uptime #查看系统运行时间、用户数、负载
id <用户名> # 查看指定用户信息
last #查看用户登录日志
lastb #用户错误登录的日志
lastlog #查看用户最后一次登录系统的时间
lastlog -u 500 #查看UID为500的用户登录信息
awk -F: '$3==0{print $1}' /etc/passwd #查询uid为0的特权用户
cat /etc/passwd|grep -E "/bin/bash$" #查看能够登录的帐号
awk '/\$1|\$6/{print $1}' /etc/shadow #查询可以远程登录的账号
more /etc/sudoers|grep -v "^#\|^$"|grep "ALL=(ALL)" #sudo权限的用户
cut -d: -f1 /etc/passwd #查看系统所有用户
cut -d: -f1 /etc/group #查看系统所有组
usermod -L user #禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user #删除user用户
userdel -r user #将删除user用户,并且将/home目录下的user目录一并删除

crontab -l #查看当前用户的计划任务服务
chkconfig --list #查看服务自启动状态,可以看到所有的RPM包安装的服务
chkconfig –list/systemctl list-units –type=service #检查自启
systemctl|grep running #只查看正在运行的服务
ps aux|grep crond #查看当前服务
systemctl list-unit-files|grep enabled #查看系统启动时会被启用的服务
cat /etc/init.conf|grep –v "^#" #输出的信息是此台机器所开启的远程服务

lsusb -tv #列出所有USB设备
fdisk -l #查看磁盘列表的设备
mount /dev/sda3 /mnt/usb_temp #将U盘/dev/sda3挂载到/mnt/usb_temp文件夹下
umount /dev/sda3 #弹出U盘/dev/sda2
df #查看设备挂载点

#阻断服务器通讯
iptables -A INPUT -s xmr.crypto-pool.fr -j DROP and iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP

#常用权限分配
chmod 777 file #rwxrwxrwx
chmod 755 file #rwxr-xr-x
chmod 644 file #rw-r--r--(文件所有者可读可写不可执行、所属组可读、其他用户可读)
chmod 000 file #---------

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
/etc/inittab #init进程运行级别文件
/etc/rc.d/rc.sysinit #系统初始化脚本

#敏感目录:
/
/tmp
/var/tmp
/dev/shm
/desktop
/usr/bin
/usr/sbin
/etc/ssh
./.ssh/

开机启动项

1
2
3
/etc/rc.local
/etc/rc.d/rc[0~6].d
/etc/init.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开头的脚本文件,表示关机时需要关闭的服务内容。脚本文件的启动或结束顺序是由SK字母后面的数字决定,数字越小的脚本越先执行。/etc/rc.d/rc3.d /S01sysstat/etc/rc.d/rc3.d /S99local先执行。
/etc/init.d里的shell脚本能够响应startstoprestartreload命令来管理某个具体的应用。比如经常看到的命令: /etc/init.d/networking start 这些脚本也可被其他trigger直接激活执行,这些trigger被软连接在/etc/rcN.d/中。这些原理似乎可以用来写daemon程序,让某些程序在开关机时运行。

定时任务

1
2
3
4
5
6
7
8
9
crontab -l #列出某个用户cron服务的详细内容
crontab -r #删除每个用户cront任务(谨慎:删除所有的计划任务)
crontab -e #使用编辑器编辑当前的crontab文件

crontab -u root -l #查看root用户的计划任务
cat /etc/crontab
ls -l /etc/cron.* #查看cron文件是否变化的详细信息
ls /var/spool/cron/
ls /etc/cron*

默认编写的crontab文件会保存在/var/spool/cron/用户名 ,如:/var/spool/cron/root

1
2
#每分钟写入文件
*/1 * * * * echo "hello world" >> /tmp/test.txt
1
2
3
4
#每天运行 /home/backup.sh脚本
vi /etc/anacrontab @daily 10 example.daily /bin/bash /home/backup.sh
#当机器在 backup.sh 期望被运行时是关机的
#anacron会在机器开机十分钟之后运行它,而不用再等待 7天。
1
2
3
4
5
6
7
8
9
10
#需要排查的定时任务相关文件
/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/*

日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/var/log/ #日志默认存放位置
/etc/rsyslog.conf #日志配置情况

/var/log/auth.log #用户认证日志,系统授权信息,包括用户登录和使用的权限机制等
/var/log/userlog #记录所有等级用户信息的日志
/var/log/cron #记录了系统定时任务相关的日志(crontab命令是否被正确的执行)
/var/log/secure #记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/faillog #记录登录系统不成功的账号信息
/var/log/syslog #事件记录监控程序日志
/var/log/httpd或/var/log/apache2 #包含服务器access_log和error_log信息
/var/log/boot.log #记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息
/var/log/daemon.log #系统进程日志
/var/log/xferlog(vsftpd.log) #记录FTP会话,如用户向FTP服务器或从服务器拷贝了什么文件

/var/log/btmp #记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog #记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp #永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp #记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/run/utmp #该日志文件需要使用lastlog命令查看

/var/log/cups #记录打印信息的日志
/var/log/dmesg #记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/message #记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/mailog #记录邮件信息
/var/log/mail.err #邮件错误信息
/var/log/mail.info #邮件信息
/var/log/mail.warn #邮件警告信息
/var/log/daemon.log #系统监控程序产生的信息

#Web服务器日志
Access.log
Error.log
1
2
3
4
5
6
7
8
9
10
11
12
#登录日志可以关注Accepted、Failed password 、invalid特殊关键字
find . access_log|grep xargs ip攻击地址
find . access_log|grep xargs 木马文件名

#页面访问排名前十的IP
cat access.log|cut -f1 -d " "|sort|uniq -c|sort -k 1 -r|head -10

#页面访问排名前十的URL
cat access.log|cut -f4 -d " "|sort|uniq -c|sort -k 1 -r|head -10

#查看最耗时的页面
cat access.log|sort -k 2 -n -r|head 10
1
2
3
4
5
#成功登录的ssh记录(或者last,它会读取位于/var/log/wtmp的文件)
grep 'Accepted' /var/log/secure|awk '{print $11}'|sort|uniq -c|sort -nr

#登录失败的ssh记录(lastb,会读取位于/var/log/btmp的文件)
grep 'Failed' /var/log/secure|awk '{print $11}'|sort|uniq -c|sort -nr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

#定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

#爆破用户名字典是什么:
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

#登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

#登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

#增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure

#删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

#su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

#sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

其它排查

Rootkit查杀

chkrootkit

网址:http://www.chkrootkit.org

1
2
3
4
5
6
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.52
make sense
#编译完成没有报错的话执行检查
./chkrootkit

rkhunter

网址:http://rkhunter.sourceforge.net

1
2
3
4
5
wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.4/rkhunter-1.4.4.tar.gz
tar -zxvf rkhunter-1.4.4.tar.gz
cd rkhunter-1.4.4
./installer.sh --install
rkhunter -c

病毒查杀

Clamav

ClamAV的官方下载地址为:http://www.clamav.net/download.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#安装方式一:
#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.gz
cd zlib-1.2.7

#安装一下gcc编译环境:yum install gcc
CFLAGS="-O3 -fPIC" ./configure --prefix= /usr/local/zlib/
make && make install

#2、添加用户组clamav和组成员clamav
groupadd clamav
useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav

#3、安装Clamav
tar –zxvf clamav-0.97.6.tar.gz
cd clamav-0.97.6
./configure --prefix=/opt/clamav --disable-clamav -with-zlib=/usr/local/zlib
make
make install

#4、配置Clamav
mkdir /opt/clamav/logs
mkdir /opt/clamav/updata
touch /opt/clamav/logs/freshclam.log
touch /opt/clamav/logs/clamd.log
cd /opt/clamav/logs
chown clamav:clamav clamd.log
chown clamav:clamav freshclam.log

#5、ClamAV 使用
/opt/clamav/bin/freshclam #升级病毒库
./clamscan –h #查看相应的帮助信息
./clamscan -r /home #扫描所有用户的主目录就使用
./clamscan -r --bell -i /bin #扫描bin目录并且显示有问题的文件的扫描结果


#安装方式二:
#安装
yum install -y clamav

#更新病毒库
freshclam

#扫描方法
clamscan -r /etc --max-dir-recursion=5 -l /root/etcclamav.log
clamscan -r /bin --max-dir-recursion=5 -l /root/binclamav.log
clamscan -r /usr --max-dir-recursion=5 -l /root/usrclamav.log

#扫描并杀毒
clamscan -r --remove /usr/bin/bsd-port
clamscan -r --remove /usr/bin/
clamscan -r --remove /usr/local/zabbix/sbin

#查看日志发现
cat /root/usrclamav.log |grep FOUND

SSH后门排查

检查SSH后门方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#1、比对ssh的版本
ssh -V

#2、查看ssh配置文件和/usr/sbin/sshd的时间
stat /usr/sbin/sshd

#3、strings检查/usr/sbin/sshd,看是否有邮箱信息
#strings可以查看二进制文件中的字符串,在应急响应中是十分有用的。有些sshd后门会通过邮件发送登录信息
strings /usr/sbin/sshd

#4、通过strace监控sshd进程读写文件的操作
#一般的sshd后门都会将账户密码记录到文件,可以通过strace进程跟踪到ssh登录密码文件。
ps axu | grep sshd | grep -v grep
root 65530 0.0 0.1 48428 1260 ? Ss 13:43 0:00 /usr/sbin/sshd
strace -o aa -ff -p 65530
grep open aa* | grep -v -e No -e null -e denied| grep WR
aa.102586:open("/tmp/ilog", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

Webshell查杀

Linux端的Webshell查杀,可用工具如下:

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

检查系统命令是否被替换

检查命令替换,比较直观的方式是比较命令的大小和mtime。

1
2
apt-get check #检查损坏的依赖
type -a 命令名称 #显示指定命令所有可能的类型,如pwd是shell内建命令

使用ls 以及 stat 查看系统命令是否被替换:

1
2
3
4
#两种思路:第一种查看命令目录最近的时间排序,第二种根据确定时间去匹配。
ls -alt /usr/bin|head -10
ls -al /bin /usr/bin /usr/sbin/ /sbin/|grep "Jan 15"
#如果日期数字<10,中间需要两个空格。比如1月1日,grep “Jan 1”

RPM check检查

系统完整性可以通过rpm自带的-Va来校验检查所有的rpm软件包。为防止rpm也被替换,需要上传一个安全干净稳定版本rpm二进制到服务器上进行检查。
查看哪些命令是否被替换了:

1
./rpm -Va > rpm.log

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

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

还原被替换的命令:

1
2
3
4
5
6
#文件提取还原案例
rpm -qf /bin/ls #查询ls命令属于哪个软件包
mv /bin/ls /tmp #先把ls转移到tmp目录下,造成ls命令丢失的假象
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm|cpio -idv ./bin/ls
#提取rpm包中ls命令到当前目录的/bin/ls下
cp /root/bin/ls /bin/ #把ls命令复制到/bin/目录,修复文件丢失

内存取证

内存抓取工具Lime

1
2
3
4
5
6
git clone https://github.com/504ensicsLabs/LiME.git
cd lime/src
make

#加载内核模块
sudo insmod lime-`uname -r`.ko "path=<outfile | tcp:<port>> format=<raw|padded|lime> [dio=<0|1>]"

path为本地保存的输出文件,tcp:是可选的远程监听。
format:raw是将所有系统RAM空间串联起来,padded是将非系统RAM空间以0填充,而lime则是将每段空间前填充固定大小的头部,该头部包含地址空间信息。dio则用于是否启用Direct IO。

实际参考命令:

1
sudo insmod lime-`uname -r`.ko "path=/home/crazydog/linux.lime format=lime"

会使系统非常卡顿,可能会对正在运行的生产系统造成影响。

内存镜像分析工具Volatility

使用可参考:https://www.jianshu.com/p/5f13ee20f5b0

整理声明

本笔记整理自以下互联网博客资源:

linux 查看系统信息命令(比较全)-jiftle
Linux常用命令大全(非常全!!!)-鸿燕藏锋
Volatility学习笔记一:使用手册-cr4zyd0g
应急响应-Vinc’s Blog
应急响应小总结-享受孤独
Linux应急响应入侵排查思路-Bypass

CONTACT