Получение ответов из пользовательского слоя со scapy с помощью StreamSocket - PullRequest
1 голос
/ 24 сентября 2019

Я новичок в scapy и пытаюсь создать собственный пакет IPP (Internet Printing Protocol), используя scapy

from scapy.packet import Packet
from scapy.fields import LEShortField, ShortField, IntField, XByteField, StrField

class IPP(Packet):
    name = "IPP"

    fields_desc = [
        LEShortField("version", 1),
        ShortField("Op-Id", 11),
        IntField("request-id", 11),

        XByteField("start", 1),

        XByteField("char-code", 71),
        ShortField("len", 18),
        StrField("attr1", b'attributes-charset'),
        ShortField("len-1", 5),
        StrField("attr-value1", b'utf-8'),

        XByteField("lang-code", 72),
        ShortField("len-2", 27),
        StrField("attr2", b'attributes-natural-language'),
        ShortField("len-3", 5),
        StrField("attr-value2", b'en-us'),

        XByteField("uri-code", 69),
        ShortField("len-4", 11),
        StrField("attr3", b'printer-uri'),
        ShortField("len-5", 34),
        StrField("attr-value3", b'http://192.168.80.189:631/printer1'),

        XByteField("end", 3),
    ]

    def guess_payload_class(self, payload):
        return payload

Я добавил следующий код в Python3.7 / dist-packages / scapy /layer / ipp.py

Следовательно, IPP (протокол Интернет-печати) реализован с использованием HTTP, я добавил слой HTTP перед настраиваемым IPP Layer

Для управления TCP-трехсторонним рукопожатием я использовал scapy StreamSocket

from scapy.layers.http import HTTP, HTTPRequest
from scapy.layers.ipp import IPP
from scapy.all import StreamSocket
import socket

ipp_request = HTTP()/HTTPRequest(
    Method=b'POST',
    Path=b'/printer1',
    Connection=b'Keep-Alive',
    Content_Type=b'application/ipp',
    User_Agent=b'Internet Print Provider',
    Content_Length=b'125',
    Host=b'192.168.80.189:631'
)/IPP()

if __name__ == "__main__":

    my_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    my_soc.connect(("192.168.80.189", 631))

    my_stream = StreamSocket(my_soc)
    my_stream.basecls = IPP

    reply, ans = my_stream.sr(ipp_request)

Я могу успешно отправить пакет IPP, но я не могу получить ответы. Я получаю ответ, например

Begin emission:
Finished sending 1 packets.
.......
Received 7 packets, got 0 answers, remaining 1 packets

, кажется, не работает, Любая помощь оченьоценили.

...