端口检查是否开放

      今早上班,老婆说她们楼层的护士长又作妖。孕妇护士服领用申请不签字,又推脱说下星期再说。MD你要推脱你就早直接这样说啊,干嘛说要找总护士长签字,去了被总护士长怼一顿,说找楼层。一老护士还天天臭美,打玻尿酸,很多其他事情也是,一点担当都没有,占着茅坑不拉屎。正好最近准备研究下网络安全,于是就研究下他们医院的官网,看看是什么鬼,有什么漏洞没有,一般黑客肯定是扫描端口,看端口开放情况。

一、扫描端口测试

      平常我们自己检查服务器的端口是否开放就是使用telnet这个命令,于是就想这端口不就是从0-65535吗,挨个telnet呗。预售首先想到的是直接执行这个命令,一般的命令执行可以使用Process process = Runtime.getRuntime().exec(shStr);先来个ping的命令大家看看,上代码:

public class ShellTest {
    Logger log = Logger.getAnonymousLogger();

    public static void runShell(String shStr) throws Exception {

        Process process = Runtime.getRuntime().exec(shStr);
        InputStream inputStream = process.getInputStream();

        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "gb2312"));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

    }
    
    public static void main(String[] arge) throws Exception {
    
        System.out.println("-------start----");
    
        String shellStr = "ping -t www.hbfy.com";
    
        ShellTest t = new ShellTest();
    
        t.runShell(shellStr);
    
        System.out.println("-----end------");
    
    }

}

结果:

端口检查是否开放

呵呵,看到没,延时还蛮低。

二、telnet初试

于是修改命令为telnet ip 8000端口,之前已经使用Wappalyzer看到官网用的web服务器与js库了,以及服务器的操作系统。

端口检查是否开放

修改后重新run测试类,效果:

端口检查是否开放

纳里,居然是这种效果。容我喝杯19年的水静静。

度娘说这个命令可以传字符串数组,于是修改下代码:

runShell的入参改为string[],把命令分开写,正常是先cmd,然后telnent,所以:

端口检查是否开放

一直没有下文了,后来又又说win NT6.0以后,就不允许调用telnet了。

三、common-net第三方库

考虑到每个端口要是等超时,或异常再进行下一个,那就太漫长了,于是就用多线程呗(多线程之前也分享过了)。

多线程类:

public class PortScanThread extends Thread {
    Logger log = Logger.getAnonymousLogger();

    private String ip;
    private Integer port;
    
    private Integer start;
    private Integer end;
    private Integer sleepTime;
    
    public PortScanThread(String ip,Integer port,Integer start,Integer end,Integer sleepTime){
        this.ip = ip;
        this.port = port;
        this.start = start;
        this.end = end;
        this.sleepTime = sleepTime;
    }
    
    public void run() {
        TelnetClient telnet = new TelnetClient();
        if(start != null && end != null) {
            for(int tmpPort = start;tmpPort < end;tmpPort++) {
                try {
                    telnet.connect(ip, tmpPort);
                    if(telnet.isConnected()) {
                        System.out.println("目标机器【"+ ip +"】端口"+tmpPort+"开放");
                        telnet.disconnect();
                    }
                    if(sleepTime != null) {
                        PortScanThread.sleep(sleepTime);
                    }
                } catch (Exception e) {
                    System.out.println("目标机器【"+ ip +"】端口"+tmpPort+"未开放");
                }
            }
        }else {
            try {
                telnet.connect(ip, port);
                if(telnet.isConnected()) {
                    System.out.println("目标机器【"+ ip +"】端口"+port+"开放");
                    telnet.disconnect();
                }
            } catch (Exception e) {
                System.out.println("目标机器【"+ ip +"】端口"+port+"未开放");
            }
        }
    }
}

一个线程里循环的效果:

端口检查是否开放

多线程的效果:

端口检查是否开放

就是这个等待时间有点长,这个telnet没有超时时间设置,后面封装可以自己做命令发出时间记时间,超时就默认未开放。租用可以提高性能。

四、总结

    做完这些发现端口开放的很少,而且目前我也不知道端口开放下一步可以干啥。网络方面不擅长啊,回去得找本书看看。有NB的攻防朋友,求带。