Router_Unlocker作成ログ

このURLはルータにつながっている
http://192.168.0.1/
この画面をブルートフォースで解除する

まずHTTPを使用すると思うけど
リクエストを見てみる
要求ヘッダ

GET / HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 
Accept-Encoding: gzip, deflate 
Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7 
Authorization: Basic Og== 
Cache-Control: max-age=0 
Connection: keep-alive 
Host: 192.168.0.1 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0

要求ヘッダ2

GET / HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 
Accept-Encoding: gzip, deflate 
Accept-Language: ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7 
Authorization: Basic Og== 
Cache-Control: max-age=0 
Connection: keep-alive 
Host: 192.168.0.1 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0

応答ヘッダ

HTTP/1.1 401 Unauthorized 
WWW-Authenticate: Basic realm="hgw-area" 
Pragma: no-cache 
Cache-Control: no-cache, no-store, must-revalidate 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Content-type: text/html 
Transfer-Encoding: chunked 
Date: Wed, 17 Jul 2024 11:56:02 GMT 
Server: lighttpd/1.4.26

General

要求 URL:http://192.168.0.1/
要求方法 GET
状態コード: 401 Unauthorized
リモート アドレス:192.168.0.1:80
参照元のポリシー:strict-origin-when-cross-origin

GETリクエストを送ってるらしい
状態コード401は

基本的にログインエラーなどで表示される。

Quote

401エラーとは、「Unauthorized」とも呼ばれ、あるWebサイトへログインする際、認証に失敗した場合やそのサイトへのアクセス権限がない場合に表示されるHTTPレスポンスステータスコードです。

80ポートだからWEBサーバらしいね
ポリシーの意味は特に気にしなくてもよさそう。

ここでFlutterで実装していこう。
たぶんhttpパッケージだよね
HTTPパッケージの使用方法

AIにヘッダのこと聞いたらめっちゃいい情報きた!

この例では、`Authorization`ヘッダーに`Basic Og==`を設定していますが、これはBase64エンコードされた認証情報(ユーザー名とパスワード)を示しています。実際の使用では、この値を適切な認証情報に置き換える必要があります。

試しにユーザ名にRerurate、パスワードにnameって入れたらこれが出てきた。
UmVydXJFEWS*******WdhaXl1dG8=
これをBase64でデコードしたら、Rerurate:nameって出てきた!
ここに認証情報いれるのは確定っぽい

こんな感じで送るテキストも用意してみた

20240717094258-TalkWithAI-phind-Log-dartでStringからBase64の変換

import 'dart:convert';
import 'package:http/http.dart' as http;
 
class HttpController{
  Future<http.Response> getHttp(Uri reqHeader) async {
 
    var response = await http.get(reqHeader);
 
    return response;
  }
}
 
class HeadrCreater{
  final String URL = "http://192.168.0.1/";
 
  Uri getHeader(Base64Controller base64){
    var req = Uri.http(
      URL, 
      "", 
      { 
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 
        'Accept-Encoding': 'gzip, deflate', 
        'Accept-Language': 'ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7', 
        'Authorization': 'Basic ${base64.encodedText}', 
        'Cache-Control': 'max-age=0', 
        'Connection': 'keep-alive', 
        'Host': '192.168.0.1', 
        'Upgrade-Insecure-Requests': '1', 
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0' 
      }
    );
 
    return req;
  }
}
 
class Base64Controller{
  late final String _encodedText;
  String get encodedText => _encodedText;
 
  void encodeText(String name, String password){
    String text = "$name:$password";
    _encodedText = base64Encode(
      utf8.encode(text)
    );
  }
}
 

この時にUriクラスからHttpのUriを生成するときのURLはhttp://部分は要らないらしい

var uri = Uri.http("www.google.com". "/");

AIにすべてのパターンを出してくれるコード作ってもらった

void generateCombinations(int length) {
  const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  List<String> combinations = [];
 
  void recurse(String prefix) {
    if (prefix.length == length) {
      combinations.add(prefix);
      return;
    }
 
    for (int i = 0; i < characters.length; i++) {
      recurse(prefix + characters[i]);
    }
  }
 
  recurse('');
  
  print('Generated ${combinations.length} combinations\n$combinations');
}

なんか500コードなので
JSでも試してみる

// リクエストオプションを設定
const requestOptions = {
    method: 'GET',
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'ja,en;q=0.9,en-GB;q=0.8,en-US;q=0.7',
        'Authorization': 'Basic Og==',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Host': '192.168.0.1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
    }
};
 
// fetch APIを使用してリクエストを送信
fetch('http://192.168.0.1', { ...requestOptions, mode: 'no-cors' })
    .then(response => {
        // レスポンスが成功した場合
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        } else {
            return response.text(); // レスポンスボディをテキストとして取得
        }
    })
    .then(data => {
        console.log(data); // レスポンスデータをコンソールに出力
    })
    .catch(error => {
        console.error('Error:', error);
    });

mode: "no-cors"を有効にしてみる。Dartで。

なんかHTTPパッケージの使用方法だとこの設定ができないらしい
からDioというパッケージを使ってみる。