编写简易端口扫描工具

引言:端口探测利用的是TCP的三次握手特性去检测端口的开放与否

1. 本文缘由

计算机网络的课程即将来到尾声,本文根据课程所学的内容,利用TCP的三次握手特性编写简易端口扫描工具。

2.使用软件

  • Wireshark

  • Eclipse / Java

3.原理分析及代码

端口扫描的原理,即采用的是TCP的三次握手的特性,当某个端口未开放或隐藏时,客户端向服务器端发出的请求不会得到回应,多次尝试失败后可认定该端口未开放或已经隐藏。以下分析以80端口为例:

向某一IP地址发出请求

当80端口开放时,向服务器发送请求时便能得到服务器的回应,进行三次握手

无反应的端口

而当客户端向其他端口发送请求时并未得到回应,因此跳过请求,从而证实端口未开放

本简易端口扫描器采用Java + JavaFX编写,带UI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package application;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;
public class ViewController {
@FXML
private TextArea text;
@FXML
private TextField ip;
@FXML
private TextField start;
@FXML
private TextField stop;
@FXML
private Button btn_start;
private int startport;
private int stopport;
private String ipaddress;
Socket socket;
public void strat() {
startport = Integer.parseInt(start.getText());
stopport = Integer.parseInt(stop.getText());
ipaddress = ip.getText();
new Thread() {
public void run() {
text.appendText("开始扫描端口,请稍等...\n");
long starttime = System.currentTimeMillis();
for(int i= startport;i <= stopport;i++) {
try {
socket = new Socket();
socket.connect(new InetSocketAddress(ipaddress,i), 80);
text.appendText("扫描到的端口:"+ i + "\n");
socket.close();
}catch (UnknownHostException e) {
} catch (IOException e) {
}
}
long endtime = System.currentTimeMillis();
text.appendText("耗时:"+ (endtime-starttime)+"\n");
}
}.start();
}
}

Java编写的简易端口扫描器

该扫描器包含IP地址输入框,扫描开始端口和终止端口的输入框以及端口扫描器抓取的信息

4. 运行过程与结果

确认扫描对象:

本次设定的扫描目标为学校的教务系统,首先通过系统ping:es.bnuz.edu.cn获得目标域名的ip地址。

利用CMD获取网址对应IP地址

根据ping到的结果可知,学校教务网站的IP地址并对其进行端口扫描

为了节省时间,本次端口扫描将扫描0-400端口。

端口扫描结果

由结果可以得出0-400端口中教务系统开放了80网页端口和211未知端口。

5.总结

本文仅提供了扫描端口的思路,但仅仅只是简易的端口扫描器,缺陷还有很多,比如:

连接超时时间设置

代码中超时时间设定为80ms,而对于大部分网站而言这是不合理的,部分网站未开启DCDN之类的分布式缓存,访问时间可能会超过100ms,国外网站的访问更是需要300ms左右,因此需要改进。并且未开启多线程同时搜索端口,当搜索端口的范围扩大时候很容易出现“假死“现象,虽然后台有在运作然而界面并未显现。

2019/11/24


编写简易端口扫描工具
http://blask.cn/2019/11/24/编写端口扫描app/
作者
Wayne Li
发布于
2019年11月24日
许可协议