예제 #1
0
class mitm:

    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

    session = None
    script = None
    serverkey = None
    pk = None
    sk = None
    k = None
    snonce = None
    rnonce = None
    tee = None

    def __init__(self, session, script):
        self.session = session
        self.script = script
        self.serverkey = PublicKey(
            "47d1416f3cf982d2b510cab32ecc4f1a04971345446cb1af326f304f63da6264".
            decode("hex"))

    def handle_event(self, event):
        for key in event:
            if key in {"type", "from"}:
                continue
            elif key == "messageid":
                event[key] = int(event[key], 16)
            elif type(event[key]) is bool:
                continue
            elif type(event[key]) in {str, unicode}:
                event[key] = event[key].decode("hex")
        if event["type"] == "socket":
            self.tee = Tee(
                os.path.join(self.BASE_DIR,
                             "session-{}.log".format(event["threadid"])))
            self.log("session started")
        elif event["type"] == "keypair":
            self.sk = PrivateKey(event["sk"])
            self.dump({"sk": self.sk}, function="PrivateKey")
        elif event["type"] == "send" or event["type"] == "recv":
            if event["messageid"] == 10100:
                event.update({"message": event["buffer"]})
                self.dump(event)
            elif event["messageid"] == 20100:
                event.update({"message": event["buffer"]})
                self.dump(event)
            else:
                if self.serverkey:
                    if self.sk:
                        if event["messageid"] == 10101:
                            self.pk = PublicKey(event["buffer"][:32])
                            self.dump({"pk": bytes(self.pk)},
                                      function="PublicKey")
                            event["buffer"] = event["buffer"][32:]
                        if self.pk:
                            if event["messageid"] == 10101 or self.snonce:
                                if event["messageid"] in {10101, 20104
                                                          } or self.rnonce:
                                    if event["messageid"] in {10101, 20104
                                                              } or self.k:
                                        if event["messageid"] in {
                                                10101, 20104
                                        }:
                                            k = Box(self.sk, self.serverkey)
                                            self.dump({"s": k}, function="Box")
                                            b2 = blake2b(digest_size=24)
                                            if event["messageid"] == 20104:
                                                b2.update(bytes(self.snonce))
                                            b2.update(bytes(self.pk))
                                            b2.update(bytes(self.serverkey))
                                            nonce = b2.digest()
                                            if event["messageid"] == 10101:
                                                self.dump(
                                                    {
                                                        "pk": self.pk,
                                                        "serverkey":
                                                        self.serverkey,
                                                        "nonce": nonce
                                                    },
                                                    function="blake2b")
                                            elif event["messageid"] == 20104:
                                                self.dump(
                                                    {
                                                        "snonce": self.snonce,
                                                        "pk": self.pk,
                                                        "serverkey":
                                                        self.serverkey,
                                                        "nonce": nonce
                                                    },
                                                    function="blake2b")
                                        else:
                                            k = self.k
                                            if event["type"] == "send":
                                                self.snonce = self.increment_nonce(
                                                    self.snonce)
                                                nonce = self.snonce
                                            elif event["type"] == "recv":
                                                self.rnonce = self.increment_nonce(
                                                    self.rnonce)
                                                nonce = self.rnonce
                                        ciphertext = event["buffer"]
                                        event.update({
                                            "k":
                                            k,
                                            "nonce":
                                            nonce,
                                            "ciphertext":
                                            event["buffer"]
                                        })
                                        try:
                                            message = k.decrypt(
                                                ciphertext, nonce)
                                        except:
                                            self.dump(event, error=True)
                                            self.log(
                                                "Warning: failed to decrypt {}"
                                                .format(event["messageid"]),
                                                error=True)
                                            if event["messageid"] in {
                                                    10101, 20104
                                            }:
                                                raise
                                        else:
                                            if event["messageid"] == 10101:
                                                self.snonce = message[24:48]
                                                self.dump(
                                                    {"snonce": self.snonce},
                                                    function="slice")
                                                message = message[48:]
                                            elif event["messageid"] == 20104:
                                                self.rnonce = message[:24]
                                                self.k = Box.decode(
                                                    message[24:56])
                                                self.dump(
                                                    {
                                                        "rnonce": self.rnonce,
                                                        "k": self.k
                                                    },
                                                    function="slice")
                                                message = message[56:]
                                            event.update({"message": message})
                                            self.dump(event)
                                    else:
                                        raise Exception(
                                            "Missing shared key ({}).".format(
                                                event["messageid"]))
                                else:
                                    raise Exception(
                                        "Missing server nonce ({}).".format(
                                            event["messageid"]))
                            else:
                                raise Exception(
                                    "Missing client nonce ({}).".format(
                                        event["messageid"]))
                        else:
                            raise Exception("Missing public key ({}).".format(
                                event["messageid"]))
                    else:
                        raise Exception("Missing secret key ({}).".format(
                            event["messageid"]))
                else:
                    raise Exception("Missing server key ({}).".format(
                        event["messageid"]))
        elif event["type"] == "closing":
            self.log("session closed")
        elif event["type"] == "close":
            self.tee.flush()
            self.tee.close()
        else:
            raise Exception("Invalid event type ({}).".format(event["type"]))

    def increment_nonce(self, nonce):
        return hex(long(nonce[::-1].encode("hex"), 16) +
                   2)[2:-1].decode("hex")[::-1]

    def log(self, message, error=False):
        if error:
            print message
        else:
            self.script.post_message({"type": "log", "message": message})

    def dump(self, event, function=None, error=False):
        message = []
        if not function:
            function = event["type"]
        if error:
            function = function.rjust(31)
        message.append(function)
        message.append("--------------------".rjust(31))
        ordered = [
            "messageid", "snonce", "rnonce", "pk", "sk", "serverkey", "s", "k",
            "nonce", "message", "ciphertext"
        ]
        skipped = ["from", "type", "buffer"]
        intersection = [x for x in ordered if x in event.keys()]
        for key in intersection:
            if type(event[key]) in {Box, PrivateKey, PublicKey}:
                value = bytes(event[key]).encode("hex")
            elif type(event[key]) in {dict, bool}:
                value = str(event[key])
            elif type(event[key]) in {str, unicode}:
                value = event[key].encode("hex")
            else:
                value = event[key]
            message.append("".join(["".rjust(15), key.ljust(20), str(value)]))
        message.append("")
        self.log("\n".join(message), error=error)
        extra = set(event.keys()) - set(ordered) - set(skipped)
        if extra:
            self.log("Warning: Missed key(s) ({})".format(", ".join(extra)),
                     error=error)
