前言:
对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。
为什么需要telnet?
telnet有两个主要功能,一个是,查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是 8080。那么你可以启动服务器,用telnet 去查看这个端口是否可用。说人话就是端口嗅探功能。
另一个功能就是远程登录服务器啦,和ssh协议一样,远程登录使得服务器的物理距离不是主要的问题了。
Telnet协议是TCP/IP协议家族中的一员,是Internet远程登陆服务的标准协议和主要方式。这里,多提一句,telnet协议是比ssh协议更早的,并不是特别安全的一个协议。在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
telnet的组成:
telnet是c/s 架构的一组程序,通常client端是连接服务端的专有工具,server端是提供侦听client端服务,如果client端验证通过,就可以登录服务器了。
telnet的安装不管是centos7还是6 安装方式都是一样的:
[root@master nginx-offline]# yum install telnet telnet-server -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package telnet.x86_64 1:0.17-64.el7 will be installed
---> Package telnet-server.x86_64 1:0.17-64.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================
Package Arch Version Repository Size
======================================================================================================================================================
Installing:
telnet x86_64 1:0.17-64.el7 local-http 64 k
telnet-server x86_64 1:0.17-64.el7 local-http 41 k
Transaction Summary
======================================================================================================================================================
Install 2 Packages
Total download size: 105 k
Installed size: 168 k
Downloading packages:
(1/2): telnet-0.17-64.el7.x86_64.rpm
功能介绍:
一。端口嗅探功能
该功能是由telnet的client端完成,也就是说,如果不需要远程登录,仅仅做端口嗅探,安装client即可。centos系统下安装命令为:(不管要嗅探的服务器是否有安装telnet都可以嗅探)
yum install telnet -y
比如,client已经安装好了,那么,随意连接一个不在线的服务器:
[root@master nginx-offline]# telnet 192.168.0.17 80
Trying 192.168.0.17...
telnet: connect to address 192.168.0.17: No route to host
以上输出告诉我们,192.168.0.17这个服务器没有开启。那么,嗅探百度的服务器,看是否开启了80端口(其实必须是开启的嘛,浏览器输入 已经表明了是80端口服务,只是省略了而已)
[root@master nginx-offline]# ping
PING (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=52 time=54.1 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=52 time=53.6 ms
^C
--- ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 53.676/53.902/54.129/0.324 ms
[root@master nginx-offline]# telnet 220.181.38.148 80
Trying 220.181.38.148...
Connected to 220.181.38.148.
Escape character is '^]'.
Connection closed by foreign host.
再次嗅探百度的8080和8081端口,从结果可以看到,嗅探端口大概率是被百度阻拦,也就是说端口是开的,但不让你侦测,因为是timeout了嘛。说人话就是端口状态不明,也许是被阻拦了,也许是根本没开。(大厂这一点安全意识还是肯定有的,未知的迷雾才是让人难受的哦)
root@master nginx-offline]# telnet 220.181.38.148 8080
Trying 220.181.38.148...
telnet: connect to address 220.181.38.148: Connection timed out
[root@master nginx-offline]# telnet 220.181.38.148 8081
Trying 220.181.38.148...
telnet: connect to address 220.181.38.148: Connection timed out
嗅探自身的8081端口,可以看到端口并没有开启,因此是refuse。(refused是可以明确的没有开启端口)
[root@master nginx-offline]# telnet 127.0.0.1 8081
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
二,远程登录功能
远程登录需要安装telnet的server端。
由于telnet是一个远古的程序,因此,centos7和centos7以前的telnet远程登录配置是有所不同的。
实验环境概述:
两台服务器,操作系统都为centos7,IP分别为192.168.0.16和192.168.0.17, 实验目的是16服务器可以使用telnet的client端登录到17服务器上。
在192.168.0.17服务器上执行安装命令:
yum install telnet telnet-server -y
telnet-server 在centos7下启动方式为(在17服务器上执行):
systemctl enable telnet.socket
systemctl start telnet.socket
启动之后,我们会发现一个守护进程,该进程ID为1,由systemd进程守护,此服务的端口是23,因此,我们要远程17的话,就需要在16服务器上通过23端口telnet
[root@slave2 ~]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 988/sshd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:8670 0.0.0.0:* LISTEN 1063/python
tcp 0 0 192.168.0.18:23 192.168.0.17:51496 ESTABLISHED 1/systemd
tcp 0 1 192.168.0.18:24698 192.168.0.16:8440 SYN_SENT 1063/python
tcp 0 52 192.168.0.18:22 192.168.0.11:49593 ESTABLISHED 1163/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 988/sshd
udp 0 0 192.168.0.18:123 0.0.0.0:* 765/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 765/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 765/ntpd
udp6 0 0 :::123 :::* 765/ntpd
在16服务器上安装Telnet客户端,安装命令为:
yum install telnet -y
安装完成后,就可以愉快的使用telnet远程登录17服务器了,此时我们会发现使用root账号并不能登录服务器,而使用普通账号则可以,这里,是telnet的一个保护措施。
[root@master ~]# telnet 192.168.0.17 23
Trying 192.168.0.17...
Connected to 192.168.0.17.
Escape character is '^]'.
Kernel 3.10.0-693.el7.x86_64 on an x86_64
slave1 login: root
Password:
Login incorrect
slave1 login: Connection closed by foreign host.
那么,如何可以使用root账号也登录服务器呢?此时,需要编辑/etc/securetty 将以后可能用到的tty终端名称写入就可以了。
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9
此时,使用root账号telnet登录就可以正常了:
[root@master ~]# telnet 192.168.0.17 23
Trying 192.168.0.17...
Connected to 192.168.0.17.
Escape character is '^]'.
Kernel 3.10.0-693.el7.x86_64 on an x86_64
slave1 login: root
Password:
Last failed login: Thu Mar 31 20:20:22 CST 2022 from master on pts/1
There were 11 failed login attempts since the last successful login.
Last login: Thu Mar 31 20:12:01 from master
[root@slave1 ~]#
telnet的默认端口是23,如果有人恶意的爆破这个端口,那也是比较危险的,因此,我们应该更改telnet服务的端口,比如,43278,随机定义一个不常用的端口。
ListenStream 后的数字改成自己想要的端口,保存即可。
[root@slave1 ~]# cat /usr/lib/systemd/system/telnet.socket
[Unit]
Description=Telnet Server Activation Socket
Documentation=man:telnetd(8)
[Socket]
ListenStream=23
Accept=true
[Install]
WantedBy=sockets.target
此时执行以下命令即可:(重载systemd的配置,然后重启服务,)
[root@slave1 ~]# systemctl daemon-reload
[root@slave1 ~]# systemctl restart telnet.socket
[root@slave1 ~]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 990/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1145/master
tcp 0 0 0.0.0.0:8670 0.0.0.0:* LISTEN 1140/python
tcp 0 52 192.168.0.17:22 192.168.0.11:49592 ESTABLISHED 1233/sshd: root@pts
tcp 0 0 192.168.0.17:60272 192.168.0.16:8441 ESTABLISHED 1140/python
tcp6 0 0 :::43278 :::* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
此时通过netstat命令可以看到有43278端口了。这个时候,在16服务器上telnet远程命令应该是这样的:
[root@master ~]# telnet 192.168.0.17 43278
Trying 192.168.0.17...
Connected to 192.168.0.17.
Escape character is '^]'.
Kernel 3.10.0-693.el7.x86_64 on an x86_64
slave1 login:
此时,我们可以试验把17的sshd服务停掉,这个时候telnet将会是的一个后手(即使xshell等等ssh工具都连接不上也没事,有telnet ,你将后顾无忧)
[root@master ~]# ssh slave1
ssh: connect to host slave1 port 22: Connection refused
[root@master ~]# telnet 192.168.0.17 43278
Trying 192.168.0.17...
Connected to 192.168.0.17.
Escape character is '^]'.
Kernel 3.10.0-693.el7.x86_64 on an x86_64
slave1 login: root
Password:
Last login: Thu Mar 31 20:20:45 from master