0

现在我在为工作安全项目编写一个简单的端口扫描器/密码检查器时遇到了一些重大问题。

我的基本目标是编写一个快速的小工具来打开一个文本文件,扫描端口 21、23、80、502 和 8080,然后简单地将返回的 http 状态写入文件(200、404 等)

到目前为止,我一直在尝试使用 httpclient 执行此操作,但结果非常糟糕。

我的代码是这样的

 public static void doHosts() throws Exception{
        String filename = "C:\\test.txt";
        String ip = "";
        String port[] = {"21", "23", "80", "502", "8080"};
        FileInputStream fstream = new FileInputStream("c:\\scan.txt");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        while ((ip = br.readLine()) != null) {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            int timeoutSocket = 5000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

            HttpHost targetHost = new HttpHost(ip);
            DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters);
            UsernamePasswordCredentials creds = new UsernamePasswordCredentials("blah", "blah");
            httpclient.getCredentialsProvider().setCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()), creds);
            NegotiateSchemeFactory nsf = new NegotiateSchemeFactory();
            httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, nsf);
            // Create AuthCache instance
            AuthCache authCache = new BasicAuthCache();
            // Generate BASIC scheme object and add it to the local auth cache
            BasicScheme basicAuth = new BasicScheme();
            authCache.put(targetHost, basicAuth);
            // Add AuthCache to the execution context
            BasicHttpContext localcontext = new BasicHttpContext();
            localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
            httpclient = wrapClient(httpclient);

            HttpGet get;
            for (int i = 0; i < port.length; i++) {

                    get = new HttpGet("http://" + ip + ":" + port[i] + "/");

                    HttpResponse response = httpclient.execute(get);
                    try {
                        BufferedWriter out = new BufferedWriter(new FileWriter("filename", true));
                        out.write("ip:  "+ ip + " : "+port+ " - " + response.getStatusLine().getStatusCode());  //HTTP status returned off request );
                    } catch (IOException e) {
            }
        }
        }
}

到目前为止,我的问题是它打开了文本文件,遇到了一个错误的结果,没有对其进行序列化,然后就因异常而死了。

我不确定如何让它继续出现异常(我知道有些网站会说“未启动”,这就是它是端口扫描器的原因。

任何帮助都会很棒,并且可能会使一些可怜的实习生免于明天手动检查大约 6000 个 ip。

4

3 回答 3

0

“坏结果”是什么意思?nmap 表示端口已打开或已关闭但不是的情况?

如果您决定继续使用 nmap 路径并希望将 nmap 与一些 Java 代码集成,请查看 sourceforge.net 上的 Nmap4j。它是一个简单的围绕 Nmap 的 Java 包装器,允许您以 Java 对象的形式访问结果。

于 2012-06-29T13:29:26.603 回答
0

当无法建立连接时,您没有处理 HttpClient 引发的异常。你不应该假设它httpclient.execute(get)总是会毫无例外地返回。

如果您希望您的程序忽略这些条件并继续进行卡车运输,您需要捕获这些异常。

或者,您似乎想试试nmap 。

于 2012-06-28T23:42:58.937 回答
0

你没有在你的帖子中说,但我猜它是ClientProtocolException在第一次请求端口 21 时抛出的,这是可以预料的,因为端口 21 不支持 HTTP。你没有捕捉到这个异常,所以你的程序死了。

于 2012-06-28T23:45:38.330 回答