第二届帕鲁杯应急响应部分完整WP
在帕鲁杯 2025 - 应急响应获得最佳阅读体验
畸形的爱
解压密码
Parloo&zgsfsys&onefox&solar**juyt

| 主机名 | 操作系统登录 | 服务登录 |
|---|---|---|
| WebServer | root/root | https://192.168.20.102:9443/ admin/VF6NXMs7 |
| SQL服务器 | sql/sql | |
| Windows7 PC 1 | administrator/wmx666 | |
| Windows10 PC2 | administrator/zjl@123 |
1.提交攻击者使用的攻击ip地址1
在webserver查看nginx日志
cat /var/log/nginx/access.log.1 | grep 'GET'

palu{192.168.31.240}
2.提交攻击者使用的攻击ip地址2
在PC2的回收站发现简历.zip,压缩包里面有一个简历.exe
放到安恒云沙箱检测

palu{192.168.31.11}
3.提交攻击者暴力破解开始时间
查看docker启动的服务
root@ubuntu:/home/webserver# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6801404902b1 phpmyadmin/phpmyadmin:latest "/docker-entrypoint.…" 3 weeks ago Exited (255) 6 days ago 0.0.0.0:8080->80/tcp phpmyadmin
ec87eb8a81c7 webdata "docker-php-entrypoi…" 3 weeks ago Exited (255) 6 days ago 9000/tcp, 192.168.87.101:8061->80/tcp WebData
192686b818fc serjs/go-socks5-proxy "/socks5" 3 weeks ago Exited (255) 6 days ago 0.0.0.0:1081->1080/tcp socks5-open
查看phpmyadmin的日志
docker logs 6801404902b1

发现大量访问记录
palu{2025:03:05:58}
4.提交攻击者留下的flag1
查看PC2的任务计划程序
taskschd.msc


palu{pc3_zgsfqwerlkssaw}
5.提交攻击者留下的flag2
在PC2的C盘下搜索字符串
findstr /s /i "palu{" *.* 2>nul

发现flag在a.bat里
palu{nizhidaowoyouduoainima}
6.提交攻击者留下的flag3
在webserver的/var/www/html/index.php中发现数据库密码TOOR@123

在mysql登录
sql@ubuntu:~$ mysql -u root -p
Enter password: TOOR@123
mysql> show databases;
mysql> use ecommerce_order_system
mysql> show tables;
mysql> select * from orders;

分别拿到下面几条order_content
W3siaXRlbV9pZCI6MSwiaXRlbV9uYW1lIjoi5bCP5pe25aSN5Y2wIiwicXVhbnRpdHkiOjIsInByaWNlIjoxOTkuOTl9LHsiaXRlbV9pZCI6MywiaXRlbV9uYW1lIjoi6Iux5Zu95aSN5Y2wIiwicXVhbnRpdHkiOjEsInByaWNlIjo1OS45OX1d
W3siaXRlbV9pZCI6NSwiaXRlbV9uYW1lIjoi5Y+R5bGV5aSN5Y2wIiwicXVhbnRpdHkiOjEsInByaWNlIjoyOTkuOTl9XQ==
W3siaXRlbV9pZCI6MiwiaXRlbV9uYW1lIjoi5aSN5Y2w5Y+R6YCB5omr5o+P5pel5pyfIiwicXVhbnRpdHkiOjMsInByaWNlIjoxMjkuOTl9LHsiaXRlbV9pZCI6NCwiaXRlbV9uYW1lIjoi5aSN5Y2w5Y+R6YCB6Z2e5Y6CIiwicXVhbnRpdHkiOjEsInByaWNlIjo4OS45OX
W3siaXRlbV9pZCI6MSwiaXRlbV9uYW1lIjoiZmxhZzNwYWx1e3NxbGFhYmJjY3Nid2luZG93c30iLCJxdWFudGl0eSI6MiwicHJpY2UiOjE5OS45OX0seyJpdGVtX2lkIjozLCJpdGVtX25hbWUiOiLoi7Hlm73lpI3ljbAiLCJxdWFudGl0eSI6MSwicHJpY2UiOjU5Ljk5fV

flag在最后一条里
palu{sqlaabbccsbwindows}
7.提交钓鱼文件的哈希32位大写
第2题的检测结果里面有:安恒云沙箱
palu{2977CDAB8F3EE5EFDDAE61AD9F6CF203}
8.提交攻击者留下的webshell-1密码
从第1题可以知道两个webshell分别是shell.php和a.php,分别搜索后查看
find / -name "shell.php"
cat /var/lib/docker/overlay2/4bc4b1046f364a2489bc8a2636f6be58ae1620139c2198b10610563e4860313f/diff/var/www/html/uploads/shell.php
find / -name "a.php"
cat /var/www/html/a.php

