ホームページ > バックエンド開発 > Golang > Golang は同期スキャンを実装します

Golang は同期スキャンを実装します

王林
リリース: 2023-05-13 09:21:07
オリジナル
1419 人が閲覧しました

インターネットの普及に伴い、ネットワークのセキュリティ問題はますます深刻になっています。ネットワーク攻撃手法は数え切れないほどありますが、その中でも一般的な攻撃手法が SYN スキャンです。 SYN スキャンは、ターゲット ホストの開いているポートに TCP SYN パケットを送信することによって、ターゲット ホストのアクセス可能性をチェックする方法です。この記事では、Golangを使用したSYNスキャンの実装方法を紹介します。

1. SYN スキャンの原理

SYN スキャンは、TCP の 3 ウェイ ハンドシェイク プロセスに基づいています。ホストが別のホストの特定のポートに接続したい場合、ターゲット ホストに SYN パケットを送信して、ポートが開いているかどうかを尋ねます。ターゲット ホストがこの SYN パケットを受信し、ポートが実際に開いている場合、ターゲット ホストは ACK フラグを含む SYN/ACK パケットを要求側ホストに送信することで応答します。最後に、要求側ホストは ACK パケットを送信して TCP 接続を確立します。ポートが開いていない場合、ターゲット ホストは RST パケットを送信して接続要求を拒否します。

したがって、SYN スキャンの原理は、SYN パケットをターゲット ホストに送信し、応答を待つことです。応答が SYN/ACK パケットの場合はポートが開いていることを示し、応答が RST パケットの場合はポートが開いていないことを示します。

2. Golang を使用して SYN スキャンを実装する

Golang は、ネットワーク スキャン ツールの実装に非常に適した同時実行性の高いプログラミング言語です。次に、Golang を使用して SYN スキャンを実装します。

1. TCP パケットを送受信できる接続を作成する

Golang では、「net」ライブラリを使用して TCP 接続を実装できます。ここでは、「net.DialTimeout」関数を使用して TCP 接続を作成し、接続タイムアウトを設定します。

conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ipAddress, port), time.Duration(timeout)*time.Millisecond)
ログイン後にコピー

2. SYN パケットの送信

接続を作成した後、SYN パケットを送信する必要があります。 「go-socket.io/socket.io-protocol」ライブラリの「ErrSig」を使用して SYN パケットを生成できます。

SYN := socketio.Packet{
    Type: socketio.SYNT,
}
SYNBytes, err := SYN.Encode(socketio.BINARY)
if err != nil {
    return false, err
}
ログイン後にコピー

次に、パッケージをターゲット ホストに送信します。

_, err = conn.Write(SYNBytes)
if err != nil {
    return false, err
}
ログイン後にコピー

3. 応答パケットを読み取ります

最後に、応答パケットを待ちます。応答パケットは「bufio.NewReader」関数を使用して読み取ることができます。

reader := bufio.NewReader(conn)
response, err := reader.ReadByte()
if err != nil {
    return false, err
}
ログイン後にコピー

応答が SYN/ACK パケットの場合はポートが開いていることを示し、応答が RST パケットの場合はポートが開いていないことを示します。

if response == socketio.SYNACKT.Value() {
    return true, nil
} else {
    return false, nil
}
ログイン後にコピー

3. 完全なコード実装

以下は、Golang を使用して SYN スキャンを実装する完全なコード実装です。

package main

import (
    "bufio"
    "fmt"
    "net"
    "time"

    "github.com/go-socket.io/socket.io-protocol"
)

func synScan(ipAddress string, port int, timeout int) (bool, error) {
    conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", ipAddress, port), time.Duration(timeout)*time.Millisecond)
    if err != nil {
        return false, err
    }
    defer conn.Close()

    SYN := socketio.Packet{
        Type: socketio.SYNT,
    }
    SYNBytes, err := SYN.Encode(socketio.BINARY)
    if err != nil {
        return false, err
    }

    _, err = conn.Write(SYNBytes)
    if err != nil {
        return false, err
    }

    reader := bufio.NewReader(conn)
    response, err := reader.ReadByte()
    if err != nil {
        return false, err
    }

    if response == socketio.SYNACKT.Value() {
        return true, nil
    } else {
        return false, nil
    }
}

func main() {
    // 定义扫描目标IP地址和端口范围
    ipAddress := "127.0.0.1"
    startPort := 1
    endPort := 100

    // 初始化结果
    results := make(map[int]bool)

    // 扫描每一个端口
    for port := startPort; port <= endPort; port++ {
        isOpen, err := synScan(ipAddress, port, 100)
        if err != nil {
            fmt.Println(err)
            continue
        }
        results[port] = isOpen
    }

    // 输出扫描结果
    for port, isOpen := range results {
        if isOpen {
            fmt.Printf("Port %d is open
", port)
        } else {
            fmt.Printf("Port %d is closed
", port)
        }
    }
}
ログイン後にコピー

4. 概要

この記事では、Golang を使用して SYN スキャンを実装する方法を紹介します。 Golang を使用して SYN スキャンを実装すると、効率と精度が向上し、コードが読みやすく保守しやすくなります。同時に、開発者は、マルチスレッドやマルチコルーチンを使用してより多くのポートをスキャンするなど、実際のニーズに応じてコードを変更できるため、より幅広いアプリケーション シナリオに適したものになります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート