【实验目的】
- 了解信息搜集的一般步骤
- 学会熟练使用ping命令
- 学会利用Nmap等工具进行信息搜集
- 了解IP助手函数
- 掌握SendARP函数的使用方法
- 理解利用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协议实现主机发现的过程如下图所示。
下图为ARP请求与应答情况。
【实验内容】
打开Windows虚拟机作为主机A,Linux虚拟机作为主机B,分别查看两台主机的IP地址:
可以得到主机A的IP地址为172.16.0.54,主机B的IP地址为172.16.0.239
实验1:信息搜集
此实验主机A可与B同时相互搜集对方信息。这里使用主机A搜索主机B的信息:
1. ping探测
主机A开启命令行,对主机B进行ping探测,根据主机B的回复,可以确定主机A和主机B之间的连通情况,还可以根据回复数据包的TTL值对操作系统进行猜测。
回复数据包的TTL值:64,主机B操作系统可能为:Unix/Linux。
2. Nmap扫描
(1)对活动主机进行端口扫描
主机A使用Nmap工具对主机B进行TCP端口同步扫描(范围1-150):
Nmap命令:nmap -sS -p 1-150 172.16.0.239
主机B开放的TCP端口:21(ftp)、23(telnet)、80(http)
对主机B进行UDP端口扫描(范围是110-140):
Nmap命令:nmap -sU -p 110-140 172.16.0.239
主机B开放的UDP端口:111(rcpbind)
(2)对活动主机操作系统进行探测
主机A对主机B进行TCP/IP指纹特征扫描:
Nmap命令:nmap -sS -O 172.16.0.239
扫描结果如上,可以得到其TCP开放的端口信息,以及主机B的操作系统型号为Linux 2.6.15 – 2.6.26,主机B的MAC地址为00:0C:29:89:DC:08。
(3)对活动主机运行服务进行探测
主机A单击平台工具栏“协议分析器”按钮,启动协议分析器进行数据包捕获(新建捕获串口后,点击左上角的开始键开始捕获):
打开IE在地址栏中输入http://主机B的IP,访问主机B的web服务:
停止协议分析器,查看捕获结果如下(这里在右侧选择主机B向主机A发送的请求,以查看主机B运行web服务的相关信息):
由上图可判断目标主机web服务使用的软件类型是Apache/2.2.3 (CentOS)
接下来探测目标主机FTP服务使用的软件类型:使用同样的方式开始捕获,并打开主机B的FTP服务:
停止捕获,查看捕获的结果如下(同样选择B向A发送的报文):
由上图可判断目标主机FTP服务使用的软件类型是vsFTPd 2.0.5
(4)对活动主机IP协议进行探测
(由于实验过程中忘记对这一步结果进行截图,这里用的同学截图)
Nmap命令:nmap -sO 172.16.0.253
查看扫描结果为:icmp协议、esp协议、ah协议
根据上述实验,可得到主机B的信息汇总于下表:
目标主机IP | 目标主机MAC | 目标主机开放端口 | 目标主机操作系统 |
172.16.0.253 | 00:0C:29:89:DC:08 | 21,23,80,111 | Linux 2.6.X |
目标主机开放服务 | 目标主机服务软件 | 服务软件版本 | 主机支持的IP协议 |
HTTP, FTP | HTTP:Apache FTP: vsFTPd | Apache: 2.2.3 vsFTPd: 2.0.5 | icmp, esp, ah |
实验二:主机发现
一.SendArp应用示例
Windows提供了帮助函数SendARP来发送ARP请求,获取与IP地址对应的物理地址。平台目录D:\ExpNIC\NetAD\Projects\HostScan\SendArpEx\中提供了SendArp应用实例,它能够实现列出LAN中IP地址对应的MAC地址。
1.运行程序
(1)单击工具栏中“SendARP工程”按钮,打开工程文件。在左侧“Workspace”区域,选择“FileView”标签页,双击“SendArpEx.cpp”文件,如下图所示:
(2)单击菜单项“Build”|“Rebuild All”编译SendArpEx工程,生成的可执行文件位于当前工程Debug目录下(SendArpEx.exe)。
在控制台中执行SendArpEx.exe,分析SendArpEx.exe返回信息:
可以得到返回信息为主机B的Mac地址:00-0C-29-71-A1-B5.
2.代码分析
程序中最为重要的一条语句就是调用函数SendARP,对其4个参数的实例说明如下:
(1)第一参数,目的IP地址。ARP请求试图取得此IP地址对应的物理地址,该参数类型为IPAddr(IP Helper提供此种数据类型,它与Winsock提供的in_addr是可互换的)。通过inet_addr函数(Winsock提供)可以将IP点式地址(如172.16.0.50)转换成in_addr结构地址。
(2)第二参数,发送者的IP。将此参数指定为0。
(3)第三参数,返回目标地址的缓冲区。
(4)第四参数,指定目标地址缓冲区大小,返回实际需要的长度。
二、主机发现程序开发
在熟悉了SendArp的应用之后,我们来设计一个简单的Arp主机发现程序,它可以发现当前LAN中的所有活动主机,为了减少开发量,我们固定本地主机的网络掩码为255.255.255.0。开发流程如下图所示。
1. 编写程序
- 单击工具栏中的“主机发现工程”按钮,即可打开工程文件。在HostDiscover.cpp源文件中,提供了程序的框架。
- 在程序开始运行时,需要调用WSAStartup函数来加载Winsock库(版本2.2),以便进行网络编程。
- 使用gethostname函数,可以获取本地主机的名称。
- 调用gethostbyname函数,可以获取本地主机的IP地址列表。
- 根据获取到的IP地址列表,计算出本地网络地址,并调用SendARP函数进行主机发现。
- 在程序结束前,需要使用WSACleanup函数卸载Winsock库。
- 最后,进行调试和编译,生成可执行文件HostDiscover.exe。
补充后的完整代码及注释如下:
#include <windows.h>
#include <stdio.h>
#include <iphlpapi.h>
#include <iostream>
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;
// 初始化Winsock库
WSAStartup (MAKEWORD(2, 2), &wsaData);
//! 获取本地主机名称
char host_name[256];
if (gethostname(host_name, sizeof(host_name)) < 0)
{
exit(EXIT_FAILURE);
}
//! 获取本地主机信息
hostent *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;
saShow.S_un.S_addr = htonl(ulLocalNet + n); // 设置展示地址的网络字节顺序
// 发送ARP请求获取目标MAC地址,并打印运行的IP地址
if(::SendARP(saShow.S_un.S_addr, 0, (ULONG*)arDestMac, &ulLen) == NO_ERROR)
printf("IP %s is running.\n", inet_ntoa(saShow));
}
}
else
{
exit(EXIT_FAILURE);
}
// 清理Winsock库
WSACleanup();
return 0;
}
2. HostDiscover发现主机
(1)启动协议分析器,单击菜单“设置”|“定义过滤器”,在“定义过滤器”界面中,选择“网络地址”选项卡,设置捕获本机IP地址与同组主机IP地址间的数据;选择“协议过滤”选项卡,选中“ARP”节点,单击“确定”按钮完成过滤器设置。
单击“新建捕获窗口”按钮,点击“选择过滤器”按钮,确定过滤信息。
在新建捕获窗口工具栏中点击“开始捕获数据包”按钮,开始捕获数据包。
(2)执行HostDiscover.exe:
(3)待HostDiscover发现同组主机后,协议分析器停止捕获。观察本机与活动主机间的ARP会话过程图:
【小结或讨论】
思考题1:137/UDP端口提供的是什么服务?Linux系统是否提供此服务?
UDP端口137通常用于NetBIOS Name Service (NBNS)。NetBIOS是一种网络基本输入/输出系统,用于在局域网中的计算机之间进行通信。NBNS服务提供了一种将NetBIOS名称映射到IP地址的机制,允许计算机通过名称而不是IP地址来寻址其他计算机。
在Linux系统中,默认情况下通常不会提供NBNS服务,因为Linux系统更倾向于使用其他网络服务和协议来进行通信(如DNS)来解析主机名到IP地址。但是可以在Linux系统上安装和配置NBNS服务。
思考题2:利用ARP协议探测网络中的活动主机的优、缺点是什么?
优点:
- 简单快速:ARP协议是一种简单而有效的协议,可以快速地确定网络中活动主机的MAC地址。
- 无需配置:ARP请求和响应是在数据链路层(通常是以太网层)上发送的,因此不需要额外的网络配置或服务。
- 实时性:ARP请求和响应几乎是实时的,因此可以快速发现新加入网络的主机或主机的状态变化。
缺点:
- 局限性:ARP只能探测到与当前子网相连的主机,不能跨越路由器进行网络探测。
- 易受欺骗:ARP欺骗攻击是一种常见的安全威胁,攻击者可以发送伪造的ARP响应来欺骗其他主机,导致网络中的混乱和安全问题。
- 不可靠性:ARP响应可能会被网络拥塞或其他因素所影响,导致部分主机无法被正确地探测到。
- 资源消耗:在大型网络中频繁地发送ARP请求可能会占用网络带宽和主机资源,对网络性能产生一定影响。