Пример #1
0
#!/usr/bin/python

from scapy.all import socket, StreamSocket, Raw
from modlib import *

import socket

sock = socket.socket()
sock.connect(("217.128.188.179", 502))
s = StreamSocket(sock, basecls=ModbusADU)

ans, unans = s.sr(ModbusADU() / ModbusPDU03())
ans.show()
Пример #2
0
class IPP:
    def __init__(self, host, port=631, path="/ipp/print"):
        self.host = host
        self.port = int(port)
        self.path = "/" + path if path[0] != "/" else path

        self.my_socket = None
        self.my_stream = None

        # main ipp data field
        self.ipp_field = list()

        # all ipp attributes
        self.ipp_attr_group_tags = dict()
        self.ipp_attrs = dict()
        self.ipp_enums = dict()
        self.ipp_operations = dict()
        self.ipp_value_tags = dict()

        self.load_ipp_data()
        self.connect()

    def load_ipp_data(self):
        """
        Method to load all ipp data
        """
        logger = get_logger("Load ipp Data")
        logger.info("loading ipp required data")

        self.ipp_attr_group_tags = load_json_file(
            str(Path("protocols/ipp/ipp_data/ipp_attribute_group_tags.json")))

        self.ipp_attrs = load_json_file(
            str(Path("protocols/ipp/ipp_data/ipp_attributes.json")))

        self.ipp_operations = load_json_file(
            str(Path("protocols/ipp/ipp_data/ipp_operations.json")))

        self.ipp_value_tags = load_json_file(
            str(Path("protocols/ipp/ipp_data/ipp_attributes_value_tags.json")))

        self.ipp_enums = load_enum_data(
            str(Path("protocols/ipp/ipp_data/ipp_enum.json")))

        logger.info("loading ipp required data completed")

    def connect(self):
        """
        Method to initiate 3 way handshake
        """
        logger = get_logger("Three Way Handshake")
        logger.info("Initiating Three way Handshake")
        try:

            self.my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.my_socket.connect((self.host, self.port))
            self.my_stream = StreamSocket(self.my_socket)
            self.my_stream.basecls = InternetPrintingProtocol

        except socket.error as exc:
            logger.critical(f"Socket Error {exc}")

        finally:
            logger.info("Three way handshake completed")

    def form_ipp_packet(self, op_type, version=1.0, **kwargs):
        """
        Method to form ipp packets
        """

        logger = get_logger("IPP Packet Forming")
        logger.info("Initiating IPP Packet Crafting")

        ver = str(version).split(".")
        ver = "".join(ver)
        ver = SignedShortField("Version", int(ver))

        self.ipp_field.append(ver)

        data = ""

        operation_type = op_type

        if operation_type in self.ipp_operations.keys():

            self.ipp_field.append(
                SignedShortField("Operation-ID",
                                 self.ipp_operations[operation_type]))
            self.ipp_field.append(
                SignedIntField("Request-ID",
                               self.ipp_operations[operation_type]))
        else:
            logger.critical(f"Invalid operation tag : {operation_type}")
            print('Supported Operations')
            for op_rst in list(self.ipp_operations.keys()):
                print(f"* {op_rst}")
            sys.exit()

        delete_key = list()

        for delimiter_key, delimiter_value in kwargs.items():
            if type(delimiter_value) != dict:
                data = delimiter_value
                delete_key.append(delimiter_key)

        if len(delete_key) > 0:
            for del_key in delete_key:
                del kwargs[del_key]

        for delimiter_key, delimiter_value in kwargs.items():

            if type(delimiter_value) == dict:

                if delimiter_key in self.ipp_attr_group_tags.keys():

                    self.ipp_field.append(
                        XByteField(delimiter_key,
                                   self.ipp_attr_group_tags[delimiter_key]))

                    count = 0
                    for attr_key, attr_val in delimiter_value.items():

                        if attr_key in self.ipp_attrs.keys():

                            self.ipp_field.append(
                                XByteField(f"key_{attr_key}_{count}",
                                           self.ipp_attrs[attr_key][1]))

                            self.ipp_field.append(
                                ShortField(f"Attribute_Name_Length_{count}",
                                           len(attr_key)))
                            self.ipp_field.append(
                                StrField(
                                    f"Attribute_Name_Value_{attr_key}_{count}",
                                    bytes(attr_key, encoding='utf8')))

                            self.ipp_field.append(
                                ShortField(f"Attribute_Value_Length_{count}",
                                           len(attr_val)))
                            self.ipp_field.append(
                                StrField(
                                    f"Attribute_Value_Value_{attr_val}_{count}",
                                    bytes(attr_val, encoding='utf8')))

                            count += 1

                        else:
                            logger.critical(
                                f"Invalid Attribute tag : {attr_key}")
                            sys.exit()
                else:
                    logger.critical(f"Invalid Delimiter tag : {delimiter_key}")
                    print("Supported Tags")
                    for del_tag in list(self.ipp_attr_group_tags.keys()):
                        print(f"* {del_tag}")
                    sys.exit()

            else:
                logger.critical(f"Invalid tag : {delimiter_key}")
                sys.exit()

        self.ipp_field.append(
            XByteField("end-of-attributes-tag",
                       self.ipp_attr_group_tags["end-of-attributes-tag"]))
        if data != "":
            self.ipp_field.append(StrField("Data", data))
        logger.info("IPP Packet forming completed")

    def send(self, op_type, version, **kwargs):
        """
        Method to send and receive ipp request
        """

        if len(kwargs) <= 0:

            if op_type == "Get-Jobs":
                kwargs = get_jobs(self.host)
            else:
                print(f"No default templates is available for {op_type} !!!")
                sys.exit()

        self.form_ipp_packet(op_type=op_type, version=version, **kwargs)

        InternetPrintingProtocol.add_fields(self.ipp_field)

        IPP_HTTP_REQUESTS['Content_Length'] = bytes(
            str(len(InternetPrintingProtocol())), "utf-8")
        IPP_HTTP_REQUESTS['Host'] = bytes(f"{self.host}:{self.port}", "utf-8")
        IPP_HTTP_REQUESTS['Path'] = bytes(self.path, "utf-8")

        ipp_request = HTTP() / HTTPRequest(
            **IPP_HTTP_REQUESTS) / InternetPrintingProtocol()

        self.my_stream.sr(ipp_request, timeout=5, verbose=0)

        return InternetPrintingProtocol().get_results()