インターネットの普及に伴い、ネットワークのセキュリティ問題はますます深刻になっています。ネットワーク攻撃手法は数え切れないほどありますが、その中でも一般的な攻撃手法が 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 サイトの他の関連記事を参照してください。