荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Macro (M2), 信区: Security
标  题: ip-trick
发信站: 荔园晨风BBS站 (Sun Dec  9 19:45:27 2001), 转信

有时在网上找了一些电子图书馆,本以为可以大饱眼福,点击后才发现它有IP的限
制,不是一定的范围内的IP不能访问,我顿是觉得很失望。失望之余,我在考虑,
有什么方法能绕过这个障碍呢?(请原谅我对知识的如饥似渴!^_^)
后来在网上看了一些文章,又发现这并非完全没可能。一山还有一山高,用IP欺骗
,可以使这种安全策略形同虚设。以下就说说我自己的一点看法。

网络通信依靠的是网络协议,其中TCP/IP协议占了主要的部分。现在就让我们看看
TCP/IP协议,它是一个协议栈, 不仅包括TCP协议和IP协议, 而且包括很多其他
协议, 但TCP协议和IP协议是它的最主要部分,在TCP/IP协议的基础上形成了因特
网, 这是一个虚拟网络。 为了在因特网上进行通信, 设计者给每一台连入网络
的主机都分配了一个唯一的IP地址, 在IP协议软件之上的传输控制软件和应用程
序都用IP地址进行寻址。IP地址是一个32位的二进制数,采用分层结构分为两个部
分: 前缀和后缀。地址前缀标明了主机连入的物理网络,地址后缀则标明了连入该
物理网络的不同的主机。IP地址是只在软件中使用的抽象地址。不论是局域网还是
广域网, 发送和接收信息时都依靠的是硬件地址,即48 bit的以太网地址(
MAC(Media Access Control)地址)。以下是一个客户端程序与一个主机建立连接
的过程:

1)应用程序通过DNS(Domain Name Server)或静态主机文件把主机名转换成32 bit
的IP地址。
2)应用程序发出TCP请求到远端的主机,即用上述IP地址发送一份IP数据报。
3)如果目的主机在本地网络上(如以太网、令牌环网或点对点链接的另一端),那
么IP数据报可以直接送到目的主机上。如果目的主机在一个远程网络上,假定是一
个以太网,那么发送端主机必须把32 bit的IP地址变换成48 bit的以太网地址。从
逻辑Internet地址到对应的物理硬件地址需要进行翻译。这就是ARP(Address
Resolution Protocol)的功能。
4)ARP发送一份称作ARP请求的以太网数据帧给以太网上的每个主机。这个过程称作
广播。ARP请求数据帧中包含目的主机的IP地址,其意思是“如果你是这个IP地址
的拥有者,请回答你的硬件地址。”
5) 目的主机的ARP层收到这份广播报文后,识别出这是发送端在寻问它的IP地址,
于是发送一个ARP应答。这个ARP应答包含IP地址及对应的硬件地址。
6) 收到ARP应答后,请求——应答交换的IP数据报现在就可以传送了。
(参考《TCP/IP详解:协议卷》 机械工业出版社)


由此可见,如果两台主机在同一网段,即点对点的链路,只要IP即可,不用涉及以
太网地址。因此只要在数据报上进行伪装就可以了。但要取得信任的主机通常是在
不同的网段呢?这里先介绍一下ARP报文的处理:首先接收方把报文中发送方的IP
地址和硬件地址取出, 如果已经缓存了它们的对应关系, 就替换原来的记录, 否则
产生一个新的记录。然后,接收方首先把报文中的目标IP地址和自己的协议地址进
行比较, 当二者不一致时放弃报文。否则, 根据报文中operation的值来确定该报
文是请求报文还是应答报文。如果是请求报文, 则把自己的硬件地址放入报文中,
 并把目标地址和发送地址调换, 发送应答。如果是应答报文, 则记录下发送方硬
件地址和IP地址的对应关系。ARP高效运行的关键是由于每个主机上都有一个ARP高
速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速
缓存中每一项的生存时间一般为几分钟,因此要隔段时间就再发送一个进行更新。
现在就从发送ARP请求开始。

在互联网中,数据的封装是十分复杂的,而且不同的网络有不同的封装。(详见《
TCP/IP详解:协议卷》)在以太网中,ARP的分组格式如下:每帧是由14字节以太
网首部和28字节的ARP请求/应答。可用以下的数据结构描述。
struct ether_head
{
        char source_hardware_addr[ETH_HW_ADDR_LEN]; //6 byte
        char target_hardware_addr[ETH_HW_ADDR_LEN]; //6 byte
        short frame_type;
};
struct arp_req_ans
{
        short hardware_type;
        short protocol_type;
        char hardware_addr_size;
        char protocol_addr_size;
        short operation;
        char send_hardware_addr[ETH_HW_ADDR_LEN]; //6 byte
        char send_ip_addr[IP_ADDR_LEN]; //4 byte
        char rcpt_hardware_addr[ETH_HW_ADDR_LEN];// 6 byte
        char rcpt_ip_addr[IP_ADDR_LEN]; //4 byte
};

struct arp_packet
{
        struct ether_head eh;
        struct arp_req_ans ra;
};

以下是利用SOCKET编程可以实现发送一个ARP请求。

int send_ARP(struct arp_packet *ap)
{
        char buffer[ETHER_HEAD_LEN+ARP_HEAD_LEN];
        memcpy(..);
        int sock;
        sock=socket(..);
        if(sendto(..))
                exit(1);
        else
                exit(0);
}

当连接建立后就可以发送数据报了。为了达到伪装的目的还要研究一下数据报。这
里给出IP和TCP数据报的首部的数据结构。

struct IP_packet_head {
        int  version;
        int  type;
        WORD total_length;
        WORD ID;
        int  flag;
        WORD offset;
        BYTE TTL;
        BYTE protocol;
        WORD sum;
        DWORD source_IP;
        DWORD target_IP;
};

struct TCP_packet_head {
        WORD source_port;
        WORD target_port;
        DWORD sequence_NO;
        DWORD acknowledge_NO;
        int length;//4位首部长度
        BYTE flag;//标志位
        WORD window_size;
        WORD sum;
        WORD emergency_pointer;
};

TCP数据报封装在IP数据报内的,在TCP数据报首部后面的是要传输的数据。这样封
装以后,通过SOCKET编程就可发送伪装数据了。当然,这只是发一个数据包,但更
进一步做一个浏览器可以按我自己指定的MAC和IP在网上浏览,理论上是可以的。

如果有一天真的有这样的浏览器出现,我们又能有什么对付的方法呢?正如人的指
纹是唯一的一样,每台电脑也有唯一的东西。MAC是唯一的,每块网卡出厂的时候
都有一个48BIT的MAC号,但是当网卡使用时,MAC是从寄存器中读出的,这就造成
MAC可修改的原因!你还可以修改注册表来改变MAC。我想用处理器的ID会是一个好
主意!自i386PC起,BIOS中有一段代码可确定运行处理器的类型,但此段代码只在
复位之后的BIST(Build-In Self-Test)期间执行。以后程序不能访问此BIST结果
。能否运用这功能呢?在开机的时候就确定它的唯一身份!但从PENTIUM处理器开
始,有了CPUID指令,程序可随时获取运行算处理器的标识。这就提供了一个方便
,同时它会否是第二个MAC——形同虚设呢?暂时还没有改CPUID的方法,我想能否
安装系统钩子,截获每次的查询请求,并伪装成另外结果发送出去!

可见世界就在这种不可能与可能的竞赛之中发展!

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.55.254]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店