Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/adversis/screenscrub
OSINT (Open Source Intelligence)Password CrackingData ExfiltrationInformation GatheringPenetration TestingSecret Detection
GitHubadversis/screenscrub

screenscrub

스크린샷에서 자격 증명을 찾아 비밀 관리자에 저장하고, 이미지에서 복구 불가능하게 삭제합니다 — 로컬, 오프라인, OCR 기반.

저장소 보기
61개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
screenscrub

screenscrub

스크린샷에서 자격 증명을 찾아 비밀 관리자로 추출하고 이미지에서 복구 불가능하게 삭제하여 비밀번호가 노트, 스크린샷, ~/Desktop에 방치되지 않도록 합니다.

로컬. 오프라인. 조용히. 기본적으로 네트워크 없음, 텔레메트리 없음.

screenscrub는 두 가지 기존 도구 카테고리를 연결합니다: GUI 리뷰어(Xnapper, Shhshot, macshot)는 수동으로 PII를 흐리게 하지만 비밀과 주소를 구분하지 못하거나 숨기는 내용을 캡처하지 못합니다; 비밀 스캐너(gitleaks, TruffleHog)는 실제 자격 증명을 찾지만 텍스트에서만 찾고 PNG에서는 찾지 못합니다. screenscrub는 gitleaks 수준의 탐지(레드팀 팩 및 엔트로피 분석 포함)를 픽셀에 헤드리스로 적용합니다: 각 비밀을 관리자로 캡처하고, 이미지를 복구 불가능하게 삭제한 후, 결과를 다시 OCR하여 비밀이 제거되었음을 증명합니다.

안전망이지 보장이 아닙니다 — screenscrub는 이미지가 "완전히 깨끗하다"고 주장하지 않습니다; OCR과 탐지 모두 누락되는 경우가 있으므로 항상 결과를 직접 확인하세요. 이에 의존하기 전에 읽어보세요.

root@kitploit:~
screenscrub scan   ~/Screenshots                 # dry run: 감지 + 보고, 쓰지 않음
screenscrub clean  ~/Screenshots --out ~/clean \ # 추출, 삭제, 검증, 격리
    --sink file://./secrets.age --yes
screenscrub verify ~/clean                       # 폴더가 깨끗한지 증명 (그렇지 않으면 종료 코드 ≠0)

screenscrub clean --keep-originals ./tmp
Cleaning 7 image(s) in ./tmp (7 worker(s))…
[1/7] tmp/ssh.jpg — 6 region(s) → tmp/ssh.redacted.jpg ✓ verified
[2/7] tmp/key.jpg — 13 region(s) → tmp/key.redacted.jpg ✓ verified
[3/7] tmp/test2.jpg — 12 region(s) → tmp/test2.redacted.jpg ✓ verified
[4/7] tmp/test5.jpg — 13 region(s) → tmp/test5.redacted.jpg ✓ verified
[5/7] tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
[6/7] tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
[7/7] tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved

7/7 file(s) flagged, 382 region(s) total, 3 file(s) errored/unverified.
By kind:
   high-entropy             343
   keyword-secret           15
   db-connection-uri        10
   github-pat               6
   unix-crypt-hash          6
   aws-access-key           1
   stripe-key               1
Needs manual attention (3):
   tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
   tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
   tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved
Before — 비밀 값이 보임After clean — 복구 불가능하게 삭제됨
원본 스크린샷: 수십 개의 API 키 예시 값이 보임screenscrub 후 동일한 스크린샷: 모든 비밀 값이 검게 칠해지고, 레이블과 정규식 패턴은 여전히 읽을 수 있음

동일한 스크린샷의 clean 전과 후: 모든 비밀 값이 픽셀로 디코딩되고, 박스 처리된 후 새 이미지로 다시 인코딩됩니다(복구 불가능). 레이블과 구조는 읽을 수 있습니다.


설치

