mcpField
P
performing-steganography-detection

performing-steganography-detection

github.com/mukul975セキュリティ35.2k64 回インストール8 週間前に更新
リポジトリ

performing-steganography-detection について

画像、音声、動画に隠されたデータを調べる、調査担当者やセキュリティ分析者向けのステガノグラフィ検出手順です。メタデータ確認、自動ツール、LSB 分析、結果の報告を扱います。

主な機能

  1. 01メディアのメタデータ異常の確認
  2. 02ツールによる埋め込みデータのスキャン
  3. 03画像の LSB 分析
  4. 04音声・動画のステガノグラフィ調査
  5. 05検出結果レポートの作成

活用シーン

  1. 01メディアファイルを使った秘密通信の調査
  2. 02画像アップロードにおける情報流出兆候の確認
  3. 03マルウェアが取得した画像の分析
  4. 04音声ファイル内の隠し文書の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-steganography-detection

インストール後、Claude Code で/performing-steganography-detectionを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
agent.py

詳細

ステガノグラフィの検出

使用する場面

  • 画像、音声、動画ファイルに秘密裏にデータが隠されている疑いがある場合
  • メディアファイルを介したデータ窃取が疑われる調査
  • スパイ活動や内部脅威の調査でファイルを分析する場合
  • 標準的なファイル分析でメディアファイルのプロパティに異常が見つかった場合
  • ステガノグラフィ技術を使用した通信チャネルを検出する場合

前提条件

  • 分析用の StegDetect、zsteg、stegsolve、binwalk
  • 抽出を試みるための steghide、OpenStego
  • メタデータ分析用の ExifTool
  • カスタム分析用の Pillow、numpy を含む Python
  • 一般的なステガノグラフィ技術(LSB、DCT、スペクトラム拡散)の理解
  • 比較および統計分析用のサンプルファイル

ワークフロー

ステップ 1:ファイルの初期評価とメタデータ分析
# Install steganography detection tools
sudo apt-get install steghide stegsnow
pip install zsteg
pip install stegoveritas
gem install zsteg  # Ruby-based tool for PNG/BMP

# Examine file metadata for anomalies
exiftool /cases/case-2024-001/media/suspect_image.jpg | tee /cases/case-2024-001/analysis/metadata.txt

# Check for unusual file size (larger than expected for resolution/format)
identify -verbose /cases/case-2024-001/media/suspect_image.jpg | head -30

# Verify file type matches extension
file /cases/case-2024-001/media/suspect_image.jpg
# Confirm JPEG signature vs actual content

# Check for appended data after file footer
python3 << 'PYEOF'
import os

filepath = '/cases/case-2024-001/media/suspect_image.jpg'
filesize = os.path.getsize(filepath)

with open(filepath, 'rb') as f:
    data = f.read()

# JPEG files end with FF D9
jpeg_end = data.rfind(b'\xff\xd9')
if jpeg_end > 0:
    trailing_bytes = filesize - jpeg_end - 2
    if trailing_bytes > 0:
        print(f"WARNING: {trailing_bytes} bytes of data after JPEG end marker!")
        print(f"  File size: {filesize} bytes")
        print(f"  JPEG data: {jpeg_end + 2} bytes")
        print(f"  Hidden data: {trailing_bytes} bytes")
        # Extract trailing data
        with open('/cases/case-2024-001/analysis/trailing_data.bin', 'wb') as out:
            out.write(data[jpeg_end + 2:])
    else:
        print("No trailing data detected after JPEG end marker")

# Check for embedded ZIP/RAR archives
zip_offset = data.find(b'PK\x03\x04')
rar_offset = data.find(b'Rar!\x1a\x07')
if zip_offset > 0:
    print(f"ZIP archive found at offset {zip_offset}")
if rar_offset > 0:
    print(f"RAR archive found at offset {rar_offset}")
PYEOF
ステップ 2:自動ステガナリシスツールを実行する
# Use binwalk to detect embedded files and data
binwalk /cases/case-2024-001/media/suspect_image.jpg | tee /cases/case-2024-001/analysis/binwalk_scan.txt

# Extract embedded files
binwalk --extract --directory /cases/case-2024-001/analysis/binwalk_extracted/ \
   /cases/case-2024-001/media/suspect_image.jpg

# Use zsteg for PNG and BMP analysis (LSB detection)
zsteg /cases/case-2024-001/media/suspect_image.png | tee /cases/case-2024-001/analysis/zsteg_results.txt

# zsteg with all checks
zsteg -a /cases/case-2024-001/media/suspect_image.png

# Use stegoveritas for comprehensive analysis
stegoveritas /cases/case-2024-001/media/suspect_image.jpg \
   -out /cases/case-2024-001/analysis/stegoveritas/

