Linux 版 (精华区)

发信人: Baggio (傻瓜牌生活), 信区: Linux
标  题: #代理猎手深度分析报告#
发信站: 哈工大紫丁香 (Sat May  8 14:38:18 1999), 转信

发信人: zer9 (zer9), 信区: Hacker

标  题: #代理猎手深度分析报告#

发信站: 网易虚拟社区 (Wed May  5 00:37:03 1999), 站内信件

 

  #代理猎手深度分析报告#

           及

      & 欺骗手段 &

        

          

          zer9         

          ====

---

前言:

代理猎手是太阳风同志辛勤工作的成果,没有太阳风

一年多来的不断耕耘,就没有今天精彩的代理猎手,

因此让我们在文章的开始对太阳风同志表示真诚的

问候!

首先要说的是以前我并没用过该软件,手头的版本

还是1998年出的1.1版。但在写作的后半段还是去下载了

最新的2.8版。但结果还是一样:)

---

这篇文章的写作目的是帮助ADM摆脱目前网上普遍存在

的利用代理猎手进行的大量扫描活动。以及揭示了代理

猎手的实现原理。由于手头没有关于代理服务器的详细

资料,因此分析代理的实现花了很大的精力。希望在传播

本文时请尽量保持文章的完整性,谢谢!

---

代理猎手的实现:

由于没有源码,分析的开始使用的是netcat,利用它的hex

dump 功能把猎手所发出的信息截获。但netcat是一dos

下的软件,使用起来不太方便,于是又花了几个小时写了

个for win的netcat.截获的信息如下:

47 45 54 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6d # GET http://www.m

61 78 74 6f 72 2e 63 6f 6d 20 48 54 54 50 2f 31 # axtor.com HTTP/1

2e 31 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 6d 61 # .1..Host: www.ma

78 74 6f 72 2e 63 6f 6d 0d 0a 41 63 63 65 70 74 # xtor.com..Accept

3a 20 2a 2f 2a 0d 0a 50 72 61 67 6d 61 3a 20 6e # : */*..Pragma: n

6f 2d 63 61 63 68 65 0d 0a 55 73 65 72 2d 41 67 # o-cache..User-Ag

65 6e 74 3a 20 50 72 6f 78 79 48 75 6e 74 65 72 # ent: ProxyHunter

31 2e 30 0d 0a 0d 0a                            # 1.0....

基本上我们就知道了猎手对于server所发出的信息:

GET htttp://www.maxor.com HTTP/1.1

Host: www.maxtor.com

Accept: */*

Pragma: no-cache

User-Agent: ProxyHunter 1.0

也就是说,在发出了这样一个命令序列后,如果对方是proxy server

的话,猎手就会收到www.maxtor.com 的首页,然后下来的应该是在

主页中搜寻预先定义在猎手中的KEYWORD,如果为真,则目标是代理

服务器,并且免费。于是我猜想如果直接的发KEYWORD给它,会不会

通过它的检验了?答案是:ON!,不得以,只好上网(这个月的上网

时间早已透支:)架上sniffer,找上一个真的代理,然后再找一个

有限制的,测试完后赶紧断开连接。下面是真代理服务器的log:

-------------------------------------------------

HTTP/1.1 200 OK

Server: Microsoft-IIS/4.0

Content-location: http://www.maxtor.com/default.htm

Date: Tue, 04 May 1999 04:53:14 GMT

Content-type: text/html

Accept-ranges: bytes

Last-modified: Wed, 28 Apr 1999 16:42:38 GMT

Etag: "cf6f51f9691be1:105fb"

Content-length: 8558

Content-location: http://www.maxtor.com/default.htm

Etag: "cf6f51f9691be1:105fb"

Accept-ranges: bytes

Cache-last-checked: Tuesday, 04-May-99 04:15:50 GMT

Proxy-agent: Netscape-Proxy/2.5

<html>

<head>

<meta http-equiv="Content-Type"

content="text/html; charset=iso-8859-1">

<title>Maxtor Corporation - Creative Solutions for Information Storage

</title>

----------------------------------------------------------------------

---

肯定它还检查了另外的特征传,但没有什么好的办法,

只好一个一个的试了。添入第一行,“HTTP/1.1 200 OK"

加上KEYWORD 一起发给猎手,OK!!! 通过了检验。

看来猎手只是检查了二个地方。(可能是为了加快速度)

进一步的实验表明,猎手检查的方式如下:

             "HTTP/1.1 200"+WORDKEY (特征传)

也就是说,只要在连接是,你发给它以上的字符传,猎手

接受后就会认为验证成功,至此我们已经找到了欺骗猎手

从而通过验证的方法。

而在验证有限制的代理是LOG如下:

-----

HTTP/1.1 404 ERROR

.......

-----

进一步的研究表明,仅发出

     "HTTP/1.1 404"

的字符传就可以欺骗从而通过验证,猎手显示

”要密码“ :)

---

2.8版的猎手中还增加的对socks的验证,

但结果同上:)

---

至此,我们应该可以从分析的结果中找到代理的实现方法

了,剩下就是通过程序来证明之。

但还有两个方面值得注意:

1。在上面的第一个log中,我附带了16进制的转换,

   这很重要!!早先我就是没有仔细查看它,走了

   很长的弯路。

   请注意字符传之间的分格符,"0x0d 0x0a"

   也就是c 中的”\n";行了吗?且慢,最重要的

   就是最后的8bits!!!!!!!!!

   "0x0d 0x0a 0x0d 0x0a" 

   连续的两个"\n\n",当初我就是没有看到它,

   始终得不到正确的答案。

   (在程序通不过测试后,我只好手动的找寻答案

     也不行,最后再看了一边log,才发现问题所在,

     就象 linux 中 mail 命令以一个回车加上

     一个点代表信笺的结束一样,send代理命令是

     以连续的两个回车结束.

下面是代理猎手的gnuC 实现,注意,本程序只是解释

了代理猎手的实现过程,没有多IP 的扫描功能。

test on slackware 2.0.33

---Cut Here----------------------------------------

/* this codez describe how to search a PROXY server

 *              

 *                 by 

 *

 *                zer9

 *                ==== 

 *            zer9@21cn.com

 *

 *        test on slackware 2.0.33

 *        cc proxyht.c -o proxyht.c  

 */

 

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <netdb.h>

