使用httpclient自动进行密码检查

时间:2012-06-28 23:35:44

标签: java httpclient

现在我在为工作安全项目编写简单的portscanner /密码检查程序时遇到了一些重大问题。

我的基本目标是编写一个快速的小工具,打开一个文本文件,扫描端口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。

3 个答案:

答案 0 :(得分:0)

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

如果您希望程序忽略这些条件并继续卡车运输,则需要捕获这些例外情况。

或者,似乎您可能想尝试nmap

答案 1 :(得分:0)

你没有在你的帖子中说,但我的猜测是它在第一个端口21的请求上抛出ClientProtocolException,这是预期的,因为端口21不会说HTTP。您没有捕获此异常,因此您的程序将死亡。

答案 2 :(得分:0)

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

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