rewrite basic docs for readthedocs
@ -1,24 +0,0 @@
|
|||||||
Welcome to mitmproxy's dev documentation!
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
End User Documentation <https://mitmproxy.org/doc/>
|
|
||||||
|
|
||||||
inlinescripts
|
|
||||||
protocols
|
|
||||||
proxy
|
|
||||||
exceptions
|
|
||||||
models
|
|
||||||
|
|
||||||
|
|
||||||
Indices and tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`modindex`
|
|
||||||
|
|
@ -192,4 +192,4 @@ pseudoxml:
|
|||||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
||||||
|
|
||||||
livehtml:
|
livehtml:
|
||||||
sphinx-autobuild -b html -z '../../libmproxy' -r '___jb_(old|bak)___$$' $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
sphinx-autobuild -b html -z '../libmproxy' -r '___jb_(old|bak)___$$' $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
BIN
docs/certinstall-webapp.png
Normal file
After Width: | Height: | Size: 60 KiB |
173
docs/certinstall.rst
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
.. _certinstall:
|
||||||
|
|
||||||
|
About Certificates
|
||||||
|
==================
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
Mitmproxy can decrypt encrypted traffic on the fly, as long as the client
|
||||||
|
trusts its built-in certificate authority. Usually this means that the
|
||||||
|
mitmproxy CA certificates have to be installed on the client device.
|
||||||
|
|
||||||
|
Quick Setup
|
||||||
|
-----------
|
||||||
|
|
||||||
|
By far the easiest way to install the mitmproxy certificates is to use the
|
||||||
|
built-in certificate installation app. To do this, just start mitmproxy and
|
||||||
|
configure your target device with the correct proxy settings. Now start a
|
||||||
|
browser on the device, and visit the magic domain **mitm.it**. You should see
|
||||||
|
something like this:
|
||||||
|
|
||||||
|
.. image:: certinstall-webapp.png
|
||||||
|
|
||||||
|
Click on the relevant icon, follow the setup instructions for the platform
|
||||||
|
you're on and you are good to go.
|
||||||
|
|
||||||
|
|
||||||
|
Installing the mitmproxy CA certificate manually
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
Sometimes using the quick install app is not an option - Java or the iOS
|
||||||
|
Simulator spring to mind - or you just need to do it manually for some other
|
||||||
|
reason. Below is a list of pointers to manual certificate installation
|
||||||
|
documentation for some common platforms.
|
||||||
|
|
||||||
|
The mitmproxy CA cert is located in ``~/.mitmproxy`` after it has been generated at the first
|
||||||
|
start of mitmproxy.
|
||||||
|
|
||||||
|
|
||||||
|
iOS
|
||||||
|
^^^
|
||||||
|
|
||||||
|
http://kb.mit.edu/confluence/pages/viewpage.action?pageId=152600377
|
||||||
|
|
||||||
|
iOS Simulator
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
See https://github.com/ADVTOOLS/ADVTrustStore#how-to-use-advtruststore
|
||||||
|
|
||||||
|
Java
|
||||||
|
^^^^
|
||||||
|
|
||||||
|
See http://docs.oracle.com/cd/E19906-01/820-4916/geygn/index.html
|
||||||
|
|
||||||
|
Android/Android Simulator
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
See http://wiki.cacert.org/FAQ/ImportRootCert#Android_Phones_.26_Tablets
|
||||||
|
|
||||||
|
Windows
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
See http://windows.microsoft.com/en-ca/windows/import-export-certificates-private-keys#1TC=windows-7
|
||||||
|
|
||||||
|
Windows (automated)
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
>>> certutil.exe -importpfx mitmproxy-ca-cert.p12
|
||||||
|
|
||||||
|
See also: https://technet.microsoft.com/en-us/library/cc732443.aspx
|
||||||
|
|
||||||
|
Mac OS X
|
||||||
|
^^^^^^^^
|
||||||
|
|
||||||
|
See https://support.apple.com/kb/PH7297?locale=en_US
|
||||||
|
|
||||||
|
Ubuntu/Debian
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
See http://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate/94861#94861
|
||||||
|
|
||||||
|
Mozilla Firefox
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
See https://wiki.mozilla.org/MozillaRootCertificate#Mozilla_Firefox
|
||||||
|
|
||||||
|
Chrome on Linux
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
See https://code.google.com/p/chromium/wiki/LinuxCertManagement
|
||||||
|
|
||||||
|
|
||||||
|
More on mitmproxy certificates
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
The first time **mitmproxy** or **mitmdump** is run, the mitmproxy Certificate
|
||||||
|
Authority (CA) is created in the config directory (``~/.mitmproxy`` by default).
|
||||||
|
This CA is used for on-the-fly generation of dummy certificates for each of the
|
||||||
|
SSL sites that your client visits. Since your browser won't trust the
|
||||||
|
mitmproxy CA out of the box , you will see an SSL certificate warning every
|
||||||
|
time you visit a new SSL domain through mitmproxy. When you are testing a
|
||||||
|
single site through a browser, just accepting the bogus SSL cert manually is
|
||||||
|
not too much trouble, but there are a many circumstances where you will want to
|
||||||
|
configure your testing system or browser to trust the mitmproxy CA as a
|
||||||
|
signing root authority. For security reasons, the mitmproxy CA is generated uniquely on the first
|
||||||
|
start and is not shared between mitmproxy installations on different devices.
|
||||||
|
|
||||||
|
|
||||||
|
CA and cert files
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The files created by mitmproxy in the .mitmproxy directory are as follows:
|
||||||
|
|
||||||
|
===================== ====================================================================================
|
||||||
|
mitmproxy-ca.pem The certificate **and the private key** in PEM format.
|
||||||
|
mitmproxy-ca-cert.pem The certificate in PEM format. Use this to distribute on most non-Windows platforms.
|
||||||
|
mitmproxy-ca-cert.p12 The certificate in PKCS12 format. For use on Windows.
|
||||||
|
mitmproxy-ca-cert.cer Same file as .pem, but with an extension expected by some Android devices.
|
||||||
|
===================== ====================================================================================
|
||||||
|
|
||||||
|
Using a custom certificate
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
You can use your own certificate by passing the ``--cert`` option to
|
||||||
|
mitmproxy. Mitmproxy then uses the provided certificate for interception of the
|
||||||
|
specified domains instead of generating a certificate signed by its own CA.
|
||||||
|
|
||||||
|
The certificate file is expected to be in the PEM format. You can include
|
||||||
|
intermediary certificates right below your leaf certificate, so that you PEM
|
||||||
|
file roughly looks like this:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
<private key>
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
<cert>
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
<intermediary cert (optional)>
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
|
||||||
|
For example, you can generate a certificate in this format using these instructions:
|
||||||
|
|
||||||
|
|
||||||
|
>>> openssl genrsa -out cert.key 2048
|
||||||
|
>>> openssl req -new -x509 -key cert.key -out cert.crt
|
||||||
|
(Specify the mitm domain as Common Name, e.g. *.google.com)
|
||||||
|
>>> cat cert.key cert.crt > cert.pem
|
||||||
|
>>> mitmproxy --cert=cert.pem
|
||||||
|
|
||||||
|
|
||||||
|
Using a custom certificate authority
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
By default, mitmproxy will use ``~/.mitmproxy/mitmproxy-ca.pem`` as
|
||||||
|
the certificate authority to generate certificates for all domains for which no
|
||||||
|
custom certificate is provided (see above). You can use your own certificate
|
||||||
|
authority by passing the ``--confdir`` option to mitmproxy. Mitmproxy
|
||||||
|
will then look for ``mitmproxy-ca.pem`` in the specified directory. If
|
||||||
|
no such file exists, it will be generated automatically.
|
||||||
|
|
||||||
|
|
||||||
|
Using a client side certificate
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
You can use a client certificate by passing the ``--client-certs DIRECTORY``
|
||||||
|
option to mitmproxy. If you visit example.org, mitmproxy looks for a file named ``example.org.pem``
|
||||||
|
in the specified directory and uses this as the client cert. The certificate file needs to be in
|
||||||
|
the PEM format and should contain both the unencrypted private key and the certificate.
|
||||||
|
|
@ -149,7 +149,7 @@ html_favicon = "favicon.ico"
|
|||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = ['_static']
|
# html_static_path = ['_static']
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
# Add any extra paths that contain custom files (such as robots.txt or
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
# .htaccess) here, relative to this directory. These files are copied
|
@ -1,7 +1,7 @@
|
|||||||
.. _exceptions:
|
.. _proxy:
|
||||||
|
|
||||||
Proxy
|
Proxy Server
|
||||||
=====
|
============
|
||||||
|
|
||||||
.. automodule:: libmproxy.proxy
|
.. automodule:: libmproxy.proxy
|
||||||
|
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
4
docs/features/upstreamcerts.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.. _upstreamcerts:
|
||||||
|
|
||||||
|
Upstream Certificates
|
||||||
|
=====================
|
238
docs/howmitmproxy.rst
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
How mitmproxy works
|
||||||
|
===================
|
||||||
|
|
||||||
|
Mitmproxy is an enormously flexible tool. Knowing exactly how the proxying
|
||||||
|
process works will help you deploy it creatively, and take into account its
|
||||||
|
fundamental assumptions and how to work around them. This document explains
|
||||||
|
mitmproxy's proxy mechanism in detail, starting with the simplest unencrypted
|
||||||
|
explicit proxying, and working up to the most complicated interaction -
|
||||||
|
transparent proxying of SSL-protected traffic [#ssl]_ in the presence of `Server Name Indication`_.
|
||||||
|
|
||||||
|
Explicit HTTP
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Configuring the client to use mitmproxy as an explicit proxy is the simplest
|
||||||
|
and most reliable way to intercept traffic. The proxy protocol is codified in the
|
||||||
|
`HTTP RFC`_, so the behaviour of both
|
||||||
|
the client and the server is well defined, and usually reliable. In the
|
||||||
|
simplest possible interaction with mitmproxy, a client connects directly to the
|
||||||
|
proxy, and makes a request that looks like this:
|
||||||
|
|
||||||
|
.. code-block:: http
|
||||||
|
|
||||||
|
GET http://example.com/index.html HTTP/1.1
|
||||||
|
|
||||||
|
This is a proxy GET request - an extended form of the vanilla HTTP GET request
|
||||||
|
that includes a schema and host specification, and it includes all the
|
||||||
|
information mitmproxy needs to proceed.
|
||||||
|
|
||||||
|
.. image:: schematics/how-mitmproxy-works-explicit.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
1. The client connects to the proxy and makes a request.
|
||||||
|
2. Mitmproxy connects to the upstream server and simply forwards the request on.
|
||||||
|
|
||||||
|
|
||||||
|
Explicit HTTPS
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The process for an explicitly proxied HTTPS connection is quite different. The
|
||||||
|
client connects to the proxy and makes a request that looks like this:
|
||||||
|
|
||||||
|
.. code-block:: http
|
||||||
|
|
||||||
|
CONNECT example.com:443 HTTP/1.1
|
||||||
|
|
||||||
|
A conventional proxy can neither view nor manipulate an SSL-encrypted data
|
||||||
|
stream, so a CONNECT request simply asks the proxy to open a pipe between the
|
||||||
|
client and server. The proxy here is just a facilitator - it blindly forwards
|
||||||
|
data in both directions without knowing anything about the contents. The
|
||||||
|
negotiation of the SSL connection happens over this pipe, and the subsequent
|
||||||
|
flow of requests and responses are completely opaque to the proxy.
|
||||||
|
|
||||||
|
The MITM in mitmproxy
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This is where mitmproxy's fundamental trick comes into play. The MITM in its
|
||||||
|
name stands for Man-In-The-Middle - a reference to the process we use to
|
||||||
|
intercept and interfere with these theoretically opaque data streams. The basic
|
||||||
|
idea is to pretend to be the server to the client, and pretend to be the client
|
||||||
|
to the server, while we sit in the middle decoding traffic from both sides. The
|
||||||
|
tricky part is that the `Certificate Authority`_ system is
|
||||||
|
designed to prevent exactly this attack, by allowing a trusted third-party to
|
||||||
|
cryptographically sign a server's SSL certificates to verify that they are
|
||||||
|
legit. If this signature doesn't match or is from a non-trusted party, a secure
|
||||||
|
client will simply drop the connection and refuse to proceed. Despite the many
|
||||||
|
shortcomings of the CA system as it exists today, this is usually fatal to
|
||||||
|
attempts to MITM an SSL connection for analysis. Our answer to this conundrum
|
||||||
|
is to become a trusted Certificate Authority ourselves. Mitmproxy includes a
|
||||||
|
full CA implementation that generates interception certificates on the fly. To
|
||||||
|
get the client to trust these certificates, we :ref:`register mitmproxy as a trusted
|
||||||
|
CA with the device manually <certinstall>`.
|
||||||
|
|
||||||
|
Complication 1: What's the remote hostname?
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
To proceed with this plan, we need to know the domain name to use in the
|
||||||
|
interception certificate - the client will verify that the certificate is for
|
||||||
|
the domain it's connecting to, and abort if this is not the case. At first
|
||||||
|
blush, it seems that the CONNECT request above gives us all we need - in this
|
||||||
|
example, both of these values are "example.com". But what if the client had
|
||||||
|
initiated the connection as follows:
|
||||||
|
|
||||||
|
.. code-block:: http
|
||||||
|
|
||||||
|
CONNECT 10.1.1.1:443 HTTP/1.1
|
||||||
|
|
||||||
|
Using the IP address is perfectly legitimate because it gives us enough
|
||||||
|
information to initiate the pipe, even though it doesn't reveal the remote
|
||||||
|
hostname.
|
||||||
|
|
||||||
|
Mitmproxy has a cunning mechanism that smooths this over - :ref:`upstream
|
||||||
|
certificate sniffing <upstreamcerts>`. As soon as we
|
||||||
|
see the CONNECT request, we pause the client part of the conversation, and
|
||||||
|
initiate a simultaneous connection to the server. We complete the SSL handshake
|
||||||
|
with the server, and inspect the certificates it used. Now, we use the Common
|
||||||
|
Name in the upstream SSL certificates to generate the dummy certificate for the
|
||||||
|
client. Voila, we have the correct hostname to present to the client, even if
|
||||||
|
it was never specified.
|
||||||
|
|
||||||
|
|
||||||
|
Complication 2: Subject Alternative Name
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Enter the next complication. Sometimes, the certificate Common Name is not, in
|
||||||
|
fact, the hostname that the client is connecting to. This is because of the
|
||||||
|
optional `Subject Alternative Name`_ field in the SSL certificate
|
||||||
|
that allows an arbitrary number of alternative domains to be specified. If the
|
||||||
|
expected domain matches any of these, the client will proceed, even though the
|
||||||
|
domain doesn't match the certificate Common Name. The answer here is simple:
|
||||||
|
when we extract the CN from the upstream cert, we also extract the SANs, and
|
||||||
|
add them to the generated dummy certificate.
|
||||||
|
|
||||||
|
|
||||||
|
Complication 3: Server Name Indication
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
One of the big limitations of vanilla SSL is that each certificate requires its
|
||||||
|
own IP address. This means that you couldn't do virtual hosting where multiple
|
||||||
|
domains with independent certificates share the same IP address. In a world
|
||||||
|
with a rapidly shrinking IPv4 address pool this is a problem, and we have a
|
||||||
|
solution in the form of the `Server Name Indication`_ extension to
|
||||||
|
the SSL and TLS protocols. This lets the client specify the remote server name
|
||||||
|
at the start of the SSL handshake, which then lets the server select the right
|
||||||
|
certificate to complete the process.
|
||||||
|
|
||||||
|
SNI breaks our upstream certificate sniffing process, because when we connect
|
||||||
|
without using SNI, we get served a default certificate that may have nothing to
|
||||||
|
do with the certificate expected by the client. The solution is another tricky
|
||||||
|
complication to the client connection process. After the client connects, we
|
||||||
|
allow the SSL handshake to continue until just _after_ the SNI value has been
|
||||||
|
passed to us. Now we can pause the conversation, and initiate an upstream
|
||||||
|
connection using the correct SNI value, which then serves us the correct
|
||||||
|
upstream certificate, from which we can extract the expected CN and SANs.
|
||||||
|
|
||||||
|
Putting it all together
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Lets put all of this together into the complete explicitly proxied HTTPS flow.
|
||||||
|
|
||||||
|
.. image:: schematics/how-mitmproxy-works-explicit-https.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
1. The client makes a connection to mitmproxy, and issues an HTTP CONNECT request.
|
||||||
|
2. Mitmproxy responds with a ``200 Connection Established``, as if it has set up the CONNECT pipe.
|
||||||
|
3. The client believes it's talking to the remote server, and initiates the SSL connection.
|
||||||
|
It uses SNI to indicate the hostname it is connecting to.
|
||||||
|
4. Mitmproxy connects to the server, and establishes an SSL connection using the SNI hostname
|
||||||
|
indicated by the client.
|
||||||
|
5. The server responds with the matching SSL certificate, which contains the CN and SAN values
|
||||||
|
needed to generate the interception certificate.
|
||||||
|
6. Mitmproxy generates the interception cert, and continues the
|
||||||
|
client SSL handshake paused in step 3.
|
||||||
|
7. The client sends the request over the established SSL connection.
|
||||||
|
8. Mitmproxy passes the request on to the server over the SSL connection initiated in step 4.
|
||||||
|
|
||||||
|
Transparent HTTP
|
||||||
|
----------------
|
||||||
|
|
||||||
|
When a transparent proxy is used, the HTTP/S connection is redirected into a
|
||||||
|
proxy at the network layer, without any client configuration being required.
|
||||||
|
This makes transparent proxying ideal for those situations where you can't
|
||||||
|
change client behaviour - proxy-oblivious Android applications being a common
|
||||||
|
example.
|
||||||
|
|
||||||
|
To achieve this, we need to introduce two extra components. The first is a
|
||||||
|
redirection mechanism that transparently reroutes a TCP connection destined for
|
||||||
|
a server on the Internet to a listening proxy server. This usually takes the
|
||||||
|
form of a firewall on the same host as the proxy server - `iptables`_ on Linux or
|
||||||
|
pf_ on OSX. Once the client has initiated the connection, it makes a vanilla HTTP request,
|
||||||
|
which might look something like this:
|
||||||
|
|
||||||
|
.. code-block:: http
|
||||||
|
|
||||||
|
GET /index.html HTTP/1.1
|
||||||
|
|
||||||
|
Note that this request differs from the explicit proxy variation, in that it
|
||||||
|
omits the scheme and hostname. How, then, do we know which upstream host to
|
||||||
|
forward the request to? The routing mechanism that has performed the
|
||||||
|
redirection keeps track of the original destination for us. Each routing
|
||||||
|
mechanism has a different way of exposing this data, so this introduces the
|
||||||
|
second component required for working transparent proxying: a host module that
|
||||||
|
knows how to retrieve the original destination address from the router. In
|
||||||
|
mitmproxy, this takes the form of a built-in set of
|
||||||
|
modules_ that know how to talk to each platform's redirection mechanism.
|
||||||
|
Once we have this information, the process is fairly straight-forward.
|
||||||
|
|
||||||
|
.. image:: schematics/how-mitmproxy-works-transparent.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
1. The client makes a connection to the server.
|
||||||
|
2. The router redirects the connection to mitmproxy, which is typically listening on a local port
|
||||||
|
of the same host. Mitmproxy then consults the routing mechanism to establish what the original
|
||||||
|
destination was.
|
||||||
|
3. Now, we simply read the client's request...
|
||||||
|
4. ... and forward it upstream.
|
||||||
|
|
||||||
|
Transparent HTTPS
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
The first step is to determine whether we should treat an incoming connection
|
||||||
|
as HTTPS. The mechanism for doing this is simple - we use the routing mechanism
|
||||||
|
to find out what the original destination port is. By default, we treat all
|
||||||
|
traffic destined for ports 443 and 8443 as SSL.
|
||||||
|
|
||||||
|
From here, the process is a merger of the methods we've described for
|
||||||
|
transparently proxying HTTP, and explicitly proxying HTTPS. We use the routing
|
||||||
|
mechanism to establish the upstream server address, and then proceed as for
|
||||||
|
explicit HTTPS connections to establish the CN and SANs, and cope with SNI.
|
||||||
|
|
||||||
|
.. image:: schematics/how-mitmproxy-works-transparent-https.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
1. The client makes a connection to the server.
|
||||||
|
2. The router redirects the connection to mitmproxy, which is typically listening on a local port of
|
||||||
|
the same host. Mitmproxy then consults the routing mechanism to establish what the original
|
||||||
|
destination was.
|
||||||
|
3. The client believes it's talking to the remote server, and initiates the SSL connection. It uses
|
||||||
|
SNI to indicate the hostname it is connecting to.
|
||||||
|
4. Mitmproxy connects to the server, and establishes an SSL connection using the SNI hostname
|
||||||
|
indicated by the client.
|
||||||
|
5. The server responds with the matching SSL certificate, which contains the CN and SAN values
|
||||||
|
needed to generate the interception certificate.
|
||||||
|
6. Mitmproxy generates the interception cert, and continues the client SSL handshake paused in
|
||||||
|
step 3.
|
||||||
|
7. The client sends the request over the established SSL connection.
|
||||||
|
8. Mitmproxy passes the request on to the server over the SSL connection initiated in step 4.
|
||||||
|
|
||||||
|
.. rubric:: Footnotes
|
||||||
|
|
||||||
|
.. [#ssl] I use "SSL" to refer to both SSL and TLS in the generic sense, unless otherwise specified.
|
||||||
|
|
||||||
|
.. _Server Name Indication: https://en.wikipedia.org/wiki/Server_Name_Indication
|
||||||
|
.. _HTTP RFC: https://tools.ietf.org/html/rfc7230
|
||||||
|
.. _Certificate Authority: https://en.wikipedia.org/wiki/Certificate_authority
|
||||||
|
.. _Subject Alternative Name: https://en.wikipedia.org/wiki/SubjectAltName
|
||||||
|
.. _iptables: http://www.netfilter.org/
|
||||||
|
.. _pf: https://en.wikipedia.org/wiki/PF_\(firewall\)
|
||||||
|
.. _modules: https://github.com/mitmproxy/mitmproxy/tree/master/libmproxy/platform
|
43
docs/index.rst
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
.. include:: introduction.rst
|
||||||
|
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
introduction
|
||||||
|
install
|
||||||
|
certinstall
|
||||||
|
howmitmproxy
|
||||||
|
modes
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
:caption: Tools
|
||||||
|
|
||||||
|
mitmproxy
|
||||||
|
mitmdump
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
:caption: Scripting
|
||||||
|
|
||||||
|
scripting/inlinescripts
|
||||||
|
scripting/libmproxy
|
||||||
|
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
:caption: Development
|
||||||
|
|
||||||
|
dev/protocols
|
||||||
|
dev/proxy
|
||||||
|
dev/exceptions
|
||||||
|
dev/models
|
||||||
|
|
||||||
|
.. Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
|
100
docs/install.rst
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
.. _install:
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
.. _install-ubuntu:
|
||||||
|
|
||||||
|
Installation On Ubuntu
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Ubuntu comes with Python but we need to install pip, python-dev and several libraries.
|
||||||
|
This was tested on a fully patched installation of Ubuntu 14.04.
|
||||||
|
|
||||||
|
>>> sudo apt-get install python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev
|
||||||
|
>>> sudo pip install mitmproxy
|
||||||
|
|
||||||
|
Once installation is complete you can run :ref:`mitmproxy` or :ref:`mitmdump` from a terminal.
|
||||||
|
|
||||||
|
Installation From Source (Ubuntu)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
If you would like to install mitmproxy directly from the master branch on GitHub or would like to
|
||||||
|
get set up to contribute to the project, install the dependencies as you would for a regular
|
||||||
|
mitmproxy installation (see :ref:`install-ubuntu`).
|
||||||
|
Then see the Hacking_ section of the README on GitHub.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Installation On Mac OS X
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The easiest way to get up and running on OSX is to download the pre-built binary packages from
|
||||||
|
`mitmproxy.org`_.
|
||||||
|
|
||||||
|
There are a few bits of customization you might want to do to make mitmproxy comfortable to use on
|
||||||
|
OSX. The default color scheme is optimized for a dark background terminal, but you can select a
|
||||||
|
palette for a light terminal background with the ``--palette`` option.
|
||||||
|
You can use the OSX **open** program to create a simple and effective ``~/.mailcap`` file to view
|
||||||
|
request and response bodies:
|
||||||
|
|
||||||
|
.. code-block:: none
|
||||||
|
|
||||||
|
application/*; /usr/bin/open -Wn %s
|
||||||
|
audio/*; /usr/bin/open -Wn %s
|
||||||
|
image/*; /usr/bin/open -Wn %s
|
||||||
|
video/*; /usr/bin/open -Wn %s
|
||||||
|
|
||||||
|
Once installation is complete you can run :ref:`mitmproxy` or :ref:`mitmdump` from a terminal.
|
||||||
|
|
||||||
|
|
||||||
|
Installation From Source (Mac OS X)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
If you would like to install mitmproxy directly from the master branch on GitHub or would like to
|
||||||
|
get set up to contribute to the project, there are a few OS X specific things to keep in mind.
|
||||||
|
|
||||||
|
- Make sure that XCode is installed from the App Store, and that the command-line tools have been
|
||||||
|
downloaded (XCode/Preferences/Downloads).
|
||||||
|
- If you're running a Python interpreter installed with homebrew (or similar), you may have to
|
||||||
|
install some dependencies by hand.
|
||||||
|
|
||||||
|
Then see the Hacking_ section of the README on GitHub.
|
||||||
|
|
||||||
|
Installation On Windows
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Please note that mitmdump is the only component of mitmproxy that is supported on Windows at
|
||||||
|
the moment.
|
||||||
|
|
||||||
|
**There is no interactive user interface on Windows.**
|
||||||
|
|
||||||
|
|
||||||
|
First, install the latest version of Python 2.7 from the `Python website`_.
|
||||||
|
If you already have an older version of Python 2.7 installed, make sure to install pip_
|
||||||
|
(pip is included in Python 2.7.9+ by default).
|
||||||
|
|
||||||
|
Next, add Python and the Python Scripts directory to your **PATH** variable.
|
||||||
|
You can do this easily by running the following in powershell:
|
||||||
|
|
||||||
|
>>> [Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27;C:\Python27\Scripts", "User")
|
||||||
|
|
||||||
|
Now, you can install mitmproxy by running
|
||||||
|
|
||||||
|
>>> pip install mitmproxy
|
||||||
|
|
||||||
|
Once the installation is complete, you can run :ref:`mitmdump` from a command prompt.
|
||||||
|
|
||||||
|
Installation From Source (Windows)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
If you would like to install mitmproxy directly from the master branch on GitHub or would like to
|
||||||
|
get set up to contribute to the project, install Python as outlined above, then see the
|
||||||
|
Hacking_ section of the README on GitHub.
|
||||||
|
|
||||||
|
|
||||||
|
.. _Hacking: https://github.com/mitmproxy/mitmproxy/blob/master/README.mkd#hacking
|
||||||
|
.. _mitmproxy.org: https://mitmproxy.org/
|
||||||
|
.. _`Python website`: https://www.python.org/downloads/windows/
|
||||||
|
.. _pip: https://pip.pypa.io/en/latest/installing.html
|
26
docs/introduction.rst
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
**mitmproxy** is an interactive, SSL-capable man-in-the-middle proxy for HTTP
|
||||||
|
with a console interface.
|
||||||
|
|
||||||
|
**mitmdump** is the command-line version of mitmproxy. Think tcpdump for HTTP.
|
||||||
|
|
||||||
|
**libmproxy** is the library that mitmproxy and mitmdump are built on.
|
||||||
|
|
||||||
|
Documentation, tutorials and distribution packages can be found on the
|
||||||
|
mitmproxy website: `mitmproxy.org <https://mitmproxy.org/>`_
|
||||||
|
|
||||||
|
|
||||||
|
.. rubric:: Features
|
||||||
|
|
||||||
|
|
||||||
|
- Intercept HTTP requests and responses and modify them on the fly.
|
||||||
|
- Save complete HTTP conversations for later replay and analysis.
|
||||||
|
- Replay the client-side of an HTTP conversations.
|
||||||
|
- Replay HTTP responses of a previously recorded server.
|
||||||
|
- Reverse proxy mode to forward traffic to a specified server.
|
||||||
|
- Transparent proxy mode on OSX and Linux.
|
||||||
|
- Make scripted changes to HTTP traffic using Python.
|
||||||
|
- SSL certificates for interception are generated on the fly.
|
||||||
|
- And much, much more.
|
4
docs/mitmdump.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.. _mitmdump:
|
||||||
|
|
||||||
|
mitmdump
|
||||||
|
========
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
4
docs/mitmproxy.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.. _mitmproxy:
|
||||||
|
|
||||||
|
mitmproxy
|
||||||
|
=========
|
193
docs/modes.rst
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
.. _modes:
|
||||||
|
|
||||||
|
Modes of Operation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Mitmproxy has four modes of operation that allow you to use mitmproxy in a
|
||||||
|
variety of scenarios:
|
||||||
|
|
||||||
|
- **Regular** (the default)
|
||||||
|
- **Transparent**
|
||||||
|
- **Reverse Proxy**
|
||||||
|
- **Upstream Proxy**
|
||||||
|
|
||||||
|
|
||||||
|
Now, which one should you pick? Use this flow chart:
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-flowchart.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Regular Proxy
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Mitmproxy's regular mode is the simplest and the easiest to set up.
|
||||||
|
|
||||||
|
1. Start mitmproxy.
|
||||||
|
2. Configure your client to use mitmproxy by explicitly setting an HTTP proxy.
|
||||||
|
3. Quick Check: You should already be able to visit an unencrypted HTTP site through the proxy.
|
||||||
|
4. Open the magic domain <strong>mitm.it</strong> and install the certificate for your device.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Unfortunately, some applications bypass the system HTTP proxy settings - Android applications
|
||||||
|
are a common example. In these cases, you need to use mitmproxy's transparent mode.
|
||||||
|
|
||||||
|
If you are proxying an external device, your network will probably look like this:
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-regular.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
The square brackets signify the source and destination IP addresses. Your
|
||||||
|
client explicitly connects to mitmproxy and mitmproxy explicitly connects
|
||||||
|
to the target server.
|
||||||
|
|
||||||
|
Transparent Proxy
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
In transparent mode, traffic is directed into a proxy at the network layer,
|
||||||
|
without any client configuration required. This makes transparent proxying
|
||||||
|
ideal for situations where you can't change client behaviour. In the graphic
|
||||||
|
below, a machine running mitmproxy has been inserted between the router and
|
||||||
|
the internet:
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-transparent-1.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
The square brackets signify the source and destination IP addresses. Round
|
||||||
|
brackets mark the next hop on the *Ethernet/data link* layer. This distinction
|
||||||
|
is important: when the packet arrives at the mitmproxy machine, it must still
|
||||||
|
be addressed to the target server. This means that Network Address Translation
|
||||||
|
should not be applied before the traffic reaches mitmproxy, since this would
|
||||||
|
remove the target information, leaving mitmproxy unable to determine the real
|
||||||
|
destination.
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-transparent-wrong.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
Common Configurations
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
There are many ways to configure your network for transparent proxying. We'll
|
||||||
|
look at two common scenarios:
|
||||||
|
|
||||||
|
1. Configuring the client to use a custom gateway/router/"next hop"
|
||||||
|
2. Implementing custom routing on the router
|
||||||
|
|
||||||
|
In most cases, the first option is recommended due to its ease of use.
|
||||||
|
|
||||||
|
(a) Custom Gateway
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
One simple way to get traffic to the mitmproxy machine with the destination IP
|
||||||
|
intact, is to simply configure the client with the mitmproxy box as the
|
||||||
|
default gateway.
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-transparent-2.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
In this scenario, we would:
|
||||||
|
|
||||||
|
1. Configure the proxy machine for transparent mode. You can find instructions
|
||||||
|
in the :ref:`transparent` section.
|
||||||
|
2. Configure the client to use the proxy machine's IP as the default gateway.
|
||||||
|
3. Quick Check: At this point, you should already be able to visit an
|
||||||
|
unencrypted HTTP site over the proxy.
|
||||||
|
4. Open the magic domain <strong>mitm.it</strong> and install the certificate
|
||||||
|
for your device.
|
||||||
|
|
||||||
|
Setting the custom gateway on clients can be automated by serving the settings
|
||||||
|
out to clients over DHCP. This lets set up an interception network where all
|
||||||
|
clients are proxied automatically, which can save time and effort.
|
||||||
|
|
||||||
|
.. admonition:: Troubleshooting Transparent Mode
|
||||||
|
:class: note
|
||||||
|
|
||||||
|
Incorrect transparent mode configurations are a frequent source of
|
||||||
|
error. If it doesn't work for you, try the following things:
|
||||||
|
|
||||||
|
- Open mitmproxy's event log (press :kbd:`e`) - do you see clientconnect messages?
|
||||||
|
If not, the packets are not arriving at the proxy. One common cause is the occurrence of ICMP
|
||||||
|
redirects, which means that your machine is telling the client that there's a faster way to
|
||||||
|
the internet by contacting your router directly (see the :ref:`transparent` section on how to
|
||||||
|
disable them). If in doubt, Wireshark_ may help you to see whether something arrives at your
|
||||||
|
machine or not.
|
||||||
|
- Make sure you have not explicitly configured an HTTP proxy on the client.
|
||||||
|
This is not needed in transparent mode.
|
||||||
|
- Re-check the instructions in the :ref:`transparent` section. Anything you missed?
|
||||||
|
|
||||||
|
If you encounter any other pitfalls that should be listed here, please let us know!
|
||||||
|
|
||||||
|
(b) Custom Routing
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
In some cases, you may need more fine-grained control of which traffic reaches
|
||||||
|
the mitmproxy instance, and which doesn't. You may, for instance, choose only
|
||||||
|
to divert traffic to some hosts into the transparent proxy. There are a huge
|
||||||
|
number of ways to accomplish this, and much will depend on the router or
|
||||||
|
packet filter you're using. In most cases, the configuration will look like
|
||||||
|
this:
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-transparent-3.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
|
||||||
|
Reverse Proxy
|
||||||
|
-------------
|
||||||
|
|
||||||
|
mitmproxy is usually used with a client that uses the proxy to access the
|
||||||
|
Internet. Using reverse proxy mode, you can use mitmproxy to act like a normal
|
||||||
|
HTTP server:
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-reverse.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
There are various use-cases:
|
||||||
|
|
||||||
|
- Say you have an internal API running at http://example.local/. You could now
|
||||||
|
set up mitmproxy in reverse proxy mode at http://debug.example.local/ and
|
||||||
|
dynamically point clients to this new API endpoint, which provides them
|
||||||
|
with the same data and you with debug information. Similarly, you could move
|
||||||
|
your real server to a different IP/port and set up mitmproxy in the original
|
||||||
|
place to debug and or redirect all sessions.
|
||||||
|
|
||||||
|
- Say you're a web developer working on http://example.com/ (with a development
|
||||||
|
version running on http://localhost:8000/). You can modify your hosts file so that
|
||||||
|
example.com points to 127.0.0.1 and then run mitmproxy in reverse proxy mode
|
||||||
|
on port 80. You can test your app on the example.com domain and get all
|
||||||
|
requests recorded in mitmproxy.
|
||||||
|
|
||||||
|
- Say you have some toy project that should get SSL support. Simply set up
|
||||||
|
mitmproxy as a reverse proxy on port 443 and you're done (``mitmdump -p 443 -R
|
||||||
|
http://localhost:80/``). Mitmproxy auto-detects TLS traffic and intercepts it dynamically.
|
||||||
|
There are better tools for this specific task, but mitmproxy is very quick and simple way to
|
||||||
|
set up an SSL-speaking server.
|
||||||
|
|
||||||
|
- Want to add a non-SSL-capable compression proxy in front of your server? You
|
||||||
|
could even spawn a mitmproxy instance that terminates SSL (``-R http://...``),
|
||||||
|
point it to the compression proxy and let the compression proxy point to a
|
||||||
|
SSL-initiating mitmproxy (``-R https://...``), which then points to the real
|
||||||
|
server. As you see, it's a fairly flexible thing.
|
||||||
|
|
||||||
|
.. admonition:: Caveat: Interactive Use
|
||||||
|
:class: warning
|
||||||
|
|
||||||
|
Reverse Proxy mode is usually not sufficient to create a copy of an interactive website at
|
||||||
|
different URL. The HTML served to the client remains unchanged - as soon as the user clicks on
|
||||||
|
an non-relative URL (or downloads a non-relative image resource), traffic no longer passes
|
||||||
|
through mitmproxy.
|
||||||
|
|
||||||
|
Upstream Proxy
|
||||||
|
--------------
|
||||||
|
|
||||||
|
If you want to chain proxies by adding mitmproxy in front of a different proxy
|
||||||
|
appliance, you can use mitmproxy's upstream mode. In upstream mode, all
|
||||||
|
requests are unconditionally transferred to an upstream proxy of your choice.
|
||||||
|
|
||||||
|
.. image:: schematics/proxy-modes-upstream.png
|
||||||
|
:align: center
|
||||||
|
|
||||||
|
mitmproxy supports both explicit HTTP and explicit HTTPS in upstream proxy
|
||||||
|
mode. You could in theory chain multiple mitmproxy instances in a row, but
|
||||||
|
that doesn't make any sense in practice (i.e. outside of our tests).
|
||||||
|
|
||||||
|
|
||||||
|
.. _Wireshark: https://wireshark.org/
|
BIN
docs/schematics/architecture.pdf
Normal file
BIN
docs/schematics/architecture.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
docs/schematics/architecture.vsdx
Normal file
BIN
docs/schematics/how-mitmproxy-works-explicit-https.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
docs/schematics/how-mitmproxy-works-explicit.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
docs/schematics/how-mitmproxy-works-transparent-https.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
docs/schematics/how-mitmproxy-works-transparent.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
docs/schematics/proxy-modes-flowchart.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/schematics/proxy-modes-regular.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/schematics/proxy-modes-reverse.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/schematics/proxy-modes-transparent-1.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/schematics/proxy-modes-transparent-2.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
docs/schematics/proxy-modes-transparent-3.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
docs/schematics/proxy-modes-transparent-wrong.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/schematics/proxy-modes-upstream.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/schematics/proxy-modes.pdf
Normal file
BIN
docs/schematics/proxy-modes.vsdx
Normal file
BIN
docs/screenshots/firefox3-import.jpg
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
docs/screenshots/firefox3-trust.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
docs/screenshots/firefox3.jpg
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
docs/screenshots/ios-gateway.png
Normal file
After Width: | Height: | Size: 151 KiB |
BIN
docs/screenshots/ios-installed.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
docs/screenshots/ios-manual.png
Normal file
After Width: | Height: | Size: 192 KiB |
BIN
docs/screenshots/ios-profile.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
docs/screenshots/ios-reverse.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
docs/screenshots/ios-warning.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
docs/screenshots/mitmproxy-flowview.png
Normal file
After Width: | Height: | Size: 308 KiB |
BIN
docs/screenshots/mitmproxy-intercept-filt.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
docs/screenshots/mitmproxy-intercept-mid.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
docs/screenshots/mitmproxy-intercept-options.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
docs/screenshots/mitmproxy-intercept-result.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
docs/screenshots/mitmproxy-kveditor-editmode.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/screenshots/mitmproxy-kveditor.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/screenshots/mitmproxy.png
Normal file
After Width: | Height: | Size: 149 KiB |
BIN
docs/screenshots/osx-addcert-alwaystrust.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
docs/screenshots/win7-certstore-trustedroot.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/screenshots/win7-certstore.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs/screenshots/win7-wizard.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
docs/screenshots/winpythoninstaller.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
@ -1,3 +1,5 @@
|
|||||||
|
.. _inline-scripts:
|
||||||
|
|
||||||
Inline Scripts
|
Inline Scripts
|
||||||
==============
|
==============
|
||||||
|
|
||||||
@ -56,6 +58,7 @@ Events are listed in the order they usually occur.
|
|||||||
a connection can correspond to multiple HTTP requests.
|
a connection can correspond to multiple HTTP requests.
|
||||||
|
|
||||||
.. versionchanged:: 0.14
|
.. versionchanged:: 0.14
|
||||||
|
|
||||||
:param Layer root_layer: The root layer (see :ref:`protocols` for an explanation what the root
|
:param Layer root_layer: The root layer (see :ref:`protocols` for an explanation what the root
|
||||||
layer is), which provides transparent access to all attributes of the
|
layer is), which provides transparent access to all attributes of the
|
||||||
:py:class:`~libmproxy.proxy.RootContext`. For example, ``root_layer.client_conn.address``
|
:py:class:`~libmproxy.proxy.RootContext`. For example, ``root_layer.client_conn.address``
|
||||||
@ -111,6 +114,7 @@ Events are listed in the order they usually occur.
|
|||||||
Called when the proxy has closed the server connection.
|
Called when the proxy has closed the server connection.
|
||||||
|
|
||||||
.. versionadded:: 0.14
|
.. versionadded:: 0.14
|
||||||
|
|
||||||
:param ServerConnection server_conn: see :py:func:`serverconnect`
|
:param ServerConnection server_conn: see :py:func:`serverconnect`
|
||||||
|
|
||||||
.. py:function:: clientdisconnect(context, root_layer)
|
.. py:function:: clientdisconnect(context, root_layer)
|
||||||
@ -118,6 +122,7 @@ Events are listed in the order they usually occur.
|
|||||||
Called when a client disconnects from the proxy.
|
Called when a client disconnects from the proxy.
|
||||||
|
|
||||||
.. versionchanged:: 0.14
|
.. versionchanged:: 0.14
|
||||||
|
|
||||||
:param Layer root_layer: see :py:func:`clientconnect`
|
:param Layer root_layer: see :py:func:`clientconnect`
|
||||||
|
|
||||||
.. py:function:: done(context)
|
.. py:function:: done(context)
|
27
docs/scripting/libmproxy.rst
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.. _libmproxy:
|
||||||
|
|
||||||
|
libmproxy
|
||||||
|
=========
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
We strongly encourage you to use :ref:`inline-scripts` rather than libmproxy.
|
||||||
|
- Inline Scripts are equally powerful and provide an easier syntax.
|
||||||
|
- Most examples are written as inline scripts.
|
||||||
|
- Multiple inline scripts can be used together.
|
||||||
|
- Inline Scripts can either be executed headless with mitmdump or within the mitmproxy UI.
|
||||||
|
|
||||||
|
|
||||||
|
All of mitmproxy's basic functionality is exposed through the **libmproxy**
|
||||||
|
library. The example below shows a simple implementation of the "sticky cookie"
|
||||||
|
functionality included in the interactive mitmproxy program. Traffic is
|
||||||
|
monitored for ``Cookie`` and ``Set-Cookie`` headers, and requests are rewritten
|
||||||
|
to include a previously seen cookie if they don't already have one. In effect,
|
||||||
|
this lets you log in to a site using your browser, and then make subsequent
|
||||||
|
requests using a tool like curl, which will then seem to be part of the
|
||||||
|
authenticated session.
|
||||||
|
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/stickycookies
|
||||||
|
:caption: examples/stickycookies
|
||||||
|
:language: python
|
6
docs/transparent.rst
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.. _transparent:
|
||||||
|
|
||||||
|
Transparent Proxying
|
||||||
|
====================
|
||||||
|
|
||||||
|
TODO
|