steganography

拿到steganography_challenge,010打开发现是一张损坏的png,我们手动修复一下

它是开头多了很多数据,删一下,然后每一个IDAT的前面有一点多余数据,删一下,然后末尾多了点。

全部修好之后长这个样子

1773461643969

我们拖入随波逐流会发现在lsb的rgb通道有zip

1773461717226

写个脚本提取出来bin文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from PIL import Image, ImageFile
import numpy as np

ImageFile.LOAD_TRUNCATED_IMAGES = True

img = Image.open("111.png").convert("RGB")
data = np.array(img)

h, w, _ = data.shape

r = data[:,:,0] & 1
g = data[:,:,1] & 1
b = data[:,:,2] & 1

bits = np.dstack((r,g,b)).flatten()

bytes_data = []
for i in range(0,len(bits),8):
byte = 0
for j in range(8):
if i+j < len(bits):
byte = (byte<<1) | bits[i+j]
bytes_data.append(byte)

with open("lsb.bin","wb") as f:
f.write(bytes(bytes_data))

print("提取完成:lsb.bin")

得到的bin文件用binwalk提取出来发现很多个压缩包,每一个都是四字节

我们crc4字节爆破一下

1773461865612

得到密钥:pass is c1!xxtLf%fXYPkaA

解密得到一个flag.txt,后面加了很多不可见字符

1773461941211

0x200b是0,0x200c是1,得到

1
011001000110000101110010011101000111101101100010011001100011010000110001001100000011000001100100001110010010110101100011011000110011100001100100001011010011010000111000011001100011011000101101011000010011000000111001001101010010110100110101001101000110001101100010011001100110000101100100001100010011100000111001011001010011000101111101

转ascii得到flag

traffic_hunt

前面一直在shiro反序列化,后面发现似乎根本用不上。

先看流量包,发现从404223包开始,传了favicondemo.ico,应该是木马了,我们再看传木马前他在干什么,即前几个包在干嘛

404205包看到p:HWmc2TLDoihdlr0N,也就是webshell的密码

1773461046823

取其md5的前16位,1f2c8075acd3d118 ,拿这个去解密webshell流量,得到很多个java和class文件,

1773460564733

我们直接看最后一个

1773460286431

看到aes-key:IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs=

这个是用aes-gcm模式加密的,我们看下一条流量(也即是最后一条流量

看到很多加密过的数据:

1773460363362

编写aes-gcm解密的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import base64
from Crypto.Cipher import AES

key_b64 = "IhbJfHI98nuSvs5JweD5qsNvSQ/HHcE/SNLyEBU9Phs="

data_hex = "8ac33897541bf959bb223309ffa07a25c49245bb988404180f84d7baef2c2ca8dfd669d39d3fa9c9e66b3da81834c7121cad53ffb16b38dcb062b2b3ce1b634f3bac9ed6e161661efb67ab754eb078718c484cb1b9ec873a103035fdc0b28ed418aa11e68b561599b9685ae54b95"

key = base64.b64decode(key_b64)
data = bytes.fromhex(data_hex)

# 解析数据
nonce = data[:12]
tag = data[-16:]
ciphertext = data[12:-16]

cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)

plaintext = cipher.decrypt_and_verify(ciphertext, tag)

print("plaintext:", plaintext)

得到:’echo 3SoX7GyGU1KBVYS3DYFbfqQ2CHqH2aPGwpfeyvv5MPY5Dm1Wt9VYRumoUvzdmoLw6FUm4AMqR5zoi’

那这串字符两层base58解密得到flag

1773460494907