Wie ich ProxyScrape Proxys benutzt habe, um ipinfo.io-Waren zu gewinnen

Mar-06-20245 Min. gelesen

Hey, ich bin Benji, ein ProxyScrape Benutzer, und ich liebe es, mit Systemen herumzuspielen und herauszufinden, wie Programme im Hintergrund funktionieren. Ich verwalte auch einige Server und programmiere gelegentlich (https://benji.link). ProxyScrape hat mich gebeten, ein wenig darüber zu schreiben, wofür ich ihre Proxys benutze, also los geht's: Zu Halloween 2023 hielt ipinfo.io

Hey, ich bin Benji, ein ProxyScrape Benutzer, und ich liebe es, mit Systemen herumzuspielen und herauszufinden, wie Programme im Hintergrund funktionieren. Ich mache auch etwas Server-Administration und gelegentliches Programmieren(https://benji.link). ProxyScrape hat mich gebeten, ein wenig darüber zu schreiben, wofür ich ihre Proxys benutze, also los geht's:

Zu Halloween 2023 veranstaltete ipinfo.io den Wettbewerb "Halloween Hunt", bei dem die Nutzer die IPinfo-App verwenden sollten, um IPs und GPS-Daten zu übermitteln. Ich vermute, sie wollten ihre IP-Daten verbessern, während wir die Chance bekamen, etwas zu gewinnen.

2 Wochen lang wurde jeden Tag ein Benutzer aus den Einsendungen ausgewählt, der die Waren des Tages gewinnen sollte. Auf diese Weise war es kein reines Zahlenspiel und es gehörte auch etwas Glück dazu.

Ich habe meine Reise so begonnen, wie es wahrscheinlich beabsichtigt war, nämlich mit etwas Automatisierung. Ich tat dies, indem ich einen langsamen Auto-Klicker machte, um den Flugzeugmodus auf meinem Telefon ein- und auszuschalten, um eine neue mobile IP von meinem ISP zu erzwingen. Das funktionierte gut, war aber sehr langsam und lieferte mir nur etwa 2-3 IPs pro Minute.

Mit dieser Methode habe ich mit meinem Telefon insgesamt etwa 400-500 IPs erhalten, bevor ich anfing, über schnellere Methoden nachzudenken.

Als ich an diesem Tag nach Hause kam, begann ich mit dem Reverse Engineering der App, um herauszufinden, ob es eine Möglichkeit gab, das System zu umgehen und Proxys zu verwenden, ohne dafür ein Telefon benutzen zu müssen.

Nachdem ich den Netzwerkverkehr der Anwendung untersucht hatte, stellte ich fest, dass nur eine einzige Anfrage an den json-Endpunkt ("https://ipinfo.io/json") mit Ihrer Geräte-ID gesendet wurde.


Screenshot des HTTP-Toolkits zur Überwachung des Datenverkehrs, der durch die IPinfo-App läuft. (Geräte-ID hervorgehoben)

Ich habe zunächst versucht, eine dieser Anfragen zu kopieren und Proxys dafür zu verwenden, aber die Anfragen wurden nicht angenommen. Nach einigem Ausprobieren stellte ich fest, dass es irgendwie mit den zusätzlichen Informationen zu tun hatte, die in der Anfrage gesendet wurden.

Die Geräte-ID und die Endpunkt-URL waren die einzigen wichtigen Angaben in dieser Anfrage.

Nachdem ich alle anderen Details entfernt hatte, so dass die Anfrage nur die device_id und sonst nichts enthielt, funktionierte es.

url = "https://ipinfo.io/json?token=app_test"


headers = {
  'Host': 'ipinfo.io',
  'User-Agent': 'IPinfo/Android-Lib/3.0.6/IPinfo',
  'x-conn-details': 'device_id=d813353d28df2ad3'
}

Die Geräte-ID konnte man einfach von jedem Telefon kopieren, auf dem man die App installiert hatte, und ich hätte wahrscheinlich etwas machen können, um die ID ohne die App für mich zu generieren, aber das war mir den Aufwand nicht wert.

Jetzt mussten nur noch Proxys verwendet werden, was der einfachste Teil war.

Ich habe mich für ProxyScrape Residential Proxies entschieden, weil ich einige kostenlose Daten aus einer Werbeaktion hatte und sie mir Tausende von eindeutigen IPs lieferten.

Ich habe mit einem sehr einfachen Skript begonnen, das 100 Anfragen wie diese gesendet hat:


Dies hat gut funktioniert und die Geschwindigkeit von etwa 2-3 IPs pro Minute auf etwa 30 IPs pro Minute erhöht (wobei jede Anfrage zwischen 0,5-2 Sekunden dauert).

Um die Geschwindigkeit weiter zu erhöhen, wollte ich, da mir das immer noch nicht schnell genug war, ein einfaches Threading implementieren, um die Anfragen gleichzeitig zu senden.

import requests
import concurrent.futures
import time
import random


# open the proxies.txt file and read the proxies
proxies = open("proxies.txt", "r").read().split("\n")


url = "https://ipinfo.io/json?token=app_test"


device_ids = {
  "3d8e0d7245a92152",
  "a9c7b2b233dd06b8",
  "661035895999a7fe",
  "d813353d28df2ad3",
  "982078c380f4fe38"
}


success_count = 0


def send_request(i):
  global success_count
  try:
    # pick a random number between 1 and 1000
    rand = random.randint(1, 10000)
    proxy = {"https": proxies[rand]}
    device_id = random.choice(list(device_ids))


    payload = {}
    headers = {
        'Host': 'ipinfo.io',
        'User-Agent': 'IPinfo/Android-Lib/3.0.6/IPinfo',
        'x-conn-details': 'device_id={}'.format(device_id)
    }


    response = requests.request("GET", url, headers=headers, data=payload, proxies=proxy, timeout=20)
    print("Request #{}: \n{} \nTime taken: {}\n".format(i, response.text, response.elapsed.total_seconds()))
    success_count += 1
  except Exception as e:
    print("Request #{}: Error - {}".format(i, str(e)))


with concurrent.futures.ThreadPoolExecutor() as executor:
  futures = []
  for i in range(500):
    time.sleep(0.02)  # wait for 100ms before starting each thread
    futures.append(executor.submit(send_request, i))


  try:
    for future in concurrent.futures.as_completed(futures):
      future.result()
  except KeyboardInterrupt:
    print("Program interrupted by user.")
    for future in futures:
      future.cancel()
  except Exception as e:
    print("An error occurred:", str(e))


print("Success count:", success_count)

Ich habe vorsichtshalber ein paar verschiedene Geräte-IDs hinzugefügt und eine Liste von 10 000 einminütig rotierenden Proxys von ProxyScrapewhich in proxies.txt eingefügt. Ich habe auch dafür gesorgt, dass zwischen dem Start jedes Threads eine kurze Ruhezeit eingefügt wird, damit nicht alles genau zur gleichen Zeit passiert. (Das schien Probleme zu verursachen.)

Jetzt musste ich nur noch die Zahl im "Bereich (500)" ändern, um Tausende von IPs zählen zu lassen.

Mit all diesen Änderungen konnte ich ein paar hundert IPs pro Minute erhalten. Während der zweiwöchigen Jagd habe ich dann weiterhin jeden Tag ein paar tausend IPs gesendet.

Laut den Veranstaltern habe ich 149k eindeutige IPs erhalten, obwohl ich vermute, dass ich viel mehr gesendet habe. Das brachte mich auf den 6. Platz weltweit und bescherte mir ein paar nette Fanartikel.
Die Ergebnisse des Wettbewerbs können Sie hier sehen: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Ich habe mir ein Aufkleberpaket, ein "I am a Huntathon Winner T-Shirt", eine Notizkarte mit einer Karte des Internets und ein paar IPinfo-Socken gekauft.

Diese kamen alle etwa 3 Wochen später an:

Um es gleich vorweg zu nehmen: Das IPinfo-Team hat damit gerechnet, dass die App zurückentwickelt wird, und war sehr erfreut zu erfahren, wie die Leute kreative Lösungen für die Blockaden gefunden haben.

Letztendlich hat es Spaß gemacht, neue Leute kennenzulernen, etwas über Proxies und Android-Reverse-Engineering zu lernen und natürlich ein paar kostenlose Artikel zu bekommen.

Benji