相关知识
会话劫持(Session Hijack): 就是结合了嗅探以及欺骗技术在内的攻击手段。例如,在一次正常的会话过程当中,攻击者作为第三方参与到其中,他可以在正常数据包中插入恶意数据,也可以在双方的会话当中进行监听,甚至可以是代替某一方主机接管会话。
可以把会话劫持攻击分为两种类型:
- 中间人攻击(Man In The Middle,简称MITM)
- 注射式攻击(Injection)
既然是进行TCP劫持,则先要对TCP/IP协议相关知识有个初步的了解。
- TCP/IP数据封装
- IP数据包格式
- TCP建立连接过程
原理
注射式攻击
这种方式的会话劫持比中间人攻击实现起来简单一些,它不会改变会话双方的通讯流,而是在双方正常的通讯中流插入恶意数据。在注射式攻击中,需要实现两种技术:
- 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主要流程
-
源码
下载地址: 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