通过Java实现一个端口扫描器

一、原理介绍

端口扫描顾名思义,就是扫描目的资源的端口,来发现目的资源是否对外开放某个端口,提供了某种网络服务。
在安全攻防领域经常通过端口扫描技术来发现关键资产对外提供服务的情况。红军为发现暴露的风险点,进行安全加固;蓝军为识别目标服务,以便识别资产的脆弱点,实施针对性网络攻击。

二、实现

功能介绍

  • 对指定ip进行指定端口进行扫描,获取目的ip的端口开放情况
  • 扫描模式:TCP全连接扫描、TCP半连接扫描(待实现)
  • 通过发送空信息,获取开放端口对应服务的应答,获取指纹信息,从而判断服务类别
  • 端口开放情况会通过日志打印出来

输入

  • ip地址或ip地址组,用逗号隔开
  • 待扫描的端口组:0-65535,左开右闭

输出

  • 通过日志打印端口开放情况

类说明

  • ScanApp 扫描器启动类
/*** 扫描器启动类*/
public class ScanApp {public static void main(String[] args) {// 待扫描的ip地址或ip地址组String ips = null;ips = "14.29.192.196,14.116.188.121";// 待扫描的port范围String ports = "20-25";Scanner.start(ips,ports);}
}
  • Scanner 扫描管理类
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;/*** 端口、指纹扫描器* 职责:* 1、解析输入的ip地址、端口* 2、新键扫描任务ScanJob扫描引擎进行端口扫描* 3、两种扫描方式:TCP全连接扫描、TCP半连接扫描**/
public class Scanner {// 日志private static Logger logger = Logger.getLogger("Scanner");// 使用多线程扫描private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10,20,1000,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(5),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());/*** 开始方法* @param ips 输入的待扫描ip列表* @param ports 输入的待扫描端口*/public static void start(String ips, String ports) {// 解析端口String[] portArray = ports.split("-");int portStart = Integer.parseInt(portArray[0]);int portEnd = Integer.parseInt(portArray[1]);logger.info("[-] Ports: " + ports);// 解析ip地址,并扫描if (ips.indexOf(',') != -1) {String[] ipList = ips.split(",");logger.info("[-] IP list: " + ipList.toString());for (String ip : ipList) {scanAllPort(ip,portStart,portEnd);}}else if (ips.indexOf('/') != -1){// TODO 支持ip地址网段的解析String[] ipArray = ips.split("/");String ipAddress = ipArray[0];int mask = Integer.parseInt(ipArray[1]);String[] ipSplit = ipAddress.split(".");}else {scanAllPort(ips,portStart,portEnd);}// 扫描任务都完成后,程序停止try{while(true){if(poolExecutor.getActiveCount() == 0){logger.info("[-] Scan job all finish");System.exit(-1);break;}Thread.sleep(1000);}}catch (Exception ex){logger.warning("End with exeception, ex: " + ex.getMessage());}System.exit(-1);}/*** 扫描某ip的对应端口* @param ip ip地址* @param portStart 开始扫描的的端口* @param portEnd 停止扫描的端口*/public static void scanAllPort(String ip, int portStart, int portEnd){for (int port = portStart; port <= portEnd; port++){scan(ip,port);}}/*** 对ip:port进行扫描* @param ip ip地址* @param port 端口*/public static void scan(String ip, int port){// 执行扫描任务poolExecutor.execute(new ScanJob(new ScanObject(ip,port),ScanEngine.TCP_FULL_CONNECT_SCAN));}
}
  • ScanEngine 扫描器引擎
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.util.logging.Logger;/*** 扫描器引擎* 实现具体的扫描逻辑,提供扫描能力(TCP全连接和半连接扫描)*/
public class ScanEngine {private static Logger logger = Logger.getLogger("TCPFullConnectScan");public static final String TCP_FULL_CONNECT_SCAN = "TCP_FULL_CONNECT_SCAN";public static final String TCP_HALF_CONNECT_SCAN = "TCP_HALF_CONNECT_SCAN";public static ScanObject scan(ScanObject object, String scanEngine){switch (scanEngine){case TCP_FULL_CONNECT_SCAN:return tcpFullConnectScan(object);case TCP_HALF_CONNECT_SCAN:return tcpHalfConnectScan(object);}return tcpFullConnectScan(object);}/*** tcp全连接扫描* @param object* @return*/private static ScanObject tcpFullConnectScan(ScanObject object){try{// 全连接扫描,发现可用服务Socket socket = new Socket(object.getIp(),object.getPort());object.setOpen(true);object.setService();// 发送招手信息OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());out.write("hello");out.flush();// 获取服务指纹BufferedReader re = new BufferedReader(new InputStreamReader(socket.getInputStream()));String serviceBanner = re.readLine();object.setBanner(serviceBanner);object.setService();logger.info("[-] Find service :"+ object);socket.close();} catch (ConnectException e) {// 打印连接失败的端口
//            logger.info("[-] Close: " + object.getIp() + ":" + object.getPort());} catch (Exception e){// 出现其他异常logger.info("[-] " + object.toString() + "end with unexecepted exeception:" + e.getMessage());}return object;}/*** TPC 半连接扫描* @param object* @return*/private static ScanObject tcpHalfConnectScan(ScanObject object){// TODO 待实现tcp半连接扫描return object;}
}
  • ScanJob 扫描任务类
/*** 扫描任务类,执行具体的扫描任务*/
public class ScanJob implements Runnable{// 扫描信息private ScanObject object;// 扫描类型private String scanType;public ScanJob(ScanObject object,String scanType) {this.object = object;this.scanType = scanType;}@Overridepublic void run() {ScanEngine.scan(object, scanType);}
}
  • ScanObject 扫描结果实体类
import java.util.HashMap;
import java.util.Map;/*** 扫描信息实体*/
public class ScanObject {private String ip;private int port;private String service;private Boolean isOpen;private String banner;// 存放服务指纹和服务的对应关系 banner -> serviceprivate static Map<String,String> bannerMaps = new HashMap<>();// 存放常见端口与服务的对应关系 port -> serviceprivate static Map<Integer,String> portMaps = new HashMap<>();static {bannerMaps.put("ssh","SSH");portMaps.put(22,"SSH");bannerMaps.put("ftp","FTP");portMaps.put(21,"FTP");portMaps.put(20,"FTP");bannerMaps.put("smtp","SMTP");portMaps.put(25,"SMTP");bannerMaps.put("mysql","MySQL");portMaps.put(3389,"MySQL");}public ScanObject(String ip, int port) {this.ip = ip;this.port = port;}public Boolean getOpen() {return isOpen;}public void setOpen(Boolean open) {isOpen = open;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public String getService() {return service;}public void setService() {// 先根据port判断服务类型if (portMaps.containsKey(this.port)){this.service = portMaps.get(this.port);}if (banner != null && !banner.equals("")){for (String key : bannerMaps.keySet()) {if (banner.toLowerCase().contains(key)) {this.service = bannerMaps.get(key);break;}}}}public String getBanner() {return banner;}public void setBanner(String banner) {this.banner = banner;}@Overridepublic String toString() {return "ScanObject{" +"ip='" + ip + '\'' +", port=" + port +", service='" + service + '\'' +", isOpen=" + isOpen +", banner='" + banner + '\'' +'}';}
}

使用方式

