[PYTHON] Utilisez mitmproxy pour forcer l'API de votre application dans un environnement de développement

Qu'est-ce que mitmproxy

mitmproxy est un serveur proxy HTTP pour regarder et falsifier les requêtes HTTP à la manière de Man in the Middle Attack. En installant le certificat généré par mitmproxy sur le terminal, la communication HTTPS peut être gérée de la même manière.

Pour plus de détails sur l'installation de mitmproxy, etc., reportez-vous aux articles suivants.

Ce que je veux faire cette fois

Les demandes peuvent être falsifiées par mitmproxy en écrivant un script Python. Cette fois, nous expliquerons la procédure en supposant les cas suivants.

Il peut être possible de résoudre le problème en automatisant la construction et la distribution de l'environnement de développement à partir de la branche de fonction. Cependant, il peut arriver qu'un tel environnement ne soit pas prêt. De plus, même s'il existe un tel environnement, si vous souhaitez vérifier en basculant plusieurs fois entre plusieurs environnements, il peut être plus facile de falsifier la demande que de redémarrer plusieurs applications. ..

procédure

Installez mitmproxy

Veuillez vous référer à ce qui précède Comment intercepter ou falsifier la communication SSL de l'appareil iOS réel par un proxy.

Préparation d'un programme Python pour la falsification des demandes

Ce que je veux faire cette fois, c'est "Je veux changer la destination de la requête de l'API Web effectuée sur l'application vers l'environnement de développement". Dans ce cas, vous devez faire deux choses:

  1. Tamper le nom d'hôte pour la requête TCP / IP
  2. Tamper with Host dans l'en-tête de la requête HTTP

Le programme Python suivant fait cela. Modifiez le nom d'hôte, etc. si nécessaire.

replace_host.py


def request(context, flow):
    #Nom d'hôte d'origine(Environnement de production)
    original = "example.com"
    #Nom d'hôte après remplacement(Environnement de développement)
    replace  = "dev.example.com"

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            #Demander le nom d'hôte de destination
            flow.request.host = replace
            #Hôte dans l'en-tête de la requête HTTP
            flow.request.headers["Host"] = [replace]

L'en-tête de la demande peut être falsifié de la même manière que Host. À ce stade, il convient de noter que flow.request.headers utilise le nom de l'en-tête comme clé et que la valeur contient * un tableau de chaînes de caractères *. Dans l'en-tête HTTP, plusieurs valeurs peuvent être définies avec la même clé. (Set-Cookie etc.)

Démarrez mitmproxy

Démarrez en chargeant le script Python préparé.

$ mitmproxy -p 8080 -s replace_host.py

Il ne vous reste plus qu'à déboguer votre application avec ce proxy.

Bonus: falsifier les demandes uniquement dans certains chemins

Dans le programme précédent, la falsification était effectuée à la condition que "ne demande qu'à un hôte spécifique". De plus, si vous ajoutez la condition "dans un chemin spécifique", ce sera comme suit.

replace_host.py


def request(context, flow):
    #Nom d'hôte d'origine(Environnement de production)
    original = "example.com"
    #Nom d'hôte après remplacement(Environnement de développement)
    replace  = "dev.example.com"
    #Chemin à falsifier
    target_path = '/api/foo'

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            #Seulement dans un chemin spécifique
            if flow.request.path == target_path:
                #Demander le nom d'hôte de destination
                flow.request.host = replace
                #Hôte dans l'en-tête de la requête HTTP
                flow.request.headers["Host"] = [replace]

Ceci peut être réalisé en vérifiant la valeur de flow.request.path. Ici, la correspondance exacte par == est vérifiée, mais diverses applications telles que le ciblage de tout sous un répertoire spécifique avec une expression régulière seront possibles.

J'ai pensé que ce serait pratique si la documentation officielle de mitmproxy contenait une collection de recettes ici.

Recommended Posts

Utilisez mitmproxy pour forcer l'API de votre application dans un environnement de développement
Comment utiliser Docker pour conteneuriser votre application et comment utiliser Docker Compose pour exécuter votre application dans un environnement de développement
Comment entrer dans l'environnement de développement Python avec Vagrant
Comment utiliser Jupyter Notebook sans polluer votre environnement avec Docker
Préparez votre premier environnement de développement Python
Comment utiliser l'API Python d'OpenPose
Comment utiliser l'API Bing Search
[Python] Comment utiliser l'API Typetalk
Ajoutez votre propre vue de contenu à mitmproxy
Comment utiliser Tensorflow dans un environnement Docker
Comment utiliser l'API Cloud Vision de GCP
Flutter dans Docker - Comment créer et utiliser un environnement de développement Flutter dans un conteneur Docker