阅读:3813回复:0
2014年澳大利亚信息安全挑战 CySCA CTF 官方write up Crypto篇
from:https://www.cyberchallenge.com.au/CySCA2014_Crypto.pdf
◆0 背景 Fortcerts开发了不少涉及加密算法的程序并已经自行测试了这些程序,现在他们想要了解其他人对于这些加密程序安全性的看法。 ◆1 标准银河字母(Standard Galactic Alphabet) Question 请对Fortcerts自定义加密算法的Slightly Secure Shell程序进行白盒测试。找出漏洞并证明其可以利用来获取机密信息。服务器运行在172.16.1.20:12433 Source #!python a580fd052a2f1ef9a0753ee36ad6bd51-crypt01.py === snip... === def execute_command(command,plain,coded): print "Running command: bash %s" % command proc = subprocess.Popen(("/bin/bash","-c",command),stdout=subprocess.PIPE,stderr=subprocess.PIPE) proc.wait() stdoutdata = proc.stdout.read() stdoutdata += proc.stderr.read() output = "" for letter in stdoutdata: if letter in plain: output += coded[plain language=".find(letter)"][/plain] else: output += letter return output def handle_client(conn,addr): plain = "`1234567890-=~!@#$%^&*()_+[]{}|;':",./?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ " conn.send("You have connected to the Slightly Secure Shell server of Fortress Certifications.n") coded = shuffle_plain(plain) command = "" conn.send("#>") while 1: data = conn.recv(1) if not data: break if data == "x7f" or data == "x08": if len(command) > 0: command = command[:-1] continue if data == "n" or data =="r": if len(command) == 0: continue conn.send("Running command: '%s'n" % command) cmd_stdout = execute_command(command,plain,coded) conn.sendall(cmd_stdout+"n") command = "" conn.sendall("Key resetn") coded = shuffle_plain(plain) conn.sendall("#>") else: if data not in plain: continue command += data conn.sendall(data) conn.close() === snip... === Designed Solution 选手可以在自定义命令之前发送一个echo命令来获得加密密钥并对输出值进行破译,然后使用多个命令来查找包含key的文件,并查看其内容。 Write Up 首先阅读系统提供的源码,明确程序读取用户的输入值,直到它获到一个换行符或回车符,然后通过bash来执行命令,并使用单码代换对命令的执行结果加密后将输出返回给用户。在此之后,密钥被重置。 我们可以通过管道命令来在单个密钥的使用过程中执行多个命令,基于此来恢复密钥和对输出进行解密。 下面连接到服务器来发送一些命令以验证我们的假设:可以执行多个命令并且密钥仅在命令都执行完后被重置。 #!bash #>nc 172.16.1.20 12433 You have connected to the Slightly Secure Shell server of Fortress Certifications. #>echo AAAA echo AAAARunning command: 'echo AAAA' 6666 Key reset #>echo AAAA;echo AAAA echo AAAA;echo AAAARunning command: 'echo AAAA;echo AAAA' zzzz zzzz Key reset #>echo AAAA;echo BBBB;echo ABAB echo AAAA;echo BBBB; echo ABABRunning command: 'echo AAAA;echo BBBB; echo ABAB' 8888 5555 8585 Key reset 可以看出A和B总是被相同字符替换,因此可以确定这是一个单码代换加密,同时可以得知密钥是在所有命令的输出结果显示之后再更新。 我们通过两个bash命令来执行任意命令,第一个echo明文字符串,第二个执行自定义命令。这样输出结果的开始将是密文字符表,剩下的内容就是第二个命令的输出。 #!bash #>echo abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; echo TestString echo abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; echo TestStringRunning command: 'echo abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; echo estString' _u;pSw"y|r^QFJ {tl |
|