第二届“Parloo”CTF应急响应挑战赛-应急相应方向-WriteUp

畸形的爱

攻击者ip地址1

nginx日志 31网段之外的基本都是内网ip,所以不考虑
palu{192.168.31.240}

攻击者ip地址2

这道题目没做出来,主要原因是光做主线了,这个简单过了一下,没有在意到docker容器,在webserver中有一个webdata容器,开启会报错,原因是在题目创建时绑定了一个当时主机的ip,复现的虚拟机因为环境问题无法从挂起状态恢复导致虚拟机的ip被本地的dhcp更换了,所以开启不了,具体报错如下

1
2
3
root@ubuntu:/var/www/html# docker start WebData
Error response from daemon: driver failed programming external connectivity on endpoint WebData (d139b4f26019de0d9e2dc495f1917ce3e47443f38d283802da47eb972ded07cb): Error starting userland proxy: listen tcp 192.168.87.101:8061: bind: cannot assign requested address
Error: failed to start containers: WebData

通过下面命令可以临时加一条对应的ip让其临时开启容器进入里面查看数据

1
sudo ip addr add 192.168.87.101/24 dev ens33

进入机器后发现反弹的后门ip

palu{192.168.31.11}

暴力破解开始时间

这道题目也没做出来没注意到容器,这个日志是通过

1
docker logs phpmyadmin

获取到的,在这个容器中存在大量爆破日志

palu{2025:03:05:58}

flag1

win10直接搜索
palu{pc3_zgsfqwerlkssaw}

flag2

win10的最近使用里
palu{nizhidaowoyouduoainima}

flag3

这个也没做出来,具体原因似乎是没怎么在乎数据库的内容,光去看webserver了,从webserver的网页代码中获取到数据库的账号密码

通过账号密码连接数据库查看数据库数据,发现很多base64

挨个解码后发现第三个内容如下

1
[{"item_id":1,"item_name":"flag3palu{sqlaabbccsbwindows}","quantity":2,"price":199.99},{"item_id":3,"item_name":"英国复印","quantity":1,"price":59.99}]

palu{sqlaabbccsbwindows}

提交钓鱼文件的哈希32位大写

在回收站中有一个奇怪的zip恢复后

沙箱分析

palu{2977CDAB8F3EE5EFDDAE61AD9F6CF203}

webshell密码1

没做出来,没看容器,在容器中直接就能看到webshell密码

palu{hack}

攻击者开放3个端口

没接出来,这个本来是想法查网络端口,但是没有思路,好多端口都开放。首先是第一个在攻击者ip2中,在清理脚本中就发现了一个反弹shell的脚本,上面就有端口

1133,其他目前没找到,然后据群友说有一个是在/tmp/r.sh位置,在第一次开机的时候存在

好像是1144,等官方题解吧。

webshell密码2

网站目录下
palu{00232}

隐藏账户的密码

没解出来,没发现隐藏账户。。赛后才发现
在win10中通过工具发现额外的账户

通过LaZagne获取出他的hash

然后通过kali跑一下字典,这个在cmd5中是可以查询到的,但是是付费的,直接通过万能群友直接出了

palu{wmx_love}
还有就是john就不要试了,我跑了15分钟都没出…

[溯源]攻击者的邮箱

没有解出来,没想到是这种方法。。。根据病毒侵害的主机得知王美欣的名字,去github搜索拿到githubid

并且同通过id可以去github用户反查api中得知他的邮箱为

palu{n0k4u@outlook.com}

[溯源]flag4

没解出来,上面搜索仓库拿到一个密语

这是一个qq号直接去添加拿到flag4

palu{loveyouibiejv}

solar_Linux后门排查

通过命令ss -tulnpa查看连接发现后门

通过pid直接拿到文件

直接连接过去这台机器

直接就出flag了

取证主线

1.提交堡垒机中留下的flag

flag:palu{2025_qiandao_flag}

2.提交WAF中隐藏的flag

palu{2025_waf}

3.提交Mysql中留下的flag


palu{Mysql_@2025}

4.提交攻击者的攻击IP

5.提交攻攻击者最早攻击时间

提交攻攻击者最早攻击时间flag格式为palu{xxxx-xx-xx-xx-xx-xx},这个时间格式是错误的。。。一直没交上,最后半小时才说格式不对。。

palu{2025-05-05-00:04:40}

6.提交web服务泄露的关键文件名

在waf的静态网站文件中有一个key.txt
palu{key.txt}

7.题解泄露的邮箱地址

在key.txt中最后面有邮箱
palu{parloo@parloo.com}

8.提交立足点服务器ip地址

palu{192.168.20.108}
服务端的爆破流量

堡垒机中的ssh爆破流量也来自108lastb

9.提交攻击者使用的提权的用户和密码

在sshserver中的passwd中发现parloo用户,通过john直接爆破出flag

