SSH
ポート スキャナーを作成しており、特定のポートがそのポートで期待される標準サービス (やなど) を実行しているかどうかを確認したいと考えていますHTTP
。方法の 1 つは、そのポートにクエリを送信し、返された情報を分析することです。たとえば、SSH は接続するとすぐにバージョン情報を送信してくれます。ただし、connect()
IP アドレスでポート 22 を使用すると、Error number: 110. Error message: Connection timed out
. どんなアイデアでも大歓迎です。
コード全体は長い話です。ここに一部を抜粋して貼り付けます。
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(22);
dest_addr.sin_addr.s_addr = inet_addr("8.8.8.8");
int service_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (service_sock < 0) {
printf("Error creating service socket. Error number: %d. Error message: %s\n", errno, strerror(errno));
exit(0);
}
int dest_addr_len = sizeof(dest_addr);
if (connect(service_sock, (struct sockaddr *)&dest_addr, dest_addr_len) < 0) { // stuck here
printf("Error connection. Error number: %d. Error message: %s\n", errno, strerror(errno));
exit(0);
}
この質問を明確にするために、例を示す必要があります。サービスを確認する方法を見つけましたHTTP
。つまり、文字列"GET / HTTP\n\n"
を宛先アドレスに送信します。次に、関数を呼び出しrecv()
て、返されたメッセージを読み取ります。私はこのようなものを得ることができます。
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1419
Date: Tue, 02 Dec 2014 05:56:25 GMT
Server: GFE/2.0
...
HTTP
バージョンは1.0
最初の行から読み取ることができます。
ここでは、リモート ホスト上の多くのサービスを確認したいと考えていSSH
ますHTTP
。推測するのは良くないと思います。したがって、これらの情報を から取得するための一般的な方法が必要dest_addr
です。