palu{hack}
9.提交攻击者开放端口
webserver下的/var/lib/docker/overlay2/4bc4b1046f364a2489bc8a2636f6be58ae1620139c2198b10610563e4860313f/diff/var/www/html/clean.sh找到端口1133
webserver下的/tmp/r.sh找到端口1144
PC2下的简历.exe请求的端口8084
palu{1133,1144,8084}
10.提交攻击者留下的webshell密码2
同第8题
palu{00232}
11.提交攻击者留下的隐藏账户的密码

palu{wmx_love}
12.[溯源]攻击者的邮箱
逆向病毒简历.exe找到用户名n0k4u

搜索发现仓库n0k4u/whatthis: 这是嘛呀?
然后先找到了第13题的QQ号Add files via upload · n0k4u/whatthis@9fde50f

这条commit的链接后面加.patch
From 9fde50f0bc13cc2bf916ecc95ca912bc7f0cd114 Mon Sep 17 00:00:00 2001
From: n0k4u <n0k4u@outlook.com>
Date: Thu, 1 May 2025 18:30:24 +0800
Subject: [PATCH] Add files via upload
---
"\346\210\221\347\232\204\346\227\245\350\256\260.txt" | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 "\346\210\221\347\232\204\346\227\245\350\256\260.txt"
diff --git "a/\346\210\221\347\232\204\346\227\245\350\256\260.txt" "b/\346\210\221\347\232\204\346\227\245\350\256\260.txt"
new file mode 100644
index 0000000..8cd105e
--- /dev/null
+++ "b/\346\210\221\347\232\204\346\227\245\350\256\260.txt"
@@ -0,0 +1,7 @@
+日记:
+2025年5月1日,我想和王美欣宝贝51出去玩,但是他说他要加班。。。。。
+51还要加班?我要入侵他们公司服务器看看真假。。。。
+
+好吧,你果然没有加班,你永远也别想抛开我,永远,我说的是永远!!!!
+
+密语:3834239649
\ No newline at end of file
palu{n0k4u@outlook.com}
13.提交溯源后得到的flag
从第12题得到QQ号3834239649
搜索添加好友

palu{loveyouibiejv}
应急响应主线
解压密码
Skills@@@Skills@@@Skills

| 主机名 | IP 地址 | 操作系统登录 | 服务登录 |
|---|---|---|---|
| JumpServer | 192.168.20.100 | ubuntu/ubuntu | http://192.168.20.100/ admin/Skills@2020 |
| sshServer | 192.168.20.108 | ubuntu/Skills@sshserver | |
| Server01 | 192.168.20.103 | ubuntu/Skills@server | http://192.168.20.103:16303/9bbe149955 c394c5de46/e36c392092 http://192.168.20.102:3000/ admin@qq.com/未知 |
| Mysql | 192.168.20.101 | ubuntu/Skills@mysql | http://192.168.20.101:20221/4a883f0c56 64a44f8137/f8941f8eb7 root/mysql_QPiS8y |
| Waf | 192.168.20.102 | ubuntu/Skills@waf | https://192.168.20.102:9443/ admin/VF6NXMs7 |
| palu01 | 192.168.20.200 | Parloo/Skills@01 | |
| palu02 | 192.168.20.201 | Parloo/Skills@02 | |
| palu03 | 192.168.20.202 | Parloo/Skills@03 | 此靶机为"近源"对应靶机 |
solar_Linux后门排查
跳板机疑似被遗留后门,请排查
1、找到可疑进程完整路径
2、找到被横向的服务器IP
3、连接被横向服务器
flag格式为 flag{base64{完整路径}|服务器IP|服务器中flag文本}
root:Solar@2025_05_palu!
查看当前建立的网络连接
sudo ss -antup

得到pid是11,被横向的服务器IP是49.232.112.164
查找pid是11的进程
ps aux | grep 11

得到可疑进程完整路径是/usr/lib/systemd/systemd-login
ssh 49.232.112.164

ssh连接得到flag文件内容为ZX0001S
flag{L3Vzci9saWIvc3lzdGVtZC9zeXN0ZW1kLWxvZ2lu|49.232.112.164|ZX0001S}
1.提交堡垒机中留下的flag
标签列表

palu{2025_qiandao_flag}
2.提交WAF中隐藏的flag
身份验证->配置

