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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
DECEIVE — DECeption with Evaluative Integrated Validation Engine (DECEIVE): Let an LLM do all the hard honeypot work! | Kitploit
도구/GitHubGitHub/cisco-talos/deceive
Defensive ToolsNetwork SecurityThreat IntelligenceIntrusion DetectionAI SecurityLog Analysis
GitHubcisco-talos/deceive

DECEIVE

DECeption with Evaluative Integrated Validation Engine (DECEIVE): Let an LLM do all the hard honeypot work!

저장소 보기
2884116일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

DECEIVE

사이버 범죄자가 유령 같은 AI 기반 허니팟 시스템과 상호작용하는 모습

DECEIVE, 즉 DECeption with Evaluative Integrated Validation Engine(평가 기반 통합 검증 엔진을 갖춘 기만)은 고상호작용(high-interaction)이면서도 적은 노력이 드는(low-effort) 허니팟 시스템입니다. 대부분의 고상호작용 허니팟과 달리, DECEIVE는 공격자에게 실제 시스템에 대한 접근 권한을 제공하지 않습니다. AI가 시뮬레이션하려는 시스템 유형을 설명하는 구성 가능한 시스템 프롬프트를 기반으로 실제와 같은 허니팟 시스템을 시뮬레이션하는 모든 작업을 실제로 수행합니다. 현실적인 사용자, 데이터, 애플리케이션을 구성하는 데 상당한 노력이 필요한 다른 많은 고상호작용 허니팟과 달리, DECEIVE의 AI 백엔드는 이 모든 작업을 자동으로 대신 수행합니다.

이 버전의 DECEIVE는 SSH 프로토콜을 통해 Linux 서버를 시뮬레이션합니다. 사용자의 모든 입력, LLM 백엔드가 반환한 출력, 그리고 각 세션이 종료된 후의 요약까지 모두 기록합니다. 또한 사용자 세션이 정상(benign)인지, 의심스러운(suspicious)인지, 또는 명백히 악성(malicious)인지에 대한 판단도 알려줍니다.

⛔️⛔️ DECEIVE는 개념 증명(proof-of-concept) 프로젝트입니다. 프로덕션 품질이 아닙니다. 사용해 보고 배울 수는 있지만, 프로덕션 환경에 배포할 때는 주의하십시오. ⛔️⛔️

지원되는 호스트 플랫폼

DECEIVE는 주로 MacOS 15(Sequoia)에서 개발되었지만, Python3를 실행할 수 있는 모든 UNIX 계열 시스템에서 작동합니다. 여기에는 다른 버전의 MacOS, Linux, 심지어 Windows(Windows Subsystem for Linux를 통해)도 포함됩니다.

설정

GitHub에서 최신 코드 받기

다음 명령을 사용하여 최신 버전을 받을 수 있습니다:

root@kitploit:~
git clone https://github.com/splunk/DECEIVE

이후 지침은 클로닝이 완료된 후 현재 디렉터리를 저장소로 변경했음을 전제로 합니다.

의존성 설치

DECEIVE는 Python 의존성 및 가상 환경 관리를 위해 uv를 사용합니다. 아직 uv를 설치하지 않았다면 Astral의 독립 실행형 설치 프로그램으로 설치하십시오:

root@kitploit:~
curl -LsSf https://astral.sh/uv/install.sh | sh

다음으로, 저장소 루트에서 프로젝트 환경을 동기화합니다:

root@kitploit:~
uv sync

pyproject.toml 및 uv.lock 파일은 의존성의 기준 소스(source of truth)입니다. 이 프로젝트는 의도적으로 requirements.txt 대체 파일을 유지하지 않습니다.

SSH 호스트 키 생성

SSH 서버는 보안 통신을 위해 TLS 키페어가 필요합니다. 저장소의 최상위 디렉터리에서 다음 명령을 사용하여 SSH 키페어를 생성합니다:

root@kitploit:~
ssh-keygen -t rsa -b 4096 -f SSH/ssh_host_key

템플릿 구성 파일 복사

SSH/config.ini.TEMPLATE 파일을 SSH/config.ini로 복사합니다:

구성 파일 편집

SSH/config.ini 파일을 열고 설정을 검토합니다. 필요에 따라 값을 업데이트하되, 사용하려는 LLM 백엔드를 구성하는 [llm] 섹션과 허니팟이 지원할 사용자 이름과 비밀번호를 구성할 수 있는 [user_accounts] 섹션의 값에 특히 주의하십시오.

DECEIVE에 에뮬레이션할 대상을 지정하기

