Wie authentifiziere ich mich bei einem "offenen" Netzwerk eines Mobilfunkanbieters, ohne einen Browser zu verwenden?

13

Diese Art der Einrichtung scheint in Einkaufszentren und Flughäfen üblich zu sein. In Westkanada bietet Shaw einen solchen Service an und nennt ihn "Shaw Open". Ich bin mir ziemlich sicher, dass andere Gebietsschemas ähnliche Dienste von Anbietern wie T-Mobile usw. anbieten.

Von so etwas wie einem Handy ist es nicht sehr kompliziert zu machen. Für die Verbindung zum WLAN-Hotspot ist keine Authentifizierung erforderlich, da dieser für den öffentlichen Zugriff "offen" ist. Mein Mobiltelefon kann jedoch erst dann über Apps eine Verbindung zu Websites oder Remotediensten herstellen, wenn ich meinen Browser verwende und mich bei einer bestimmten, vom Internetdienstanbieter bereitgestellten Webseite anmelde .

Meine Frage lautet einfach: Wie automatisiere ich den Authentifizierungsschritt von einem Gerät aus, das normalerweise keinen herkömmlichen Browser hat?

In meinem speziellen Fall habe ich einen Himbeer-Pi, der mit Software konfiguriert ist, die ich auf Messen usw. verwenden möchte. Diese Standorte haben die gleiche Art von "offenen" Hotspots. Die Raspi soll in sich geschlossen sein. Es macht einfach sein Geschäft und spricht mit einer Website. Diese ausgehende Verbindung wird jedoch von der "offenen" Verbindung des Internetdienstanbieters blockiert, da ich den Browserteil des Vorgangs noch nicht abgeschlossen habe.

Angenommen, ich habe Anmeldeinformationen für das Netzwerk eines bestimmten Anbieters. Wie kann ich diesen Teil des Prozesses automatisieren, ohne dass ich eine Terminalsitzung für den Pi eröffnen muss? Nach welcher Technologie kann ich hier suchen?

Tintenfisch
quelle
Angenommen, Ihr Pi hat Linux, ist das wgetProgramm installiert?
David Wilkins
1
Ihre Frage bezieht sich nicht wirklich auf Linux oder Unix, sondern passt besser zu Super User . Gibt es auch einen Grund, warum Sie keinen Browser auf dem Pi installieren möchten? Sie könnten immer einen einfachen textbasierten Befehlszeilenbrowser verwenden, wie links2zum Beispiel.
Terdon
@terdon Solange auf dem Pi Linux oder eine andere Unix-Variante läuft, ist die Frage hier genau richtig. Umgekehrt glaube ich nicht, dass der Pi ein Computer gemäß der Definition von SU ist (aber ich bin mir nicht sicher, ich habe diese Definition nie verstanden und sehe sie auch nirgendwo aufgeschrieben).
Gilles 'SO - hör auf böse zu sein'
@Gilles ja, es ist ein Thema, ich habe nicht abgestimmt, um zu schließen. Ich habe nur vorgeschlagen, dass es besser zu SU passt. Und ja, pi-Fragen sind dort willkommen.
Terdon

Antworten:

12

Der Schlüssel zur Lösung solcher Probleme ist das Wissen, wie man die Frage stellt. Ich suchte bei Google nach "wie man auf panera bread wifi zugreift" und fand dieses Juwel.

Dieser Artikel enthielt mehrere Skripts, die zur Erleichterung der automatischen Anmeldung verwendet werden konnten. Ich habe mich für das Beispiel für Panera Bread entschieden, das die Mechanize-Bibliothek von Python nutzt.

Die Lösung verwendet das dispatcher.dVerzeichnis von NetworkManager , um Skripts immer dann auszuführen, wenn eine bestimmte Netzwerkschnittstelle inaktiv oder inaktiv ist. Der Artikel beschreibt ein Skript mit dem /etc/NetworkManager/dispatch.dNamen 07-autologin_openwifi. Hier ist das Skript:

#!/bin/bash
#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------

export LC_ALL=C
LogFile="/var/log/07-WIFI_ACCESS.log"

# The parameters that get passed to the script are:
# $1 = The interface name ( eth0, wlan0 ...etc)
# $2 = Interface status ( "up" or "down" )

# Check if wireless status is up
# I have two wifi cards in my laptop, named "wlan0 and wlan1"
# so I use regular expression "wlan[01]" to match both of them.
if [[ "$1" =~ wlan[01] && $2 == "up" ]]; then

    # Get the network name from "iwconfig" or (can also locate the network based on IP or MAC address if needed)
    ESSID=$(/sbin/iwconfig $1 | grep ESSID | cut -d'"' -f2)

    # Record the date and time for debugging purposes only
    echo "[`date`] ESSID=($ESSID)" >> $LogFile

    # If the wireless name matches then run its python script
    if [[ "$ESSID" == "BCPL-PUBLIC-WIFI" ]]; then
        /usr/bin/python /myscripts/baltimore-county_library_wifi.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "PANERA" ]]; then
        /usr/bin/python /myscripts/panera.py 1>> $LogFile 2>&1
    elif [[ "$ESSID" == "Nordstrom_Wi-Fi" ]]; then
        /usr/bin/python /myscripts/nordstrom.py 1>> $LogFile 2>&1
    #elif .... (you can add more open wifi here)

    fi
fi