palu{2025_waf}
3.提交Mysql中留下的flag
从说明手册拿到MySQL的登录信息root/mysql_QPiS8y,然后用Navicat连

palu{Mysql_@2025}
4.提交攻击者的攻击IP

palu{192.168.20.107}
5.提交攻攻击者最早攻击时间
第4题的图里有
palu{2025-05-05-00:04:40}
6.提交web服务泄露的关键文件名
在防护应用下四个服务的应用路由里找

palu{key.txt}
7.提交泄露的邮箱地址
访问第7题找到的关键文件 http://192.168.20.102/bak/key.txt

palu{parloo@parloo.com}
8.提交立足点服务器ip地址
第4题图里的日志
palu{192.168.20.108}
9.提交攻击者使用的提权的用户和密码
cat /etc/shadow
查找sshserver下的用户

parloo:$y$j9T$bLw/vAsrL.71gbi6NQPhI/$lpN9vHI0MYs/YL19ERrpaRpdrC37f5ya520xeG9BGiC:20212:0:99999:7:::
把parloo:$y$j9T$bLw/vAsrL.71gbi6NQPhI/$lpN9vHI0MYs/YL19ERrpaRpdrC37f5ya520xeG9BGiC保存到hash.txt用john爆破
john --format=crypt hash.txt

palu{parloo/parloo}
10.提交攻击者留下的的文件内容作为flag提交
find / -iname "flag" 2>/dev/null

在/home/parloo找到parloo_flag01
cat /home/parloo/parloo_flag01
palu{hi_2025_parloo_is_hack}
11.提交权限维持方法服务的名称
systemctl list-units --type=service --state=running
先查看正在运行的服务