tesseract OCR 바이너리가 PATH에 필요합니다:

  • macOS: brew install tesseract
  • Windows: winget install UB-Mannheim.TesseractOCR (또는 UB Mannheim 설치 프로그램)
  • Debian/Ubuntu: apt-get install tesseract-ocr

그런 다음 빌드:

root@kitploit:~
go build -o screenscrub ./cmd/screenscrub

macOS(arm64/amd64) 및 Windows(amd64)로 크로스 컴파일 가능 — cgo 대신 tesseract를 외부 호출합니다. macOS에서만 테스트되었습니다.

사용법

scan <dir|file> — dry run (시험 실행)

감지하고 보고합니다; 아무것도 쓰지 않습니다.

root@kitploit:~
screenscrub scan ~/Screenshots --ignore 'node_modules/**' --ignore '*.thumb.png'
screenscrub scan shot.png --json            # 기계가 읽을 수 있는 보고서
screenscrub scan ~/Screenshots --preview ~/review   # clean이 무엇을 삭제할지 확인

--preview <dir>는 플래그가 지정된 각 이미지의 비파괴 복사본을 작성하며, 탐지된 각 영역을 윤곽선(채우지 않음)으로 표시하여 clean이 삭제할 내용을 확정하기 전에 확인할 수 있게 합니다. ⚠️ 이 복사본에는 여전히 비밀이 포함되어 있으므로, 디렉터리는 0700 권한으로 생성되며 공유해서는 안 됩니다.

보고서는 요약으로 끝납니다: 종류별 분석과 명시적인 "수동 확인 필요" 목록 — 오류가 발생했거나, 검증에 실패했거나, 스크린샷에 대해 OCR 텍스트를 생성하지 않은 파일들입니다(조용한 OCR 누락은 깨끗한 이미지와 동일하게 읽히므로, 신뢰하기보다 표면화됩니다).

scan --fail-on-findings는 무언가 탐지되면 0이 아닌 종료 코드를 반환합니다 — pre-commit/CI 게이트용입니다.

clean <dir|file> — 추출, 삭제, 격리

root@kitploit:~
SCREENSCRUB_PASSPHRASE=… screenscrub clean ~/Screenshots \
    --out ~/Screenshots/clean \
    --sink file://./secrets.age \
    --yes

검출 항목이 있는 각 이미지에 대해 clean은:

  1. 모든 비밀을 싱크에 저장하고,
  2. <name>.redacted.png를 --out (또는 원본 옆)에 작성하며,
  3. 원본을 age로 암호화하여 <out>/quarantine/으로 이동합니다.

