Merge pull request #98 from Zeecka/main

PngCheck and fixes
This commit is contained in:
Zeecka
2025-11-07 18:30:23 +01:00
committed by GitHub
5 changed files with 57 additions and 7 deletions
+2 -1
View File
@@ -36,6 +36,7 @@ The platform allow you to:
- **Visualise `binwalk` informations** - **Visualise `binwalk` informations**
- **Download `binwalk` files** such as zip in png headers - **Download `binwalk` files** such as zip in png headers
- **Download `foremost` files** such as zip in png headers - **Download `foremost` files** such as zip in png headers
- **Visualise `pngcheck` output**
- **Visualise `strings` output** - **Visualise `strings` output**
## Installation ## Installation
@@ -93,7 +94,7 @@ GitHub CI will alert in case of failure.
## Roadmap ## Roadmap
- [ ] PngCheck - [x] PngCheck
- [ ] Zsteg extract / --all --> **Download `zsteg` files** such as mp3 encoded on LSB - [ ] Zsteg extract / --all --> **Download `zsteg` files** such as mp3 encoded on LSB
- [ ] Test on mobile - [ ] Test on mobile
- [ ] i18n - [ ] i18n
+40
View File
@@ -0,0 +1,40 @@
"""Pngcheck Analyzer for Image Submissions."""
import subprocess
from pathlib import Path
from .utils import MAX_PENDING_TIME, update_data
def analyze_pngcheck(input_img: Path, output_dir: Path) -> None:
"""Analyze an image submission using strings."""
try:
data = subprocess.run(
["pngcheck", "-v", input_img],
capture_output=True,
text=True,
check=False,
timeout=MAX_PENDING_TIME,
)
# Error based on https://github.com/pnggroup/pngcheck/issues/59
# if data.stderr:
# update_data(
# output_dir, {"pngcheck": {"status": "error", "error": data.stderr}}
# )
# return
data_strings = data.stdout.split("\n") if data else []
data_strings = [s for s in data_strings if s]
update_data(
output_dir,
{
"pngcheck": {
"status": "ok",
"output": data_strings,
}
},
)
except Exception as e:
update_data(output_dir, {"pngcheck": {"status": "error", "error": str(e)}})
+12 -6
View File
@@ -61,9 +61,9 @@ def analyze_steghide(
"steghide", "steghide",
"extract", "extract",
"-sf", "-sf",
"../" + str(image_name), "../../" + str(image_name),
"-xf", "-xf",
str(embedded_filename), str(embedded_file.name),
] ]
if password: if password:
cmd_ext += ["-p", password] cmd_ext += ["-p", password]
@@ -72,13 +72,19 @@ def analyze_steghide(
data = subprocess.run( data = subprocess.run(
cmd_ext, cmd_ext,
cwd=output_dir, cwd=extracted_dir,
capture_output=True, capture_output=True,
text=True, text=True,
check=False, check=False,
timeout=MAX_PENDING_TIME, timeout=MAX_PENDING_TIME,
) )
stderr += data.stderr # Filter out lines that indicate success
stdout = []
for line in data.stderr.split("\n"):
if line.startswith('wrote extracted data to "'):
stdout.append(line)
elif line:
stderr += line + "\n"
# Zip extracted files # Zip extracted files
zip_data = subprocess.run( zip_data = subprocess.run(
@@ -94,7 +100,7 @@ def analyze_steghide(
if len(stderr) > 0: if len(stderr) > 0:
err = { err = {
"binwalk": { "steghide": {
"status": "error", "status": "error",
"error": stderr, "error": stderr,
} }
@@ -110,7 +116,7 @@ def analyze_steghide(
{ {
"steghide": { "steghide": {
"status": "ok", "status": "ok",
"output": data.stdout.split("\n") if data else [], "output": stdout,
"download": f"/download/{output_dir.name}/steghide", "download": f"/download/{output_dir.name}/steghide",
} }
}, },
+1
View File
@@ -4,6 +4,7 @@ const TOOL_ORDER = [
"binwalk", "binwalk",
"foremost", "foremost",
"outguess", "outguess",
"pngcheck",
"steghide", "steghide",
"zsteg", "zsteg",
"strings", "strings",
+2
View File
@@ -12,6 +12,7 @@ from .analyzers.outguess import analyze_outguess
from .analyzers.steghide import analyze_steghide from .analyzers.steghide import analyze_steghide
from .analyzers.strings import analyze_strings from .analyzers.strings import analyze_strings
from .analyzers.zsteg import analyze_zsteg from .analyzers.zsteg import analyze_zsteg
from .analyzers.pngcheck import analyze_pngcheck
from .app import app, db from .app import app, db
from .config import RESULT_FOLDER from .config import RESULT_FOLDER
from .models import Image, Submission from .models import Image, Submission
@@ -49,6 +50,7 @@ def analyze_image(submission_hash: str) -> None:
(analyze_exiftool, img_path, result_path), (analyze_exiftool, img_path, result_path),
(analyze_foremost, img_path, result_path), (analyze_foremost, img_path, result_path),
(analyze_strings, img_path, result_path), (analyze_strings, img_path, result_path),
(analyze_pngcheck, img_path, result_path),
(analyze_steghide, img_path, result_path, submission.password), (analyze_steghide, img_path, result_path, submission.password),
(analyze_zsteg, img_path, result_path), (analyze_zsteg, img_path, result_path),
] ]