4

ESP8266 ベースのセンサーを、キャプティブ ポータルで保護された Wi-Fi ネットワークに接続したいと考えています (他に選択肢がなく、例外を求めることはできません)。接続するためのログイン/パスワードがあります。

基本的なコンピューターから、ネットワークに接続してインターネット リクエスト (たとえば、Google で「bl」を検索) を行うと、次のようなページが表示されました: https://url:1003/fgtauth?12291a0aff04200a

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style type="text/css">
    ...
    </style>
    <body>
<div class="oc">
  <div class="ic">
    <form action="/" method="post">
      <input type="hidden" name="4Tredir" value= "https://www.google.com/search?q=test&ie=utf-8&oe=utf-8">
      <input type="hidden" name="magic" value="12291a0aff04200a">
      <input type="hidden" name="answer" value="0">
      <h1 class="logo">
        GENERAL CONDITIONS
      </h1>
      <p>
      I.    OBJET <br /> <br />
      Some blabla..
      </p>
      <h2>
        Do you agree to the above terms?
      </h2>
      <div class="fec">
        <input type="submit" value= "Yes, I agree" onclick="sb('1')">
        <input type="submit" value= "No, I decline" onclick="sb('0')">
      </div>
    </form>
   </div>
   </div>
   <script>
     function sb(val) {
       document.forms[0].answer.value = val;
       document.forms[0].submit();
      }
    </script>
  </body>
</html>

したがって、このページでは、実際にはセッションの ID である「魔法の値」を取得していることがわかります。同意ボタンをクリックすると、次のページが表示されます https://url:1003/ :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <style type="text/css">
    ...
    </style>

    <title>
      Firewall Authentication
    </title>
  </head>
  <body>
    <div class="oc">
      <div class="ic">
        <form action="/" method="post">
        <input type="hidden" name="4Tredir" value= "https://www.google.com/search?q=bl&ie=utf-8&oe=utf-8">
        <input type="hidden" name="magic" value="122713150676bec1">
        <h1 class="logo">
          Authentication Required
        </h1>
      <h2>
        Please enter your username and password to continue.
      </h2>
        <div class="fer">
          <label for="ft_un">
            Username:
          </label>
            <input name="username" id="ft_un" style="width:245px">
            <br>
          </div>
          <div class="fer">
            <label for="ft_pd">
              Password:
            </label>
            <input name="password" id="ft_pd" type="password" style="width:245px">
          </div>
          <div class="fer">
            <input type="submit" value= "Continue">
          </div>
        </form>
      </div>
    </div>
  </body>
</html>

ここで、ユーザーとパスワードを入力すると、それらがサーバーに送信され、サーバーは空白のページを OK で返します。

したがって、ESP8266 からこの手順を実行したいと思います。私は2つのステップでそれを見ます:

  • ページをリクエストする
  • 結果を取得して魔法を保存する
  • 「同意」リクエストページを偽造する
  • 「user/id/magic」リクエストページを偽造する

ESP8266 のリクエスト ページの例は、こちらにあります: https://github.com/iobridge/ThingSpeak-Arduino-Examples/blob/master/Ethernet/Arduino_to_ThingSpeak.ino ここで、POST リクエストを次のように送信できることがわかります。

client.print("POST /update HTTP/1.1\n");

ここに、ページを解析する良い例があります: http://blog.nyl.io/esp8266-led-arduino/

それで、私はそれでそれをして答えを投稿するかもしれませんが、最初に上記の「偽の」リクエストを作成する方法についての手がかりが必要です.

何か案は ?

4

1 に答える 1

7

ESP8266 は HTTPS を使用する以上の機能を備えています。実際、最新の ESP8226 Arduino コードベースには、HTTPS サーバーに接続するための WiFiClientSecure クラスが含まれています。

このページが変更されず、Arduino 環境を使用していると仮定すると、いくつかの基本的な関数を記述する必要があります。これらの 1 つは、既にリンクされている初期GET機能であり、目的のページを受け取ったかどうか、またはポータルに誘導されたかどうかを確認します。ポータルに誘導された場合はPOST、「同意します」という応答を送信する同等の関数を作成する必要があります。

ここで、このPOST関数では、"Answer" 値を含む HTTP フォームでエンコードされたペイロードをサーバーに送信する必要があります。これについては、 http://www.w3.org/TR/html401/interact/forms.htmlで確認できます。 #h-17.13 . (おそらく) ページが変更されることを期待していないため、次のようにハード コードすることができます。

client.println("POST / HTTP/1.1");
// $PORTAL_HOST should be the host of the captive portal, e.g. 10.1.1.1
client.println("Host: $PORTAL_HOST");
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Content-Length: 8");
client.print("\n");
client.print("Answer=1");

そのペイロードを送信すると、セカンダリ ユーザー/パスワード ページを受信する必要があります。そこから、indexOf/substringまたは同様のものを介してマジック/セッションを抽出し、必要に応じて、抽出したデータで上記のコードを繰り返すだけです。

正確に何を送信するかをより正確に把握する必要がある場合は、ブラウザの [デバッグ/ネットワーク] タブを開いて、このポータル ページにリダイレクトされたときにブラウザが送信する正確なデータを監視することをお勧めします。これをできるだけ厳密にエミュレートする必要があります。

于 2015-11-19T23:12:56.163 に答える