비밀은 --sink에 전달하는 싱크로 전송됩니다: age 파일(기본값), 1Password (op://), KeePassXC (keepassxc://), macOS 키체인 (keychain://), HashiCorp Vault (vault://) — 또는 하드웨어 기반 age 수신자(YubiKey, Touch ID). 비밀 싱크를 참조하세요.

플래그:

--exclude-kind 및 --min-confidence는 노이즈가 많은 코퍼스에 대한 로컬(네트워크 없음) 정밀도 조정 기능입니다 — --llm의 오프라인 대응물입니다. 이들은 더 조용한 보고서를 위해 재현율을 희생하므로 의도적으로 사용하세요. 두 기능 모두 scan/verify에서도 작동하며 --config에서 설정할 수 있습니다 (exclude_kinds, min_confidence).

암호 해결 순서: --passphrase, 그 다음 설정 파일, 그 다음 SCREENSCRUB_PASSPHRASE. 명령줄에서 --passphrase 사용은 피하세요 — argv는 다른 프로세스에 보입니다.

verify <dir|file> — 폴더가 깨끗함을 증명

각 이미지를 다시 OCR하고, 다시 탐지를 실행하며, 어떤 비밀 영역이 여전히 발견되면 0이 아닌 종료 코드로 종료합니다 — 클라이언트에게 스크린샷을 전달하기 전에 인도물/CI 게이트로 사용하세요. (OCR이 비밀을 읽을 수 없음을 증명하는 것이지, 사람이 절대 읽을 수 없다는 것은 아닙니다.)

root@kitploit:~
screenscrub verify ~/deliverable/screenshots
echo $?   # 0 = 깨끗함, 0이 아님 = 여전히 감지 가능한 비밀 있음

clean은 모든 삭제된 복사본에 대해 이 동일한 검사를 자동으로 수행하며, 삭제된 복사본이 실패하면 원본을 격리하거나 파쇄하지 않습니다; --no-verify는 이를 건너뜁니다(권장되지 않음).

open <store> — 비밀 또는 격리된 원본 복구

데이터를 되찾으세요: open은 age 싱크(저장된 비밀 기록) 또는 격리된 원본을 --out으로 복호화하며, 표준 출력으로는 내보내지 않습니다. 저장소 복호화를 참조하세요.

--llm — LLM으로 양성 오버플래그 드롭

OCR 텍스트(OCR 노이즈 포함)에 대한 gitleaks 수준 규칙은 필연적으로 과도하게 플래그를 지정합니다: 재현율 편향 탐지기는 운영자가 유지하려는 양성 고엔트로피 문자열(호스트 이름, GUID, git SHA, NTLM 해시 등 자체가 손상 증거인 것)을 표면화합니다. --llm은 각 후보를 Claude(Opus 4.8)에 전달하여 진짜 비밀은 유지하고 양성 식별자는 드롭합니다; LLM이 확인한 영역은 빨간색으로 채워집니다.

root@kitploit:~
ANTHROPIC_API_KEY=… screenscrub clean ~/Screenshots --out ~/clean --llm --yes

이것은 의도적으로 로컬 및 무음을 깨뜨립니다: 후보 문자열(탐지된 비밀)을 Anthropic API로 전송하므로 옵트인 전용이며, 경고를 출력하고 API 키가 필요합니다. 실패 시 폐쇄: 모든 API/네트워크 오류는 모든 검출 결과를 유지(모든 것을 삭제)하여 실제 비밀을 드롭할 위험을 감수하지 않습니다. 플래그가 지정된 이미지당 하나의 API 호출을 수행하며(동시 4개로 제한, --jobs와 무관) — 대규모 디렉터리에서는 속도 제한과 비용에 주의하세요.

--watch

root@kitploit:~
screenscrub clean ~/Screenshots --watch --sink file://./secrets.age --yes

이미 존재하는 모든 것을 처리한 후, 새/수정된 이미지를 감시하고 나타날 때마다 각각을 스크럽합니다. *.redacted.png 출력은 루프를 방지하기 위해 무시됩니다.

감지(Detection)

OCR 토큰 위에서 screenscrub는 다음을 결합합니다:

  • 벤더된 gitleaks 정규식 — AWS AKIA…, GitHub ghp_…, GitLab, Slack, Stripe, OpenAI, GCP API 키, JWT 및 PEM 헤더. (작고 완전히 오프라인 상태를 유지하기 위해 가져오지 않고 복사됨)
  • 레드팀 팩 — 엔게이지먼트 스크린샷에 나타나는 자격 증명 형태: DB 연결 문자열(postgres://u:p@…), HTTP Basic/Bearer 인증 헤더, NetNTLMv2 및 NTLM(pwdump) 해시, /etc/shadow crypt 해시, PuTTY 및 OpenSSH 개인 키, SendGrid/npm 토큰.
  • 무작위로 보이는 문자열에 대한 Shannon 엔트로피 임계값.
  • 컨텍스트 키워드(password, token=, secret, api_key, …) — 패턴과 일치하지 않고 엔트로피가 낮더라도 인접한 값에 플래그를 지정합니다.
  • 구조적 PEM 탐지 — OCR은 밀집된 base64를 왜곡하므로 BEGIN/END 마커를 활용하고, 단어별 일치를 신뢰하지 않고 포함 영역 전체를 넉넉하게 삭제합니다.

각 적중은 이를 구성하는 토큰의 픽셀 상자에 매핑되며(두 가지 선 재구성 — 간격 있음 및 조밀함 — OCR이 공백으로 분할한 비밀을 복구), 상자는 채우기 전에 패딩됩니다.

비밀 싱크 — "모든 사람은 자신만의 관리자가 있다"

싱크는 하나의 메서드입니다: Store(Secret) error. 제공된 어댑터:

  • file:// — age 암호화 로컬 파일 (기본값). 외부 종속성 없음; age scrypt 암호(또는 age 수신자 — 아래 하드웨어 기반 암호화 참조)로 암호화된 JSON 레코드 배열.
  • op:// — 1Password CLI. 값이 stdin으로 전달되는 op item create 실행(argv에 절대 나타나지 않음).
  • keepassxc://./vault.kdbx — KeePassXC. 인기 있는 크로스 플랫폼 로컬 KeePass 관리자. keepassxc-cli add 실행; 데이터베이스 암호와 비밀 모두 stdin으로 전달(argv에 절대 나타나지 않음). 데이터베이스 암호는 확인된 암호(--config/SCREENSCRUB_PASSPHRASE)입니다.
  • keychain://screenscrub — macOS 키체인. security add-generic-password 실행. 주의: security 도구는 비밀을 명령줄 인수로만 받아들이므로, 실행 중에 동일 사용자의 ps에 잠시 보입니다(macOS는 다른 사용자로부터 argv를 숨깁니다). 더 엄격한 위생을 위해 1Password, KeePassXC 또는 아래 Secure Enclave 수신자를 선호하세요.
  • vault:// — HashiCorp Vault KV v2 — 존재하지만 지연/덜 일반적; 경로가 비밀을 해시하므로 URL에 나타나지 않습니다.

자체 싱크를 추가하려면 sink.SecretSink (internal/sink)를 구현하고 sink.FromURI에 연결하세요. 이것이 전체 계약입니다.

하드웨어 기반 암호화 — YubiKey 및 Touch ID

기본 age 파일 싱크와 격리는 age 플러그인을 통해 하드웨어 기반 수신자를 포함한 age 수신자에게 암호화할 수 있습니다:

root@kitploit:~
# YubiKey (PIV) — age-plugin-yubikey 설치 후:
screenscrub clean ~/Screenshots --out ~/clean \
    --sink file://./secrets.age \
    --recipient age1yubikey1q... --yes

# Apple Secure Enclave / Touch ID — age-plugin-se 설치 후:
screenscrub clean ~/Screenshots --out ~/clean \
    --recipient age1se1q... --yes

# 일반 age 키페어, 또는 여러 수신자 / 수신자 파일:
screenscrub clean ~/Screenshots --recipient age1abc... --recipients-file team.age.pub --yes

수신자 모드에서는 암호가 필요하지 않습니다. 싱크와 암호화된 격리 모두 수신자에게 전송됩니다. 하드웨어 토큰으로 복구: age -d -i <identity> secrets.age (복호화는 YubiKey 터치 / Touch ID를 요청합니다). 플러그인 수신자로 암호화하려면 age-plugin-<name> 바이너리가 필요합니다; 복호화는 추가로 장치가 필요합니다.

암호 저장소 복호화 — open

싱크와 격리는 단일 암호에서 파생된 별도의 키(HKDF)를 사용하므로, 한 저장소를 크래킹해도 다른 저장소를 열 수 없습니다. 디스크 키가 파생되므로 원시 age 대신 screenscrub로 복호화하세요:

root@kitploit:~
screenscrub open ./secrets.age --out secrets.json          # 비밀 기록
screenscrub open ~/clean/quarantine/shot.png.ab12cd34.age --out shot.png   # 원본

open은 각 파생 키를 자동으로 시도하고 평문을 --out으로 작성합니다(표준 출력 절대 안 함). 수신자 모드 저장소의 경우 age 키 파일을 전달하세요: screenscrub open secrets.<id>.age --identity key.txt --out secrets.json (YubiKey/Touch ID의 경우 직접 age -d -i를 사용하세요, 이는 하드웨어 플러그인을 구동합니다). 수신자 모드는 비밀당 하나의 파일(secrets.<hash>-<rand>.age)을 작성하므로 반복 실행이 서로 덮어쓰지 않습니다.

개발

root@kitploit:~
go test ./...        # tesseract 없이 단위 테스트 실행; OCR/re-OCR 테스트는 없으면 건너뜀

주요 보장은 엔드 투 엔드 테스트로 다룹니다: AWS 키가 있는 스크린샷을 렌더링하고, 실제 OCR → 탐지 → 삭제 파이프라인을 실행하고, 출력을 다시 OCR한 후 비밀이 사라졌음을 단언합니다(internal/redact).


심층 방어(Defense-in-depth), 보장이 아닙니다

screenscrub는 생각을 멈춰도 되는 라이선스가 아닙니다.

  • OCR은 텍스트를 놓칩니다. 낮은 명암비, 회전, 작거나 스타일이 적용된 텍스트는 전혀 읽히지 않을 수 있으며, 읽히지 않은 것은 삭제할 수 없습니다.
  • 탐지는 새로운 비밀을 놓칩니다. 일반적인 형태(AWS 키, PEM 블록, JWT, 고엔트로피 덩어리, password: 줄)는 알지만, 인식하지 못하는 형태의 비밀은 통과합니다.
  • 이미지가 "완전히 깨끗하다"고 절대 주장하지 않습니다. 명백한 ~90%를 자동으로 잡아내므로 나머지는 직접 확인할 수 있습니다. 항상 이미지를 직접 검토하세요.

재현율(recall)이 정밀도(precision)보다 우선하도록 조정되었습니다 — 의도적으로 과도하게 플래그를 지정합니다. 이미지에 남은 자격 증명이 치명적인 경우이고, 거짓 양성은 단지 삭제된 덩어리만 만들기 때문입니다.

testdata/ 폴더에서 RExpository 스크린샷을 가져온 실제 사용 사례를 볼 수 있습니다:

https://jaimepolop.github.io/RExpository/

완벽하지는 않지만 꽤 괜찮습니다.

기능

  1. 복구 불가능한 삭제. 이미지를 완전히 픽셀로 디코딩하고, 비밀 영역 위에 불투명한 직사각형을 그린 후, 결과를 새 PNG로 다시 인코딩합니다 — 벗겨낼 오버레이 레이어가 없고, 자르기-재인코딩 없음으로 aCropalypse 클래스의 복구 가능한 삭제(CVE-2023-21036 / CVE-2023-28303)를 피합니다. 모든 소스 메타데이터(EXIF, PNG 텍스트 청크)는 재인코딩 과정에서 제거됩니다. 흐림 및 픽셀화는 복구 가능하므로(Depix, Unredacter), screenscrub는 필터가 아닌 불투명 채우기만 사용합니다.
  2. 검증된 삭제. 삭제된 복사본을 작성한 후, clean은 다시 OCR하고 다시 탐지를 실행합니다. 어떤 비밀이 여전히 감지 가능하면, 원본을 격리하거나 파괴하는 것을 거부하고 파일에 플래그를 지정합니다. 삭제 상자는 글리프 높이에 비례하여 패딩되므로 크거나 높은 DPI 텍스트의 안티앨리어싱된 가장자리가 덮입니다.
  3. 안전한 원본 처리. clean은 삭제된 복사본을 작성하고 검증한 후, 비삭제 원본을 age 암호화 격리로 이동하고 원래 위치에서 제거합니다 — 삭제된 복사본이 깨끗하게 검증되고 추출된 비밀이 안전하게 디스크에 저장된 후에만 파괴 단계가 진행됩니다. --yes가 필요합니다.
  4. 비밀은 비밀로 유지됩니다. 비밀 값이 로그, 표준 출력, 또는 임시 파일에 평문으로 나타나지 않습니다; 보고서는 마스킹된 미리보기(AK****…**LE)만 표시합니다. 유일한 평문 복사본은 암호화된 싱크에 도달할 때까지 메모리에만 존재합니다.

--purge와 안전한 삭제의 한계

기본적으로 원본은 복구 가능한 잘못된 삭제를 위해 격리(암호화) 상태로 유지됩니다. --purge는 대신 원본을 파쇄합니다: 난수로 덮어쓰기, 0으로 덮어쓰기, 그런 다음 연결 해제.

안전한 삭제는 신뢰할 수 없습니다. SSD, 쓰기 중 복사 파일 시스템(APFS, Btrfs, ZFS), 저널 파일 시스템, 스냅샷/백업된 볼륨에서 덮어쓰기-후-연결 해제는 원본 바이트가 사라졌음을 보장하지 않습니다 — 웨어 레벨링 및 스냅샷이 이를 유지할 수 있습니다. 유일한 실제 방어는 처음부터 평문을 지속하지 않는 것입니다. 암호화된 격리를 선호하고, --purge를 최선의 노력으로 취급하세요.

사전 작업 및 감사의 말

  • 탐지 규칙은 gitleaks (MIT)에서 벤더되었습니다 — 작고 오프라인 상태를 유지하기 위해 가져오지 않고 복사됨.
  • 삭제 메커니즘 — Tesseract → 정규식 → 불투명 상자 — pyDactor 및 Microsoft Presidio가 입증한 경로를 따릅니다; 복사-및-삭제 CLI 형태는 redacter-rs를 반영합니다.
  • OCR은 크로스 플랫폼 호환성을 위해 Tesseract를 기본값으로 합니다. macOS에서는 Xnapper/macshot에서 사용하는 Apple의 Vision 프레임워크가 동일한 OCR 인터페이스 뒤에서 자연스러운 더 높은 정확도의 백엔드입니다 — 향후 추가 가능성.

라이선스

벤더된 자격 증명 패턴은 gitleaks (MIT)에서 파생되었습니다.

도구 다운로드
플래그의미
--out <dir>삭제된 복사본이 저장될 디렉터리 (기본값: 원본 옆)
--sink <uri>file://./secrets.age · op://Vault · keepassxc://./v.kdbx · keychain://service · vault://KV
--recipient <age1…>age 수신자로 암호화 (반복 가능): X25519, YubiKey 또는 Touch ID
--recipients-file <f>한 줄에 하나씩 age 수신자가 있는 파일
--passphrase파일 싱크/격리용 암호 (환경 변수 또는 --config 선호)
--watch계속 실행; 새 스크린샷이 나타나면 처리 (fsnotify)
--purge격리 대신 원본을 파쇄 (아래 주의사항 참조)
--keep-originals삭제된 복사본만 작성; 원본을 그대로 둠 (격리 없음, 암호 없음, --yes 불필요) — --purge와 상호 배타적
--yes파괴적인 원본 처리를 확인 (필수)
--config <file>JSON 설정; 암호를 argv 밖에 보관 가능
--no-verify삭제된 출력의 재-OCR 검증을 건너뜀 (권장되지 않음)
-i, --interactive플래그가 지정된 각 이미지를 열고 건드리기 전에 삭제/건너뛰기를 확인
--llmClaude를 사용하여 양성 오버플래그를 드롭; 후보 문자열을 Anthropic API로 전송
--llm-api-key--llm용 Anthropic API 키 (또는 ANTHROPIC_API_KEY)
--jobs NN개 이미지를 병렬로 처리 (기본값: CPU 수)
--manifest <file>원본→삭제→영역의 JSON 맵 작성
--ocr-raw / --ocr-upscale N어두운 터미널 전처리 비활성화 / OCR 전 업스케일
--exclude-kind <kind>특정 종류의 검출 결과를 억제 (반복 가능), 예: high-entropy — 오프라인 정밀도 조정
--min-confidence <0..1>이 신뢰도 미만의 검출 결과를 드롭 — 오프라인 정밀도 조정
--json보고서를 JSON으로 출력
--ignore <glob>무시할 glob, 반복 가능; **는 모든 깊이와 일치
--langtesseract 언어 (기본값 eng)