当前位置: 代码网 > it编程>编程语言>Java > 使用SpringBoot+nmap4j获取端口信息的代码详解

使用SpringBoot+nmap4j获取端口信息的代码详解

2025年01月13日 Java 我要评论
序言今天在工作的时候,领导突然安排和我说一个需求,就是根据一个 ip 和 端口去获取对应服务上对应端口的信息,当时主要是为了确定数据库的版本和型号,比如 mysql、oracle 这些数据库,我后面尝

序言

今天在工作的时候,领导突然安排和我说一个需求,就是根据一个 ip 和 端口去获取对应服务上对应端口的信息,当时主要是为了确定数据库的版本和型号,比如 mysql、oracle 这些数据库,我后面尝试发现其他端口也可以获取信息。这个在公司里之前是通过 python 来写的,python 里面刚好有这个模块,但是 java 没有,所以写这篇文章记录一下,帮助大家以后避免踩坑。

nmap4j

nmap4j 是一个用于 java 语言的 nmap 端口扫描器的包装库,它允许 java 开发者在自己的项目中方便地调用 nmap 的功能进行网络扫描和探测。

在运行这个代码之前,我们是需要下载 nmap 的可执行文件,地址为:download the free nmap security scanner for linux/mac/windows

这里下载第一个,下载后安装就行了。

代码说明

接下来和大家说一下 nmap4j 中的测试代码,这里面有个坑,我当时找了好久,代码在 test/org/nmap4j/nmap4jtest.java

    public class nmap4jtest {
	
	
	@test
	public void basicnmap4jusagetest() {
		
		try {
               // 这里的路径要改为刚才 nmap 软件的安装路径
			string path = "/usr/local" ;
			
			nmap4j nmap4j = new nmap4j( path ) ;
               // 这地方使用了 -ox 后面要跟文件名称
			nmap4j.addflags( "-sv -t5 -o -ox -" ) ;
			nmap4j.includehosts( "localhost" ) ;
			nmap4j.execute() ;
			if( !nmap4j.haserror() ) {
                        
				nmaprun nmaprun = nmap4j.getresult() ;  // 这一行一定要注释掉,不然会一直报错
				string output = nmap4j.getoutput() ;  // 这一样代码意义也不大,我直接删掉了
				if( output == null ) {
					fail() ;
				}
				string errors = nmap4j.getexecutionresults().geterrors() ;
				if (errors == null ) {
					fail() ;
				}
			}
		} catch (nmapinitializationexception e) {
			// todo auto-generated catch block
			e.printstacktrace();
			fail() ;
		} catch (nmapexecutionexception e) {
			// todo auto-generated catch block
			e.printstacktrace();
			fail() ;
		}
		
	}

}

参数说明:

  • 目标选择参数:

    • -il :从文件中读取扫描目标列表。例如,nmap -il targets.txt,会从targets.txt文件中读取每行一个的 ip 地址或域名作为扫描目标。
    • -ir :随机选择指定数量的主机进行扫描。如nmap -ir 100,会随机选取 100 个主机进行扫描。
    • --exclude <host1[,host2,...]> :排除指定的主机或网络不进行扫描。例如,nmap 192.168.1.0/24 --exclude 192.168.1.100,192.168.1.200,将扫描192.168.1.0/24网段,但排除192.168.1.100192.168.1.200这两台主机。
    • --excludefile <exclude_file> :从文件中读取要排除的主机或网络列表。
  • 扫描类型参数

    • -ss:tcp syn 扫描,也称为半开放扫描。它发送 syn 包到目标端口,如果收到 syn/ack 响应,就表示端口开放;如果收到 rst 响应,则表示端口关闭。这种扫描方式速度快,且不容易被目标系统记录,相对隐蔽,例如nmap -ss 192.168.1.100
    • -st:tcp 连接扫描,通过完整的 tcp 三次握手来确定端口是否开放。这种扫描方式最准确,但也最容易被检测到,如nmap -st 192.168.1.100
    • -su:udp 扫描,用于检测目标主机上的 udp 端口是否开放。因为 udp 是无连接协议,所以判断端口状态相对复杂,nmap -su 192.168.1.100可对指定主机进行 udp 扫描。
    • -sf、-sx、-sn:分别是 fin 扫描、xmas 扫描和 null 扫描。这些扫描方式通过发送特殊标志位的 tcp 包来判断端口状态,常用于绕过一些简单的防火墙检测。
  • 端口指定参数

    • -p :指定要扫描的端口范围。可以是单个端口,如-p 80;也可以是多个端口,如-p 80,443,8080;还可以是端口范围,如-p 1-1000表示扫描 1 到 1000 号端口。
    • --top-ports :扫描最常用的指定数量的端口。例如,nmap --top-ports 100 192.168.1.100会扫描目标主机上最常用的 100 个端口。
    • -f:快速扫描模式,只扫描一些常见的端口,相当于-p 1-1024加上一些其他常用端口。
  • 服务探测参数

    • -sv:启用服务版本探测,尝试确定目标主机上运行的服务及其版本信息。例如,nmap -sv 192.168.1.100可以扫描出目标主机开放端口上运行的服务名称和版本号。
    • --version-intensity :设置服务版本探测的强度,级别越高,探测越全面,但耗时也越长,取值范围是 0 到 9。
  • 操作系统探测参数

    • -o:启用操作系统探测,尝试识别目标主机的操作系统类型和版本。如nmap -o 192.168.1.100
    • --osscan-limit:限制操作系统探测只对可能的目标进行,这样可以加快扫描速度,但可能会降低准确性。
    • --osscan-guess:更积极地猜测操作系统类型,当 nmap 不确定时会给出更宽泛的猜测结果。
  • 输出参数

    • -on :将扫描结果以正常格式保存到指定文件。例如,nmap -on scan_results.txt 192.168.1.100会把扫描结果保存到scan_results.txt文件中。
    • -ox :将扫描结果以 xml 格式保存到指定文件,方便后续使用脚本或其他工具进行解析和处理。
    • -og :将扫描结果以 grep 格式保存,这种格式便于使用文本处理工具进行分析。
    • -oa :以多种格式(包括正常、xml 和 grep 格式)保存扫描结果,文件名为指定的基本名称加上相应的扩展名。
    • -v:详细输出模式,显示更多的扫描过程信息,如发送的数据包、收到的响应等。使用多个v可以增加详细程度,如-vv-vvv