예제 #2
0
class mitm:

    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

    session = None
    script = None
    serverkey = None
    pk = None
    sk = None
    k = None
    snonce = None
    rnonce = None
    tee = None

    def __init__(self, session, script):
        self.session = session
        self.script = script
        self.serverkey = PublicKey("47d1416f3cf982d2b510cab32ecc4f1a04971345446cb1af326f304f63da6264".decode("hex"))

    def handle_event(self, event):
        for key in event:
            if key in {"type", "from"}:
                continue
            elif key == "messageid":
                event[key] = int(event[key], 16)
            elif type(event[key]) is bool:
                continue
            elif type(event[key]) in {str, unicode}:
                event[key] = event[key].decode("hex")
        if event["type"] == "socket":
            self.tee = Tee(os.path.join(self.BASE_DIR, "session-{}.log".format(event["threadid"])))
            self.log("session started")
        elif event["type"] == "keypair":
            self.sk = PrivateKey(event["sk"])
            self.dump({"sk": self.sk}, function="PrivateKey")
        elif event["type"] == "send" or event["type"] == "recv":
            if event["messageid"] == 10100:
                event.update({"message": event["buffer"]})
                self.dump(event)
            elif event["messageid"] == 20100:
                event.update({"message": event["buffer"]})
                self.dump(event)
            else:
                if self.serverkey:
                    if self.sk:
                        if event["messageid"] == 10101:
                            self.pk = PublicKey(event["buffer"][:32])
                            self.dump({"pk": bytes(self.pk)}, function="PublicKey")
                            event["buffer"] = event["buffer"][32:]
                        if self.pk:
                            if event["messageid"] == 10101 or self.snonce:
                                if event["messageid"] in {10101, 20104} or self.rnonce:
                                    if event["messageid"] in {10101, 20104} or self.k:
                                        if event["messageid"] in {10101, 20104}:
                                            k = Box(self.sk, self.serverkey)
                                            self.dump({"s": k}, function="Box")
                                            b2 = blake2b(digest_size=24)
                                            if event["messageid"] == 20104:
                                                b2.update(bytes(self.snonce))
                                            b2.update(bytes(self.pk))
                                            b2.update(bytes(self.serverkey))
                                            nonce = b2.digest()
                                            if event["messageid"] == 10101:
                                                self.dump(
                                                    {"pk": self.pk, "serverkey": self.serverkey, "nonce": nonce},
                                                    function="blake2b",
                                                )
                                            elif event["messageid"] == 20104:
                                                self.dump(
                                                    {
                                                        "snonce": self.snonce,
                                                        "pk": self.pk,
                                                        "serverkey": self.serverkey,
                                                        "nonce": nonce,
                                                    },
                                                    function="blake2b",
                                                )
                                        else:
                                            k = self.k
                                            if event["type"] == "send":
                                                self.snonce = self.increment_nonce(self.snonce)
                                                nonce = self.snonce
                                            elif event["type"] == "recv":
                                                self.rnonce = self.increment_nonce(self.rnonce)
                                                nonce = self.rnonce
                                        ciphertext = event["buffer"]
                                        event.update({"k": k, "nonce": nonce, "ciphertext": event["buffer"]})
                                        try:
                                            message = k.decrypt(ciphertext, nonce)
                                        except:
                                            self.dump(event, error=True)
                                            self.log(
                                                "Warning: failed to decrypt {}".format(event["messageid"]), error=True
                                            )
                                            if event["messageid"] in {10101, 20104}:
                                                raise
                                        else:
                                            if event["messageid"] == 10101:
                                                self.snonce = message[24:48]
                                                self.dump({"snonce": self.snonce}, function="slice")
                                                message = message[48:]
                                            elif event["messageid"] == 20104:
                                                self.rnonce = message[:24]
                                                self.k = Box.decode(message[24:56])
                                                self.dump({"rnonce": self.rnonce, "k": self.k}, function="slice")
                                                message = message[56:]
                                            event.update({"message": message})
                                            self.dump(event)
                                    else:
                                        raise Exception("Missing shared key ({}).".format(event["messageid"]))
                                else:
                                    raise Exception("Missing server nonce ({}).".format(event["messageid"]))
                            else:
                                raise Exception("Missing client nonce ({}).".format(event["messageid"]))
                        else:
                            raise Exception("Missing public key ({}).".format(event["messageid"]))
                    else:
                        raise Exception("Missing secret key ({}).".format(event["messageid"]))
                else:
                    raise Exception("Missing server key ({}).".format(event["messageid"]))
        elif event["type"] == "closing":
            self.log("session closed")
        elif event["type"] == "close":
            self.tee.flush()
            self.tee.close()
        else:
            raise Exception("Invalid event type ({}).".format(event["type"]))

    def increment_nonce(self, nonce):
        return hex(long(nonce[::-1].encode("hex"), 16) + 2)[2:-1].decode("hex")[::-1]

    def log(self, message, error=False):
        if error:
            print message
        else:
            self.script.post_message({"type": "log", "message": message})

    def dump(self, event, function=None, error=False):
        message = []
        if not function:
            function = event["type"]
        if error:
            function = function.rjust(31)
        message.append(function)
        message.append("--------------------".rjust(31))
        ordered = ["messageid", "snonce", "rnonce", "pk", "sk", "serverkey", "s", "k", "nonce", "message", "ciphertext"]
        skipped = ["from", "type", "buffer"]
        intersection = [x for x in ordered if x in event.keys()]
        for key in intersection:
            if type(event[key]) in {Box, PrivateKey, PublicKey}:
                value = bytes(event[key]).encode("hex")
            elif type(event[key]) in {dict, bool}:
                value = str(event[key])
            elif type(event[key]) in {str, unicode}:
                value = event[key].encode("hex")
            else:
                value = event[key]
            message.append("".join(["".rjust(15), key.ljust(20), str(value)]))
        message.append("")
        self.log("\n".join(message), error=error)
        extra = set(event.keys()) - set(ordered) - set(skipped)
        if extra:
            self.log("Warning: Missed key(s) ({})".format(", ".join(extra)), error=error)
예제 #3
0
            print('reverting learned weights to best checkpoint..')
            model_globals.dynet_param_collection.revert_to_best_model()
        if evaluators:
            print("> Evaluating test set")
            output.indent += 2
            xnmt_decode.xnmt_decode(decode_args,
                                    model_elements=(xnmt_trainer.corpus_parser,
                                                    xnmt_trainer.model))
            eval_scores = []
            for evaluator in evaluators:
                evaluate_args.evaluator = evaluator
                eval_score = xnmt_evaluate.xnmt_evaluate(evaluate_args)
                print(eval_score)
                eval_scores.append(eval_score)
            output.indent -= 2

        results.append((experiment_name, eval_scores))

        output.close()
        err_output.close()

    print("")
    print("{:<30}|{:<40}".format("Experiment", " Final Scores"))
    print("-" * (70 + 1))

    for line in results:
        experiment_name, eval_scores = line
        for i in range(len(eval_scores)):
            print("{:<30}| {:<40}".format((experiment_name if i == 0 else ""),
                                          str(eval_scores[i])))