这波Aura✌tql,仅凭一己之力干完了应急响应,本菜鸡直接被带飞OrzOrz

比赛的时候根本跟不上aura✌的进度,虽说看了题但是没做几道,现在好好复现一下。

除了应急响应以外的题就不复现了,都是musc。。。

主线

第二届“Parloo”CTF应急响应挑战赛应急响应场景挑战说明手册.pdf

1

提交堡垒机中留下的flag 附件下载地址:百度网盘 https://pan.baidu.com/s/1otqDnpKTOEsPZQiWSE8ECg?pwd=6666 提取码: 6666 夸克网盘 https://pan.quark.cn/s/46653bd06cca 123云盘 https://www.123865.com/s/qDVvjv-zVBod 提取码:6666 **解压密码:应急响应环境解压密码网络拓扑环境 Skills@@@Skills@@@Skills 畸行的爱 Parloo&zgsfsys&onefox&solar**juyt**

登录面板即可看到flag

img

palu{2025_qiandao_flag}

2

提交WAF中隐藏的flag

进入雷池面板即可找到

img

palu{2025_waf}

3

提交Mysql中留下的flag

先在面板中搜索一下flag

img
img

palu{Mysql_@2025}

4

提交攻击者的攻击IP

看waf的拦截记录

img

palu{192.168.20.107}

5

提交攻攻击者最早攻击时间flag格式为palu{xxxx-xx-xx-xx-xx-xx}

这题题目要求的格式有问题。。。

由上题可知

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

6

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

waf中查看路由配置,可以看到泄露了一个key.txt

img

palu{key.txt}

7

提交泄露的邮箱地址

访问一下这个泄露的路由可以看到里面有提到邮箱

img

palu{parloo@parloo.com}

8

提交立足点服务器ip地址

192.168.20.108是sshserver的ip,但是却存在攻击行为,因此可以判断是立足点服务器

img

palu{192.168.20.108}

9

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

提交格式

palu{账号/密码}

在sshserver中找到恶意用户的账密密文

img

用jtr爆破一下

img

palu{parloo/parloo}

10

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

在sshserver的/home/parloo下

img

palu{hi_2025_parloo_is_hack}

11

提交权限维持方法服务的名称

列出sshserver上正在运行的服务

img

palu{rootset}

12

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

在server中可以找到一个叫aa的程序,提取出来

img

丢进IDA就能看见

img

palu{47.101.213.153}

13

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

在sshserver中对/usr/bin下的程序按照修改时间排序

img

palu{id}

14

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

img

palu{8081}

15

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

img

palu{310105198512123456}

16

提交存在危险功能的操作系统路径作为flag提交。flag格式为palu{/xxx/xxx}

可以看到存在危险路由

img

palu{admin/parloo}

17

提交进源机器中恶意程序的MD5作为flag进行提交。 flag格式为palu{MD5小写}

可以发现palu03机器的temp文件夹中存在一个奇怪的文件,同时也可以注意到机器开机时就报的一个错svhost.exe已停止运行

img
img

palu{0f80a92621b8c4c3303d198d13776b34}

18

提交攻击者留下的恶意账户名称md5后作为flag进行提交。 格式为palu{md5{xxxxx}}

登录时发现有个hack用户

img
img

palu{d78b6f30225cdc811adfe8d4e7c9fd34}

19

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

查看聊天记录就能看到

img

palu{nbq_nbq_parloo}

20

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

server中cat /var/log/parloo/command.log查看日志即可看到

img

palu{Server_Parloo_2025}

21

提交获取敏感内容IP的第一次执行命令时间作为flag进行提交。flag格式为palu{xxxx-xx-xx:xx:xx:xx}

根据上题日志

img

palu{2025-05-04:15:30:38}

22

提交攻击者使用的恶意ip和端口flag格式为palu{xx.xx.xx.xx:xxxx}

根据上题日志,可以看到一个反弹shell的命令

img

palu{10.12.12.13:9999}

23*

提交重要数据的明文内容作为flag提交

gitea中还有个hack用户,仓库中有个加密脚本

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)

