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