# Stegoveritas performs:
# - Metadata extraction
# - LSB analysis (multiple bit planes)
# - Color map analysis
# - Trailing data detection
# - Embedded file extraction
# - Image transformation analysis

# Use steghide for JPEG/BMP/WAV/AU extraction attempts
# Try with empty password
steghide extract -sf /cases/case-2024-001/media/suspect_image.jpg -p "" \
   -xf /cases/case-2024-001/analysis/steghide_extract.bin 2>&1

# Try with common passwords
for pwd in password secret hidden stego test 123456 admin; do
    result=$(steghide extract -sf /cases/case-2024-001/media/suspect_image.jpg \
       -p "$pwd" -xf "/cases/case-2024-001/analysis/steghide_$pwd.bin" 2>&1)
    if echo "$result" | grep -q "extracted"; then
        echo "SUCCESS with password: $pwd"
    fi
done
ステップ 3:LSB(最下位ビット)分析を実施する
# Custom LSB analysis with Python
python3 << 'PYEOF'
from PIL import Image
import numpy as np

img = Image.open('/cases/case-2024-001/media/suspect_image.png')
pixels = np.array(img)

# Extract LSB from each color channel
for channel, name in enumerate(['Red', 'Green', 'Blue']):
    if channel >= pixels.shape[2]:
        break

    lsb_data = pixels[:, :, channel] & 1

    # Count distribution (should be ~50/50 for natural images)
    zeros = np.sum(lsb_data == 0)
    ones = np.sum(lsb_data == 1)
    total = zeros + ones
    ratio = ones / total

    print(f"{name} channel LSB: 0s={zeros} ({zeros/total*100:.1f}%), 1s={ones} ({ones/total*100:.1f}%)")
    if abs(ratio - 0.5) < 0.01:
        print(f"  NEUTRAL - Close to random (could be stego or natural)")
    elif ratio > 0.55 or ratio < 0.45:
        print(f"  ANOMALY - Significant deviation from expected distribution")

# Extract LSB data as bytes
lsb_bits = (pixels[:, :, 0] & 1).flatten()
lsb_bytes = np.packbits(lsb_bits)

# Check if extracted data has structure
with open('/cases/case-2024-001/analysis/lsb_extracted.bin', 'wb') as f:
    f.write(lsb_bytes.tobytes())

# Check for known file signatures in extracted data
import struct
header = bytes(lsb_bytes[:16])
print(f"\nLSB extracted header (hex): {header.hex()}")
if header[:4] == b'PK\x03\x04':
    print("  DETECTED: ZIP archive in LSB data!")
elif header[:3] == b'GIF':
    print("  DETECTED: GIF image in LSB data!")
elif header[:4] == b'\x89PNG':
    print("  DETECTED: PNG image in LSB data!")
elif header[:2] == b'\xff\xd8':
    print("  DETECTED: JPEG image in LSB data!")

# Generate LSB visualization
lsb_img = Image.fromarray((lsb_data * 255).astype(np.uint8))
lsb_img.save('/cases/case-2024-001/analysis/lsb_visualization.png')
print("\nLSB visualization saved to lsb_visualization.png")
PYEOF
ステップ 4:音声と動画のステガノグラフィを分析する
# Spectral analysis of audio files
python3 << 'PYEOF'
import wave
import numpy as np

# Analyze WAV file for audio steganography
with wave.open('/cases/case-2024-001/media/suspect_audio.wav', 'r') as wav:
    frames = wav.readframes(wav.getnframes())
    samples = np.frombuffer(frames, dtype=np.int16)

    # LSB analysis of audio samples
    lsb = samples & 1
    zeros = np.sum(lsb == 0)
    ones = np.sum(lsb == 1)
    total = len(lsb)

    print(f"Audio LSB Analysis:")
    print(f"  Samples: {total}")
    print(f"  LSB 0s: {zeros} ({zeros/total*100:.1f}%)")
    print(f"  LSB 1s: {ones} ({ones/total*100:.1f}%)")

    # Extract LSB data
    lsb_bytes = np.packbits(lsb)
    with open('/cases/case-2024-001/analysis/audio_lsb.bin', 'wb') as f:
        f.write(lsb_bytes.tobytes())

    # Chi-square test for randomness
    from scipy import stats
    chi2, p_value = stats.chisquare([zeros, ones])
    print(f"  Chi-square: {chi2:.4f}, p-value: {p_value:.4f}")
    if p_value < 0.05:
        print(f"  ANOMALY: LSB distribution is not random (potential stego)")
PYEOF

# Use steghide on audio files
steghide info /cases/case-2024-001/media/suspect_audio.wav