这里给大家看一下改造后的代码

/**
 * 使用 nmap4j 工具进行扫描
 *
 * @param ip    目标 ip
 * @param ports 目标端口
 * @return 端口信息列表
 */
@requestmapping("/querydb")
public list<nmapportinfo> querydb(@requestparam(value = "ip") string ip, @requestparam("ports") list<string> ports) {
    arraylist<nmapportinfo> portinfos = new arraylist<>();
    // 1.拼接端口
    string portstr = strutil.join(",", ports);
    //2. 指定 nmap 路径
    string path = "d:/studyapps/nmap";
    string filename = "temp_result.xml";

    nmap4j nmap4j = new nmap4j(path);

    //3.读取端口耗时较长,可以使用异步
    completablefuture<void> future = completablefuture.runasync(() -> {
        nmap4j.addflags("-sv -p " + portstr + " -t5 -o -ox " + filename);
        nmap4j.includehosts(ip);
        try {
            nmap4j.execute();
        } catch (exception e) {
            throw new runtimeexception(e);
        }
    }, threadpoolexecutor);

    future.join();

    //4. 获取端口信息
    return getportinfo(portinfos, filename);
}
/**
     * 获取 ip + 端口信息,封装为集合返回前端
     *
     * @param portinfos 返回前端集合
     * @param filename  临时的 xml 文件
     * @return 信息列表
     */
    @sneakythrows
    private list<nmapportinfo> getportinfo(list<nmapportinfo> portinfos, string filename) {
        // 获取项目所在路径
        string projectpath = system.getproperty("user.dir");
        // 拼接文件路径
        string filepath = projectpath + fileutil.file_separator + filename;
        log.info("文件路径:{}", filepath);

        // nmap 返回 xml 格式固定,使用 dom4j 解析
        saxreader reader = new saxreader();
        org.dom4j.document document = reader.read(fileutil.file(filepath));
        org.dom4j.element rootelement = document.getrootelement();
        org.dom4j.element element = rootelement.element("host");

        org.dom4j.element xmlports = element.element("ports");

        list<org.dom4j.element> port = xmlports.elements("port");
        for (org.dom4j.element port1 : port) {
            element service = port1.element("service");
            string product = service.attributevalue("product");
            string version = service.attributevalue("version");
            nmapportinfo nmapportinfo = new nmapportinfo(product, version);
            portinfos.add(nmapportinfo);
        }

        // 删除临时文件
        fileutil.del(filepath);
        return portinfos;
    }
}

我这里就是没有去按照官网上的写法,我的思路是文件已经下载了我直接去读取 xml 文件解决会更快,这里是使用 dom4j 来读取的 xml 文件。代码就这么多,最后请求是可以获取到数据的:

总结

忘记和大家说了,nmap4j 在maven仓库是搜不到的,所以只通过 jar 包(点击下载)的方式来引入。

以上就是使用springboot+nmap4j获取端口信息的代码详解的详细内容,更多关于springboot nmap4j获取端口信息的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com