Date Tags Http / Tcp

相关知识

会话劫持(Session Hijack): 就是结合了嗅探以及欺骗技术在内的攻击手段。例如,在一次正常的会话过程当中,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当中进行监听,甚至可以是代替某一方主机接管会话。
可以把会话劫持攻击分为两种类型:

  • 中间人攻击(Man In The Middle,简称MITM)
  • 注射式攻击(Injection)

既然是进行TCP劫持,则先要对TCP/IP协议相关知识有个初步的了解。

  • TCP/IP数据封装
    1
  • IP数据包格式
    1
  • TCP建立连接过程
    1

原理

注射式攻击

这种方式的会话劫持比中间人攻击实现起来简单一些,它不会改变会话双方的通讯流,而是在双方正常的通讯中流插入恶意数据。在注射式攻击中,需要实现两种技术:

  • IP欺骗;
  • 预测TCP序列号。

对于IP欺骗,有两种情况需要用到:

  • 隐藏自己的IP地址;
  • 利用两台机器之间的信任关系实施入侵。

在Unix/Linux平台上,可以直接使用Socket构造IP包,在IP头中填上虚假的IP地址,但需要root权限;在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系统,首先打开一个Raw Socket(原始套接字),然后自己编写IP头及其他数据。 TCP协议的注射式会话劫持,攻击者应先采用嗅探技术对目标进行监听,然后从监听到的信息中构造出正确的序列号,如果不这样,你就必须先猜测目标的ISN(初始序列号),这样无形中对会话劫持加大了难度。

中间人攻击MITM

要想正确的实施中间人攻击,攻击者首先需要使用ARP欺骗或DNS欺骗,将会话双方的通讯流暗中改变,而这种改变对于会话双方来说是一个完全透明的代理,可以得到一切想知道的信息,甚至是利用一些有缺陷的加密协议来实现。

libnet

libnet是一个开源的接口函数库,主要用C语言实现,提供了底层网络数据包的构造、处理和发送功能。

tips 实际实现过程中,会用libpcap进行监控,用libnet进行构造数据包

  • libnet主要流程

    1

  • 源码

下载地址: libnet

DEMO部分代码

对http会话协议报文的篡改,实现基本的302重定向功能

    //初始化libnet,每个线程一个libnet 
    init_thread_libnet();

    //http重定向
    if(ip_head->protocol == IPPROTO_TCP && tcp_head->dest == HTTP_PORT) {
        u_int8_t tcp_flags = ((struct libnet_tcp_hdr *) tcp_head)->th_flags;

        if(tcp_flags == TH_SYN) {
            TODO: 回复一个syn ack
        }else if (tcp_flags & (TH_ACK|TH_SYN) ) {
            TODO: 伪造http响应报文。这里是302重定向
        }else if (tcp_flags & (TH_FIN|TH_RST)) {
            TODO: 结束链接
        }
    }

伪造所用的http head

static u_int8_t httphead_t[] =
"HTTP/1.0 302 Found\n"
"Location: %s\n"
"Connection:close\n\n"
"<html>\n\t<head>\n\t\t<meta http-equiv=\"Refresh\"content=\"0;"
"url=%s\">\n\t</head>\n</html>\n";

结束语

只有在了解别人攻击手段之后,我们才能做好网络安全的防范措施。
后续会在研究https会话劫持技术


Comments

comments powered by Disqus