#include <sys/socket.h>

#include <signal.h>

#define  DefaultProxyPort   8080  //default proxy port 8080

#define  MSG1  "GET http://www.maxtor.com HTTP/1.1\n"  //1 --change (1

,2)

#define  MSG2  "Host: www.maxtor.com\n"                //2   to search

 

#define  MSG3  "Accept: */*\n"                         //    other sit



#define  MSG4  "Pragma: no-cache\n"

#define  MSG5  "User-Agent: ProxyHT 0.01\n\n"

#define  KEYWORD    "Maxtor Corp"                      // this is keyw

ord

#define  TIMEOUT  30

void alarm_handler(int w)

{

 alarm(0);

 printf("Time Out!\n");

}

int main(int argc,char *argv[])

{

 struct in_addr Target;

 struct hostent *he;

 struct sockaddr_in sin;

 int s,ProxyPort;

 char recvbuf1[5000];            

 char recvbuf2[10000];

 

 if(argc==2)

   ProxyPort=DefaultProxyPort;

 else

  if(argc==3)

    ProxyPort=atoi(argv[2]);

   else

    {

     printf("ProxyHT 0.01 by zer9 mail:zer9@21cn.com\n");

     printf("usage: %s <proxy> [proxy_port]\n",argv[0]);

     return 0;

    } 

if((he=gethostbyname(argv[1]))!=NULL)

  bcopy(he->h_addr,(char *)&Target.s_addr,he->h_length);

 else

  Target.s_addr=inet_addr(argv[1]);

if(Target.s_addr==-1)

 {

  perror("gethostbyname");

  return -1;

 }

printf("ProxyHT 0.01 by zer9 mail:zer9@21cn.com\n"); 

if((s=socket(AF_INET,SOCK_STREAM,0))<0)

{

 perror("socket");

 return -1;

}

sin.sin_family=AF_INET;

sin.sin_port=htons(ProxyPort);

sin.sin_addr.s_addr=Target.s_addr;

if(connect(s,(struct sockaddr*)&sin,sizeof(sin))<0)

{

 perror("connect");

 return -1;

}

bzero(recvbuf1,sizeof(recvbuf1));

bzero(recvbuf2,sizeof(recvbuf2));

printf("%s start verifying... waiting a while please\n",argv[1]); 

signal(SIGALRM,alarm_handler);

send(s,MSG1,strlen(MSG1),0);

send(s,MSG2,strlen(MSG2),0);

send(s,MSG3,strlen(MSG3),0);

send(s,MSG4,strlen(MSG4),0);

send(s,MSG5,strlen(MSG5),0); 

alarm(TIMEOUT);

recv(s,recvbuf1,sizeof(recvbuf1),0);

recv(s,recvbuf2,sizeof(recvbuf2),0);

alarm(0);

//if u want to debug , open follow two lines 

//printf("%s\n",recvbuf1);

//printf("%s\n",recvbuf2);

if(strstr(recvbuf1,"HTTP/1.1 200"))

 {

 if(strstr(recvbuf2,KEYWORD))

  {

   printf("hahaha... there's something found!  \n");

   close(s);

   return 0;

  }

 }

 else

  {

   if(strstr(recvbuf1,"HTTP/1.1 404"))

    {

     printf("woo! I found one,but dont free...\n");

     close(s);

     return 0;

   }

 }

close(s); 

printf("sorry.dont hit me please,nexttime i *MUST* find one.\n"); 

return 0;

}

