将python代码注入TCP套接字服务器

时间:2016-02-05 18:12:01

标签: python sockets tcp code-injection

对于我正在解决的渗透测试问题,我陷入了这个任务,我们得到了一个简单的TCP Web服务器,我们要连接到它并提供两个值,如果它们最终匹配,我们得到了标志,我们也得到了一段服务器代码。我已经尝试了所有我知道的旗帜。这是代码:

clientsock.send("Welcome to Maths_Server 1.0\n")
try:
    clientsock.send("Enter the first number, so I can EVALuate it:\n")
    firstNum = eval(clientsock.recv(1024))
    firstNum = firstNum + firstNum + ord(flag[4]) + ord(flag[8]) + ord(flag[5])
    clientsock.send("Enter the second number, so I can EVALuate it:\n")
    secondNum = eval(clientsock.recv(1024))
    if secondNum == firstNum:
        clientsock.send("The flag is: " + flag + "\n")
        firstNum = 0
        secondNum = 0
except:
    pass

clientsock.close()

2 个答案:

答案 0 :(得分:2)

只需将字符串firstNum作为第二条消息发送即可。然后,无论你最初使用的是firstNum的值,你都会成功:

    secondNum = eval(clientsock.recv(1024))
->  secondNum = eval("firstNum")
->  secondNum = ... value of firstNum

这可以通过telnet轻松完成

$ telnet services.cyberprotection.agency 3166
Welcome to Maths_Server 1.0
Enter the first number, so I can EVALuate it:
10
Enter the second number, so I can EVALuate it:
firstNum
The flag is: .... (try yourself)...

另一种可能性是你只需发送字符串clientsock.send(flag)作为第一个数字,它会立即向你发送flag的值。请注意,这不适用于测试服务器,因此我猜测源代码略有不同,并且不会简单地执行远程用户给出的任何类型的代码,但只有当它符合您所获得的任务的期望时。但它适用于我对给定代码的测试安装。

希望能够让您得出以下结论:永远不要只是评估未经授权的用户输入。

答案 1 :(得分:1)

请注意,这些数字是从字符串转换为"数字"使用eval。这意味着您不需要传入数字,只需要将其评估为一个数字。由于eval使用了局部变量,因此您可以为-0.5 * (ord(flag[4]) + ord(flag[8]) + ord(flag[5]))提供字符串firstNum,这会使下一行firstNum设置为零。然后,您可以为0传递文字secondNum并获取flags

您可能需要将字符串填充为1024个字符。我会做output.center(1024, ' ')之类的事情。