# Analyze with sonic-visualiser or audacity for spectral anomalies
# (Check spectrogram for hidden images encoded in frequency domain)
ステップ 5:ステガナリシスレポートを作成する
# Compile findings
python3 << 'PYEOF'
import os, json

report = {
    "case": "2024-001",
    "files_analyzed": [],
    "findings": []
}

analysis_dir = '/cases/case-2024-001/analysis/'
for f in os.listdir(analysis_dir):
    if f.endswith('.txt'):
        with open(os.path.join(analysis_dir, f)) as fh:
            content = fh.read()
            if 'DETECTED' in content or 'SUCCESS' in content or 'WARNING' in content:
                report["findings"].append({
                    "source": f,
                    "content": content[:500]
                })

with open('/cases/case-2024-001/analysis/steg_report.json', 'w') as f:
    json.dump(report, f, indent=2)

print("Steganalysis report generated")
print(f"Total findings: {len(report['findings'])}")
PYEOF

主な概念

概念説明
LSB(最下位ビット)ピクセル値またはサンプル値の最下位ビットにデータを埋め込むこと
DCT ステガノグラフィJPEG の離散コサイン変換係数にデータを隠すこと
スペクトラム拡散隠されたデータを搬送信号全体に分散させること
ステガナリシス隠された情報の存在を検出する科学
カイ二乗攻撃LSB 分布の非ランダム性を検出する統計的検定
カバーメディア隠されたデータを運ぶために使用される元のファイル(画像、音声、動画)
ステゴメディア隠されたデータが埋め込まれた後のファイル
容量目に見える歪みを生じさせずに隠せるデータの最大量

ツールとシステム

ツール目的
steghideJPEG、BMP、WAV、AU ファイルへのデータの埋め込み/抽出
zstegPNG および BMP ファイルの LSB ステガノグラフィを検出
binwalkバイナリファイル内の埋め込みファイルとデータを検出
stegoveritas複数の検出方法を備えた包括的なステガナリシスツール
StegSolve画像のビットプレーンとフィルターを分析する Java GUI ツール
OpenStegoオープンソースのステガノグラフィおよび電子透かしツール
ExifToolメディアファイルのメタデータ抽出と分析
stegseekJPEG ステガノグラフィの抽出に使用する、高速な steghide パスワードクラッカー

よくあるシナリオ

シナリオ 1:秘密通信の調査 容疑者がメッセージングプラットフォームを介してやり取りした画像を調査し、すべての PNG/BMP ファイルに対して stegoveritas と zsteg を実行します。既知のパスワードを使って JPEG ファイルからの steghide 抽出を試み、LSB 分布に統計的な異常がないか分析し、隠されたメッセージがあれば抽出してデコードします。

シナリオ 2:画像アップロードを介したデータ窃取 クラウドサービスにアップロードされた画像のファイルサイズに異常がないか監視し、画像のメタデータを想定されるカメラ/デバイスのプロファイルと比較します。binwalk を実行して埋め込みアーカイブを検出し、JPEG の量子化テーブルに steghide の痕跡がないか分析して、隠されたペイロードがあれば抽出して調査します。

シナリオ 3:マルウェアのコマンドアンドコントロール マルウェアがダウンロードした画像にコマンドが埋め込まれていないか分析し、ファイル終端マーカーの後にデータが追加されていないか確認します。DNS クエリへの応答の TXT レコードに Base64 エンコードされたデータがないか調べ、PNG の IDAT チャンクに異常な圧縮データサイズがないか分析します。

シナリオ 4:音声ファイルを介した知的財産の窃取 音声ファイルの LSB に文書が埋め込まれていないか分析し、スペクトログラムに周波数領域で隠された視覚的パターンがないか確認します。音声ファイルのサイズをビットレートと再生時間から想定されるサイズと比較し、隠されたデータペイロードがあれば抽出して分析します。

出力形式

Steganalysis Summary:
  Files Analyzed: 45 (32 images, 8 audio, 5 video)

  Detection Results:
    suspect_image_03.png:
      zsteg: Text detected in R channel LSB
      Content: "Meet at location B, Tuesday 1400"
      Method: LSB embedding in Red channel

    suspect_photo_17.jpg:
      steghide: Data extracted with password "secret123"
      Hidden file: confidential_report.pdf (234 KB)
      Method: DCT coefficient modification

    profile_pic.png:
      binwalk: ZIP archive embedded at offset 45678
      Contents: 3 spreadsheet files with financial data
      Method: Data appended after PNG IEND marker

    recording_05.wav:
      LSB analysis: Non-random distribution (p < 0.001)
      Extracted: 12 KB binary payload (further analysis needed)
      Method: Audio LSB embedding

  Clean Files: 41 (no steganographic indicators)
  Suspicious Files: 4 (data extracted)

  Report: /cases/case-2024-001/analysis/steg_report.json

コメント