palu{parloo/parlook}

10.提交攻击者留下的的文件内容作为flag提交

在sshserver中,在parloo用户的家目录中发现flag

11.提交权限维持方法的名称

没做出来,具体原因是没有思路。。。题目太多了就做别的题目了。。在sshserver中通过命令

1
systemctl list-units --type=service --state=running

列出了所有已经在运行的服务,发现有两个奇怪的服务

仔细看一下这个服务发现问题

运行的b4b40c44ws,这个在受感染的机器中可以找到,放入沙箱之后可以发现这是一个木马。
palu{rootset}

12.提交攻击者攻击恶意服务器连接地址作为flag提交

在Server01中发现后门用户的家目录中发现aa程序

ida分析

palu{47.101.213.153}

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

没解出来,在sshserver中,通过下面命令

1
find ./ -ytpe f -newermt "2025-05-6" ! -newermt "2025-05-010"

搜索近期5月份被修改的文件可以找到

题目说是被劫持的,所以是
palu{id}

14.找到系统中存在信息泄露的服务运行端口作为flag提交

在面板中或者服务器使用ss -tnl都可以发现额外的端口,直接访问
palu{8081}

15.提交Parloo公司项目经理的身份证号作为flag提交

在server01主机的8081端口中可以直接发现,可以直接编辑

palu{310105198512123456}

16.提交存在危险功能的操作系统路径作为flag提交

没做出来…在waf中发现有一个应用路由如下


发现可以执行命令
palu{/admin/parloo}

17.提交进源机器中恶意程序的MD5作为flag进行提交。

没做出来,火绒剑中可以看到启动项中存在一个奇怪的内容

文件拖入到沙箱中发现是恶意程序

palu{8cc6fc843882735e1c1152b383e35e3b}

18.提交攻击者留下的恶意账户名称md5后作为flag进行提交

在登录的时候就有hack 在用户目录下也发现了

palu{d78b6f30225cdc811adfe8d4e7c9fd34}

19.提交内部群中留下的flag并提交


palu{nbq_nbq_parloo}

20.请提交攻击者使用维护页面获取到的敏感内容作为flag进行提交

没出 在17题中,发现了软件的被代理端是server服务器上的,通过查看端口(waf中其实写好了是8080)->通过端口查pid-》id拿到文件位置-》拿到位置发现有日志

查看日志发现是空的,又通过用户记录发现了一个相同文件名字,查看拿到flag

日志很乱直接过滤flag就可以出了

palu{Server_Parloo_2025}

21.提交获取敏感内容IP的第一次执行命令时间作为flag进行提交

没出

对应20,日志第一条就是flag
palu{192.168.20.1}

22.提交攻击者使用的恶意ip和端口

没做出,通过下面命令拿到反弹shell地址

1
cat /var/log/parloo/command.log |grep -e "^\[" |awk -F "|" '{print $2}'


palu{10.12.12.13:9999}

23.提交重要数据的内容作为flag提交

没做出,在PC3机器发现重要数据,直接提交没用

具体的解密脚本在gitea的hack仓库中具体的进入私人仓库的方法可以在39问中找到,当时想到了可能是这个加密的,但是做其他的题目给忘了。。。具体的加密逻辑如下

1
2
3
4
5
6
7
8
9
10
11
12
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)

这里只是加密脚本需要自己推回来解密脚本,我这里直接通过ai出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def custom_decrypt(encrypted_text, key):
decrypted = []
key_bytes = [ord(c) for c in key]

# Process the encrypted text two characters at a time (hex pairs)
for i in range(0, len(encrypted_text), 2):
# Convert hex pair to integer
substituted = int(encrypted_text[i:i+2], 16)

# Reverse nibble swap
xored = ((substituted & 0x0F) << 4) | ((substituted & 0xF0) >> 4)

