总字符数: 21.15K
代码: 18.27K, 文本: 1.28K
预计阅读时间: 1.42 小时
入侵排查思路
系统基本信息
- lscpu查看cpu信息
1 | [root@localhost ~]# lscpu |
- 操作系统信息
1 | [root@localhost ~]# uname -a |
账号安全
基本使用
用户信息文件
/etc/passwd
1
2
3
4
5root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell
# 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell
# 注意:无密码只允许本机登陆,远程不允许登陆影子文件
/etc/shadow
1
2
3root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
# 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
# 可以用john碰撞解密/etc/sudoers
1
2
3
4
5
6
7
8[loneferret@localhost ~]$ sudo -l
User loneferret may run the following commands on this host:
(root) NOPASSWD: !/usr/bin/su
(root) NOPASSWD: /usr/local/bin/ht
# 用户 loneferret 在这个系统上有以下权限:
# 可以以 root 权限运行 /usr/local/bin/ht 命令,而无需输入密码。
# 不能以 root 权限运行 /usr/bin/su 命令。几个常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# who 命令用于查看当前登录的用户。输出显示当前用户的会话类型(tty 表示本地登录,pts 表示远程登录)。
who
# 输出示例:
# loneferret tty7 2023-10-01 08:45 (:0)
# user2 pts/1 2023-10-01 09:00 (192.168.1.100)
# w 命令用于查看系统信息和用户在做什么。输出包括用户、TTY、远程主机、登录时间、空闲时间、JCPU、PCPU 和当前正在执行的命令。
w
# 输出示例:
# 10:30:45 up 2:15, 2 users, load average: 0.00, 0.01, 0.05
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# loneferret tty7 :0 08:45 2:15m 0.10s 0.10s /usr/bin/X
# user2 pts/1 192.168.1.100 09:00 1:30 0.20s 0.15s /bin/bash
# uptime 命令用于查看系统已运行时间、当前登录用户数及系统负载平均值。
uptime
# 输出示例:
# 10:30:45 up 2:15, 2 users, load average: 0.00, 0.01, 0.05
入侵排查
查询特权用户特权用户
(uid为0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 该 awk 命令用于从 /etc/passwd 文件中找出 UID 为 0 的账户名。
awk -F: '{if($3==0) print $1}' /etc/passwd
# 代码含义:
# 使用 awk 命令 -F 指定分割符为冒号,读取 /etc/passwd 文件
# 如果第三列(UID)的值恒等于 0,则输出第一列的值(账户名)
# 在 Linux 系统中,UID 为 0 的账户通常只有 root 用户才有
# 如果出现别的账户 UID 为 0,则需要特别关注,可能存在安全风险
# 用户 ID (UID) 在 Linux 系统中有几种类型:
# 1. 超级用户 (root) UID: 0
# - root 用户拥有最高权限,可以执行任何操作
# 2. 系统用户 UID: 1-999 (某些系统为 1-1000)
# - 系统用户用于系统服务和守护进程
# - 例如:daemon、bin、sys 等
# 3. 普通用户 UID: 1000 及以上
# - 普通用户用于实际登录和操作系统的用户
# - 例如:用户创建的账户,如 alice、bob
[root@localhost ~]# awk -F: '{if($3==0) print $1}' /etc/passwd
root
defend查询可以远程登录的帐号信息
1
2
3
4
5
6
7[root@localhost ~]# cat /etc/passwd | grep -v "nologin"
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
defend:x:0:0:defend:/home/defend:/bin/bash除root帐号外,其他帐号是否存在sudo权限.如非管理需要,普通帐号应删除sudo权限
1
2
3
4[root@localhost ~]# more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
# %wheel ALL=(ALL) NOPASSWD: ALL禁用或删除多余及可疑的帐号
1
2
3usermod -L user # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为!开头
userdel user # 删除 user 用户
userdel -r user # 将删除user用户,并且将/home目录下的user目录一并删除查看空口令账户
1
2
3
4
5
6
7
8
9[root@localhost ~]# awk -F : '($2 == "!!") {print $1}' /etc/shadow
[root@localhost ~]# awk -F : '$2=="x" {print $1,$7}' /etc/passwd | grep -v nologin
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
defend /bin/bash
shell_exec /bin/bash查看用户错误的登录信息:
lastb
查看所有用户最后的登录信息:
lastlog
查看用户最近登录信息:
last
历史命令
通过.bash_history
查看帐号执行过的系统命令
root的历史命令
histroy
打开
/home
各帐号目录下的.bash_history
,查看普通帐号的历史命令为历史的命令增加登录的IP地址、执行命令时间等信息:
保存 1 万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
在
/etc/profile
的文件尾部添加如下行数配置信息1
2
3
4
5
6
7
8
9######jiagu history xianshi#########
USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g')
if [ -z "$USER_IP" ]; then
USER_IP=$(hostname)
fi
export HISTTIMEFORMAT="%F %T $USER_IP $(whoami) "
shopt -s histappend
export PROMPT_COMMAND="history -a"
######### jiagu history xianshi ##########source /etc/profile
让配置生效,效果为:2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
历史操作命令的清除:
history -c
但此命令并不会清除保存在文件中的记录,因此需要手动删除.bash_profile
文件中的记录.
端口
1 | # netstat分析可疑端口,可以ip地址,可以PID及程序进程 |
进程
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础
无论是Windows还是Linux,主机在感染恶意程序后,恶意程序都会启动相应的进程,来完成相关恶意操作,有的进程为了不为查杀,还会启动守护进程对恶意进程进行守护
1 | # 根据PID的值,可查看其对应的可执行程序. |
开机启动项
基本使用
系统运行级别:
运行级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户模式,可以想象为Windows的安全模式,主要用于系统修复 |
2 | 不完全的命令行模式,不含NFS服务 |
3 | 完全的命令行模式,就是标准字符界面 |
4 | 系统保留 |
5 | 图形模式 |
查看运行级别命令runlevel
系统默认允许级别
1 | vi /etc/inittab |
入侵排查
启动项文件:
1 | more /etc/rc.local |
定时任务
基本使用
利用
crontab
创建计划任务1
2
3
4
5
6
7crontab -l # 列出某个用户 cron 服务的详细内容
# Tips:默认编写的crontab文件会保存在(/var/spool/cron/用户名 例如:/var/spool/cron/root)
# 指定用户查看计划任务
crontab -u root -l
crontab -r # 删除每个用户 cront 任务(谨慎:删除所有的计划任务)
crontab -e # 使用编辑器编辑当前的 crontab 文件
# 如:*/1 * * * * echo "hello world" >> /tmp/test.txt # 每分钟写入文件利用
anacron
实现异步定时任务调度1
2
3
4
5# 每天运行 /home/backup.sh 脚本
vi /etc/anacrontab
@daily 10 example.daily /bin/bash /home/backup.sh
# 当机器在backup.sh期望被运行时是关机的,anacron会在机器开机十分钟之后运行它,而不用再等待7天
入侵排查
1 | # 重点关注以下目录中是否存在恶意脚本 |
服务
服务自启动
1 | # 第一种修改方法 |
入侵排查
查询已安装的服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 查看服务自启动状态,可以看到所有的RPM包安装的服务
chkconfig --list
# 查看当前服务
ps aux | grep crond
# 系统在3与5级别下的启动项
chkconfig --list | grep "3:on|5:on"
# 服务安装位置,一般是在 /usr/local/
# 注意:service 命令通常用于启动传统的SysV init脚本,而不是直接指示服务安装位置
service httpd start
# 搜索 /etc/rc.d/init.d/ 查看是否存在
# 这个目录包含了传统的SysV init脚本,用于启动和管理服务
ls /etc/rc.d/init.d/
# 查看 systemd 服务单元文件
# 这些目录包含了 systemd 服务单元文件,用于启动和管理服务
ls /usr/lib/systemd/system
ls /etc/systemd/system
文件痕迹
敏感目录
1 | # /tmp 和 /usr/bin、/usr/sbin |
时间点查找
1 | # 使用 find 命令查找在特定时间段内变动的文件 |
特殊文件
1 | # 特殊权限文件查找 |
系统日志
日志默认存放位置:/var/log/
查看日志配置情况:more /etc/rsyslog.conf
1 | # 日志级别 |
日志分析技巧
定位有多少IP在爆破主机的root帐号
1
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些 IP 在爆破主机的root帐号
1
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
爆破用户名字典是什么
1
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
登录成功的IP有哪些
1
2
3grep "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日志
1
2
3
4
5[root@localhost ~]# grep "useradd" /var/log/secure
Jul1000:12:15localhostuseradd[2382]: newgroup: name=kali, GID=1001
Jul1000:12:15localhostuseradd[2382]: newuser: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul1000:12:58localhostpasswd: pam_unix(passwd:chauthtok): passwordchangedforkali删除用户kali日志
1
2
3
4[root@localhost ~]# grep "userdel" /var/log/secure
Jul1000:14:17localhostuserdel[2393]: deleteuser'kali'
Jul1000:14:17localhostuserdel[2393]: removedgroup'kali' ownedby'kali'
Jul1000:14:17localhostuserdel[2393]: removedshadowgroup'kali' ownedby'kali'su切换用户
1
2
3
4
5
6
7
8
9
10
11# 通过 /var/log/auth.log 文件(适用于基于 Debian 的系统,如 Ubuntu):
cat /var/log/auth.log | grep su
cat /var/log/auth.log | grep sudo
# 通过 /var/log/secure 文件(适用于基于 Red Hat 的系统,如 CentOS 和 Fedora):
cat /var/log/secure | grep su
cat /var/log/secure | grep sudo
# 通过 /var/log/messages 文件(适用于某些旧版本的系统):
cat /var/log/messages | grep su
cat /var/log/messages | grep sudo
通信分析
iptables
Linux平台下的包过滤防火墙,具有封包过滤、封包重定向和网络地址转换(NAT)等功能表 链 filter INPUT,FORWARD,OUTPUT nat PREROUTING,OUTPUT,POSTROUTING mangle PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING raw PREROUTING,OUTPUT 动作 含义 ACCEPT 允许数据包通过 DROP 直接丢弃数据包,不会给数据端发送响应 REJECT 拒绝数据包,必要时会给数据端发送响应 SNAT 源地址转换,解决内网用户公用一个公网地址 MASQUERADE SNAT的特殊形式,适用于动态IP REDIRECT 在本机做端口映射 1
2
3
4
5
6# 192.168.10.0/24 可接受,但192.168.10.10丢弃
iptables -A INPUT -i eth0 -s 192.168.10.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.10.10 -j DROP
iptables -nL --line-number | grep 192.168.10
iptables -L -t nat
# 重点注意:红队常用natFireWalld
Linux-FireWalld
命令被替换
BusyBox
1 | # 下载 BusyBox 64 位二进制文件 |
检查确认系统命令工具是否被替换
使用工具篇中的rkhunter检测即可
工具篇
一、Rootkit查杀
chkrootkit
1 | # http://www.chkrootkit.org |
rkhunter
1 | # http://rkhunter.sourceforge.net |
二、病毒查杀
Clamav
安装方式一:
1 | # ClamAV 的官方下载地址为: |
安装方式二:
1 | # 安装 |
三、webshell查杀
1 | linux 版: |
四、RPM check检查
1 | # 系统完整性可以通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了: |
验证内容中的8个信息的具体内容如下:
- S文件大小是否改变
- M文件的类型或文件的权限(rwx)是否被改变
- 5文件 MD5 校验是否改变(可以看成文件内容是否改变)
- D设备中,从代码是否改变
- L文件路径是否改变
- U文件的属主(所有者)是否改变
- G文件的属组是否改变
- T文件的修改时间是否改变
1 | # 如果命令被替换了,如何还原回来: |