利用TTL识别目标主机操作系统
项目内容简要介绍
TCP/IP协议栈是指不同操作系统系统实现TCP/IP协议时存在差异性,通过查询资料可知,TCP指纹中包括FIN探测、SYN洪范测试、ACK值等,IP、ICMP指纹中包括ICMP错误信息查询、服务类型(Tos)和TTL、DF标记位等。
本项目主要通过发送探测ICMP数据包中的TTL值对目标主机的操作系统进行识别。了解可知,TTL是IPv4协议包头中的一个值,其原本存在意义是通知网络路由器一个包在网络上的时间是否过长进而是否应被丢弃。其初始值通常是系统默认值,是包头中的8位字段。
由于默认的TTL值因操作系统而异,因此本项目考虑通过TTL值对目标主机的操作系统值进行判断。本项目操作系统为linux、Windows、unix的主机及本机进行了识别,识别结果准确。
本项目使用C语言进行开发。
较难理解的地方都已注释。其实是一个非常简单的原理,探测结果较其他方法也相对粗略。
一些需要知道的知识点
ICMP协议
ICMP(Internet Control Message
Protocol)因特网控制报文协议,是TCP/IP协议簇的一个子协议,属于网络层协议。它主要用于在IP主机、路由器之间传递如主机是否可达等的控制信息,ping命令使用的就是该协议。
ICMP协议数据报文长度固定,大小为64kb。其类型域为8时表示回显请求,类型域为0时表示回显应答,这是最常用的两个ICMP消息类型。在本项目中可以通过报文的类型值来捕获目标ip的回显应答。
检验和计算(不必须)
检验和用来检查数据包是否出错,对于一份数据包的IP检验和,首先将其置零,然后将每十六位进行二进制反码相加,最后将结果取反获得正确检验和。
TTL生存时间
在具体意义上,TTL生存时间是网络发送的数据包中包含的计时器值,它告诉接收方在丢弃数据包前要保留该数据包的时间。而因为对于不同的操作系统来说TTL值是不同的,因此我们可以通过提取TTL值来判断接收数据包的目标主机的操作系统。
整体形式
通过原始主机向目标主机发包,收到回复后根据ttl值进行判断。
具体代码实现
#include <stdio.h>
#include <time.h>
#include <Winsock2.h>
#include <Windows.h>
#pragma comment (lib, "ws2_32.lib")
//icmp报头结构体
typedef struct icmp_header
{
unsigned char icmp_type;//消息类型 8回波请求
unsigned short icmp_checksum;//校验和
unsigned short icmp_id;//用来惟一标识此请求的ID号,通常设置为进程ID
} icmp_header;
#define ICMP_HEADER_SIZE sizeof(icmp_header)
#define ICMP_ECHO_REQUEST 0x08
#define ICMP_ECHO_REPLY 0x00
//int notconnect =0;
// 计算校验和 testInfoBuffer, sizeof(testInfoBuffer)
unsigned short getChecksum(struct icmp_header *picmp, int len) {
long sum = 0;//将校验和字段设为0
unsigned short *pusicmp = (unsigned short *)picmp;
//当发送探测报文
while (len > 1) {
//每个16bit二进制反码求和
sum += *(pusicmp++);
if (sum & 0x80000000) {
sum = (sum & 0xffff) + (sum >> 16);
}
len -= 2;
}
if (len) {
sum += (unsigned short)*(

该项目通过发送ICMP数据包并分析返回的TTL值来识别目标主机的操作系统,如Linux、Windows和Unix。利用不同系统默认TTL值的差异,实现了简单但准确的识别。项目采用C语言开发,并详细解释了ICMP协议、TTL生存时间和识别原理。
最低0.47元/天 解锁文章
1766

被折叠的 条评论
为什么被折叠?