SSH/prompt.txt 파일을 편집하여 DECEIVE가 가장할 시스템 유형에 대한 간단한 설명을 포함하십시오. 여기서 아주 자세히 작성할 필요는 없지만, 더 많은 세부 정보를 제공할수록 시뮬레이션 품질이 좋아집니다. 다음과 같이 개괄적인 수준으로 유지할 수 있습니다:

root@kitploit:~
You are a video game developer's system. Include realistic video game source and asset files.

원한다면 도움이 될 만한 추가 세부 정보를 얼마든지 추가할 수 있습니다. 예를 들어:

root@kitploit:~
You are the Internet-facing mail server for bigschool.edu, a state-sponsored university in Virginia. Valid user accounts are "a20093887", "a20093887-admin", and "mxadmin". Home directories are in "/home/$USERNAME".  Everyone's default shell is /bin/zsh, except mxadmin's, which is bash. Mail spools for all campus users (be sure to include email accounts that are not valid for logon to this server) are in /var/spool/mail. Be sure to simulate some juicy emails there, but make them realistic.  Some should be personal, but some should be just about the business of administering the school, dealing with students, applying for financial aid, etc. Make the spool permissions relaxed, simulating a misconfiguration that would allow anyone on the system to read the files.

허니팟 실행

DECEIVE 허니팟 서버를 시작하려면 먼저 선택한 LLM 백엔드에 필요한 환경 변수를 설정했는지 확인하십시오. 예를 들어, OpenAI 모델을 사용하는 경우 OPENAI_API_KEY 변수를 다음과 같이 설정해야 합니다:

root@kitploit:~
export OPENAI_API_KEY="<your secret API key>"

다음으로, 저장소 루트에서 SSH 허니팟을 실행합니다:

root@kitploit:~
uv run python SSH/ssh_server.py

SSH 디렉터리로 이동하여 실행할 수도 있습니다:

root@kitploit:~
uv run python ssh_server.py

서버가 시작되면 구성된 포트에서 들어오는 SSH 연결을 수신 대기합니다. 출력은 생성하지 않지만 포그라운드에서 계속 실행됩니다.

테스트해 보기

서버가 실행되면(몇 초 정도 걸릴 수 있음) 구성된 포트로 접속합니다. Linux 또는 UNIX 계열 시스템을 사용 중이라면 다음 명령을 시도해 보십시오(구성에 맞게 "localhost"와 "8022"를 적절히 바꾸십시오):

root@kitploit:~
ssh guest@localhost -p 8022

자동화된 테스트 실행

uv sync를 실행한 후 저장소 루트에서 모든 테스트를 실행합니다:

root@kitploit:~
uv run pytest

SSH 통합 테스트만 실행하려면:

root@kitploit:~
uv run pytest tests/test_ssh_integration.py

통합 테스트는 실제 SSH 서버를 로컬의 임의 포트에서 시작하고 SSH 클라이언트로 연결하며, 결정적(deterministic)인 가짜 LLM 백엔드를 사용하므로 어서션(assertion)이 실제 모델 출력에 의존하지 않습니다.

로깅

로그는 log_file 구성 옵션에 지정된 파일에 기록됩니다. 상대 경로 log_file은 로드된 구성 파일이 포함된 디렉터리를 기준으로 해석되므로, 기본 템플릿 값은 SSH/ssh_log.log에 기록됩니다.

DECEIVE 로그는 JSON lines 형식이며, 각 줄이 완전한 JSON 문서입니다.

다음은 사용자가 두 개의 간단한 명령(pwd와 exit)을 실행한 간단한 SSH 세션의 전체 예시입니다:

