diff options
author | Jim Shaver <dcypherd@gmail.com> | 2015-05-31 01:21:44 -0400 |
---|---|---|
committer | Jim Shaver <dcypherd@gmail.com> | 2015-05-31 01:21:44 -0400 |
commit | b51363b3ca43f6572acb673186e6ae78a1f48434 (patch) | |
tree | a7488b32871c142141a813dc6ff2ede172672c31 /libmproxy/platform | |
parent | 4fe2c069cca07aadf983f54e18dac4de492d5d69 (diff) | |
parent | 06fba18106a8f759ec6f08453e86772a170c653b (diff) | |
download | mitmproxy-b51363b3ca43f6572acb673186e6ae78a1f48434.tar.gz mitmproxy-b51363b3ca43f6572acb673186e6ae78a1f48434.tar.bz2 mitmproxy-b51363b3ca43f6572acb673186e6ae78a1f48434.zip |
Merge remote-tracking branch 'upstream/master' into print-bracket-fix
Conflicts:
examples/har_extractor.py
examples/nonblocking.py
examples/read_dumpfile
libmproxy/web/app.py
Diffstat (limited to 'libmproxy/platform')
-rw-r--r-- | libmproxy/platform/__init__.py | 4 | ||||
-rw-r--r-- | libmproxy/platform/linux.py | 3 | ||||
-rw-r--r-- | libmproxy/platform/osx.py | 5 | ||||
-rw-r--r-- | libmproxy/platform/pf.py | 4 | ||||
-rw-r--r-- | libmproxy/platform/windows.py | 76 |
5 files changed, 64 insertions, 28 deletions
diff --git a/libmproxy/platform/__init__.py b/libmproxy/platform/__init__.py index 1b2cf909..e1ff7c47 100644 --- a/libmproxy/platform/__init__.py +++ b/libmproxy/platform/__init__.py @@ -8,9 +8,9 @@ if sys.platform == "linux2": elif sys.platform == "darwin": from . import osx resolver = osx.Resolver -elif sys.platform == "freebsd10": +elif sys.platform.startswith("freebsd"): from . import osx resolver = osx.Resolver elif sys.platform == "win32": from . import windows - resolver = windows.Resolver
\ No newline at end of file + resolver = windows.Resolver diff --git a/libmproxy/platform/linux.py b/libmproxy/platform/linux.py index d5cfec90..e60a9950 100644 --- a/libmproxy/platform/linux.py +++ b/libmproxy/platform/linux.py @@ -1,4 +1,5 @@ -import socket, struct +import socket +import struct # Python socket module does not have this constant SO_ORIGINAL_DST = 80 diff --git a/libmproxy/platform/osx.py b/libmproxy/platform/osx.py index 810e5e5f..c5922850 100644 --- a/libmproxy/platform/osx.py +++ b/libmproxy/platform/osx.py @@ -21,6 +21,7 @@ class Resolver(object): peer = csock.getpeername() stxt = subprocess.check_output(self.STATECMD, stderr=subprocess.STDOUT) if "sudo: a password is required" in stxt: - raise RuntimeError("Insufficient privileges to access pfctl. " - "See http://mitmproxy.org/doc/transparent/osx.html for details.") + raise RuntimeError( + "Insufficient privileges to access pfctl. " + "See http://mitmproxy.org/doc/transparent/osx.html for details.") return pf.lookup(peer[0], peer[1], stxt) diff --git a/libmproxy/platform/pf.py b/libmproxy/platform/pf.py index 8c2f4678..97a4c192 100644 --- a/libmproxy/platform/pf.py +++ b/libmproxy/platform/pf.py @@ -13,7 +13,7 @@ def lookup(address, port, s): if "ESTABLISHED:ESTABLISHED" in i and spec in i: s = i.split() if len(s) > 4: - if sys.platform == "freebsd10": + if sys.platform.startswith("freebsd"): # strip parentheses for FreeBSD pfctl s = s[3][1:-1].split(":") else: @@ -21,4 +21,4 @@ def lookup(address, port, s): if len(s) == 2: return s[0], int(s[1]) - raise RuntimeError("Could not resolve original destination.")
\ No newline at end of file + raise RuntimeError("Could not resolve original destination.") diff --git a/libmproxy/platform/windows.py b/libmproxy/platform/windows.py index 98bfebcf..09a4422f 100644 --- a/libmproxy/platform/windows.py +++ b/libmproxy/platform/windows.py @@ -197,9 +197,12 @@ class TransparentProxy(object): self.driver = WinDivert() self.driver.register() - self.request_filter = custom_filter or " or ".join(("tcp.DstPort == %d" % p) for p in redirect_ports) + self.request_filter = custom_filter or " or ".join( + ("tcp.DstPort == %d" % + p) for p in redirect_ports) self.request_forward_handle = None - self.request_forward_thread = threading.Thread(target=self.request_forward) + self.request_forward_thread = threading.Thread( + target=self.request_forward) self.request_forward_thread.daemon = True self.addr_pid_map = dict() @@ -235,17 +238,25 @@ class TransparentProxy(object): # Block all ICMP requests (which are sent on Windows by default). # In layman's terms: If we don't do this, our proxy machine tells the client that it can directly connect to the # real gateway if they are on the same network. - self.icmp_handle = self.driver.open_handle(filter="icmp", layer=Layer.NETWORK, flags=Flag.DROP) - - self.response_handle = self.driver.open_handle(filter=self.response_filter, layer=Layer.NETWORK) + self.icmp_handle = self.driver.open_handle( + filter="icmp", + layer=Layer.NETWORK, + flags=Flag.DROP) + + self.response_handle = self.driver.open_handle( + filter=self.response_filter, + layer=Layer.NETWORK) self.response_thread.start() if self.mode == "forward" or self.mode == "both": - self.request_forward_handle = self.driver.open_handle(filter=self.request_filter, - layer=Layer.NETWORK_FORWARD) + self.request_forward_handle = self.driver.open_handle( + filter=self.request_filter, + layer=Layer.NETWORK_FORWARD) self.request_forward_thread.start() if self.mode == "local" or self.mode == "both": - self.request_local_handle = self.driver.open_handle(filter=self.request_filter, layer=Layer.NETWORK) + self.request_local_handle = self.driver.open_handle( + filter=self.request_filter, + layer=Layer.NETWORK) self.request_local_thread.start() def shutdown(self): @@ -266,14 +277,17 @@ class TransparentProxy(object): try: raw_packet, metadata = handle.recv() return self.driver.parse_packet(raw_packet), metadata - except WindowsError, e: + except WindowsError as e: if e.winerror == 995: return None, None else: raise def fetch_pids(self): - ret = windll.iphlpapi.GetTcpTable2(byref(self.tcptable2), byref(self.tcptable2_size), 0) + ret = windll.iphlpapi.GetTcpTable2( + byref( + self.tcptable2), byref( + self.tcptable2_size), 0) if ret == ERROR_INSUFFICIENT_BUFFER: self.tcptable2 = MIB_TCPTABLE2(self.tcptable2_size.value) self.fetch_pids() @@ -299,7 +313,8 @@ class TransparentProxy(object): self.fetch_pids() # If this fails, we most likely have a connection from an external client to - # a local server on 80/443. In this, case we always want to proxy the request. + # a local server on 80/443. In this, case we always want to proxy + # the request. pid = self.addr_pid_map.get(client, None) if pid not in self.trusted_pids: @@ -325,7 +340,8 @@ class TransparentProxy(object): server = (packet.dst_addr, packet.dst_port) if client in self.client_server_map: - del self.client_server_map[client] # Force re-add to mark as "newest" entry in the dict. + # Force re-add to mark as "newest" entry in the dict. + del self.client_server_map[client] while len(self.client_server_map) > self.connection_cache_size: self.client_server_map.popitem(False) @@ -335,7 +351,8 @@ class TransparentProxy(object): metadata.direction = Direction.INBOUND packet = self.driver.update_packet_checksums(packet) - # Use any handle thats on the NETWORK layer - request_local may be unavailable. + # Use any handle thats on the NETWORK layer - request_local may be + # unavailable. self.response_handle.send((packet.raw, metadata)) def response(self): @@ -361,15 +378,32 @@ class TransparentProxy(object): if __name__ == "__main__": - parser = configargparse.ArgumentParser(description="Windows Transparent Proxy") - parser.add_argument('--mode', choices=['forward', 'local', 'both'], default="both", - help='redirection operation mode: "forward" to only redirect forwarded packets, ' - '"local" to only redirect packets originating from the local machine') + parser = configargparse.ArgumentParser( + description="Windows Transparent Proxy") + parser.add_argument( + '--mode', + choices=[ + 'forward', + 'local', + 'both'], + default="both", + help='redirection operation mode: "forward" to only redirect forwarded packets, ' + '"local" to only redirect packets originating from the local machine') group = parser.add_mutually_exclusive_group() - group.add_argument("--redirect-ports", nargs="+", type=int, default=[80, 443], metavar="80", - help="ports that should be forwarded to the proxy") - group.add_argument("--custom-filter", default=None, metavar="WINDIVERT_FILTER", - help="Custom WinDivert interception rule.") + group.add_argument( + "--redirect-ports", + nargs="+", + type=int, + default=[ + 80, + 443], + metavar="80", + help="ports that should be forwarded to the proxy") + group.add_argument( + "--custom-filter", + default=None, + metavar="WINDIVERT_FILTER", + help="Custom WinDivert interception rule.") parser.add_argument("--proxy-addr", default=False, help="Proxy Server Address") parser.add_argument("--proxy-port", type=int, default=8080, |