---Cut Here--------------------------------------------------   

------------------

代理猎手欺骗的实现:

一把枪在好人手上可以救人,但落在了坏人手上就。。。:)

代理猎手就是这样的枪。

除开大量的利用猎手进行扫描而获得非法的服务之后,近来

还有不少人专门利用猎手多线程的特点找寻特定的端口(如

finger(79),31337(BO),12345(BO).....

在极有可能造成各种破坏性结果的同时,还占用了大量的带宽;

使得网上的正常活动都受到的影响(反正我是非常的不爽啦:)



如何对付这些“好奇心非常强”的同志了?

是给他们   [A].一个小小的教训;  还是

           [B].只让他们空喜欢一场?

下面就是一个linux (gcc) 的Anti-Porxyht 

的实现,本来win95 下的我还先做出来,但不好贴上来,而且

也不利于大家的理解。总的说来,非阻塞模式的socket(win95)

在写daemon时要比阻塞模式下的socket(BSD4.3)容易的多,

在win95下可以毫不费力的同时监听多个port,而linux下则只有

以下几个选择:1.多线程 

              2.截获每个IP包,然后再根据包里的PORT进行处理;

              3.同时启动多个副本:)

              4.我就不知到了。。。

1&&2 我都不会,只好用3了。:)

不过一般只要listen to port 8080 就可以了,因为不论猎手

怎么扫,8080都不放过的。

同上面的一样,本程序也只是为了向你展示如何欺骗猎手从而

通过猎手的验证,并没有多余的功能,在以后我可能会加上.

在写本软件的同时我还花了一段时间测试看猎手是否有

overflow 的弱点,在向他发字符传时大小 <=256 我都测了,

好象有一次看现象应该是CPU load 100%,可能是我的爱机太

“快”的问题,其余(20-30次都没有异常。

可能与猎手是用 c++ 写的用关,c++的串类很少有可能发生

此类情况(overflow).

。如果你测试能够通过

发送某个字符串让猎手当机,请告诉我哟!:)

尽管是这样,你还是可以加上某个win95&win97&win98

的漏洞,在 accept(ns,....) 后传给对方。。。。。。:)

(最好是先让它通过检验,让对方正“无比”高兴的时候

发给他:)))))))(怎么一提到这上面我的兴趣就来了;)

test on slackware 2.0.33(maybe irix6.4)

./phs 8080  --> 表示监听 8080端口,在遭扫描后欺骗对方通过

                猎手的验证 (显示 :free :)

./phs -n 8080 --> 表示监听8080端口,在遭扫描后欺骗对方通过

                猎手的验证 (显示: 需密码:)

 同样的,该程序的win95版我也写出,可以监听多个端口,

 只是兄弟我一没主页,二没ftp,也就无法共享了。

---Cut Here------------------------------------------

/* Pr0xy_Spoofer   (m4yb3 c4ll 1t: Anti-ProxyHunt:)

 * by zer9

 * mail:zer9@21cn.com

 * pass on slackware2.0.33 

 * cc phs.c -o phs

 * usage: ./phs <-n> port &

 */

 

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <signal.h>

#include <sys/socket.h>

#define  MSG_OK                 "HTTP/1.1 200\n"

#define  MSG_NOFREE             "HTTP/1.1 404\n"

//u can join that u think the target for searching to use the keyword;

#define  MSG                    "yahoo china usa Maxtor Corp nease soh

oo sina\

                                 sina lycos cpcw  263 163 169 zg169 s3

 \

                                 \n"

 

#define  TIMEOUT  30

#define  true     1

#define  false    0

void alarm_handler(int w)

