260 likes | 576 Vues
TCP/IP 基本原理 第七章 远程登录. 7.1 概述. 远程登录( Telnet )是 Internet 提供的基本服务之一,它允许用户在本地主机上对远方主机进行帐号注册,注册成功后,可以把本地主机看作是远方主机的一个普通终端,用户可以同远方主机上的其他用户一样使用远方主机上的软、硬件资源。
E N D
7.1 概述 • 远程登录(Telnet)是 Internet提供的基本服务之一,它允许用户在本地主机上对远方主机进行帐号注册,注册成功后,可以把本地主机看作是远方主机的一个普通终端,用户可以同远方主机上的其他用户一样使用远方主机上的软、硬件资源。 • 当用户的机器上没有特定的软件、硬件,而在 Internet网上的另一台机器上拥有这些资源时,他便可以同那台机器的系统管理员取得联系,申请到远方主机的一个帐号,然后使用远程登录服务将自己的主机作为终端设备登录到远方机器上去,使用那些资源。尽管地理上两台机器可能相距很远,但在用户看来,他就像在近程使用那台机器一样,不会感到任何不方便。 • 远程登录的功能:远程登录的作用是把本地主机作为远程主机的一台仿真终端使用,这同样是一种非常重要的Internet基本服务。Telnet之所以重要,首先是因为有些通信软件只支持telnet;其次在于有些非常流行的服务,如BBS,只有通过远程登录才能访问;第三是因为Telnet可以很方便地访问Internet上为数众多的联机数据库和图书馆卡片目录。事实上,Internet上的绝大多数服务都可通过Telnet进行访问。
7.1 概述 具体说来,通过远程登录Telnet可得到如下服务: • 访问Internet上的各种联机数据库,包括科网公司的数据库。 • 连接到Internet以外的专用商业网和一些服务,例如DIALOG(电子数据库的集合)或 CompuServe(一种商业电子公告牌系统)。不过,这时的先决条件是你必须在这些系统上拥有一个合法帐户,以便进行登录、使用它们的系统程序并检索有关信息。 • 查阅图书馆的馆藏目录或图书。许多大型图书馆允许用户通过Telnet访问它们的某些程序。比方说,用户可以用Telnet连接到中科院、北京大学和清华大学的图书馆,使用这些图书馆的电子卡目录,就好象用户在使用图书馆的一个终端一样。 • 使用World Wide Web,Gopher,Archie和WAIS等各种高级的Internet服务。 • 使用Whois、Netfind和X.500等目录服务,查询用户的个人信息。 • 访问电子公告牌系统(BBS)。
7.2 远程登录的工作过程 使用Telnet协议进行远程登录时需要满足以下条件:在本地计算机上必须装有包含Telnet协议的客户程序;必须知道远程主机的IP地址或域名;必须知道登录标识与口令。 Telnet远程登录服务分为以下4个过程: • 本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的IP地址或域名; • 将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据报; • 将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果; • 最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。
INTERNET 远程登录原理 远程服务器 用户本地计算机 运行Telnet 应用程序 服务器 客户机 Telnet
7.3 Telnet协议 • 基本内容 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。它提供了三种基本服务: • Telnet定义一个网络虚拟终端为远的系统提供一个标准接口。客户机程序不必详细了解远的系统,他们只需构造使用标准接口的程序; • Telnet包括一个允许客户机和服务器协商选项的机制,而且它还提供一组标准选项; • Telnet对称处理连接的两端,即Telnet不强迫客户机从键盘输入,也不强迫客户机在屏幕上显示输出。
适应异构 为了使不同操作系统间的Telnet交互成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符结束,另一些系统则需要使用ASCII换行符,还有一些系统需要用两个字符的序列回车-换行;再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。 为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下: 对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式; 对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。
传送远地命令 我们知道绝大多数操作系统都提供各种快捷键来实现相应的控制命令,当用户在本地终端键入这些快捷键的时候,本地系统将执行相应的控制命令,而不把这些快捷键作为输入。那么对于Telnet来说,它是用什么来实现控制命令的远地传送呢? Telnet同样使用NVT来定义如何从客户机将控制功能传送到服务器。我们知道USASCII字符集包括95个可打印字符和33个控制码。当用户从本地键入普通字符时,NVT将按照其原始含义传送;当用户键入快捷键(组合键)时,NVT将把它转化为特殊的ASCII字符在网络上传送,并在其到达远地机器后转化为相应的控制命令。将正常ASCII字符集与控制命令区分主要有两个原因: • 这种区分意味着Telnet具有更大的灵活性:它可在客户机与服务器间传送所有可能的ASCII字符以及所有控制功能; • 这种区分使得客户机可以无二义性的指定信令,而不会产生控制功能与普通字符的混乱。
数据流向 下面给出Telnet中的数据流向: 数据信息被用户从本地键盘键入并通过操作系统传到客户机程序,客户机程序将其处理后返回操作系统,并由操作系统经过网络传送到远地机器,远地操作系统将所接收数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的伪终端入口点,最后,远地操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程;输出将按照同一通路从服务器传送到客户机。 因为每一次的输入和输出,计算机将切换进程环境好几次,这个开销是很昂贵的。还好用户的键入速率并不算高,这个缺点我们仍然能够接受。 • 强制命令 我们应该考虑到这样一种情况:假设本地用户运行了远地机器的一个无休止循环的错误命令或程序,且此命令或程序已经停止读取输入,那么操作系统的缓冲区可能因此而被占满,如果这样,远地服务器也无法再将数据写入伪终端,并且最终导致停止从TCP连接读取数据,TCP连接的缓冲区最终也会被占满,从而导致阻止数据流流入此连接。如果以上事情真的发生了,那么本地用户将失去对远地机器的控制。
为了解决此问题,Telnet协议必须使用外带信令以便强制服务器读取一个控制命令。我们知道TCP用紧急数据机制实现外带数据信令,那么Telnet只要再附加一个被称为数据标记(date mark)的保留八位组,并通过让TCP发送已设置紧急数据比特的报文段通知服务器便可以了,携带紧急数据的报文段将绕过流量控制直接到达服务器。作为对紧急信令的相应,服务器将读取并抛弃所有数据,直到找到了一个数据标记。服务器在遇到了数据标记后将返回正常的处理过程。 • 选项协商 由于Telnet两端的机器和操作系统的异构性,使得Telnet不可能也不应该严格规定每一个telnet连接的详细配置,否则将大大影响Telnet的适应异构性。因此,Telnet采用选项协商机制来解决这一问题。 Telnet选项的范围很广:一些选项扩充了大方向的功能,而一些选项制涉及一些微小细节。例如:有一个选项可以控制Telnet是在半双工还是全双工模式下工作(大方向);还有一个选项允许远地机器上的服务器决定用户终端类型(小细节)。
telnet客户端和服务器在进行连接是的任何一个阶段都可以协商各种选项。下表是一些重要的选项参数: telnet客户端和服务器在进行连接是的任何一个阶段都可以协商各种选项。下表是一些重要的选项参数: telnet对话的任意一端都可以在本地或远程允许或取消一个选项。要更改选项的发起者需要发送三个字节的命令,格式如下: IAC,<操作类型><选项>
回应方的格式也是如此操作是下表列出的四种类型之一。回应方的格式也是如此操作是下表列出的四种类型之一。 对应这些发送出的命令有下表所列出的几种可能的应答:
比方说如果发送方想要对方“禁止继续(suppress go ahead)”。它会发送这样一个发送序列: 255 (IAC), 251(will), 3 这二个字节序列的最后一个字节指明了所需的行为。 在主机之间传递选项时,除了一个选项编码外可能还需要更多其他信息。要求有一个参数的那些选项就属于这种情况。这需要用“子协商”实现。 主机间传递其他信息的策略包含两个步骤:首先,双方都同意“商讨”该参数,然后对参数进行“商讨”。在第一步中,同意商讨参数以一种普通的方式来进行。一方通过发送带有选项代码的DO (或WILL) 命令建议使用该选项,另一方发送带有选项代码的DO (或WILL) 命令来表示接受这个建议。一旦双方都同意使用该选项,通过在SB命令后面跟上相应的选项代码、参数和命令SE来开始子协商。每一方都被假设为能够解析该参数。因为最初通过交换WILL和DO命令,双方都表明可以支持该选项。另外,即使收方不能解析该参数,收方也可以通过搜索SE命令(如字符串 ICA SE)来定位参数字符串的结束位置。当然,任何时候一方都可以给另一方发送WON‘T或DON’T来拒绝继续进行进一步的子协商。
7.4 远程登录程序telnet telnet程序可以让你的计算机像个哑终端 (Dumb Terminal,指没有提供计算功能的终端) 一样连到另一个计算机系统上,它是TELNET协议的一个具体实现。 7.4.1 终端仿真 很早之前,计算机的体积非常大.它们甚至能放满整个房间。为了能让多个人使用一台计算机,一些“终端”被接到了计算机上。最早的时候这些终端是电传打字机,即一种流行的打字机,被称作TTY (”Tele Typewriter,电传打字机,是沿用以前的说法,表示输入设备)。计算机可以让TTY打印字符、换行、回车,还可以读入用户在TLTY上的输入。 TTY之后引人了CRT (Cathode-Ray Tube,阴极射线管) 终端。这样的终端可以在显示器上显示字符。早期的这种终端包括视频终端(Video Terminals,简称 VT)的 DEC一族,像VT-52和VT-100,它们都曾经非常地流行。它们允许用户通过移动光标进行“全屏编辑”,并且可以任意地删除字符。它们还允许计算机打印特殊的符号,比如打印线条和破折号,打印粗体字符,清屏等。
如今计算机已经小到可以放到桌面上,甚至装在口袋里,不需要再使用终端,然而人们依旧使用着终端的仿真程序进行远程登录通话,telnet就是这样一种在TCP/IP的仿真终端。一旦一个telnet连接建立后,通信的两端就被假设为在一个“网络虚拟终端”上开始和终止操作。对 TTY、VT-100这种古老类型终端的仿真是通过一台机器控制另一台机器的好方法,因为它们是建立在字符上的,而且它们的设计让它们可以快速有效地传送和接收数据。在绝大多数情况下,telnet是仿真VI”-100终端的.它的显示总是文本的,没有图形。 7.4.2 telnet服务器配置 一般来说,默认安装的UNIX服务器都打开了telnet服务。telnet服务在UNIX下是通过inetd或者xinetd守护进程启动的。通过查看inetd的配置文件可以看到与下面所列类似的代码: telnet stream tcp6 nowait root /usr/sbin/in. telnetd in.telnetd 表明telnet服务通过 inetd守护进程启动了。如果是使用xinetd系统,可以在 /etc/xinetd.d中发现一个名为telnet的文件。 由于telnet是明文传输的,所以安全性很低,一般都被禁用或者使用TCP Wrappers来启动从而控制能访问telnet的IP地址。
7.4.3 常用的TELNET客户端 1.telnet 最简单也是最普遍的telnet客户端是telnet。在绝大多数的Windows系统或UNIX系统中都有telnet。在Windows的命令行中键人: telnet [hostname [port]] 就可以远程登录到名为hostname,端口号为port的主机上,只要这台主机开启了telnet服务。用Ctrl+]可以设置部分telnet的选项。 2.NetTerm NetTerm是较早的一种TELNET终端,它的界面比telnet以更友好,在前两年是最流行的一种telnet客户端。当要连接到一个主机上时,用鼠标左键单击地址簿,并且选择Telnet Default 这个条目,在 Host/IP中输入主机地址。
7.5 windows2000的Telnet服务 • 基本配置 Win2000为我们提供了Telnet客户机和服务器程序:Telnet.exe是客户机程序(Client),tlntsvr.exe是服务器程序(server),同时它还为我们提供了Telnet服务器管理程序tlntadmn.exe。 Windows 2000 默认安装了 Telnet 服务,但是并没有默认启动。下面给出 Telnet 服务的一部分默认设置: • AllowTrustedDomain:是否允许域用户访问。默认值是1,允许信任域用户访问。可以改为0: 不允许域用户访问(只允许本地用户)。 • DefaultDomain:可以对与该计算机具有信任关系的任何域设置。默认值是“.”。 • DefaultShell:显示 shell 安装的路径位置。默认值是: %systemroot%\System32\Cmd.exe /q /k • MaxFailedLogins:在连接终止之前显示尝试登录失败的最大次数。默认是3。 • LoginScript:显示 Telnet 服务器登录脚本的路径位置。默认的位置就是“%systemroot%\System32\login.cmd”,你可以更改脚本内容,这样登录进Telnet的欢迎屏幕就不一样了。
早期的SMB协议在网络上明文传输口令,后来出现了"LAN Manager Challenge/Response"验证机制,简称LM,它十分简单以至很容易被破解,微软随后提出了WindowsNT挑战/响应验证机制,即NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM工作流程是这样的: • 客户端首先在本地加密当前用户的密码成为密码散列 • 客户端向服务器发送自己的帐号,这个帐号是没有经过加密的,明文直接传输 • 服务器产生一个16位的随机数字发送给客户端,作为一个 challenge(挑战) • 客户端再用加密后的密码散列来加密这个 challenge ,然后把这个返回给服务器。作为 response(响应) • 服务器把用户名、给客户端的challenge 、客户端返回的 response 这三个东西,发送域控制器 • 域控制器用这个用户名在 SAM密码管理库中找到这个用户的密码散列,然后使用这个密码散列来加密 challenge。 • 域控制器比较两次加密的 challenge ,如果一样,那么认证成功。
从上面的过程我们可以看出,NTLM是以当前用户的身份向Telnet服务器发送登录请求的,而不是用你扫到的对方管理员的帐户和密码登录,显然,你的登录将会失败。举个例子来说,你家的机器名为A(本地机器),你入侵的机器名为B(远地机器),你在A上的帐户是xinxin,密码是1234,你扫到B的管理员帐号是Administrator,密码是5678,当你想Telnet到B时,NTLM将自动以当前用户的帐号和密码作为登录的凭据来进行上面的7项操作,即用xinxin和1234,而并非用你扫到的Administrator和5678,且这些都是自动完成的,根本不给你插手的机会,因此你的登录操作将失败。从上面的过程我们可以看出,NTLM是以当前用户的身份向Telnet服务器发送登录请求的,而不是用你扫到的对方管理员的帐户和密码登录,显然,你的登录将会失败。举个例子来说,你家的机器名为A(本地机器),你入侵的机器名为B(远地机器),你在A上的帐户是xinxin,密码是1234,你扫到B的管理员帐号是Administrator,密码是5678,当你想Telnet到B时,NTLM将自动以当前用户的帐号和密码作为登录的凭据来进行上面的7项操作,即用xinxin和1234,而并非用你扫到的Administrator和5678,且这些都是自动完成的,根本不给你插手的机会,因此你的登录操作将失败。 由于Telnet服务器对NTLM的使用有3个选项,所以当你Telnet远地机器时,会显示下面情况中的一种: 1)身份验证选项=0时 ===================================== Microsoft (R) Windows (TM) Version 5.00 (Build 2195) Welcome to Microsoft Telnet ServiceTelnet Server Build 5.00.99201.1 login: password: \\为0时不使用NTML身份验证,直接输入用户名和密码,比如你可以输入扫到的Administrator和5678
2)身份验证选项=1时===================================== 2)身份验证选项=1时===================================== NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password Microsoft (R) Windows (TM) Version 5.00 (Build 2195)Welcome to Microsoft Telnet ServiceTelnet Server Build 5.00.99201.1 login: password: \\先尝试 NTLM 身份验证,如果失败,再使用用户名和密码,其实这种方式对于我们来说,与上一种方式没什么区别 3)身份验证选项=2时 ===================================== NTLM Authentication failed due to insufficient credentials. Please login withclear text username and password Server allows NTLM authentication only Server has closed connection 遗失对主机的连接。 C:\> \\仔细看看上面的显示,根本没有给你输入用户名和密码的机会,直接断开连接,扫到了密码也是白扫
所以对于入侵者来说,NTLM是横在我们面前的一座大山,必须要除掉它,一般我们有如下几种方法: 1. 通过修改远程注册表更改telnet服务器配置,将验证方式从2改为1或0;2. 使用NTLM.exe,上传后直接运行,可将telnet服务器验证方式从2改为1; 3. 在本地建立扫描到的用户,以此用户身份开启telnet客户机并进行远程登录; 4. 使用软件,比如opentelnet.exe(需要管理员权限且开启IPC管道) 5. 使用脚本,如RTCS,(需要管理员权限但不依赖IPC管道) 基本上是以上5种,其中后两种是我们比较常用的开telnet的手法,而且使用方法十分简单,命令如下: OpenTelnet.exe \\server username password NTLMAuthor telnetport OpenTelnet.exe \\服务器地址 管理员用户名 密码 验证方式(0或1) telnet端口 cscript RTCS.vbe targetIP username password NTLMAuthor telnetport cscript RTCS.vbe <目标IP> <管理员用户名> <密码> <验证方式> <tlnet端口> 试试远程登录
7.6 非标准端口号的Telnet服务 当客户机向某一宿主机发出请求后,该由该主机的哪个服务器程序来处理该请求呢?这要由网络通信软件来决定。每个服务器都有一个端口号,网络通信软件正是通过端口号来识别各个服务器程序的。当客户程序想要与某些服务相连时,它必须确定地址,表示与某台服务器相连,并说明端口号,表示与该主机上的哪项服务相连。一些经常使用的应用程序,如Telnet,Gopher,FTP等都有自己固定的端口号。标准的Telnet的端口号是23,标准的Gopher的端口号是70,标准的FTP的端口号是200。常用程序的标准端口号可在RFC(request for comments)的Assigned Numbers中查到。在实际操作中,如果通过标准端口,使用标准服务程序,端口号可以省略不写,即系统的默认值就是23。在图形界面的情况下,用户一般不必更改端口号项。 在Internet网上也有一些主机不是以标准的23号端口提供远程登录服务,这就是非标准的Telnet,如果想要登录到这些主机上去,除具有其帐号和口令外,还需要知道其特殊的端口号,并指明端口号。例如: % telnetgarcon.cso.uiuc.edu620
表明主机garcon.cso.uiuc.edu的远程登录服务是通过620端口提供的。如果在这里不指明端口号,则表明是23号标准端口,但是garcon.cso.uiuc.edu 宿主机的23端口可能并不提供远程登录服务。因此不指明端口号就不能登录到garcon.cso.uiuc.edu宿主机上。 使用非标准端口提供远程登录服务,主要是想缩小提供远程登录服务的范围,或是在网上设定一个小的内部通信环境。具体来说就是,设定一个非标准服务器,让它监听某一个端口,例如端口100的请求,再通知本部门的用户通过端口100登录到该服务器,使用该服务器的资源,而其它非本部门的用户并不知道这个端口号,这样就形成一个小的内部的通信环境了。 Internet网上的许多服务都可以借助于Telnet进行。一般是通过不同的用户登录名:www、gopher、news、wais等登录到不同的服务程序上,有时也可以用不同的端口号登录到不同的服务程序,但这时往往需要相应的口令和帐号。假设,用户已知宿主机sonne.uiuc.edu提供News服务,那么就可以: % telnetsonne.uiuc.edu119 119是网络News服务的固定端口号,通过Telnet,指明端口就可以使本地机直接连到sonna主机的News服务器程序上,而不是Telnet服务程序。其它许多服务也是同样的。这样一方面不用本地的News客户程序也可以使用News服务,另一方面可以通过这种方法检查故障。如果用户通过本地的News程序不能连接到相应的News服务器上,而通过Telnet加指定服务的端口号就可以联上,则表明是本地的客户机程序出了故障,如果通过Telnet的方式也不能登录,那么就有可能是用户欲访问的News服务器出了问题。
7.7 安全的远程登录 SSH • 基本概念 telnet在网络上用明文传送口令和数据, 黑客非常容易截获这些口令和数据。而且,这些服务程序的安全验证方式也是有弱点,是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。 服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。 通过使用SSH (Secure Shell ),可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了, 而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。 SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。SSH由芬兰的一家公司开发。因为受版权和加密算法的限制,现在很多人都使用OpenSSH。 OpenSSH是SSH的免费替代软件。SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。 用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。
SSH的安全验证工作过程 从客户端来看,SSH提供两种级别的安全验证。 第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密, 但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器, 也就是受到“中间人”这种方式的攻击。 第二种级别(基于密匙的安全验证)需要依靠密匙,也就是必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。 如果要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用自己的密匙进行安全验证。服务器收到请求之后, 先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致, 服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。 客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。 用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。 第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。 但是整个登录的过程可能需要10秒。
本章习题 • 参见教师网页:http://staff.ustc.edu.cn/~leeyi