To be the apostrophe which changed "Impossible" into "I'm possible"!

公司事情太多,发榜的时间稍微晚了几天,大家见谅。

这次挑战赛提交贴共57个

其中3人两道题一起提交:黑色猎鹰,GYGY,netwind
一个测试帖,看雪发
一个超时贴,最后一个
一个水贴!
一个弃权帖。

A题有效提交共32个
B题有效提交共24个

A题是我在《0day安全:软件漏洞分析技术》中为了介绍Metasploit编程而设计的一个很简单的例子。这种漏洞代表了一大类漏洞利用场景:服务器漏洞。

IIS解析HTTP请求的时候,RPC服务的函数参数,FTP服务器解析畸形命令时都有可能发生这类漏洞。应该说服务器类漏洞的影响最严重,能够引起主动入侵。

在出题的时候,和看雪反复商量过关于难度的问题,最后我们把挑战赛定位在让初学者体会漏洞分析的层次上,希望有更多的朋友在读过教程后,能自己动手独立完成一次POC的构造。开始的时候曾经想过加点简单的协议进去,让大家fuzz一下,增加点漏洞定位的难度,后来干脆把A题当作热身的送分题目了。

A的源代码如下:

/*****************************************************************************
      To be the apostrophe which changed "Impossible" into "I'm possible"!
    
POC code of chapter 10.6 in book "Vulnerability Exploit and Analysis Technique"
 
file name  : target_server.cpp
author    : failwest  
date    : 2007.4.4
description  : TCP server which got a stack overflow bug for exploit practice 
Noticed    : Complied with VC 6.0 and build into release version are recommend
version    : 1.0
E-mail    : failwest@gmail.com
    
  Only for educational purposes    enjoy the fun from exploiting :)
******************************************************************************/
#include<iostream.h>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void msg_display(char * buf)
{
  char msg[200];
  strcpy(msg,buf);// overflow here, copy 0x200 to 200
  cout<<"********************"<<endl;
  cout<<"received:"<<endl;
  cout<<msg<<endl;
}
void main()
{
  int sock,msgsock,lenth,receive_len;
  struct sockaddr_in sock_server,sock_client;
  char buf[0x200]; //noticed it is 0x200
  
  WSADATA wsa;
  WSAStartup(MAKEWORD(1,1),&wsa);
  if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
  {
    cout<<sock<<"socket creating error!"<<endl;
    exit(1);
  }
  sock_server.sin_family=AF_INET;
  sock_server.sin_port=htons(7777);
  sock_server.sin_addr.s_addr=htonl(INADDR_ANY);
  if(bind(sock,(struct sockaddr*)&sock_server,sizeof(sock_server)))
  {
    cout<<"binding stream socket error!"<<endl;
  }
  cout<<"**************************************"<<endl;
  cout<<"     exploit target server 1.0     "<<endl;
  cout<<"**************************************"<<endl;
  listen(sock,4);
  lenth=sizeof(struct sockaddr);
  do{
    msgsock=accept(sock,(struct sockaddr*)&sock_client,(int*)&lenth);
    if(msgsock==-1)
    {
      cout<<"accept error!"<<endl;
      break;
    }
    else 
      do
      {
        memset(buf,0,sizeof(buf));
        if((receive_len=recv(msgsock,buf,sizeof(buf),0))<0)
        {
          cout<<"reading stream message erro!"<<endl;
          receive_len=0; 
        }
        msg_display(buf);//trigged the overflow
      }while(receive_len);
      closesocket(msgsock);
  }while(1);
  WSACleanup();
}

实在太简单了,不用多说。开了200字节,使用了0x200字节是问题的根源。最快的提交是在题目公布后40分钟左右交上来的。

好几个朋友用了python脚本,大多数用了C语言写了个简单的soket发送程序。没有见到写成MSF模块的。

比赛主要评判的标准是分析报告。A题首先要把缓冲区大小是多少说清楚吧。

稳定性来源于两个方面,定位shellcode和shellcode本身

