finger(端口79)是互连网上最古老的协议之一, 用于提供站点及用户的基本信息, 一般通过finger服务,你可以查询到站点上的在线用户清单及其他一些有用的信息.
出于安全的考虑 ,大部分站点取消了finger服务,不过互连网上仍然有相当数量的主机在继续提供finger服务(如990.net,嘿嘿,最近好像不提供这项服务了),看看coolfire的入侵教程就知道finger给网络安全带来多大的危害:
1.由于finger服务一般都是提供在线用户的用户名, 因此入侵者通过finger服务可以轻松地取得有效用户名列表(如果耐心地多试几次,基本上可以得到大部分的用户名),然后使用暴力密码破解器, 往往能在较短的时间里得到一个有用的"身份"(如ftp权限或telnet权限,要是运气好,没准能得到一个有写权限的账号),以此作为进一步行动的跳板(其实大家都知道,入侵最难的一步就是“进入”,真正进入后即使不能取得root也能获得不少东西), 所以说使用finger就等于是开门揖盗。
2.可以取得用户的登陆时间,查看邮件时间等有用的信息,这个也是入侵者需要的重要信息(因为可以了解用户的登录时间和习惯,有利于隐藏行踪) 从我个人的观点看,如果没有什么特殊的需要,finger这个服务根本就没必要开,因为几乎没有正常的用户去使用它 (使用finger的基本上都是入侵者,或者说,至少是不怀好意的用户)。 如果一定要开,也请你不要用系统默认的守护进程,下载一个或自己编一个会比较安全。
在 unix平台上,finger是一个很普通的工具,它的基本原理如下:
1.用户通过finger客户端程序提出一个finger请求
2.用户与finger服务器通过目标主机的79端口连接
3.服务器收集需要提供的信息(一般是用户上次登陆的时间,主目录等信息,主机不同,提供的服务也各不相同,你甚至可以用它来分发文本文件)。
4.如果存在plan文件,那么它的数据被连接到输出数据之后。
5.把结果返回给提出申请的用户。
也就是说, finger服务是基于客户/服务器模式的,目标机上通常有一个fingerd的服务器程序(在unix中,被称为finger守护进程),而finger返回的结果是由这个进程决定的,使用或自己编些不同的进程,可以提供各种各样的finger服务。
UNIX下,finger是被作为一个系统程序提供的,微软的用户就没有那么幸运,Windows没有自带finger客户程序! (讨厌,windows什么都没有)不过不要紧,我们可以自己编一个。
1.VB
在 VB6.0中,使用winsock控件可以很容易地编些自己的finger客户程序,部分源码如下:
Private Sub StartFinger_Click()
finger1.RemoteHost = IPAddress finger1定义为winsock控件
finger1.RemotePort = "79" finger1的默认端口是79
finger1.Connect 连接远端主机
End Sub
数据到达事件
Private Sub finger1_DataArrival(ByVal bytesTotal As Long)
Dim DataBuffer1 As String
finger1.GetData DataBuffer1, vbString 接受远端主机传回的数据
ResaultBox.Text = DataBuffer1 显示接受到的信息
End Sub
2.VC++
在 VC++中,虽然没有与finger相对应的MFC类和API函数,不过可以通过更改Gopher的默认端口(把70改成79)很容易的使用MFC类WinInet发送Finger查询了。(这是因为gopher和finger的实现原理几乎完全一样,都是通过向目标主机发送一个特定的字符串取得相关信息,只不过gopher使用端口70得到信息检索结果,finger使用端口79得到在线用户信息)
部分源码如下 :
connection.session.GetGopherConnection(host,NULL,NULL,79) 建立连接
if(connection)
{
CGopherLocator locator=connection->CreateLocator(NULL,NULL,GOPHER_TYPE_TEXT_FILE);
生成文本文件定位器
CGopherFile* file=connextion->OpenFile(locator);
打开文件
if(file)
{
CString line;
for(int i=0;i<20 &&file->ReadString(line);i++)读文件
{
m_out+=line+"\r\n";输出信息
}
file->Close();关闭文件
delete file; 删除文件
}
}
3.telnet
如果你不会编程,也没有编译工具,还有一个简单的方法可以实现 finger: 在开始菜单的运行中输入 telnet xxx.xxx.xxx.xxx 79 使用Windows的用户不必配备任何其他的工具就能对提供finger的站点进行查询。
注 :xxx.xxx.xxx.xxx为提供finger服务的主机ip地址。
4.特殊字串
有的时候 ,简单的向主机提出finger请求什么都得不到,这时,就需要用到特殊的字串,比如0,root等等,也可以在程序中使用字典来遍历有可能的字串。
1.如何取消或限制finger服务:
作为系统管理员 ,可以用很简单的方法终止finger服务-- 只要从文件etc/inetd.conf中删除finger守护进程就可以了;或者替换掉默认的守护进程也可以限制finger提供的信息。(甚至可以自己编一个进程来迷惑入侵者,嘿嘿,我比较喜欢这个)
作为个人用户,如果系统提供了 finger服务,那么你就要小心了,以下的做法可以减少你泄漏的信息:
a.登陆时不要把自己的真实信息提供给系统;
b.用流行的chfn工具或请系统管理员来修改那些能够被finger查到的信息;
2.追踪使用finger的客户机:
如果你想知道 ,有什么人在调用你的finger服务,可以使用MasterPlan,MasterPlan尝试得到进行finger查询的主机名和用户,这些变量被输出到finger-log文件中,通过MasterPlan还可以了解finger被调用的频率。
3.防止被系统管理员追踪:
如果系统管理员使用了 MasterPlan或类似的工具,那么,频繁的使用finger将会暴露你自己,为了避免被管理员反追踪,我们可以使用finger网关(finger gateways),finger网关是一些web主页,通常包括一个简单的输入框,指向一个cgi(或类似的程序比如asp),由这个cgi程序帮你进行finger查询,这样,管理员查到的只是这个网关的地址,而不是你的。
注:即使使用网关,水平较高的管理员还是能查到你的真实地址的,解决方法是经常更换网关。
后记 :文中的源码测试过(在Visual Stduio 6.0下), 如果有任何问题, 请和作者联系shotgun_xici@cmmail.com
例子 1 :查看 finger 所有参数
例子 2 :在本地机上使用 finger 命令
$ finger xxq
Login: xxq Name:
Directory: /home/xxq Shell: /bin/bash
Last login Thu Jan 1 21:43 (CST) on tty1
No mail.
No Plan. $ finger
Login Name Tty Idle Login Time Office Office Phone
root root *1 28 Nov 25 09:17
……