总字符数: 21.15K

代码: 18.27K, 文本: 1.28K

预计阅读时间: 1.42 小时

入侵排查思路

系统基本信息

  1. lscpu查看cpu信息
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
[root@localhost ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 1
座: 4
NUMA 节点: 1
厂商 ID: GenuineIntel
CPU 系列: 6
型号: 158
型号名称: Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
步进: 9
CPU MHz: 2496.004
BogoMIPS: 4992.00
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 32K
L1i 缓存: 32K
L2 缓存: 256K
L3 缓存: 6144K
NUMA 节点0 CPU: 0-3
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
  1. 操作系统信息
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
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

[root@localhost ~]# cat /etc/*release
CentOS Linux release 7.9.2009 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.9.2009 (Core)
CentOS Linux release 7.9.2009 (Core)

[root@localhost ~]# lsb_release -a

账号安全

基本使用

  1. 用户信息文件/etc/passwd

    1
    2
    3
    4
    5
    root:x:0:0:root:/root:/bin/bash
    account:password:UID:GID:GECOS:directory:shell

    # 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell
    # 注意:无密码只允许本机登陆,远程不允许登陆
  2. 影子文件/etc/shadow

    1
    2
    3
    root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
    # 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
    # 可以用john碰撞解密
  3. /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 命令。
  4. 几个常用命令

    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

入侵排查

  1. 查询特权用户特权用户(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
  2. 查询可以远程登录的帐号信息

    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
  3. 除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
  4. 禁用或删除多余及可疑的帐号

    1
    2
    3
    usermod -L user   # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为!开头
    userdel user # 删除 user 用户
    userdel -r user # 将删除user用户,并且将/home目录下的user目录一并删除
  5. 查看空口令账户

    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
  6. 查看用户错误的登录信息:lastb

  7. 查看所有用户最后的登录信息:lastlog

  8. 查看用户最近登录信息:last

历史命令

通过.bash_history查看帐号执行过的系统命令

  1. root的历史命令histroy

  2. 打开/home各帐号目录下的.bash_history,查看普通帐号的历史命令

    1. 为历史的命令增加登录的IP地址、执行命令时间等信息:

    2. 保存 1 万条命令sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

    3. /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 ##########
    4. source /etc/profile让配置生效,效果为:2018-07-10 19:45:39 192.168.204.1 root source /etc/profile

  3. 历史操作命令的清除:history -c但此命令并不会清除保存在文件中的记录,因此需要手动删除.bash_profile文件中的记录.

端口

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
# netstat分析可疑端口,可以ip地址,可以PID及程序进程
-a all显示所有的选项
-t tcp仅显示tcp连接
-u 仅显示udp连接
-p 显示对应的程序名
[root@localhost ~]# netstat -atup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN 760/rpcbind
tcp 0 0 localhost.locald:domain 0.0.0.0:* LISTEN 1633/dnsmasq
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 1094/sshd
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN 1092/cupsd
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1335/master
tcp6 0 0 [::]:sunrpc [::]:* LISTEN 760/rpcbind
tcp6 0 0 [::]:ssh [::]:* LISTEN 1094/sshd
tcp6 0 0 localhost:ipp [::]:* LISTEN 1092/cupsd
tcp6 0 0 localhost:smtp [::]:* LISTEN 1335/master
udp 0 0 0.0.0.0:923 0.0.0.0:* 760/rpcbind
udp 0 0 0.0.0.0:mdns 0.0.0.0:* 789/avahi-daemon: r
udp 0 0 0.0.0.0:38280 0.0.0.0:* 789/avahi-daemon: r
udp 0 0 localhost.locald:domain 0.0.0.0:* 1633/dnsmasq
udp 0 0 0.0.0.0:bootps 0.0.0.0:* 1633/dnsmasq
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:* 760/rpcbind
udp 0 0 localhost:323 0.0.0.0:* 800/chronyd
udp6 0 0 [::]:923 [::]:* 760/rpcbind
udp6 0 0 [::]:sunrpc [::]:* 760/rpcbind
udp6 0 0 localhost:323 [::]:* 800/chronyd

进程

进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础

无论是Windows还是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
# 根据PID的值,可查看其对应的可执行程序.
# -a:显示所有文件,包括以.开头的隐藏文件。
# -l:使用长格式列出文件信息,包括权限、所有者、大小和修改时间等。
# -t:按修改时间排序,最近修改的文件显示在最前面。
[root@localhost ~]# ls -alt /proc/1094

# 通过lsof -p PID,查看进程所打开的文件
[root@localhost ~]# lsof -p 1094

# 查看进程树
pstree
# 查看进程
ps -aux
top

# 隐藏进程
1. 列出所有进程并保存到文件1
ps -ef | awk '{print}' | sort -n | uniq > 1
# 这条命令使用 ps -ef 列出所有进程,然后通过 awk '{print}' 打印每一行,再通过 sort -n 按数字排序,最后通过 uniq 去除重复行,并将结果保存到文件 1。

2. 列出/proc目录下的所有进程ID并保存到文件2
ls /proc | sort -n | uniq > 2
# 这条命令使用 ls /proc 列出 /proc 目录下的所有子目录(这些子目录通常是进程ID),然后通过 sort -n 按数字排序,最后通过 uniq 去除重复行,并将结果保存到文件 2。

3. 比较两个文件,找出隐藏的进程:
diff 1 2
# 这条命令使用 diff 比较文件 1 和文件 2,找出它们之间的差异。如果文件 1 中缺少某些进程ID,而这些进程ID出现在文件 2 中,那么这些进程ID对应的进程可能是隐藏的。

# top命令查看资源占用率较高的进程
# 处置方法
1. kill -9 pid杀死进程
2. rm -rf 文件名 删除文件
3. 如果root权限删除不了,可能被添加了 i 属性,使用lsattr filename查看文件属性,然后使用 chattr -i filename移除 i 属性,然后删除
4. 有的进程存在守护进程,导致无法删除,我们先将进程挂起,查杀守护进程后,在删除该进程
5. ps命令全程位process state,进程状态,ps -ef显示所有进程的UID,PPIP,C与STIME栏位

开机启动项

基本使用

系统运行级别:

运行级别 含义
0 关机
1 单用户模式,可以想象为Windows的安全模式,主要用于系统修复
2 不完全的命令行模式,不含NFS服务
3 完全的命令行模式,就是标准字符界面
4 系统保留
5 图形模式

查看运行级别命令runlevel

系统默认允许级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi  /etc/inittab

id=3:initdefault # 系统开机后直接进入哪个运行级别

# 开机启动配置文件

/etc/rc.local
/etc/init.d/rc.local
/etc/rc.d/rc[0~6].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开头的脚本文件,代表运行级别加载时需要关闭的.

入侵排查

启动项文件:

1
2
3
4
5
6
more /etc/rc.local 
/etc/rc.d/rc[0~6].d
# 很多红色显示的为开机启动项,需要依次删掉
ls /etc/rc*/
# chkconfig开机启动项
chkconfig --list

定时任务

基本使用

  1. 利用crontab创建计划任务

    1
    2
    3
    4
    5
    6
    7
    crontab -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 # 每分钟写入文件
  2. 利用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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重点关注以下目录中是否存在恶意脚本
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
/var/spool/cron/root
/var/spool/cron/crontabs/root
/var/spool/cron/*
# 小技巧
more /etc/cron.daily/* # 查看目录下所有文件

服务

服务自启动

1
2
3
4
5
6
7
8
9
10
11
# 第一种修改方法
chkconfig [--level 运行级别][独立服务名][on|off]
chkconfig –level 2345 httpd on # 开启自启动
chkconfig httpd on # (默认 level 是 2345)
# 第二种修改方法
修改 /etc/re.d/rc.local文件
加入 /etc/init.d/httpd start
# 第三种修改方法
使用ntsysv命令管理自启动,可以管理独立服务和xinetd服务
# 第四种修改方法
service --status-all

入侵排查

  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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# /tmp 和 /usr/bin、/usr/sbin
# /tmp 目录经常被恶意软件用作软件下载目录
# /usr/bin 和 /usr/sbin 目录中的文件经常被恶意软件替换以执行恶意任务

# 检查 /tmp 目录中可疑文件
ls -la /tmp
# 检查 /usr/bin 目录中可疑文件
ls -la /usr/bin
# 检查 /usr/sbin 目录中可疑文件
ls -la /usr/sbin

# ~/.ssh 和 /etc/ssh
# ~/.ssh 目录常被用作存储后门的SSH配置,例如恶意的SSH公钥
# /etc/ssh 目录中的配置文件可能被修改以创建后门

# 检查 ~/.ssh 目录中的文件,包括公钥和私钥
ls -la ~/.ssh
# 检查 /etc/ssh 目录中的配置文件
ls -la /etc/ssh

# 重点检查 SSH 公钥配置文件
cat ~/.ssh/authorized_keys
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config

时间点查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 使用 find 命令查找在特定时间段内变动的文件
# 以下是一些常见的 find 命令选项和示例

# 查找过去 7 天内修改过的普通文件
find /path/to/search -type f -mtime -7
# 查找过去 30 天内访问过的普通文件
find /path/to/search -type f -atime -30
# 查找过去 60 天内创建的普通文件
find /path/to/search -type f -ctime -60
# 查找所有符号链接
find /path/to/search -type l
# 查找所有目录
find /path/to/search -type d

# 使用 stat 命令查看文件的详细时间信息
# stat 文件名
stat /path/to/file

# 示例:查找 /var/log 目录下过去 2 天内修改过的文件,并显示详细时间信息
find /var/log -type f -mtime -2 -exec stat {} \;
# 示例:查找 /home 目录下过去 1 天内创建的文件,并显示详细时间信息
find /home -type f -ctime -1 -exec stat {} \;
# 示例:查找 /etc 目录下过去 5 天内访问过的文件,并显示详细时间信息
find /etc -type f -atime -5 -exec stat {} \;

特殊文件

1
2
3
4
5
6
7
8
9
10
# 特殊权限文件查找
find /tmp -perm 777
# webshell扫描
find /var/www -name "*.php" | xargs egrep查找php文件是否包含egrep关键字
# 还可使用findwebshell,scan_webshell.py等扫描工具进行扫描
# 对系统命令进行排查
# ls、ps等命令可能被攻击者恶意替换,使用ls -alt /bin查看命令修改的时间
linux后门检测,chkrootkit、rkhunter
# 排查suid程序
find / -perm -u=s -type f 2>/dev/null

系统日志

日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf

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
# 日志级别
debug # 系统调试信息
info # 常规信息
warning # 警告信息
err # 报错(级别低,阻止了某个功能能不能正常工作)
crit # 报错(级别高,阻止了某个软件或整个系统不能正常工作)
alert # 需要立即修改的信息
emerg # 内核崩溃
none # 不采集任何日志信息
# 注意:从上到下,级别从低到高,记录的信息越来越少

# 必看日志
/var/log/secure # 包含验证和授权方面信息.例如:sshd 会将所有信息记录(其中包括失败登录)在这里
/var/log/cron # 每当cron进程开始一个工作时,就会将相关信息记录在这个文件中
/var/log/messages # 包括整体系统信息,其中也包含系统启动期间的日志.此外,mail,cron,daemon,kern和auth等内容也记录在var/log/messages日志中
/var/log/btmp # 记录所有失败登录信息.使用last命令可以查看btmp文件.例如:last -f /var/log/btmp more
/var/log/wtmp # 记录登录进入、退出、数据交换、关机和重启,即last命令
/var/log/lastlog # 记录所有用户的最近信息.这不是一个ASCII文件,因此需要用lastlog命令查看内容
/var/log/cups # 涉及所有打印信息的日志。

# 了解
/var/log/userlog # 记录用户所有等级用户信息的日志
/var/log/dmesg # 包含内核缓冲信息(kernel ring buffer).在系统启动时,会在屏幕上显示许多与硬件有关的信息.可以用dmesg查看它们
/var/log/auth.log # 包含系统授权信息,包括用户登录和使用的权限机制等
/var/10g/boot.log # 包含系统启动时的日志
/var/log/daemon.log # 包含各种系统后台守护进程日志信息
/var/log/dpkg.log # 包括安装或dpkg命令清除软件包的日志
/var/log/kern.log # 包含内核产生的日志,有助于在定制内核时解决问题
/var/log/maillog
/var/log/mai1.log # 包含来自系统运行电子邮件服务器的日志信息.例如:sendmail日志信息就全部送到这个文件中
/var/log/user.log # 记录所有等级用户信息的日志
/var/log/Xorg.x.log # 来自X的日志信息
/var/log/alternatives.log # 更新替代信息都记录在这个文件中
/var/log/anaconda.log # 在安装Linux时,所有安装信息都储存在这个文件中
/var/log/yum.log # 包含使用yum安装的软件包信息
/var/log/utmp # 包含登录信息.使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等
/var/log/faillog # 包含用户登录失败信息.此外,错误登录命令也会记录在本文件中

# 除了上述Log文件以外,vār/log还基于系统的具体应用包含以下一些子目录:
/var/log/httpd/或/var/log/apache2 # 包含服务器access_log和error_log信息
/var/log/lighttpd/ # 包含light HTTPD的access_log和error_log
/var/log/mail/ # 这个子目录包含邮件服务器的额外日志
/var/log/prelink/ # 包含.so文件被prelink修改的信息
/var/log/audit/ # 包含被Linux audit daemon储存的信息
/var/log/samba/ # 包含由samba存储的信息
/var/log/sa/ # 包含每日由sysstat软件包收集的sar文件
/var/log/sssd/ # 用于守护进程安全服务
/var/log/xferlog(vsftpd.log) # LinuxFTP日志

日志分析技巧

  1. 定位有多少IP在爆破主机的root帐号

    1
    grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
  2. 定位有哪些 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
  3. 爆破用户名字典是什么

    1
    grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
  4. 登录成功的IP有哪些

    1
    2
    3
    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}'
  5. 增加一个用户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
  6. 删除用户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'
  7. 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
    # 重点注意:红队常用nat
  • FireWalld
    Linux-FireWalld

命令被替换

BusyBox

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
101
102
103
104
105
106
# 下载 BusyBox 64 位二进制文件
wget -O busybox https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64
# 赋予权限
chmod +x busybox

# 查看查看其版本,使用和当前支持的功能
./busybox
[root@localhost opt]# ./busybox
BusyBox v1.31.0 (2019-06-10 15:54:54 CEST) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2015.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --show SCRIPT
or: busybox --install [-s] [DIR]
or: function [arguments]...

BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.

Currently defined functions:
[, [[, acpid, add-shell, addgroup, adduser, adjtimex, arch, arp, arping, ash, awk, base64, basename, bc, beep,
blkdiscard, blkid, blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, chat, chattr, chgrp, chmod,
chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, conspy, cp, cpio, crond, crontab, cryptpw,
cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg,
dnsd, dnsdomainname, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir,
envuidgid, ether-wake, expand, expr, factor, fakeidentd, fallocate, false, fatattr, fbset, fbsplash, fdflush,
fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk, fsck, fsck.minix, fsfreeze,
fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm, head,
hexdump, hexedit, hostid, hostname, httpd, hush, hwclock, i2cdetect, i2cdump, i2cget, i2cset, i2ctransfer, id,
ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc,
ipcrm, ipcs, iplink, ipneigh, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less,
link, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr,
ls, lsattr, lsmod, lsof, lspci, lsscsi, lsusb, lzcat, lzma, lzop, makedevs, makemime, man, md5sum, mdev, mesg,
microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp,
modinfo, modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat,
nice, nl, nmeter, nohup, nologin, nproc, nsenter, nslookup, ntpd, nuke, od, openvt, partprobe, passwd, paste,
patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop,
printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev, readahead, readlink, readprofile,
realpath, reboot, reformime, remove-shell, renice, reset, resize, resume, rev, rm, rmdir, rmmod, route, rpm,
rpm2cpio, rtcwake, run-init, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq,
setarch, setconsole, setfattr, setfont, setkeycodes, setlogcons, setpriv, setserial, setsid, setuidgid, sh,
sha1sum, sha256sum, sha3sum, sha512sum, showkey, shred, shuf, slattach, sleep, smemcap, softlimit, sort, split,
ssl_client, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svc, svlogd, svok, swapoff, swapon,
switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd,
time, timeout, top, touch, tr, traceroute, traceroute6, true, truncate, ts, tty, ttysize, tunctl, ubiattach,
ubidetach, ubimkvol, ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpc6, udhcpd, udpsvd, uevent, umount,
uname, unexpand, uniq, unix2dos, unlink, unlzma, unshare, unxz, unzip, uptime, users, usleep, uudecode, uuencode,
vconfig, vi, vlock, volname, w, wall, watch, watchdog, wc, wget, which, who, whoami, whois, xargs, xxd, xz, xzcat,
yes, zcat, zcip

# 使用BusyBox
## 基本语法
./busybox command

## 查看可用命令条数
busybox --list | wc -l
396

## ls
./busybox ls
## ping
./busybox ping www.baidu.com
PING www.baidu.com (180.101.50.188): 56 data bytes
64 bytes from 180.101.50.188: seq=0 ttl=128 time=42.306 ms
64 bytes from 180.101.50.188: seq=1 ttl=128 time=55.544 ms
64 bytes from 180.101.50.188: seq=2 ttl=128 time=41.421 ms
64 bytes from 180.101.50.188: seq=3 ttl=128 time=33.776 ms
64 bytes from 180.101.50.188: seq=4 ttl=128 time=40.611 ms
64 bytes from 180.101.50.188: seq=5 ttl=128 time=40.129 ms
^C
--- www.baidu.com ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 33.776/42.297/55.544 ms
## 使用 Httpd WebServer
./busybox --list | grep httpd
# 进入busybox shell环境
./busybox sh
# 激活WebServer
/opt # ./busybox httpd
# 退出进入busybox shell环境
exit
# 查询webserver 进程
[root@localhost opt]# ps -ef | grep httpd
root 38923 1 0 14:45 ? 00:00:00 ./busybox httpd
root 39460 3959 0 14:45 pts/0 00:00:00 grep --color=auto httpd
# 测试
[root@localhost opt]# curl localhost
<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>
<BODY><H1>404 Not Found</H1>
The requested URL was not found
</BODY></HTML>
# 可以创建一个简单的页面
./busybox sh
# 新建文件
/opt # ./busybox vi index.html
<!DOCTYPE html>
<html>
<body>
Welcome to BusyBox !
</body>
</html>

检查确认系统命令工具是否被替换

使用工具篇中的rkhunter检测即可

工具篇

一、Rootkit查杀

chkrootkit

1
2
3
4
5
6
7
8
# http://www.chkrootkit.org
# 使用方法:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.52
makesense
# 编译完成没有报错的话执行检查
./chkrootkit

rkhunter

1
2
3
4
5
6
7
8
# http://rkhunter.sourceforge.net

# 使用方法:
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

安装方式一:

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
# ClamAV 的官方下载地址为:

# http://www.clamav.net/download.html

# 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 -gclamav -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
makeinstall

# 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 目录并且显示有问题的文件的扫描结果

安装方式二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装
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

三、webshell查杀

1
2
3
4
5
6
7
8
9
10
11
12
linux 版:

# 河马 webshell 查杀
http://www.shellpub.com

# 深信服 Webshell 网站后门检测工具
http://edr.sangfor.com.cn/backdoor_detection.html

牧云
findWebshell-master
php-malware-finder-master
PHP-Shell-Detector-master

四、RPM check检查

1
2
3
4
5
# 系统完整性可以通过 rpm 自带的 -Va 来校验检查所有的 rpm 软件包,查看哪些命令是否被替换了:

./rpm -Va > rpm.log

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

验证内容中的8个信息的具体内容如下:

  1. S文件大小是否改变
  2. M文件的类型或文件的权限(rwx)是否被改变
  3. 5文件 MD5 校验是否改变(可以看成文件内容是否改变)
  4. D设备中,从代码是否改变
  5. L文件路径是否改变
  6. U文件的属主(所有者)是否改变
  7. G文件的属组是否改变
  8. T文件的修改时间是否改变
1
2
3
4
5
6
7
8
9
10
11
12
# 如果命令被替换了,如何还原回来:
# 文件提取还原案例:

rpm -qf /bin/ls # 查询ls命令属于哪个软件包

mv /bin/ls /tmp # 先把ls转移到tmp目录下,造成ls命令丢失的假象

# 提取rpm包中ls命令到当前目录的/bin/ls下
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls

# 把ls命令复制到/bin/目录修复文件丢失
cp /root/bin/ls /bin/

五、Linux安全检查脚本