#if [[ "$1" =~ wlan[01] && $2 == "down" ]]; then
    ##If you want to do somehting when the network is down
#fi

Und hier ist das Panera-Brotskript panera.py:

#------------------------------
# By Fahad Alduraibi
# Last update: June 12, 2012
# Version: 1.1
#------------------------------
import mechanize
import sys

br = mechanize.Browser()
br.set_handle_equiv(True)
#br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0')]

testURL = 'http://fadvisor.net/blog/'
response = br.open(testURL)

if response.geturl() == testURL:
  print "FAD: You are already logged in to Panera."
  sys.exit()

try:
  forms = mechanize.ParseResponse(response, backwards_compat=False)
except:
  print "FAD: Error in parsing forms, Am I already logged in to Panera?"
  sys.exit()

response.close

form = forms[0]
#print form
#print "----------------------------------- Login"
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin New"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- ConfirmLogin Validate"
#print
request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- CompleteLogin New"
#print

request = form.click()
response = mechanize.urlopen(request)
forms = mechanize.ParseResponse(response, backwards_compat=False)
response.close()

form = forms[0]
#print form
#print "----------------------------------- HttpLoginRequest"
#print

request = form.click()
response = br.open(request)
#print response.read()

response.close()
print "--- Panera Done ---"

Ich empfehle Ihnen, den gesamten Artikel zu lesen, wenn Sie an anderen Methoden für die automatische Anmeldung interessiert sind. Der Artikel enthielt mehrere andere offene WiFi-Netzwerke, die für den Baltimore, MD-Bereich, erstellt wurden.

slm
quelle
Dies ist möglicherweise die einzige Lösung. Leider ist einiges an Reverse Engineering erforderlich, um die zu übermittelnden URLs und Formularfelder für jeden Anbieter zu ermitteln. Dies hat natürlich seine eigenen Herausforderungen, von denen nicht zuletzt der Entwickler alle möglichen Anbieter kennen und haben muss direkten Zugang zu ihnen; für mein bestimmtes Szenario nicht unbedingt möglich. Ich denke, das ist ungefähr das Beste, was ich erwarten kann. Natürlich kann jede Lösung eines Anbieters scheitern, sobald er sich entscheidet, seine Webauthentifizierungsformulare zu aktualisieren.
Octopus
1

Abhängig davon, wie die Authentifizierung implementiert ist, können Sie möglicherweise eine HTTP-Anforderung senden, um Zugriff zu erhalten. Dies hängt jedoch von zahlreichen Aspekten der jeweiligen Implementierung ab.

Beachten Sie, dass diese Art der Authentifizierung eingeführt wird, um autonome Systeme fernzuhalten und gleichzeitig nur Browsern Zugriff zu gewähren. Genau das versuchen Sie zu umgehen.

Idealerweise hätten Sie ein Telefon, das Sie als WLAN-Hotspot einrichten und Ihren Pi mit diesem Netzwerk verbinden können, damit Sie tun können, was Sie wollen, aber das ist nicht kostenlos.

TL; DR: Bettler können keine Wahl sein

David Wilkins
quelle
1
Wenn dies über einen Browser erfolgt, muss HTTP verwendet werden, dies ist also mit Sicherheit möglich. Da es jedoch kein Protokoll oder keinen Standard für diese Art der Authentifizierung (AFAIK) gibt, müssen Sie pro Anbieter etwas implementieren. Was nutzlos ist, wenn Sie es an einen Ort bringen möchten, für den Sie keine Implementierung haben. Ich würde mit dem Telefon - Hotspot gehen - es wird frei sein , wenn Sie das Telefon an das offene Netzwerk verbinden.
Goldlöckchen
1

Anscheinend basieren diese Netzwerke mit webbasierter Authentifizierung auf der MAC-basierten Zugriffskontrolle nach der Authentifizierung. Sie können sich also einfach auf einem anderen Gerät authentifizieren, während Sie die MAC-Adresse Ihres Pi fälschen, und dann sollte Ihr Pi in der Lage sein, in das Netzwerk zu gelangen.

Bekam diesen Tipp von http://frankiejarrett.com/how-to-connect-apple-tv-to-a-hotel-wi-fi-network/

Hash
quelle
1

Wenn Sie ein zweites Netzwerkgerät haben, können Sie die NAT-Weiterleitung einrichten. Stellen Sie mit Ihrem Mobiltelefon oder Laptop eine Verbindung zu Ihrem "internen" Netzwerk her und lassen Sie das RPi diese Verbindung an das Netzwerk weiterleiten. Dann authentifizieren Sie sich mit dem Browser auf Ihrem Laptop oder Telefon. Das Netzwerk erkennt die externe MAC-Adresse Ihres RPi und ordnet diese der authentifizierten Verbindung zu.

Ich mache dies regelmäßig mit einem Pocket-Reiserouter (alter AirPort Express), um eine Verbindung zum Internet des Hotels herzustellen. Dann kann ich meinen Chromecast und andere Geräte mit diesem Netzwerk verbinden, ohne mich erneut authentifizieren zu müssen.

Noch einfacher ... Wenn Ihr Netzwerkgerät USB ist und mit einem Laptop funktioniert, schließen Sie es an einen Laptop an und melden Sie sich im Netzwerk an. Schließen Sie es dann wieder an das RPi an. Es sollte einige Stunden lang funktionieren.

Mike DeAngelo
quelle