2016-02-05 3 views
0

Я застрял в этой задаче на вопрос, который я решаю сделать с тестированием на проникновение, нам предоставлен простой TCP-сервер, и мы должны подключиться к нему и дать два значения, если они совпадают в конце, мы получим флаг, нам также предоставляется фрагмент кода сервера. Я попробовал все, что знаю, чтобы получить флаг. Вот код:Ввод кода python на сервер сокетов TCP

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() 
+0

Есть ли ограничение на количество попыток? –

+0

Nevermind. Вам не нужно больше одного. –

+0

Красивый мозг тизер. –

ответ

2

Просто отправьте строку firstNum в качестве второго сообщения. Тогда вы преуспеете, независимо от того, что вы использовали в качестве значения для FirstNum первоначально:

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

Это можно легко сделать с телнет

$ 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) в качестве первого числа, немедленно отправит вам значение флага назад. Обратите внимание, что это не работает с тестовым сервером, поэтому я предполагаю, что исходный код немного отличается и не просто выполняет какой-либо код, заданный удаленным пользователем, а только если он соответствует ожиданиям вашей задачи. Но он работает с моей тестовой установкой данного кода.

Это, надеюсь, приведет вас к выводу о том, что никогда не следует просто использовать нестандартный пользовательский ввод.

+0

... Не могу поверить, что я не думал об этом, я думаю, что меня вызвали другие 20+ проблемы, которые я должен сделать сегодня, спасибо вам большое. – Zunon

1

Обратите внимание, что числа преобразуются из строки в «номер» с помощью eval. Это означает, что вам не нужно передавать число, просто что-то оценивающее как одно. Поскольку eval использует локальные переменные, вы можете подать в строке -0.5 * (ord(flag[4]) + ord(flag[8]) + ord(flag[5])) для firstNum, что сделает следующий набор строк firstNum равным нулю. Затем вы можете передать литерал 0 за secondNum и получить flags.

Возможно, вам потребуется заполнить строку до 1024 символов. Я бы сделал что-то вроде output.center(1024, ' ').

+0

Не работает, он не запрашивает у меня второе число, тогда он закрывает соединение, возможно, это происходит потому, что оно генерирует исключение, и оно имеет , за исключением: pass или, возможно, из-за меня подключается через nc on терминал? Я не уверен – Zunon

+0

Есть ли сайт или что-то, что имеет инструкции? Я не хочу случайным образом пинговать сервер, с которым я не знаком. –

+0

Мое решение теоретически правильно, но фрагмент явно неполный. Тем не менее, сценарий Стивена очень прав. –

Смежные вопросы