[PYTHON] Abfangen oder Manipulieren der SSL-Kommunikation des tatsächlichen iOS-Geräts durch einen Proxy

Einführung

Bei der Interaktion mit dem Web- / API-Server über eine API in der Entwicklung von Smartphone-Anwendungen gibt es kein "Wenn Sie https verwenden, wird die Kommunikation vom Benutzer nicht bemerkt", wie dies bei Tools in der Webanwendung der Fall ist. Sie können den Kommunikationsinhalt überprüfen und manipulieren.

Wenn Sie die App- oder Server-API nicht unter dieser Voraussetzung entwerfen und implementieren, führt dies zu einer Fälschung der Übertragung der Spielergebnisse durch den App-Benutzer, einer Schadensoperation für den Raid-Boss usw. in sozialen Spielen, einem Kaufvorgang mit einer EC-Site-Anwendung usw. Wird auch möglich sein.

Außerdem habe ich kürzlich eine App namens "Alles, was Sie kostenlos Musik hören können !! - Net Radio" veröffentlicht](https://itunes.apple.com/jp/app/nettorajio-j-popmo-wu- liaode / id769979888? mt = 8) Überprüfen Sie, ob die in dieser App installierte statische Linkbibliothek nicht mit einem unbekannten externen Server kommuniziert oder ob Sie SSL verwenden möchten, aber nicht anderweitig kommunizieren Dazu verwende ich ein Proxyserver-Tool namens mitmproxy.

Der folgende Inhalt ist so

Was Sie brauchen ist:

Über Mitmproxy und seine Einführung

Mitmproxy ist ein Befehlszeilen-Proxy-Tool. Der Name Mitm ist eine Abkürzung für Man-in-the-Middle und scheint von Begriffen zu stammen, die in Kommunikationsbegriffen wie Man-in-the-Middle-Attacke verwendet werden.

Ein Zwischenangriff ist radikal, aber ein nützliches Werkzeug, um eine von Ihnen selbst entwickelte App zu überprüfen.

Das Bild sieht folgendermaßen aus:

mitm_2.jpg

Der grobe Mechanismus besteht darin, die Internetfreigabe (die Funktion, mit der OSX selbst zum WLAN-Router wird) in der Standardeinstellung von Mac OSX zu verwenden, die Kommunikation mit dem Proxy weiterzuleiten und das WLAN auf dem tatsächlichen iOS-Gerät zu verwenden.

Python-Installation

Um Mitmproxy auszuführen, benötigen Sie zuerst Python. Installieren Sie Python mit Homebrew.

 $ brew update
 $ brew upgrade
 $ brew install python

Dann installiere pip. easy_insall sollte gleichzeitig mit der Installation von Python durch Brew installiert werden.

$ easy_install pip

Installation von Mitmproxy

Installieren Sie mitmproxy von pip

$ pip install mitmproxy

Wenn Sie es bereits installiert haben und aktualisieren möchten, fügen Sie die Option -U wie folgt hinzu und aktualisieren Sie es.

$ pip install mitmproxy -U

Durch die Installation mit pip werden auch die zugehörigen Bibliotheken installiert.

Starten Sie Mitmproxy

Geben Sie zum Ausführen den Port mit der Option -p wie folgt an.

$ mitmproxy -p 8080

Ich habe Port 8080 angegeben, dies erfordert jedoch auch, dass 8080 in den WLAN-Einstellungen von der iPhone-Seite angegeben wird.

Sie können die Serveradresse und die Portnummer angeben, indem Sie in den WLAN-Einstellungen von iOS Manuell mit HTTP-Proxy auswählen.

IMG_0669.jpg

(In der Abbildung ist der Computername von Mac OSX sonnig. Dies ist der WLAN-Name. Machen Sie sich also keine Sorgen.)

Installation des Stammzertifikats auf dem tatsächlichen iPhone

Wenn Sie mitmproxy ausführen, wird in ~ / .mitmproxy / ein Zertifikat namens mitmroxy-ca.pem erstellt. Die Installation ist möglich, indem Sie dieses Zertifikat per E-Mail von OS X an das iPhone senden und das Zertifikat über den E-Mail-Client auf der iPhone-Seite öffnen. Sie können dieses Zertifikat unter [Einstellungen] [Allgemein] [Bereitstellung] überprüfen, das iOS-App-Entwicklern bekannt ist.

Verwenden Sie Mitmproxy

Eine einfache Verwendung von Mitmproxy besteht darin, Anforderungen und Antworten anzuzeigen, zu manipulieren oder die Kommunikation zu beenden.

In Bezug auf die Fälschung der Anforderung können Sie beispielsweise die Parameter der bereits gesendeten Anforderung ändern und die geänderte Anforderung erneut senden.

名称未設定.jpg

Schreiben Sie Anforderungs- / Antwortdaten interaktiv neu

Drücken Sie in der Anforderungsliste auf dem Bildschirm in der Abbildung, in der Mitmproxy gestartet wird, die [Eingabetaste], um zum Bildschirm mit den GET-Anforderungs- / Antwortdetails zu gelangen. Anfrage bearbeiten (Abfrage, Pfad, URL, Header, Formular, Text, Methode) mit [e Schlüssel], Sie können zur Liste zurückkehren und die bearbeitete Anforderung mit der Taste [r] erneut abrufen.

Sie können Ihre Änderungen auch mit der [V-Taste] rückgängig machen, was schwer zu bemerken ist. Sie können diese Verknüpfungen überprüfen, indem Sie die [? -Taste] drücken.

Diese Fähigkeit zum interaktiven Bearbeiten von Anforderungen erleichtert das Ausprobieren von API-Aufrufen auf der Serverseite und ist somit ideal für die Validierung und das Testen, wenn die Spezifikationen auf der Server-API-Seite unbekannt sind. Sie können auch anomale Systeme testen, wenn Parameter durcheinander geraten, z. B. wenn Sie Rechnungspositionen anfordern und während des In-App-Kaufs Belege an den Server senden.

Im Gegenteil, bei diesem interaktiven Umschreiben wurde die Kommunikation auf der Anwendungsseite abgeschlossen, selbst wenn Sie die Anforderung und GET / POST erneut bearbeiten. Wenn Sie also testen können, indem Sie die manipulierte Anforderung / Antwort auf der Anwendungsseite usw. empfangen. Ich denke, es gibt nur wenige.

Echtzeit-Datenfälschung per Skript

Mit mitmproxy können Sie für jede Kommunikation ein Skript anwenden, indem Sie eine Python-Skriptdatei angeben, die den Inhalt beschreibt, der im Voraus manipuliert werden soll, anstatt die Anforderung / Antwort durch interaktive Operation zu manipulieren.

Angenommen, Sie haben ein System namens Raid Boss in einem sozialen Spiel, in dem eine große Anzahl von Benutzern gegen einen gemeinsamen Boss kämpft.

In den meisten Fällen beträgt der Durchfluss:

--Benutzer A hat dem Boss 100 Schaden zugefügt

Wenn Sie den Schaden mit Mitmproxy ändern und die Anzahl der Belohnungsgegenstände ändern, die Schaden verursacht haben, wird dies wie folgt.

--Benutzer A hat dem Boss 100 Schaden zugefügt

Durch Fälschen der Anforderungsantwort mit einem Skript wird es möglich, Dinge zu tun, die durch interaktives Umschreiben nicht abgelaufen werden konnten.

Angeben eines Skripts

$ mitmproxy -s examples/add_header.py

Die Datei add_header.py im Beispiel enthält den folgenden einfachen Inhalt, daher sollte sie zur Einführung gebracht werden.

add_header.py


def response(context, flow):
    flow.response.headers["newheader"] = ["foo"]

Die Antwortmethode ist eine Methode, die die Kommunikationsantwort neu schreibt, bevor sie an den HTTP (S) -Client übermittelt wird. Überschreiben Sie diese Methode, fügen Sie "newheader" zum Antwortheader hinzu und setzen Sie den Wert auf den String "foo" aus der Liste.

Die Flow-Klasse und die Response-Klasse sind in flow.py definiert. Sie müssen sich daher auf sie beziehen, um die Spezifikationen zu verstehen.

https://github.com/mitmproxy/mitmproxy/blob/master/libmproxy/flow.py

Es gibt auch Beispielcode, der mithilfe eines Skripts ermittelt, ob die Anforderung für einen bestimmten Host bestimmt ist. Dies ist am hilfreichsten.

https://github.com/mitmproxy/mitmproxy/blob/master/examples/redirect_requests.py

redirect_requests.py erstellt und gibt eine ursprüngliche Antwort für alle Anforderungen an den Host auf "example.com" zurück und leitet zu "mitmproxy.org" weiter, wenn es sich um "example.org" handelt.

Basierend auf diesem Beispielcode kann die Anforderung an den von Ihnen vorbereiteten Host schnell manipuliert und überprüft werden.

Über Mitmdump

Wenn Sie mitmproxy installieren, wird auch ein Tool namens mitmdump installiert. Im Gegensatz zu dem bisher erläuterten Mitmproxy gibt Mitmdump das Ergebnis an die Standardausgabe anstatt an die interaktive Listenanzeige wie den oben erwähnten Konsolenbildschirm aus. Sie können das Ergebnis also anscheinend eingrenzen, indem Sie es zusammen mit grep verwenden. Auf diese Weise möchten Sie https für einen bestimmten Host verwenden, können jedoch effizient überprüfen, ob es sich um http handelt.

Betriebs- und Anwendungsübersicht

--Versuchen Sie, eine illegale Anfrage per In-App-Kauf mit der Grundoperation von Mitmproxy zu stellen

Was ich hier nicht geschrieben habe

Die hier beschriebene Methode ändert die WLAN-Einstellungen, um auf Port 8080 zuzugreifen. Wenn Sie jedoch einen transparenten Proxy verwenden, können Sie den tatsächlichen Computer wie gewohnt über den Standard-80-Port von WLAN kommunizieren lassen.

Informationen zur Verwendung des transparenten Proxys finden Sie auf der folgenden Website.

Transparenter Mitmproxy mit Wifi-Sharing auf dem Mac http://bagpack.hatenablog.jp/entry/2014/02/04/225553

abschließend

Wenn die Web-API-Designer / -Betreiber und App-Entwickler der Welt die oben genannten Informationen nicht richtig kennen, dauert es eine andere Zeit als beim ursprünglichen Content-Management, z. B. die Wiederherstellung im Falle eines Fehlers und die Verfolgung von Verstößen, und es kommt zu Schäden. Es verursacht sogar ein Gefühl der Stagnation im Plan. Ich denke, der Anfang ist, dass wenn Sie mit einer Smartphone-Anwendung mit https kommunizieren, das Design aufgrund optimistischen Denkens wie Seelenfrieden passiv ist. Daher dachte ich, dass es das erste war, zu wissen, wie man die Kommunikation abfängt / manipuliert.

Tatsächlich scheint Apples Game Center Punktzahlen über Plist zu senden, und es scheint, dass Sie die Punktzahl des App-Benutzers ändern können, indem Sie die interaktive Anfrage von Mitmproxy fälschen (obwohl dies jetzt möglicherweise behoben ist). ..

Setting highscores on Apple's GameCenter http://mitmproxy.org/doc/tutorials/gamecenter.html

Die spezifischen Sicherheitsmaßnahmen variieren je nach den Anforderungen und Prioritäten der einzelnen Inhalte. Überzeugen Sie sich selbst. Oder Wenn Sie sich mit uns beraten, werden wir gemeinsam nachdenken.

Referenz-URL

mitmproxy http://mitmproxy.org/

Beispiel für ein Mitmproxy-Skript https://github.com/mitmproxy/mitmproxy/tree/master/examples

Überprüfen Sie den Inhalt der SSL-Kommunikation mit Mitmproxy http://ido.nu/kuma/2012/01/29/how-to-use-mitmproxy/

Haben Sie wegen der Abhängigkeit von pyasn1 und PyOpenSSL angefangen, pip zu verwenden? https://github.com/mitmproxy/mitmproxy/issues/37

Recommended Posts

Abfangen oder Manipulieren der SSL-Kommunikation des tatsächlichen iOS-Geräts durch einen Proxy
Wie man zeichnet, indem man die Farbe des Diagramms kontinuierlich mit matplotlib ändert und einfach viele Legenden anordnet
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So berechnen Sie die Volatilität einer Marke
[Python] So sortieren Sie nach dem N-ten M-ten Element eines mehrdimensionalen Arrays
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
[Python] Umgang mit dem is-Instanzfehler "is instance () arg 2 muss ein Typ oder ein Tupel von Typen sein"
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
[Ruby] Wie ersetze ich nur einen Teil der Zeichenkette, der mit dem regulären Ausdruck übereinstimmt?
Ein Memo darüber, wie man das schwierige Problem der Erfassung von FX mit AI überwinden kann
Erstellen Sie ein zweidimensionales Array, indem Sie am Ende eines leeren Arrays mit numpy eine Zeile hinzufügen
Wie man einen bestimmten Prozess am Anfang und Ende der Spinne mit Scrapy einfügt
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
So zeigen Sie eine Liste der mit pyenv installierbaren Versionen an
Eine Geschichte über den Umgang mit dem CORS-Problem
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
So senden Sie Dateien auf einmal, indem Sie mit SCP in mehreren Schritten eine Verbindung zu einem Host auf der anderen Seite der Plattform herstellen
So bestimmen Sie die Existenz eines Selenelements in Python
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
So überprüfen Sie die Speichergröße einer Variablen in Python
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So überwachen Sie den Ausführungsstatus von sqlldr mit dem Befehl pv
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
[NNabla] So entfernen Sie die mittlere Ebene eines vorgefertigten Netzwerks
So führen Sie den Übungscode des Buches "Profitable KI mit Python erstellen" in Google Colaboratory aus
[EC2] So machen Sie mit Selen eine Bildschirmaufnahme Ihres Smartphones
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Überlegen Sie, wie Sie einen Filter mit den Shotgun API-Contact-Versionen schreiben
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
Umgang mit SSL-Fehlern beim Herstellen einer Verbindung zu S3 mit Python boto
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
Einstellung, um den Inhalt der Bibliothek mit pytest einzugeben und einen Debug-Test durchzuführen
Wie man die anfängliche Population mit einem genetischen Algorithmus unter Verwendung von DEAP fixiert
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
So formatieren Sie eine Liste von Wörterbüchern (oder Instanzen) in Python
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Zusammenfassung zum Erstellen einer LAMP + Wordpress-Umgebung mit Sakura VPS
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
So erhalten Sie den "Namen" eines Feldes, dessen Wert durch das Auswahlattribut im Django-Modell begrenzt ist
So fügen Sie ein Paket mit PyCharm hinzu
So überprüfen Sie die Version von Django
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Fühlen Sie sich frei, einen Test mit der Nase zu schreiben (im Fall von + gevent)