zoukankan      html  css  js  c++  java
  • telnet指令研究—以网络聊天程序为例

    一、telnet指令

      Telnet取名自Telecommunications和Networks的联合缩写,是早期个人计算机上连接到服务器主机的一个网络指令,由于存在安全问题,现在已经很少被使用。在windows操作系统中仍然存在这个指令,但是默认被系统禁用,可以通过以下步骤来打开:

    控制面板 》 程序和功能 》 启用或关闭Windows功能 》 勾选“Telnet Client”复选框 》 确定

      在Windos Powershell中输入telnet是否已经启用:

    ~/userName > telnet

    ~/userName > 欢迎使用 Microsoft Telnet Client !  Escape 字符为 'CTRL+]'

    Mirosoft Telnet > 

      使用 ?/help 查看可用操作:

    Microsoft Telnet > ?/help

    命令可能是缩写。支持的命令为:

    c - close 关闭当前连接
    d - display 显示操作参数
    o - open hostname [port] 连接到主机(默认端口 23)。
    q - quit 退出 telnet
    set - set 设置选项(键入 'set ?' 获得列表)
    sen - send 将字符串发送到服务器
    st - status 打印状态信息
    u - unset 解除设置选项(键入 'set ?' 获得列表)
    ?/h - help 打印帮助信息
    Microsoft Telnet >

       使用telnet指令登录到服务器之后,登录者就可以访问和使用服务器上的软硬件资源,登入者在终端输入的命令会在目标主机上运行,就像在使用本机一样。换句话说,telnet像是一个远程工具,它使你可以远程控制目标主机。

      telnet基于TCP实现,它的默认端口是23。从协议层次上来说,它工作在应用层。

    二、telnet访问远程服务器实例

      首先我们需要一个服务端程序用来与telnet客户端互动,下面是一个基于java语言的简单的网络聊天程序:

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.io.OutputStream;
     4 import java.io.PrintWriter;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 import java.util.Scanner;
     8 
     9 /**
    10  * Server
    11  */
    12 public class Server {
    13     private static final int PORT = 4000;
    14     public final String END_OF_MESSAGE = "$$";
    15 
    16     public void launch() throws IOException {
    17         ServerSocket server = new ServerSocket(PORT);
    18         Socket requSocket = server.accept();
    19         
    20         InputStream inStream = requSocket.getInputStream();
    21         OutputStream outputStream = requSocket.getOutputStream();
    22 
    23         Scanner in = new Scanner(inStream);
    24         PrintWriter out = new PrintWriter(outputStream, true /* autoFlush */);
    25 
    26         out.println("Welcome! Let talk.");
    27         while (in.hasNextLine()) {
    28             String line = in.nextLine();
    29             if (line.equals("Hello")) {
    30                 out.println("Hi");
    31             } else if (line.equals("Bye")) {
    32                 out.println("Bye");
    33                 out.println(END_OF_MESSAGE);
    34                 break;
    35             } else {
    36                 out.println("Can't understand what you said!");
    37             }
    38         }
    39         in.close();
    40         out.close();
    41         server.close();
    42     }
    43 
    44     public static void main(String[] args) throws IOException {
    45         new Server().launch();
    46     }
    47 }

      为方便测试,我们直接使用本机环回地址127.0.0.1模拟远程地址,并且在服务程序中指定端口号为4000。编译该运行java文件以启动服务。在Windows Powershell中打开telnet客户端并连接到上面的地址和端口:

    ~/userName > telnet

       服务程序打印问候语句,随后就可以按照预先设定的逻辑和服务程序对话:

    三、telnet的安全问题

      从上面的实例可以看出,使用telnet指令与远程服务端交互是非常方便的,然而这种便利性存在安全隐患。Telnet以明文的方式发送所有数据,对于那些要求要求提供用户名和登录密码的服务端程序来说,用户发来的信息在传输过程中很容易被截获。此外,telnet还存在对数据的完整性不关心的问题,telnet并不检查接收到的消息是否被正确的传输了,它不关心数据在传输过程中是否遭到了篡改。

      不过,跟利用telnet进行恶意攻击相比,这些都是小问题。telnet在远程访问主机时具有较大的权限,例如它可以连接到服务器上任何一个开放的端口,对其中一些端口的恶意访问可能带来的安全问题。

      针对telnet的安全问题,微软为telnet添加了一个身份验证——NTML,客户端不直接发送用户输入的密码,而是缓存一个对应的哈希值。服务器在接收到哈希值后返回一个随机数,客户端用缓存的哈希值对这个随机数进行加密,服务器再利用域控制器进行用户的验证。通过这种方式可以避免很多使用telnet恶意登录到目标主机的行为。

      但是NTML也并不是无法突破的,长远看来,具有加密和身份验证的SSH协议在安全性更高。因此出现稍晚但可靠性更高的SSH比Telnet的应用更为广泛,不过,在某些特定的背景下,比如对安全性要求相对较低的应用场景下,使用telnet可能是个方便的选择。

  • 相关阅读:
    java加密解密用法
    进程和线程
    office使用技巧
    apktool+dex2jar+jd_gui
    shell编程学习
    编程常犯的错误
    编程语言学习清单
    使用github托管自己的项目
    c# 异常 的 异想
    DNLA自学(一) UPnP设备发现
  • 原文地址:https://www.cnblogs.com/Mr-Tiger/p/11918566.html
Copyright © 2011-2022 走看看