bigsnitch/mitmaddon/littlesnitch.py

109 lines
3.4 KiB
Python
Raw Normal View History

2020-08-05 00:08:41 +00:00
#!/usr/bin/env python3
import pdb
from mitmproxy import ctx
import threading
2020-08-09 12:38:41 +00:00
from queue import Queue, Empty
2020-08-05 00:08:41 +00:00
import time
import zmq
2020-08-08 11:44:16 +00:00
import json
2020-08-10 22:24:08 +00:00
from enum import Enum
2020-08-05 00:08:41 +00:00
2020-08-09 12:38:41 +00:00
NO_MSG = {"msg": None}
2020-08-08 11:44:16 +00:00
INIT_MSG = {"msg": "init"}
ACK_MSG = {"msg": "ack"}
PING_MSG = {"msg": "ping"}
PONG_MSG = {"msg": "pong"}
2020-08-10 22:24:08 +00:00
class NetworkState(Enum):
DISCONNECTED = auto()
CONNECTED = auto()
PING = auto()
SENDING = auto()
2020-08-08 11:44:16 +00:00
def convert_to_strings(obj):
if isinstance(obj, dict):
return {convert_to_strings(key): convert_to_strings(value)
for key, value in obj.items()}
elif isinstance(obj, list) or isinstance(obj, tuple):
return [convert_to_strings(element) for element in obj]
elif isinstance(obj, bytes):
return str(obj)[2:-1]
return obj
def get_msg(socket):
msg = socket.recv()
try:
if msg:
return json.loads(msg)
except json.JSONDecodeError:
2020-08-09 12:38:41 +00:00
print(f"malformed message received {msg}")
2020-08-08 11:44:16 +00:00
return NO_MSG
def send_msg(msg, socket):
a = convert_to_strings(msg)
socket.send(str.encode(json.dumps(a)))
2020-08-05 00:08:41 +00:00
def networking(q):
print("starting thread")
context = zmq.Context()
2020-08-08 11:44:16 +00:00
connected = False
2020-08-09 12:07:14 +00:00
a = None
2020-08-08 11:44:16 +00:00
while not connected:
socket = context.socket(zmq.PAIR)
socket.connect("tcp://127.0.0.1:12345")
msg = get_msg(socket)
if msg["msg"] == "init":
send_msg(ACK_MSG, socket)
connected = True
timer = time.monotonic()
while connected:
if timer - time.monotonic() >= 5:
timer = time.monotonic()
send_msg(PING_MSG,socket)
msg = get_msg(socket)
if msg["msg"] != "pong":
connected = False
msg = get_msg(socket)
if msg['msg'] == "ping":
send_msg(PONG_MSG, socket)
timer = time.monotonic()
2020-08-09 12:07:14 +00:00
if not a:
2020-08-09 12:38:41 +00:00
try:
a = q.get(block=False)
except Empty:
pass
2020-08-08 11:44:16 +00:00
if a:
2020-08-09 12:07:14 +00:00
send_msg(a, socket)
2020-08-08 11:44:16 +00:00
msg = get_msg(socket)
if msg["msg"] == "ack":
timer = time.monotonic()
2020-08-09 12:07:14 +00:00
a = None
self.q.task_done()
2020-08-08 11:44:16 +00:00
else:
connected = False
2020-08-05 00:08:41 +00:00
class Counter:
def __init__(self):
self.q = Queue()
self.thread = threading.Thread(name="NetworkThread", target=networking, args=(self.q,))
self.thread.start()
def request(self, flow):
2020-08-09 12:07:14 +00:00
self.q.put({'msg': 'request', 'flow': flow.get_state()})
2020-08-05 00:08:41 +00:00
self.q.join()
def response(self, flow):
2020-08-09 12:07:14 +00:00
self.q.put({'msg': 'response', 'flow': flow.get_state()})
2020-08-05 00:08:41 +00:00
self.q.join()
addons = [
Counter()
]