root@kitploit:~
{"timestamp": "2025-01-10T20:37:55.018+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "SSH connection received", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 59, "funcName": "connection_made", "created": 1736541475.0183098, "msecs": 18.0, "relativeCreated": 13872.790813446045, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": null}
{"timestamp": "2025-01-10T20:37:55.177+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "Authentication success", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 75, "funcName": "begin_auth", "created": 1736541475.1775439, "msecs": 177.0, "relativeCreated": 14032.02486038208, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "username": "guest", "password": ""}
{"timestamp": "2025-01-10T20:37:57.456+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "LLM response", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 174, "funcName": "handle_client", "created": 1736541477.4568708, "msecs": 456.0, "relativeCreated": 16311.351776123047, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "V2VsY29tZSB0byBHYW1lRGV2IENvcnAncyBEZXZlbG9wbWVudCBFbnZpcm9ubWVudAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBXZWxjb21lLCBndWVzdCEgCiAgIExhc3QgbG9naW46IFR1ZSBPY3QgMjQgMTQ6MzI6MTUgMjAyMyBmcm9tIDE5Mi4xNjguMS4xMAogICBQcm9qZWN0czoKICAgICAtIEZhbnRhc3lRdWVzdAogICAgIC0gU3BhY2VFeHBsb3JlcnMKICAgICAtIFJhY2luZ01hbmlhCiAgIFN5c3RlbSBTdGF0dXM6IEFsbCBzeXN0ZW1zIG9wZXJhdGlvbmFsCiAgIFJlbWVtYmVyIHRvIGNvbW1pdCB5b3VyIGNoYW5nZXMhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmd1ZXN0QGRldi13b3Jrc3RhdGlvbjp+JCA="}
{"timestamp": "2025-01-10T20:37:59.333+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "User input", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 184, "funcName": "handle_client", "created": 1736541479.3334038, "msecs": 333.0, "relativeCreated": 18187.88480758667, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "cHdk"}
{"timestamp": "2025-01-10T20:38:00.189+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "LLM response", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 200, "funcName": "handle_client", "created": 1736541480.189375, "msecs": 189.0, "relativeCreated": 19043.855905532837, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "L2hvbWUvZ3Vlc3QKCmd1ZXN0QGRldi13b3Jrc3RhdGlvbjp+JCA="}
{"timestamp": "2025-01-10T20:38:01.944+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "User input", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 184, "funcName": "handle_client", "created": 1736541481.944072, "msecs": 944.0, "relativeCreated": 20798.552989959717, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "ZXhpdA=="}
{"timestamp": "2025-01-10T20:38:04.132+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "Session summary", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 151, "funcName": "session_summary", "created": 1736541484.1324642, "msecs": 132.0, "relativeCreated": 22986.945152282715, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": "session-6355218b-59e5-4549-add3-49e6d1efc133", "details": "The user issued basic commands like `pwd` to check the current working directory and `exit` to terminate the session. This activity is typical of a benign user checking their environment upon logging in and then closing the session. There is no indication of reconnaissance, exploitation, or any post-foothold activity such as privilege escalation or data exfiltration. The actions appear to be standard and routine.\n\nJudgement: BENIGN", "judgement": "BENIGN"}
{"timestamp": "2025-01-10T20:38:04.139+00:00", "level": "INFO", "task_name": "session-6355218b-59e5-4549-add3-49e6d1efc133", "src_ip": "::1", "src_port": 58164, "dst_ip": "::1", "dst_port": 8022, "message": "SSH connection closed", "name": "__main__", "levelname": "INFO", "levelno": 20, "pathname": "/home/deceive/DECEIVE/SSH/./ssh_server.py", "filename": "ssh_server.py", "module": "ssh_server", "exc_info": null, "exc_text": null, "stack_info": null, "lineno": 65, "funcName": "connection_lost", "created": 1736541484.139776, "msecs": 139.0, "relativeCreated": 22994.2569732666, "thread": 8145041472, "threadName": "MainThread", "processName": "MainProcess", "process": 10823, "taskName": null}

참고 사항:

  • 타임스탬프는 항상 UTC입니다. UTC||GTFO!
  • task_name 필드에는 SSH 연결이 수신될 때 할당되는 고유 값이 포함되며, 해당 세션의 모든 로그 항목에 사용됩니다.
  • "message" 필드는 이 항목이 어떤 유형인지 알려줍니다:
    • SSH connection received
    • Authentication success
    • User input
    • LLM response
    • Session summary
    • SSH connection closed
  • 이러한 메시지 유형 중 일부에는 추가 정보가 담긴 details 필드도 있습니다.
    • User input 메시지는 details 필드에 전체 사용자 입력의 base64 인코딩 사본을 포함하며, 이 명령이 대화형(interactive)인지 비대화형(non-interactive)인지(즉, 터미널 세션으로 로그인했는지 또는 SSH 명령줄에서 명령을 제공했는지)를 알려주는 interactive 필드(true/false)도 포함합니다.
    • LLM response 메시지는 필드에 전체 시뮬레이션 응답의 base64 인코딩 사본을 포함합니다.

기여

기여는 언제나 환영합니다! 변경 사항이나 개선 사항을 논의하려면 풀 리퀘스트를 제출하거나 이슈를 열어 주십시오.

라이선스

이 프로젝트는 MIT 라이선스에 따라 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.

도구 다운로드
details
  • Session summary 메시지에는 명령 요약뿐만 아니라 명령이 무엇을 달성하려는 의도였는지에 대한 추정도 포함됩니다. 또한 "BENIGN", "SUSPICIOUS", "MALICIOUS" 중 하나를 포함하는 judgement 필드도 있습니다.
  • 이는 허니팟이며 실제 사용자를 위한 것이 아니므로 사용자 이름과 비밀번호가 기록됩니다! 이 정보는 Authentication success 메시지의 username 및 password 필드에서 확인할 수 있습니다.