1.了解信息搜集的一般步骤;
2.学会熟练使用ping命令,学会利用Nmap等工具进行信息搜集;
3.了解IP助手函数,掌握SendARP函数的使用方法;
4.理解利用ARP协议实现主机发现的原理
ping命令探测技巧:使用ping可以测试目标主机名称和IP地址,验证与远程主机的连通性,通过将ICMP回显请求数据包发送到目标主机,并监听来自目标主机的回显应答数据包来验证与一台或多台远程主机的连通性,该命令只有在安装了TCP/IP协议后才可以使用。
nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取哪台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口映射),碎片扫描,以及灵活的目标和端口设定。
主机发现:任何网络探测任务的最初几个步骤之一就是把一组IP范围(有时该范围是巨大的)缩小为一列活动的或者你所感兴趣的主机。扫描每个IP的每个端口很慢,通常也没必要。当然,什么样的主机令你感兴趣主要依赖于扫描的目的。网络管理员也许只对运行特定服务的主机感兴趣,而从事安全的人士则可能对每一个细节都感兴趣。一个系统管理员也许仅仅使用Ping来定位内网上的主机,而一个外部入侵测试人员则可能绞尽脑汁用各种方法试图突破防火墙的封锁。
利用ARP协议实现主机发现的过程如图1-2-1所示。
图1-2-2所示为ARP请求与应答情况。
信息搜集
1.ping探测
主机A开启命令行,对主机B进行ping探测,根据主机B的回复,可以确定主机A和主机B之间的连通情况,还可以根据回复数据包的TTL值对操作系统进行猜测。
我们先查看开启的另一台Linux虚拟机的IP地址,可以看见其IP地址为:172.16.0.192.
我们使用WindowsXP系统虚拟机去ping Linux虚拟机
可以看见,回复数据包的TTL值: 64 ,主机B操作系统可能为: Linux Kernel 2.6.x 。
2. Nmap扫描
(1)对活动主机进行端口扫描
主机A使用Nmap工具对主机B进行TCP端口同步扫描(范围1-150):
Nmap命令 nmap –sS –p 1-150 172.16.0.192 ;
主机B开放的TCP端口 21,22,23,25,80,88,139 。
对主机B进行UDP端口扫描(范围是110-140):
Nmap命令 nmap –sU –p 110-140 172.16.0.192 ;
主机B开放的UDP端口 111,123,137,138 。
(2)对活动主机操作系统进行探测
主机A对主机B进行TCP/IP指纹特征扫描:
Nmap命令 nmap –sT –O 172.16.0.192 ;
查看扫描结果 Linux 2.6.15-2.6.26 。
(3)对活动主机运行服务进行探测
单击平台工具栏“协议分析器”按钮,启动协议分析器进行数据包捕获。打开IE在地址栏中输入http://主机B的IP,访问主机B的web服务,停止协议分析器,查看捕获结果。
打开IE在地址栏中输入http://172.16.0.192
打开IE在地址栏中输入ftp://172.16.0.192
HTTP会话分析可判断目标主机web服务使用的软件类型是 Apache/2.2.0 (Fedora) 。请探测目标主机FTP服务使用的软件类型是 vsFTPd 2.0.4 。
(4)对活动主机IP协议进行探测
主机A使用Nmap命令对主机B进行IP协议探测:
Nmap命令 nmap -sO 172.16.0.192 ;
查看扫描结果 icmp协议、esp协议、ah协议 。
3. 探测总结
根据上述实验所得结果,填写表1-1-1。
表1-1-1 探测结果
目标主机IP |
目标主机MAC |
目标主机开放端口 |
目标主机操作系统 |
172.16.0.192 |
00:0C:29:01:D1:7B |
TCP:21,22,23, 25,80,88,139 UDP:111,123, 137,138 |
Linux Kernel 2.6.x |
目标主机开放服务 |
目标主机服务软件 |
服务软件版本 |
主机支持的IP协议 |
HTTP FTP |
APACHE vsFTP |
APACHE2.2.0 VSFTP2.0.4 |
ICMP ESP AH |
思考题:137/UDP端口提供的是什么服务?Linux系统是否提供此服务?
137/UDP端口主要用于“NetBIOS Name Service”(NetBIOS名称服务),使用者只需要向局域网或互联网上的某台计算机的137端口发送一个请求,就可以获取该计算机的名称、注册用户名,以及是否安装主域控制器、IIS是否正在运行等信息。Linux系统也能提供此服务。
SendArp应用示例
Windows提供了帮助函数SendARP来发送ARP请求,获取与IP地址对应的物理地址。平台目录D:\ExpNIC\NetAD\Projects\HostScan\SendArpEx\中提供了SendArp应用实例,它能够实现列出LAN中IP地址对应的MAC地址。
在控制台中执行SendArpEx.exe,执行结果如下所示:
主机发现程序开发
我们设计一个简单的Arp主机发现程序,它可以发现当前LAN中的所有活动主机,为了减少开发量,我们固定本地主机的网络掩码为255.255.255.0。开发流程如图1-2-3所示。
这里分析一下加入的几条主要语句的作用;
WSAStartup(MAKEWORD(2, 2), &wsaData);// 调用WSAStartup函数,加载Winsock库(版本2.2)
gethostname(host_name, sizeof(host_name);//获取主机名,放入gethostname
exit(EXIT_FAILURE);//执行失败,退出
hp = gethostbyname(host_name);//返回对应于给定主机名的hostent结构的指针
saShow.S_un.S_addr = htonl(ulLocalNet + n);//从网段第一个开始往后遍历,注意此处的htonl
::SendARP(saShow.S_un.S_addr, 0, (ULONG*)arDestMac, &ulLen)// 发送ARP请求
下面是完整代码:
#include
#include
#include
#include
using namespace std;
#pragma comment (lib, "ws2_32.lib" )
#pragma comment (lib, "Iphlpapi.lib" )
int main()
{
WSADATA wsaData;
in_addr sa;
int nErr = 0;
ULONG ulLocaIP = 0;
ULONG ulLocalNet = 0;
HRESULT hr = 0;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//! 获取本地主机名称
char host_name[256];
if (gethostname(host_name, sizeof(host_name)) < 0)
{
exit(EXIT_FAILURE);
}
//! 获取本地主机信息
hostent *hp;
hp = gethostbyname(host_name);
if (hp != NULL)
{
memcpy(&sa, hp->h_addr_list[0], hp->h_length);
ulLocaIP = htonl(sa.s_addr);
// 计算网络地址
ulLocalNet = ulLocaIP & 0xffffff00;
// 遍历本地网络IP地址1-254
for (int n = 1; n < 255; ++n)
{
u_char arDestMac[6];
ULONG ulLen = 6;
in_addr saShow;
//发送ARP请求
saShow.S_un.S_addr = htonl(ulLocalNet + n);
if (::SendARP(saShow.S_un.S_addr, 0, (ULONG*)arDestMac, &ulLen) == NO_ERROR)
{
// 显示结果
printf("\nHost IP: %s 处于活动中", inet_ntoa(saShow));
}
else
{
printf("\nHost IP: %s 未活动", inet_ntoa(saShow));
}
}
}
else
{
exit(EXIT_FAILURE);
}
WSACleanup();
return 0;
}
2.HostDiscover发现主机
(1)启动协议分析器,,按要求完成过滤器设置,开始捕获数据包。
(2)执行HostDiscover.exe。
程序结果显示在172.16.0网段上找到了7个活动主机,我们可以使用nmap命令验证。
看以看出,此时该网段上确实有7个活动主机,说明我们实验成功。
(3)待HostDiscover发现同组主机后,协议分析器停止捕获。观察本机与活动主机间的ARP会话过程图。
停止协议分析器,可以看到ARP会话过程图,本主机发给目的主机一个ARP请求报文,目的主机返回一个应答。
思考题:利用ARP协议探测网络中的活动主机的优、缺点是什么?
优点:即使对方屏蔽了ICMP也能进行探测
缺点:耗费网络流量、只能探测以太网内的活动主机
这次的信息搜索和上次实验差别就很大了。是要是学习ping命令和nmap命令。用TTL分辨目的操作系统其实是在上学期的网络原理实验中学到的,没想到这次就派上了用场。TTL字段值是255 时系统为Unix及类Unix;128时系统为Windows NT/2K/03;32时系统为Windows 95/98/ME;64时系统为Linux Kernel 2.6.x0。nmap命令是这次实验新学到的,它拥有很多的功能和可选项,通过几个实验的例题,学会了扫描端口、查询系统、查询软件和IP协议等命令,感觉很方便用处也很大。
主机发现实验里的编程其实是这次实验的难点了。因为有Socket编程的基础,所以看到题目倒也不是很陌生。WSAStartup、WSACleanup都是常用的,就是要学习一下gethostname、gethostbyname、SendARP这几个函数的接口和用法。我觉得最难的就是这一句了:saShow.S_un.S_addr = htonl(ulLocalNet + n);in_addr结构体以前见过,但是ulLocalNet用来干嘛一开始还真是没想到,然后发现这里进行与操作后放的是网段号,那么ulLocalNet + n就是遍历该网段所有主机,htonl用来把主机数转换成无符号长整型的网络字节顺序,这也很重要。在输出的时候需要使用inet_ntoa返回点分十进制的字符串。