现在我在为工作安全项目编写简单的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。
答案 0 :(得分:0)
当无法建立连接时,您不会处理HttpClient抛出的异常。你不应该假设httpclient.execute(get)
总会毫无例外地返回。
如果您希望程序忽略这些条件并继续卡车运输,则需要捕获这些例外情况。
或者,似乎您可能想尝试nmap。
答案 1 :(得分:0)
你没有在你的帖子中说,但我的猜测是它在第一个端口21的请求上抛出ClientProtocolException
,这是预期的,因为端口21不会说HTTP。您没有捕获此异常,因此您的程序将死亡。
答案 2 :(得分:0)
“坏结果”是什么意思? nmap表示端口是打开还是关闭的情况,而不是?
如果您决定继续沿nmap路径行进并希望将nmap与某些Java代码集成,请查看sourceforge.net上的Nmap4j。它是一个简单的Java包装器,它允许您以Java对象的形式访问结果。