大多数朋友使用了我给出的那段动态定位API的shellcode,把显示的名字改了一下
也有朋友使用Metasploit生成shellcode

不管怎样,shellcode都是比较稳定的。所以在我的环境下没有通过的exploit大多数是因为跳板地址选的不够通用。

跳板地址需要根据具体情况来定。针对这个A题,即便不用跳板,其实也应该是比较稳定的。

如果选的话,A又没有版本之分,如果能在A自身代码区找个跳板出来,当然万无一失了。

在往后就是用比较通用的4G进程空间里的其他跳板。我要说user32.dll,kernel32.dll,ntdll都不是好的选择。《网络渗透技术》中曾经提到过跳板选择标准,语言区的往往比较稳定。在提交答卷中,有一些跳板选的就很好。

考虑到大家在自己机器上调通就应该给予肯定,所以运行截图的分数被我调高了,虚拟机验证部分存在一定偶然性,我降低了一些分值。

B题是shineast同学自己挖出来的一个0day,哪个0day大家应该已经知道了。比赛前我和看雪已经正式通知了该公司。

我们在PE里做了一些修改,但是忘了CLSID这回事,不少朋友在研究的过程中已经发现了网上的exploit。

我们并不排斥参考网上exploit的朋友,因为想到搜索一下本身就值得加分,Google hacking现在不是很火么:)但我们主要看得是分析报告,是思路。而且这个ActiveX中不止一个溢出漏洞,网上给出的只是其中一个的利用。

shineast在《黑客防线》上曾经写过这个0day的分析,但是那篇文章是在网上搜不到的(至少我们没有搜到)。如果你恰巧买了那期杂志,而且精读过练习过,那可就占了点便宜,好像考试的时候最后一道大题恰巧在某本习题集上被撞到一样。

这个因素我们也考虑过。我认为如果你真的很关注这些东西,那么这便宜也是你应得的。

当然如果您是完全凭自己独立完成的B题,也不要委屈。因为你刚刚独立的挖掘出了属于自己的0day!这种喜悦和自豪感才是这个比赛给您的最好的奖品。

虽然我的教程里没有讲到HeapSpray,但是B题里边普遍采用了这种方法,看来大家对浏览器漏洞利用并不陌生。

HeapSpray在《0day安全》中有比较详细的介绍。2007的black hat 阿姆斯特丹上,一个叫亚历山大的逆向工程师提出了一种叫“heap 风水”的技术,在heapspray的基础上又做了很多深入研究。由于feedback和火,他在几个月后的LV black hat上再次被邀请演讲,当时我和两个趋势的研究员慕名去听,窃窃的发现这个老外和好莱坞一个明星暴像,而且竟然赫然的用中文汉字标注着“风水”两个字,不过是繁体:)。听完之后觉得风水这个词来形容这种技术真的很贴切。

稍后我会把那次演讲的white paper和Slides发上来,看哪位朋友给大家做点贡献翻一下,大家一起学习,一起进步。

也有不少朋友使用了传统栈溢出的方法。相信大家发现shellcode要滤掉一些字节才能完整的塞进去,需要对shellcode变形。想到什么了,给shellcode加壳与脱壳?呵呵,我说的吧,crack和hack的技术本是一家啊。

详细的评分见附件,如有异议请在一周内发信给我们。另外注明exploit验证部分存在一定随机因素,恕不复查。

谢谢大家的积极参与,相信所有提交的朋友都获得了一些东西,不管是鼠标还是挖出0day的自豪,这是我们组织这个比赛的初衷。

最后顺便提一下,我的书名做了一些调整,新名字叫《0day安全:软件漏洞分析技术》,电子工业出版社,出版日期看来得稍微推后几天了,要等到2月底3月初的样子才能出来,谢谢那些写信给我的朋友对这本书的关注,谢谢。

获奖名单

一等奖(1名)
nop
 
 
二等奖(2名)
somuch
toplcj

 
三等奖(5名)
hahar
pcasa
xfmaple
netwind
xPLK

上传的附件
文件类型: rar 首届exploit_me挑战赛状元榜.rar