引言:端口探测利用的是TCP的三次握手特性去检测端口的开放与否
1. 本文缘由
计算机网络的课程即将来到尾声,本文根据课程所学的内容,利用TCP的三次握手特性编写简易端口扫描工具。
2.使用软件
3.原理分析及代码
端口扫描的原理,即采用的是TCP的三次握手的特性,当某个端口未开放或隐藏时,客户端向服务器端发出的请求不会得到回应,多次尝试失败后可认定该端口未开放或已经隐藏。以下分析以80端口为例:
当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(); } }
|
该扫描器包含IP地址输入框,扫描开始端口和终止端口的输入框以及端口扫描器抓取的信息
4. 运行过程与结果
确认扫描对象:
本次设定的扫描目标为学校的教务系统,首先通过系统ping:es.bnuz.edu.cn获得目标域名的ip地址。
根据ping到的结果可知,学校教务网站的IP地址并对其进行端口扫描
为了节省时间,本次端口扫描将扫描0-400端口。
由结果可以得出0-400端口中教务系统开放了80网页端口和211未知端口。
5.总结
本文仅提供了扫描端口的思路,但仅仅只是简易的端口扫描器,缺陷还有很多,比如:
代码中超时时间设定为80ms,而对于大部分网站而言这是不合理的,部分网站未开启DCDN之类的分布式缓存,访问时间可能会超过100ms,国外网站的访问更是需要300ms左右,因此需要改进。并且未开启多线程同时搜索端口,当搜索端口的范围扩大时候很容易出现“假死“现象,虽然后台有在运作然而界面并未显现。
2019/11/24