其中的rootset-test.service十分可疑
systemctl cat rootset-test.service
查看它的配置文件:
[Unit]
Description=rootset-test
ConditionFileIsExecutable=/usr/bin/b4b40c44ws
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/b4b40c44ws
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/rootset-test
[Install]
WantedBy=multi-user.target
/usr/bin/b4b40c44ws非常可疑,文件名看起来像是随机生成的,很可能是恶意程序。
Restart=always无论服务退出的原因是什么,都会自动重启,可能是攻击者用来维持后门的。
基本可以确定rootset-test就是用于维持权限的了,但是把这个提交了发现不对。
注意到有一个名字很像的rootset.service,查看它的配置文件:
[Unit]
Description=rootset
ConditionFileIsExecutable=/usr/bin/b4b40c44ws
[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/bin/b4b40c44ws
Restart=always
RestartSec=120
EnvironmentFile=-/etc/sysconfig/rootset
[Install]
WantedBy=multi-user.target
和rootset-test的几乎一模一样,提交上去这回正确了。
palu{rootset}
12.提交攻击者攻击恶意服务器连接地址作为flag提交

把b4b40c44ws提取出来丢奇安信情报沙箱分析

palu{47.101.213.153}
13.找到系统中被劫持的程序程序名作为flag提交

按时间排序,发现id近期被修改过
提取出来丢到奇安信情报沙箱发现也是恶意程序
palu{id}
14.找到系统中存在信息泄露的服务运行端口作为flag提交

palu{8081}
15.提交Parloo公司项目经理的身份证号作为flag提交
上题找到的http://192.168.20.103:8081/

palu{310105198512123456}
16.提交存在危险功能的操作系统路径作为flag提交
/ # cat /etc/passwd
root:x:0:0:root:/root:/bin/sh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
catchlog:x:100:101:catchlog:/:/sbin/nologin
git:x:1000:1000::/data/git:/bin/bash
直接修改会由于是root用户而修改失败,因此使用别的用户进行操作
/ # su git
224d7f8df25c:/$ gitea admin user change-password --username admin --password 12345678
admin's password has been successfully updated!
接下来就可以用admin/12345678登录gitea了
在parloo-code/main.go 位于 main - parloo-code - Gitea: Git with a cup of tea找到后门入口

palu{/admin/parloo}
17.提交近源机器中恶意程序的MD5作为flag进行提交

检测结果:奇安信情报沙箱
palu{0f80a82621b8c4c3303d198d13776b34}
18.提交攻击者留下的恶意账户名称md5后作为flag进行提交

palu{d78b6f30225cdc811adfe8d4e7c9fd34}
19.提交内部群中留下的flag并提交
看聊天记录

palu{nbq_nbq_parloo}
20.请提交攻击者使用维护页面获取到的敏感内容作为flag进行提交
进入维护页面http://192.168.20.102:8081/admin/parloo

在面板直接搜command.log就行

palu{Server_Parloo_2025}
21.提交获取敏感内容IP的第一次执行命令时间作为flag进行提交
从上一题就知道攻击者的IP是192.168.20.1

搜索这个IP然后从上往下一条条看
palu{2025-05-04:15:30:38}
22.提交攻击者使用的恶意ip和端口flag格式为

palu{10.12.12.13:9999}
23.提交重要数据的明文内容作为flag提交
在PC3桌面找到重要的数据.txt,密文如下:
c3a1c3c13e326020c3919093e1260525045e
在encode/encode.py 位于 main - encode - Gitea: Git with a cup of tea找到加密代码

def custom_encrypt(text, key):
encrypted = []
key_bytes = [ord(c) for c in key]
for i, char in enumerate(text):
shifted = ord(char) + (i % 5 + 1)
xor_key = key_bytes[i % len(key_bytes)]
xored = shifted ^ xor_key
substituted = ((xored & 0x0F) << 4) | ((xored & 0xF0) >> 4)
encrypted.append(f"{substituted:02x}")
return "".join(encrypted)
写个脚本爆破一下
import string
from itertools import product
from multiprocessing import Pool, cpu_count
def nibble_swap(val):
return ((val & 0x0F) << 4) | ((val & 0xF0) >> 4)
def custom_decrypt(ciphertext_hex, key_string):
key_bytes = [ord(c) for c in key_string]
len_key = len(key_bytes)
if len_key == 0:
return None
hex_pairs = [ciphertext_hex[j:j+2] for j in range(0, len(ciphertext_hex), 2)]
decrypted_plaintext_chars = []
for i, enc_byte_hex in enumerate(hex_pairs):
try:
substituted = int(enc_byte_hex, 16)
except ValueError:
return None
xored = nibble_swap(substituted)
xor_key_val = key_bytes[i % len_key]
shifted = xored ^ xor_key_val
shift_amount = (i % 5 + 1)
ord_char = shifted - shift_amount
if not (0 <= ord_char <= 0x10FFFF):
return None
try:
char_val = chr(ord_char)
except ValueError:
return None
decrypted_plaintext_chars.append(char_val)
return "".join(decrypted_plaintext_chars)
def is_all_printable(text):
if text is None:
return False
for char_code in text:
if not char_code.isprintable():
return False
return True
def worker_task(args):
prefix, suffix_length, key_charset, ciphertext, known_suffix = args
results = []
for suffix in product(key_charset, repeat=suffix_length):
key_candidate = prefix + ''.join(suffix)
plaintext = custom_decrypt(ciphertext, key_candidate)
if plaintext and is_all_printable(plaintext) and plaintext.endswith('}'):
results.append(f"{key_candidate}:{plaintext}")
return results
def solve_with_multiprocessing(prefix, max_len, key_charset, ciphertext):
for suffix_len in range(0, max_len - len(prefix) + 1):
print(f"Trying keys with length {len(prefix) + suffix_len}...")
pool_size = cpu_count()
chunksize = 1000
total_keys = len(key_charset) ** suffix_len
print(f"Total combinations: {total_keys}")
args_list = [(prefix, suffix_len, key_charset, ciphertext, '')] * pool_size
with Pool(pool_size) as pool:
results = pool.map(worker_task, [(prefix, suffix_len, key_charset, ciphertext, '') for _ in range(pool_size)])
for result_group in results:
for res in result_group:
print(res)
ciphertext = "c3a1c3c13e326020c3919093e1260525045e"
# 根据palu{可以解出密钥的前半段是MySec,进一步猜测是MySecret开头然后再进行爆破
known_key_prefix = "MySecret"
key_charset = string.ascii_letters + string.digits
MAX_KEY_LENGTH = 16
if __name__ == '__main__':
print("Starting multi-process decryption brute-force...")
solve_with_multiprocessing(known_key_prefix, MAX_KEY_LENGTH, key_charset, ciphertext)
密钥太长了爆破不现实。根据palu{解出密钥的前半段是MySec,可以进一步猜到密钥以MySecret开头,然后再以MySecret开头进行爆破

爆出来一堆palu{Pas***rd-000}格式的符合条件的结果,不难猜到明文是palu{Password-000}
用palu{Password-000}推出来的密钥是MySecretKey
palu{Password-000}
24.提交恶意维权软件的名称作为flag进行提交

启动项里的未知程序
经过奇安信情报沙箱检测发现是恶意程序
palu{svhost}
25.提交恶意程序的外联地址

一眼Python打包的,解包后在线分析

palu{88.173.90.103}
26.提交攻击者使用的恶意dnslog域名作为flag进行提交
同第20题在面板直接搜command.log

palu{np85qqde.requestrepo.com}
27.提交寻找反序列化漏洞的端口作为flag进行提交

各试一遍就知道了
palu{9999}
28.提交web服务泄露的密钥作为flag进行提交

http://192.168.20.102:9999/actuator/heapdump
发现存在 heapdump 泄露,用 whwlsfb/JDumpSpider 分析

palu{QZYysgMYhG6/CzIJlVpR2g==}
29.提交攻击者开始攻击的时间作为flag进行提交
访问日志的第一条

palu{2025/05/13:16:45:19}
30.提交攻击者在server中留下的账户密码作为flag进行提交
cat /etc/shadow
把密码信息提取出来
parloohack:$y$j9T$RlIs4rqy6D2PI46ntcuwZ0$WFD6WgX3XC4zp/5Y.Jq9yLcfhHK5Rdg6IeDq2Rrl791:20221:0:99999:7:::
hashcat还不支持yescrypt,用john爆破,把上面的哈希保存到hash.txt后运行john hash.txt --wordlist=./wordlists/rockyou.txt --format=crypt
Using default input encoding: UTF-8
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Cost 1 (algorithm [1:descrypt 2:md5crypt 3:sunmd5 4:bcrypt 5:sha256crypt 6:sha512crypt]) is 0 for all loaded hashes
Cost 2 (algorithm specific iterations) is 1 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
123456 (parloohack)
1g 0:00:00:01 DONE (2025-05-28 19:58) 0.8525g/s 81.84p/s 81.84c/s 81.77C/s 123456..yellow
Use the "--show" option to display all of the cracked passwords reliably
Session completed
palu{parloohack/123456}
31.提交攻击者维权方法的名称作为flag进行提交
查看server的所有服务单元
systemctl list-units --type=service --all

palu{parloohack_script.service}
32.提交攻击者留下的木马md5后作为flag进行提交

palu{4123940b3911556d4bf79196cc008bf4}
33.提交攻击者留下的溯源信息作为flag进行提交
PC2的谷歌浏览器里面查看密码

palu{X5E1yklz1oAdyHBZ}
34.提交攻击者的githubID作为flag进行提交
上一题的用户名是QQ号,查看他的QQ空间

palu{ParlooSEc}
35.提交攻击者在github下留下的的内容作为flag进行提交
ParlooSEc/fffflllgggg: fffflllgggg
palu{s5o3WkX33hptyJjk}
36.提交恶意用户的数量作为flag进行提交
PC1

从parloo01开始的,所以是99个
palu{99}
37.提交恶意用户的默认密码作为flag进行提交
不知道为啥用mimikatz提取失败了,所以这里用R-Studio把它们提出来分析
在C:\Windows\System32\config提取出SAM和SYSTEM
lsadump::sam /sam:sam /system:system

全都是32ed87bdb5fdc5e9cba88547376818d4

palu{123456}
38.提交业务数据中攻击者留下的信息作为flag进行提交
gitea的数据库

palu{crP1ZIVfqrkfdhGy}
39.提交私人git仓库中留下的内容作为flag进行提交

base64解码
palu{FO65SruuTukdpBS5}
40.提交存在在mysql服务器中的恶意程序的MD5作为flag进行提交

more .bash_history
查看执行过的命令
发现攻击者计算过~下的.a的md5值,并将其复制到/home/ubuntu后将/home/ubuntu/.a删除

palu{ba7c9fc1ff58b48d0df5c88d2fcc5cd1}
41.提交恶意程序中模拟c2通信的函数名称作为flag进行提交
提出来逆向分析

palu{simulate_network_communication}
42.提交恶意程序创建隐藏文件的名称作为flag提交

palu{.malware_log.txt}
43.提交恶意程序中模拟权限提升的函数作为flag进行提交

palu{simulate_privilege_escalation}
44.提交被钓鱼上线的用户名作为flag进行提交

palu{Parloo-子怡}
45.提交恶意程序的所在路径作为flag进行提交
上一题的图有
palu{C:\Users\Public\Nwt\cache\recv\Parloo-沉沉}
46.分析恶意程序的反连地址作为flag进行提交

palu{47.101.213.153}
47.提交恶意c2的服务器登录的账号密码作为flag进行提交
PC2的谷歌浏览器里面查看密码

palu{admin/admin@qwer}

浙公网安备 33010602011771号