donker proxyscrape logo

Hoe ik ProxyScrape proxies gebruikte om ipinfo.io-koopwaar te winnen

05 jan-20245 min gelezen
Hey, ik ben Benji, een ProxyScrape gebruiker, en ik hou ervan om met systemen te rommelen en uit te vinden hoe programma's op de achtergrond werken. Ik doe ook wat aan serverbeheer en af en toe coderen(https://benji.link). ProxyScrape vroeg me om wat te schrijven over waar ik hun proxies voor gebruikte, dus hier gaan we:
Voor Halloween 2023 hield ipinfo.io de wedstrijd "Halloween Hunt", waarbij gebruikers de IPinfo app moesten gebruiken om IP's en GPS-gegevens in te sturen. Ik denk dat ze hun IP-gegevens wilden verbeteren, terwijl wij de kans kregen om merch te winnen.

Elke dag, 2 weken lang, kozen ze een gebruiker uit de inzendingen om de merch van die dag te winnen. Op die manier was het geen compleet nummertjes spel en kwam er wat geluk bij kijken.

Ik begon mijn reis zoals het waarschijnlijk bedoeld was, gewoon met wat automatisering. Ik deed dit door een langzame auto-clicker te maken om de vliegtuigmodus op mijn telefoon in of uit te schakelen om een nieuw mobiel IP van mijn ISP te forceren. Dit werkte geweldig, maar was erg traag en gaf me maar ongeveer 2-3 IP's per minuut.

Ik kreeg ongeveer 400-500 IP's in totaal met mijn telefoon met die methode, voordat ik snellere manieren begon te bedenken.

Toen ik die dag thuiskwam, begon ik de app te reverse engineeren om te zien of er een manier was waarop ik het systeem gemakkelijk kon omzeilen en proxies kon gebruiken zonder daarvoor een telefoon te hoeven gebruiken.

Nadat ik het netwerkverkeer van de app had geïnspecteerd, zag ik dat er alleen maar een verzoek werd verzonden naar het json eindpunt ("https://ipinfo.io/json"), met je apparaat-ID.


Screenshot van HTTP-toolkit die verkeer controleert dat door de IPinfo app gaat. (Apparaat-ID gemarkeerd)

Ik heb eerst geprobeerd om gewoon een van die verzoeken te kopiëren en er proxies bij te gebruiken, maar de verzoeken werden niet geaccepteerd. Met wat vallen en opstaan ontdekte ik dat het op de een of andere manier te maken had met de extra informatie die in het verzoek werd meegestuurd.

De apparaat-ID en de URL van het eindpunt waren de enige belangrijke dingen in dat verzoek.

Na het verwijderen van alle andere details, zodat het verzoek alleen het device_id had en niets anders, begon het te werken.

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'
}

De apparaat-ID kon je gewoon kopiëren van elke telefoon waarop je de app had geïnstalleerd en ik had waarschijnlijk iets kunnen maken om de ID voor mij te genereren zonder de app, maar dat was het gedoe niet waard.

Nu hoefde ik alleen nog maar proxies te gebruiken, wat het makkelijke gedeelte was.

Ik besloot om ProxyScrape residentiële proxies omdat ik wat gratis gegevens had van een promotie, en ze lieten me duizenden unieke IP's krijgen.

Ik begon met een heel eenvoudig script dat 100 verzoeken als deze verstuurde:


Dit werkte goed en verhoogde de snelheid van ongeveer 2-3 IP's per minuut naar ongeveer 30 IP's per minuut (waarbij elk verzoek tussen 0,5-2 seconden duurde).

Om de snelheid verder te verhogen, aangezien dit nog steeds niet snel genoeg was voor mij, wilde ik wat eenvoudige threading implementeren om de verzoeken gelijktijdig te verzenden.

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)

Ik heb een paar verschillende apparaat-ID's toegevoegd voor het geval dat, en ik heb een lijst van 10 000 1-minuut roterende proxies van ProxyScrape die in proxies.txt zijn geplakt. Ik heb er ook voor gezorgd dat ik een korte slaaptijd toevoegde tussen het starten van elke thread, zodat het niet allemaal op precies hetzelfde moment gebeurt. (wat problemen leek te veroorzaken.)

Nu hoefde ik alleen maar het getal in het "bereik(500)" te veranderen om duizenden IP's te tellen.

Door al deze veranderingen kreeg ik een paar honderd IP's per minuut. Vervolgens bleef ik elke dag een paar duizend IP's versturen tijdens de jacht van 2 weken.

Volgens de organisatoren van het evenement kreeg ik 149k unieke IP's, hoewel ik vermoed dat ik er veel meer heb verzonden. Daarmee eindigde ik op de 6e plaats wereldwijd en hield ik er wat leuke merch aan over.
Je kunt de resultaten van de wedstrijd hier bekijken: https://community.ipinfo.io/t/the-great-ip-hunt-is-over/3906

Ik heb een stickerpakket, een "I am a Huntathon Winner T-Shirt", een notitiekaart met een kaart van het internet en een paar IPinfo-sokken.

Deze kwamen allemaal ongeveer 3 weken later aan:

Als disclaimer: het IPinfo team verwachtte dat de app reverse engineered zou worden en was eigenlijk best blij om te horen hoe mensen creatieve oplossingen vonden om de blokken heen.
Uiteindelijk was het een leuke tijd om nieuwe mensen te ontmoeten, wat dingen te leren over proxies en Android reverse engineering, en natuurlijk om wat gratis merch te krijgen.

Benji