{

 alarm(0);



void usage(void)

{

 printf("Pr0xyHunt Sp00fer 0.01  by zer9  mail:zer9@21cn.com\n");

 printf("usage:phs -n [bindport] \n");  

}

int main(int argc,char *argv[])

{

 struct sockaddr_in server,client;

 int s,ns,clientlen,BindPort;

 int NO_FREE;

 char recvbuf[3000];

 

 if(argc==1||argc>3) 

  {

   usage();

   return 0;

  } 

 if(argc==2) 

 { 

  NO_FREE=false;

  if(!(BindPort=atoi(argv[1]))) 

  { 

    usage();

    return -1;

  }

}

if(argc==3) 

 if(strcmp(argv[1],"n")) 

   {

    NO_FREE=true;

    if(!(BindPort=atoi(argv[2]))) 

    {

     usage();

     return -1;

    }

   }

 if((s=socket(AF_INET,SOCK_STREAM,0))<0) 

  {

   perror("socket");

   return -1;

  }

 bzero((char *)&server,sizeof(server));

 bzero((char *)&client,sizeof(client));

 bzero(recvbuf,sizeof(recvbuf));

 server.sin_family=AF_INET;

 server.sin_port=htons(BindPort);

 server.sin_addr.s_addr=INADDR_ANY;

 if(bind(s,(struct sockaddr *)&server,sizeof(server))<0)

 {

  perror("bind");

  return -1;

 }

 if(listen(s,5)!=0)

 {

  perror("listen");

  return -1;

 }

 while(1) {

 clientlen=sizeof(client);

 if((ns=accept(s,(struct sockaddr *)&client,&clientlen))<0)

 {

  perror("accept");

  close(s);

  return -1;

 }

 signal(SIGALRM,alarm_handler);

 alarm(TIMEOUT);

 recv(ns,recvbuf,sizeof(recvbuf),0);

 sleep(1);

 

 //if MSG_OK to MSG_FREE->something on proxyhunt: no free :)

 if(!NO_FREE) 

   send(ns,MSG_OK,strlen(MSG_OK),0);   

  else send(ns,MSG_NOFREE,strlen(MSG_OK),0);

 

 sleep(1);

 send(ns,MSG,strlen(MSG),0);

 alarm(0);

 close(ns);

}

 close(s);

 close(ns);

 return 0;

}  

---Cut Here-------------------------------------------------

看完这段源程,有的读者可能会问:猎手可以选择不同的字符传

来验证,我怎么知道他会向那个网址发送信息,同时他手头的

KEYWORD 是什么了?ohhh,u're g00d b0y:)这个问题很关键,

测试表明,如果你发给猎手的字符传中没有KEYWORD 的话

(但打头是"HTTP/1.1 200")

,猎手会显示“超时”,如果连"HTTP/1.1 200"都没有,只送一个

空字符传,猎手显示“无特征串”,送乱串显示“非proxy".

那我们如何解决KEYWORD的问题了?由于我们是服务器方,因此

主动权在我们手中;有两个方法:

1,构建一个大型数据库,如上面程序中的 MSG 字符串,把

  著名的主页的TITLE都加入其中,我想只要包含有该厂商

  名字的串就可以了;

2。从对方发来的请求代理的命令中过滤出www.xxxx.xxx,

    再又发给它,这可通过程序来实现。最好是加上"Corp"

    "INC. ","LTD."...之类的通用串,

    (如果你猜口令比较在行的话,这应该不成问题:)

1。2 不相矛盾,可结合使用。

不过还有一种方法:(纸上谈兵:)

  如果遭攻击时你在场,先发给他一个超时的(或需密码的)

  信息,一般(我想)对方都会第二次来验证的,这期间

  “跑去”真正的网站然后在第二次扫描时把真正的KEYWORD

     发给他。(再次申明:纸上谈兵;)

-----

到此为止,这篇文章就要 over 了,衷心希望太阳风

同志在看到这篇文章后能把猎手做得更加完美。

(不过最好是留一个overflow的洞来,让我们也过一把

 隐(^o^)

----------

这篇文章应该属于入侵欺骗吧,或者属于揭示软件bug

的那一类,不管怎样划分,我总算是为大家做了点贡献

了。”很久“以前就打算写一个关于入侵欺骗的软件,

在遭到扫描时(不是猎手这样的,而是nuess,sscan,...之类

的hacker‘scanner)遇到21port的连接请求时发一个

仿wuftp 的界面给它。。。。。不过那时我还在linux

下,多端口的监听我还不会,最近转到了c++builder门下,

发现可以轻而一举的实现之,想一想,选[A] 时整个

win95在外部看来就是一个linux (redhat 5.2 apolllo)

(对方肯定会用那个wuftp remote of 拼命的试:)

[B] is slackware 2.0.35 [C] is SUNOS 5.5

[D] is ..... ha....够酷吧:)遇到finger @@localhost

时发个超大的passwd给它:)最好连shadow也一起发给他,

让他自个乐去吧!:)ohh,对了,再加上一个[E]bsd 0.0.18

那祖传3代的历史书都要翻出来了:))))))

任凭那些hacker(初级)用尽脑浆也想不到我这是一台win95.

这个猎手欺骗只不过是尝试一下,说不定几天后就会有人

(maybe me)写出BO_SPoof,netspy_spoof...别忘了给我一份:)

———————————————

本文允许任意传阅,但不得修改之

版权保留    copyright(c) 1999

______________________________

   

     zer9

     ====

zer9@21cn.com

fingerpaint:7633 5DC1 C11C 9D7E 75D3 B95B 0613 8C39 288B 2835

to get my pgp public key at MIT's key server.

--

※ 来源:.网易虚拟社区 http://club.netease.com.[FROM: 202.103.10

5.70]--

※ 转寄:.网易 BBS bbs.netease.com.[FROM: 202.96.151.222]

.


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@fengyun.hit.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:208.320毫秒