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.
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. ..
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.
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:
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 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.
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