然后不知道怎么推出来的密钥是MySecretKey,看其他wp说是根据flag的头部是palu{推出来的,不懂(

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def custom_decrypt(ciphertext, key):
decrypted = []
key_bytes = [ord(c) for c in key]
for i in range(0, len(ciphertext), 2):
hex_byte = ciphertext[i:i+2]
substituted = int(hex_byte, 16)
xored = ((substituted & 0x0F) << 4) | ((substituted & 0xF0) >> 4)

xor_key = key_bytes[(i // 2) % len(key_bytes)]
shifted = xored ^ xor_key

original_char_code = shifted - ((i // 2) % 5 + 1)
decrypted.append(chr(original_char_code))

return ''.join(decrypted)

key = "MySecretKey"
ciphertext = "c3a1c3c13e326020c3919093e1260525045e"
plaintext = custom_decrypt(ciphertext, key)
print(plaintext)

palu{Password-000}

24

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

就是第17题中那个程序

palu{svhost}

25

提交恶意程序的外联地址

在palu03机器中,用户文件夹下有个明显奇怪的用python写的ipconfig程序

img

简单逆向一下就能看到ip

img
img

palu{88.173.90.103}

26

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

继续看之前的日志

img

palu{np85qqde.requestrepo.com}

27

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

都是常见服务端口,除了8081前面用过了,那就只能是9999了

img

palu{9999}

28

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

在/opt下有个adminAF.jar

img

拿出来逆向一下

img

palu{QZYysgMYhG6/CzIJlVpR2g==}

29*

提交攻击者开始攻击的时间作为flag进行提交。flag各式为palu{xxxx/xx/xx:xx:xx:xx}

未知flag

30

提交攻击者在server中留下的账户密码作为flag进行提交。flag格式为palu{username/password}

查看/etc/shadow

img

jtr爆破

img

palu{parloohack/123456}

31

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

可以看到开机自启项中有一个可疑服务

img

palu{parloohack_script.service}

32

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

就是第12题中的aa

img

palu{4123940b3911556d4bf79196cc008bf4}

33

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

在palu02机器中,google浏览器中保存了两个用户,其中一个用户的备注里有flag

img

palu{X5E1yklz1oAdyHBZ}

34

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

上面的用户名是一个QQ号码,访问这个账号的空间有一条说说

img

palu{ParlooSEc}

35

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

img

palu{s5o3WkX33hptyJjk}

36

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

palu01机器中除了Parloo用户外还有99个用户

img

palu{99}

37

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

在palu01机器上可以找到一个叫a.vbs的脚本,是用来生成用户的

img
img

palu{123456}

38

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

连接mysql服务器中的gitea的数据库

看user表,有一个用户的密码是flag

img

palu{crP1ZIVfqrkfdhGy}

39

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

自己注册一个账户,然后把admin账户的passwd,rands,salt三个列都替换成我们新生成账户的

img

用我们新帐户的密码就能登陆admin,查看git仓库

img
img

40

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

存在一个叫.a的程序

img
img

palu{ba7c9fc1ff58b48d0df5c88d2fcc5cd1}

41

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

把.a提取出来逆向一下就行

img

palu{simulate_network_communication}

42

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

进入加密函数看一下

img

palu{.malware_log.txt}

43

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

由第41题

palu{simulate_privilege_escalation}

44

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

palu02机器中还有一段聊天记录

img

palu{Parloo-子怡}

45

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

由上题

palu{C:-沉沉}

46

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

从google浏览器的历史记录中就能看出

img

palu{47.101.213.153}

47

提交恶意c2的服务器登录的账号密码作为flag进行提交。flag格式为palu{username/password}

看google浏览器密码管理器中保存的密码即可

img

palu{admin/admin@qwer}

畸形的爱

应急响应之畸形的爱.pdf

1

提交攻击者使用的攻击ip地址1 flag格式为:palu{xxxx} 附件下载地址:百度网盘 https://pan.baidu.com/s/1otqDnpKTOEsPZQiWSE8ECg?pwd=6666 提取码: 6666 夸克网盘 https://pan.quark.cn/s/46653bd06cca 123云盘 https://www.123865.com/s/qDVvjv-zVBod 提取码:6666 **解压密码:应急响应环境解压密码网络拓扑环境 Skills@@@Skills@@@Skills 畸行的爱 Parloo&zgsfsys&onefox&solar**juyt**

查看webserver中nginx的日志

img

palu{192.168.31.240}

2

提交攻击者使用的攻击ip地址2. flag格式为:palu{xxxx}

查看webserver的webdata容器中clean.sh的内容

img

palu{192.168.31.11}

3

题解攻击者暴力破解开始时间。 flag为:palu{xx:xx:xx:xx}

查看phpmyadmin容器的日志

img

palu{2025:03:05:58}

4

提交攻击者留下的flag1 格式为palu{xxx}

img

palu{pc3_zgsfqwerlkssaw}

5

提交攻击者留下的flag2 格式为:palu{xxxx}

继续翻看上面的flag1,后面执行了一条命令

img

查看a.bat

img

palu{nizhidaowoyouduoainima}

6

提交攻击者留下的flag3 提交格式为:palu{xxxx}

可以在webserver的/var/www/html/index.php中找到数据库的密码

img

查看数据库,可以看到content中有很多base64

img

其中Mr.chen的content解密即得flag

palu{sqlaabbccsbwindows}

7

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

在回收站中有个简历.zip,拿出来解压计算exe的哈希

img

palu{2977CDAB8F3EE5EFDDAE61AD9F6CF203}

8

提交攻击者留下的webshell-1密码 格式为:palu{xxxx}

查看webdata容器

img

palu{hack}

9*

提交攻击者开放端口 格式为:palu{xxx,xxx,xxx}

通过第二题中的clean.sh可以看到一个1133端口,以及攻击者使用的ip

根据其他wp,查看webserver和win10的网络状态还能看到1144和8084端口,但是我并没有找到,可能是我虚拟机启动方式的问题吧(

palu{1133,1144,8084}

10

提交攻击者留下的webshell密码2 格式为:palu{xxxx}

在webserver的/var/www/html下也有马

img

palu{00232}

11

提交攻击者留下的隐藏账户的密码 flag格式为:palu{xxxx}

取证大师一把梭

img

palu{wmx_love}

12

[溯源]攻击者的邮箱. flag格式为:palu{xxx}

逆向之前的简历.exe

img

可以看到n0k4u这个人,去github上能找到他的账号

img

通过api溯源到这个注册账号的邮箱

img

palu{n0k4u@outlook.com}

13

提交溯源后得到的flag flag格式为:palu{xxx}

上体找到的github账户唯一的repo内容如下

img

这个密语其实是个qq号,尝试添加好友就能看到flag

img

palu{loveyouibiejv}

CTF

再记录几道当时我做的CTF部分的题目吧 :)

Misc

screenshot

有个笨比截图flag的时候不小心发到群里了,细心和反回撤的群友已经偷偷记录下来了

img

时间折叠(TimeFold Paradox)

题目

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
41
[1970-01-01 08:00:00] System boot sequence initiated
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 00000000fe ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 10000000ef ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 20000000e2 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 30000000fb ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 40000000f5 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 50000000da ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 60000000e6 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 70000000e7 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 80000000fd ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 90000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 100000000e7 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 110000000fd ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 120000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 130000000cf ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 140000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 150000000dd ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 160000000ef ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 170000000e3 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 180000000fe ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 190000000e2 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 200000000eb ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 210000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 220000000c8 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 230000000e2 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 240000000ef ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 250000000e9 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 260000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 270000000cd ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 280000000e6 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 290000000ef ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 300000000e0 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 310000000e9 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 320000000eb ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 330000000d1 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 340000000c3 ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 350000000eb ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 360000000af ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 370000000af ns
[1970-01-01 08:00:00] SYSTEM ALERT: Time anomaly detected at 380000000f3 ns
[1970-01-01 08:00:00] System entering chronostasis mode

将每一个十六进制数的末两位提取出来然后xor brute force

img

时空交织的密语

将二进制fromhex以后可以发现每四个字节是一组,而且前28位完全相同因此提取出每组的最低四位

1
2
3
4
5
6
f=open('timestream.bin','rb')
s=f.read()
x=''
for i in range(3,len(s),4):
x+=str(hex(s[i]%16)[2:])
print(x)

发现将第一个数字删去以后fromhex就能得到flag

img

几何闪烁的秘密

稍微把有字的帧分离一下,每一个图形内出现过的字是一段,每段出现三遍,但是每遍都会缺几个字符,把三遍结合起来看,最后把四段拼起来解base64就行

palu{master_of_geometry}

时间循环的信使

按照时间戳排序,如果|后面的字符都是一样的就提取出来,拼起来后fromhex

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
from Crypto.Util.number import long_to_bytes
data = []
with open("timeloop.log", "r") as f:
for line in f:
stripped = line.strip()
if stripped:
parts = stripped.split("|")
data.append(parts)
for i in range(len(data)):
for j in range(i + 1, len(data)):
if data[i][0] > data[j][0]:
data[i], data[j] = data[j], data[i]
res_str = ""
for item in data:
second_field = item[1]
first_char = second_field[0]
all_same = True
for ch in second_field:
if ch != first_char:
all_same = False
break
if all_same:
res_str += first_char
hex_num = int(res_str, 16)
print(long_to_bytes(hex_num))
#b'palu{Time_1s_cycl1c@l_0x}'

Crypto

循环锁链

flag的下一位是前一位xor的密钥

1
2
3
4
5
6
7
8
f=open('flag.enc','rb')
s=f.read()
tmp=112
flag=''
for i in range(len(s)-1,0,-1):
flag+=chr(s[i]^tmp)
tmp=s[i]^tmp
print('p'+flag[::-1])

轮回密码

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import base64


def samsara_encrypt(text, key_word):
cycle_step = len(key_word) % 6 + 1

phase1 = bytes([(c >> cycle_step) | ((c << (8 - cycle_step)) & 0xFF) for c in text])

phase2 = base64.b85encode(phase1)

phase3 = bytes([(c >> cycle_step) | ((c << (8 - cycle_step)) & 0xFF) for c in phase2])

return bytes([phase3[i] ^ key_word[i % len(key_word)] for i in range(len(phase3))])


if __name__ == "__main__":
flag = b"palu{********}"
key = b""
cipher = samsara_encrypt(flag, key)
print("轮回密文:", cipher.decode('latin-1'))

轮换加密,照着逻辑换回去就行

exp

1
2
3
4
5
6
7
8
9
10
11
import base64

cipher_text = 'y¦_›6>X¬y–!,!n¡mSaÜñüë—9¼6™'.encode('latin-1')
key=b'Bore'
cycle_step = len(key) % 6 + 1
phase3=bytes([cipher_text[i] ^ key[i % len(key)] for i in range(len(cipher_text))])
phase2=bytes([ ((c >> (8 - cycle_step))|(c << cycle_step) & 0xFF) for c in phase3])
phase1=base64.b85decode(phase2)
flag=bytes([(c >> (8 - cycle_step) | ((c << cycle_step)) & 0xFF) for c in phase1])
print(flag)
#b'palu{reincarnation_cipher}'

RSA_Quartic_Quandary

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
import sympy as sp
from Crypto.Util.number import long_to_bytes
def solve_p_q(pq, p4_plus_q4):
x, y = sp.symbols('x y')
eq = (x**2 - 2 * y)**2 - 2 * y**2 - p4_plus_q4
solutions_for_x = sp.solve(eq.subs(y, pq), x)
results = []
for x_sol in solutions_for_x:
t = sp.symbols('t')
quadratic_eq = t**2 - x_sol * t + pq
roots = sp.solve(quadratic_eq, t)
results.append(roots)

return results
n = 125997816345753096048865891139073286898143461169514858050232837657906289840897974068391106608902082960171083817785532702158298589600947834699494234633846206712414663927142998976208173208829799860130354978308649020815886262453865196867390105038666506017720712272359417586671917060323891124382072599746305448903
s = 35935569267272146368441512592153486419244649035623643902985220815940198358146024590300394059909370115858091217597774010493938674472746828352595432824315405933241792789402041405932624651226442192749572918686958461029988244396875361295785103356745756304497466567342796329331150560777052588294638069488836419744297241409127729615544668547101580333420563318486256358906310909703237944327684178950282413703357020770127158209107658407007489563388980582632159120621869165333921661377997970334407786581024278698231418756106787058054355713472306409772260619117725561889350862414726861327985706773512963177174611689685575805282
solutions = solve_p_q(n, s)
e = 65537
c = 16076213508704830809521504161524867240789661063230251272973700316524961511842110066547743812160813341691286895800830395413052502516451815705610447484880112548934311914559776633140762863945819054432492392315491109745915225117227073045171062365772401296382778452901831550773993089344837645958797206220200272941
for i, sol in enumerate(solutions):
if int(sol[0])>0 and int(sol[1])>0:
p = int(sol[0])
q = int(sol[1])
d = pow(e, -1, (p-1)*(q-1))
m = pow(c, d, n)
print(long_to_bytes(m))
#b'palu{This_is_a_fake_flag_change_it_for_real_use}'