java与nmap整合我目前使用过两种方式,可以参考一下:
1.导入nmap4j.jar的包,在src同级目录创建lib文件夹,把jar包放入然后右键->add as Library;
2.通过Java调用Runtime这个类可以执行其他的可执行程序;
这两种方法有一个相同的地方就是需要调用nmap的程序。为了方便我们可以把程序导入项目中,在通过相对路径进行引用即可。
官网链接https://nmap.org/download.html
下载nmap-X.XX-win32.zip这种以zip结尾的压缩包,解压出来就行了
目录结构如图:
第一种写法:使用nmap4j ,需要导入jar包,这里把连接放上
链接: https://pan.baidu.com/s/1qx9gHyzBrRFqnoM1wH_eHw
提取码:cart
贴上代码:
public void getResult(String param){
//创建对象与nmap建立连接,相对路径
Nmap4j nmap4j = new Nmap4j( "doc/nmap-7.91" ) ;
//需要扫描的主机ip,可查询范围192.168.1.1-255
nmap4j.includeHosts(param);
//不需要扫描的主机范围
//nmap4j.excludeHosts("192.168.1.1-246");
//扫描规则
nmap4j.addFlags( "-T3 -Pn -sV -v") ;
try {
nmap4j.execute();
ExecutionResults executionResults = nmap4j.getExecutionResults();
if( !nmap4j.hasError() ) {
//输出扫描结果
System.out.println(executionResults.getOutput());
} else {
System.out.println( executionResults.getErrors() ) ;
}
} catch (Exception e) {
e.printStackTrace();
}
}
这段代码的意思在注释中已经解释了,但是我遇到了问题,就是同样的执行命令通过命令行窗口运行比代码运行快,而且大多数时候代码运行一直没反应,不知道是不是阻塞了,网上有大神对jar包进行了修改,但是还是解决不了我的问题,所有我用的是第二种方法。
第二种写法:不使用nmap4j
在Java中通过调用Runtime类执行其他的可执行程序,执行后返回一个进程(Process),利用Process这个类我们可以取得程序执行的结果(一个String类型的xml),把结果解析成document然后获取节点就能得到我们需要的信息。
贴上代码:
@Component
public class NmapScan {
private static Logger log = LoggerFactory.getLogger(NmapScan.class);
private static String command;
@Value("${nmap.command}")
public void setCommand(String command){
NmapScan.command = command;
}
public static List<Map<String,Object>> getResult(String ip){
//创建空集合存筛选的结果
List<Map<String,Object>> portList = new ArrayList<>();
String returnData = getReturnData(ip);
try{
if(!StringUtils.isEmpty(returnData)){
//解析String类型的xml
Document xmldoc = DocumentHelper.parseText(returnData);
//得到根节点
Element rootEl = xmldoc.getRootElement();
if(rootEl != null){
Element addrEl = rootEl.element("host").element("address");
if(addrEl != null){
//扫描到的ip
String scanIp = addrEl.attributeValue("addr");
if(scanIp.equals(ip)){
log.info("ip匹配成功,开始解析...");
//ip类型
String ipType = StringUtils.isEmpty(addrEl.attributeValue("addrtype"))?"":"地址:"+addrEl.attributeValue("addrtype")+" ";
//获取所有子节点的跟节点,xpath
List<Element> ports = rootEl.selectNodes("//ports/port");
if(ports.size()>0){
for(Element el:ports){
Map<String,Object> portMap = new HashMap<>();
//协议
String agreement = el.attributeValue("protocol");
//端口号
String port = el.attributeValue("portid");
Element stateEl = el.element("state");
//状态
String state = StringUtils.isEmpty(stateEl.attributeValue("state"))?"":"状态:"+stateEl.attributeValue("state")+" ";
//reason
String reason = StringUtils.isEmpty(stateEl.attributeValue("reason"))?"":"reason:"+stateEl.attributeValue("reason")+" ";
//reason_ttl
String reasonTTL = StringUtils.isEmpty(stateEl.attributeValue("reason_ttl"))?"":"reason_ttl:"+stateEl.attributeValue("reason_ttl")+" ";
Element serviceEl = el.element("service");
//服务名
String servicename = StringUtils.isEmpty(serviceEl.attributeValue("name"))?"":"服务名:"+serviceEl.attributeValue("name")+" ";
//product
String product = StringUtils.isEmpty(serviceEl.attributeValue("product"))?"":"product:"+serviceEl.attributeValue("product")+" ";
//操作系统
String ostype = StringUtils.isEmpty(serviceEl.attributeValue("ostype"))?"":"操作系统:"+serviceEl.attributeValue("ostype")+" ";
//主机名
String hostname = StringUtils.isEmpty(serviceEl.attributeValue("hostname"))?"":"主机名:"+serviceEl.attributeValue("hostname")+" ";
//附加信息
String extrainfo = StringUtils.isEmpty(serviceEl.attributeValue("extrainfo"))?"":"附加信息:"+serviceEl.attributeValue("extrainfo")+" ";
portMap.put("id", UUIDUtil.getUUID());
portMap.put("ip",ip);
portMap.put("wcode","12");
portMap.put("website","Nmap扫描工具");
portMap.put("port",port);
portMap.put("agreement",agreement);
String other = hostname + ostype + state + ipType + servicename + extrainfo + product + reason + reasonTTL;
portMap.put("other",other);
portList.add(portMap);
}
log.info("解析数据成功...");
}
}
}
}else {
log.info("解析数据为空...");
}
}
}catch (Exception e){
e.printStackTrace();
log.info("解析nmap数据失败...");
}
return portList;
}
/**
* 调用nmap进行扫描
* @return 执行回显
* */
public static String getReturnData(String ip){
Process process = null;
StringBuffer stringBuffer = new StringBuffer();
try {
process = Runtime.getRuntime().exec( "doc/nmap-7.91/nmap.exe " + command+" "+ip);
log.info("开始对{}进行端口扫描...",ip);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"UTF-8"));
String line = null;
while((line = reader.readLine()) != null){
stringBuffer.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuffer.toString();
}
}
代码仅供参考
参考博客:
https://blog.csdn.net/weixin_33834628/article/details/89986357
https://blog.csdn.net/weixin_34302798/article/details/92217281