# Reverse XOR with key
xor_key = key_bytes[i // 2 % len(key_bytes)]
shifted = xored ^ xor_key

# Reverse the position-based shift
char_code = shifted - ((i // 2 % 5) + 1)

# Convert back to character
decrypted.append(chr(char_code))

return "".join(decrypted)

现在还缺少一个密钥,因为flag的格式是palu{他这里的几秒也是按位进行的,直接把条件给ai让他去推

前缀是MySec,最后面是一个k,我就不多加ai的截图了线索就是
MySec*k
这大概率是单词,后面可以菜是key中间大概率是秘密慢慢试就出了
MySecretKey
完整脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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)


def custom_decrypt(encrypted_text, key):
decrypted = []
key_bytes = [ord(c) for c in key]

# Process the encrypted text two characters at a time (hex pairs)
for i in range(0, len(encrypted_text), 2):
# Convert hex pair to integer
substituted = int(encrypted_text[i : i + 2], 16)

# Reverse nibble swap
xored = ((substituted & 0x0F) << 4) | ((substituted & 0xF0) >> 4)

# Reverse XOR with key
xor_key = key_bytes[i // 2 % len(key_bytes)]
shifted = xored ^ xor_key

# Reverse the position-based shift
char_code = shifted - ((i // 2 % 5) + 1)

# Convert back to character
decrypted.append(chr(char_code))

return "".join(decrypted)


print(custom_decrypt("c3a1c3c13e326020c3919093e1260525045e", "MySecretKey"))

palu{Password-000}

24.提交恶意维权软件的名称作为flag进行提交

没做出,同17问
palu{svhost}

25.提交恶意程序的外联地址

在palu3中家目录里有一个ipconfig

反编译后拿到原代码

敏感信息
palu{88.173.90.103}

26.提交攻击这使用的恶意dnslog域名作为flag进行提交

没做出,在22问的命令中,可以发现下面命令

肯定是他们其中一个,palu{np85qqde.requestrepo.com}

27.提交寻找反序列化漏洞的端口作为flag进行提交

没做出,可以在waf的反序列化攻击类型中找到相应的日志,然后日志不多就两页,挨个排查,出现404的基本不能存在反序列化漏洞了,嫌疑最大的就是9999

palu{9999}

28.提交web服务泄露的密钥作为flag进行提交

在server里有一个adminaf.jar,jadx反编译后拿到flag

palu{QZYysgMYhG6/CzIJlVpR2g==}

29.提交攻击者开始攻击的时间作为flag进行提交

这个没出,到现在也没出,看其他师傅的wp也都没出。。。

30.提交攻击者在server中留下的账户密码作为flag进行提交

在server主机的passwd中发现

通过 john拿到密码

palu{parloohack/123456}

31.提交攻击者维权方法的名称作为flag进行提交

在server主机中parloohack用户的bash_history中发现下面内容

采用服务的方式
palu{parloohack_script.service}

32.提交攻击者留下的木马md5后作为flag进行提交

在server主机中parloohack用户家目录中发现奇怪文件

通过沙箱发现是木马

palu{4123940b3911556d4bf79196cc008bf4}

33.提交攻击者留下的溯源信息作为flag进行提交

palu{X5E1yklz1oAdyHBZ}

34.提交攻击者的githubID作为flag进行提交

没出,在33题中的用户名是一个qq号,查看qq空间内容如下

palu{ParlooSEc}

35.提交攻击者在github下留下的的内容作为flag进行提交

没出,在34题中拿到id进入他的仓库拿到flag

palu{s5o3WkX33hptyJjk}

36.提交恶意用户的数量作为flag进行提交

palu{99}

37.提交恶意用户的默认密码作为flag进行提交

似乎不对,因为我是在java后门中找到的在server1主机中发现了一adminAF.jar反编译发现默认用户名是admin密码是123456

palu{123456}
这道题目是意外出的,按理说这个程序似乎是人家公司自己的,不是恶意用户。。。意外的。。。

38.提交业务数据中攻击者留下的信息作为flag进行提交

mysql主机的gitea的用户表中
palu{crP1ZIVfqrkfdhGy}

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

重置admin密码

1
224d7f8df25c:/$ gitea admin user change-password --username "admin" --password "Qwer1234"

登录发现flag(base64解码)

palu{FO65SruuTukdpBS5}

40.提交存在在mysql服务器中的恶意程序的MD5作为flag进行提交

没出,这个没仔细看…炒
在mysql的root目录下,存在下面内容

.a很可疑,ida反编译出下面内容

数据输出就是创建隐藏文件。。
palu{ba7c9fc1ff58b48d0df5c88d2fcc5cd1}

41.提交恶意程序中模拟c2通信的函数名称作为flag进行提交

没出,同40题目程序

palu{simulate_network_communication}

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

没出,同40题目程序

palu{.malware_log.txt}

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

没出,同40题目程序

palu{simulate_privilege_escalation}

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

只有在子怡的PC(PC2)中发现了浏览器的记录并且存在访问记录

palu{Parloo-子怡}

45.提交恶意程序的所在路径作为flag进行提交

没出,在PC2的聊天记录中发现

程序拖入沙箱是个木马

palu{C:\Users\Public\Nwt\cache\recv\Parloo-沉沉}

46.分析恶意程序的反连地址作为flag进行提交

没出,很奇怪这道题我怎么没出。。都找到了。。。依旧是在浏览器的账号管理中,44题的截图

palu{47.101.213.153}

47.提交恶意c2的服务器登录的账号密码作为flag进行提交。

palu2 谷歌浏览器中直接获取
palu{admin/admin@qwer}

写在后面

除了应急响应方向的应急1的攻击者开放3个端口应急2的29基本在赛后都出了,应急响应的比赛打得太少了,赛后复现感觉好多题目都能出,还得好好练练…