Linux应急响应总结——更新中
Linux应急响应
用户信息
方向
查看可登录的用户:
cat /etc/passwd | grep /bin/bash
awk -F: '{if($7!="/usr/sbin/nologin")print $1)}' /etc/passwd
# 除去不可登录的用户,看有没有新增的
查看是否有被添加的高权限用户,uid为0默认系统只用一个root:
awk -F: '$3==0{print $0}' /etc/passwd
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd
更多时候某些普通用户可能存在suid滥用,需要查询有sudo权限的用户。
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
查询可以远程登录的帐号信息,要注意的就是空密码只能本机登录不能远程。
awk '/\$1|\$6/{print $1}' /etc/shadow
查看/etc/passwd上次修改的时间,可以通过对比判断是否存在问题。
stat /etc/passwd
解决方案
直接警用账号,使其无法登录。
usermod -L user
完全删除user,同时将/home目录下的user目录一并删除。
userdel -rf user
不过一般来说Linux下攻击者一般都不会添加账号,动静太大了。
系统日志
总结常见的:
日志 | 描述 |
---|---|
/var/log/cron | 系统定时任务相关的日志 |
/var/log/mailog | 记录邮件信息 |
/var/log/message | 记录Linux系统的绝大多数重要信息 |
/var/log/btmp | 错误登录日志,使用lastb命令查看 |
/var/log/lastlog | 系统中所有用户最后一次登录的日志,使用lastlog命令查看 |
/var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件,使用last命令查看 |
/var/log/utmp | 记录当前登录的用户信息,使用w/who/users等命令查看 |
/var/log/secure | 涉及账号和密码的程序都会记录,例如SSH、su切换用户、sudo授权、添加用户和修改用户密码 |
历史命令
使用history可以列出最近的历史命令,但是可以显示的条数有限制。可以通过修改 /etc/profile文件来修改保存历史命令的最大数量。
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
但另外一个问题是,history
中存储的可以通过history -c
被攻击者清空,但是他并不会清空保存在文件中的记录,当系统关机/重启后会更新到~/.bash_history 文件中。所以必须删除~/.bash_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"
source /etc/profilie更新文件生效之后,使用history时将可以看到登录的 IP 地址、执行命令时间。
异常文件
根据名称
若不区分大小写就使用-iname
。
find / -name shell.*
根据大小
通过文件大小的区间来判断存在的文件是否可能为木马。
find / -size +1000M
# +1000M表示大于1000M的文件,-10M代表小于10M的文件
find ./ -size -221c -size +219c -exec ls -lh {} \;
根据时间
列出最近15天内修改过了的文件。比如下面的结果中hermoine
和snape
的公钥均有变动,且hermoine
的.bash_history
有变动,就很有可能被修改了公钥进行登录。
find / -mtime -15 -ls | more
这样列出来的数据量会很大,有时候只想查看是否有webshell或者远控木马,可以过滤出修改的php文件,比如这里的index和error都有改动,可能就是被挂黑页或者是攻击者通过404反弹shell,查看index可以发现疑似webshell的语句。
find / -mtime -15 -name "*.php"
其他参数的使用:
-atime 最后一次访问时间:查找在 n*24 小时内被访问过的文件。
-ctime 文件内容修改时间:查找在 n*24 小时内状态发生变化的文件(例如权限)。
-mtime 最后一次状态的修改时间:查找在 n*24 小时内被修改过的文件(包括文件权限,所有者/组,文件大小等)。
+n:查找比 n 天前更早的文件或目录。
-n:查找在 n 天内更改过属性的文件或目录。
n:查找在 n 天前(指定那一天)更改过属性的文件或目录。
根据可见性
查看隐藏文件。
ls -ar |grep "^\."
根据权限
只看文件权限的话就使用-perm参数指定,但是排查时间就可能很长。
find / -perm 600
如果需要查看属主是root的文件,则可以用-type f指定要查找的是文件。
find ./ -user root -type f
而如果没有属主或属组的文件或者目录,就很有可能被恶意删除或者修改了用户或组信息,也有可能是被上传到系统中的存在恶意代码的内容。可以如下列出这些文件:
find / -nouser -o -nogroup
若不需要查看内容而是同时删除就加上-delete
参数。
find / -nouser -o -nogroup -delete
计划任务、自启动
列出所有已启动的服务
systemctl list-unit-files | grep enabled
查看计划任务,如果需要看特定用户就用-u 指定就行,如看root的:
crontab -u root -l
计划任务保存在/var/spool/cron/{user}
中,而上面的效果等同于cat /var/spool/cron/crontabs/root
。
对于这些任务,如需编辑则使用- e
,但/etc/crontab
是系统级别的定时任务,只有root账户可以修改。删除特定用户的就使用 -r
。
服务、模块
排查可疑服务。
root@Nagini:~# service --status-all
[ - ] anacron
[ - ] apache-htcacheclean
[ + ] apache2
[ + ] apparmor
[ - ] bluetooth
[ - ] console-setup.sh
[ + ] cron
[ + ] dbus
[ - ] hwclock.sh
[ - ] keyboard-setup.sh
[ + ] kmod
[ + ] mysql
[ - ] networking
[ - ] nginx
[ + ] procps
[ - ] rsync
[ + ] rsyslog
[ + ] ssh
[ + ] udev
root@Nagini:~#
列出所有已载入系统的模块:
root@Nagini:~# lsmod
Module Size Used by
vmwgfx 331776 1
crct10dif_pclmul 16384 0
ttm 126976 1 vmwgfx
crc32_pclmul 16384 0
snd_intel8x0 45056 0
drm_kms_helper 208896 1 vmwgfx
ghash_clmulni_intel 16384 0
snd_ac97_codec 147456 1 snd_intel8x0
ac97_bus 16384 1 snd_ac97_codec
pcspkr 16384 0
serio_raw 16384 0
drm 495616 4 vmwgfx,drm_kms_helper,ttm
evdev 28672 3
joydev 24576 0
snd_pcm 114688 2 snd_intel8x0,snd_ac97_codec
snd_timer 36864 1 snd_pcm
snd 94208 4 snd_intel8x0,snd_timer,snd_ac97_codec,snd_pcm
soundcore 16384 1 snd
vboxguest 40960 0
sg 36864 0
video 49152 0
ac 16384 0
battery 20480 0
button 20480 0
ip_tables 28672 0
x_tables 45056 1 ip_tables
autofs4 49152 2
ext4 745472 1
crc16 16384 1 ext4
mbcache 16384 1 ext4
jbd2 122880 1 ext4
crc32c_generic 16384 0
fscrypto 32768 1 ext4
ecb 16384 0
hid_generic 16384 0
usbhid 57344 0
hid 139264 2 usbhid,hid_generic
sr_mod 28672 0
cdrom 65536 1 sr_mod
sd_mod 61440 3
ata_generic 16384 0
crc32c_intel 24576 2
ata_piix 36864 0
ohci_pci 16384 0
ehci_pci 16384 0
ohci_hcd 61440 1 ohci_pci
ahci 40960 2
ehci_hcd 94208 1 ehci_pci
libahci 40960 1 ahci
libata 270336 4 ata_piix,libahci,ahci,ata_generic
aesni_intel 200704 0
aes_x86_64 20480 1 aesni_intel
crypto_simd 16384 1 aesni_intel
cryptd 28672 3 crypto_simd,ghash_clmulni_intel,aesni_intel
glue_helper 16384 1 aesni_intel
psmouse 172032 0
i2c_piix4 24576 0
usbcore 299008 5 ohci_hcd,ehci_pci,usbhid,ehci_hcd,ohci_pci
usb_common 16384 1 usbcore
e1000 155648 0
scsi_mod 249856 4 sd_mod,libata,sg,sr_mod
root@Nagini:~#
端口、进程
查看端口的连接情况:
netstat -anput | more
具体参数如下:
-a 显示所有连接和端口
-n 以数字形式显示ip和port
-t 显示tcp
-u 显示udp
-v 显示指令执行过程
-l 显示监听的服务
-s 显示网络工作信息统计表
-p 显示建立连接的进程名以及pid
ESTABLISHED 建立连接、LISTENING 侦听状态、TIME_WAIT 连接超时
如果有发现了可疑的外联ip,就可以根据pid查找其文件路径。
ls -l /proc/$pid
监控这个ip的通信进程。
while true; do netstat -antp | grep 10.10.10.1; done
查看进程使用ps -aux
,若需要关联pid就用grep:
root@Nagini:~# ps -aux | grep 3306
root 1084 0.0 0.0 6076 888 pts/0 S+ 07:42 0:00 grep 3306
还可以通过查看cpu占用率前十的进程来查看是否有可疑的进程。
ps aux --sort=pcpu | head -10ps aux --sort=pcpu | head -10
同样的可以用top来动态的监控进程,按b可以根据使用情况进行排序。-p指定pid。
top -p $pid
工具
whoamifuck
👉传送门。手工排除太慢,先用工具再结合手工最佳。赋权后指定相应参数即可。
可以列举出很多信息,部分如下:
火麒麟
👉传送门。
clone下来之后运行agent中的对应版本,之后输入start开开始,最后会得到一个后缀为.fkld的文件,将文件导入gui界面可以看到详细的信息。
河马webshell
快速配置一下,一般使用scan或者deepscan,后面跟上网页的路径即可。
wget -O /opt/hm-linux.tgz http://dl.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.7.0
c
./hm -h