  • 在ScanApp中的ips字符串中加入待扫描的ip地址(逗号隔开),在ports中输入扫描的端口范围(减号隔开)
  • 使用jdk8运行ScanApp

项目源码链接:

https://github.com/aa792978017/Scanner


如果这篇文章对你有帮助,欢迎点赞收藏;如果对文章有任何疑问,也欢迎留言提出,笔者会尽快回复。

Java实现端口扫描器相关推荐

  1. 利用Java实现端口扫描器

    上次我们用Java写了一个"文件最后修改时间编辑器"的小黑软,现在我们实现用Java写端口扫描器.为了方便和避免GUI编程的麻烦,我们就直接做成命令行下的工具,用参数来启动它,姑且 ...

  2. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  3. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现("ping扫描")和端口扫描. 旧的2.x版本只有Windo ...

  4. 端口扫描php,一个简单的php在线端口扫描器

    作者:angel 前言 PHP是一种功能强大的Web开发语言.开发效率高,语法简单,为动态网站量身定做,加强面向对象(向C++靠拢,与JAVA搭了点边),可惜单线程(这是至命弱点,据说PHP是用C\C ...

  5. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享

    #!/usr/bin/env python import socket if __name__=='__main__': port=3389 s=socket.socket() for cnt in ...

  6. 端口扫描器——ZenmapKail Linux渗透测

    3.3  端口扫描器--Zenmap Zenmap(端口扫描器)是一个开放源代码的网络探测和安全审核的工具.它是Nmap安全扫描工具的图形界面前端,它可以支持跨平台.使用Zenmap工具可以快速地扫描 ...

  7. Python3实现TCP端口扫描器

    本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...

  8. 实例探究Python以并发方式编写高性能端口扫描器的方法

    来源:http://www.jb51.net/article/86615.htm 关于端口扫描器 端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于 ...

  9. 蓝蛇端口扫描器 v2.8.4.724

    简介: 蓝蛇端口扫描器--一款快速.专业.灵活.好用的端口扫描软件,蓝蛇端口扫描器是在原有v1.0的基础上升级打造而成.它不仅具备原有的面向IP扫描功能,还实现了面向端口扫描.此外,开放原有的端口字典 ...

  10. python调用扫描仪_使用Python编写简单的端口扫描器的实例分享

    单线程实现单线程实现道理比较简单,这里尝试Soket连接3389,连接成功说明端口开放,否则说明没有开远程服务.随便修改了一下就ok了,代码如下,最终得到自己的IP地址. #!/usr/bin/env ...

最新文章

  1. javascript requestAnimationFrame 解决 setTimeout、setInterval 时间不准的方法。
  2. 织梦后台不显示验证码的解决
  3. 客户端的socket是否需要bind?
  4. 招兵买马,韩国现代将前GM研究员招致麾下
  5. 海豚计算机语言,海豚模拟器 V5.0 多国语言安装版
  6. matlab中怎么画五维图,使用MatLab绘制散点图的方法
  7. 几米的一段话,献给所有小郁闷的人
  8. 取得textarea中行的三种写法
  9. python实现决策树ID3算法
  10. 我从不劝退,我就是退。
  11. 【离散数学·图论】关于哈密顿图的判别条件总结
  12. 利用邮件合并批量制作带照片的准考证
  13. Android CameraX 使用入门
  14. 学excel还是学python_以Excel处理为目的学习python还是VBA?
  15. 《别做正常的傻瓜》后续笔记—幸福的准则
  16. centos、Windows双系统安装及修复引导启动项
  17. jQuery购物车 商品数量加减和小计
  18. ExpandableListView 实现评价回复功能
  19. 激活函数σ、tanh、relu、Leakyrelu、LR_BP反向传播推导
  20. False data injection attacks and the insider threat in smart systems

热门文章

  1. 电脑之间利用串口传输文件
  2. spss入门——简单的数据预处理到时间序列分析系列(一)
  3. 项目启动会应该注意的几点
  4. 产品研发管理和研发项目管理
  5. opera Reservation More Fields(接送机)
  6. 如何在word2016中使用自带的公式编辑器
  7. 如何在excel中使用REFPROP属性库
  8. 淘宝客优惠券领取微信小程序前台和后台源码
  9. 高通刷机工具使用介绍
  10. 让Microsoft Office2010 新建 Microsoft Office 97-2003 文档