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可能是個方便的選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM