TRENDSHIFT 일간 #18 · 2026-06-10

Social-Engineer Toolkit (SET) 딥다이브
— 메뉴로 조작하는 보안 모의훈련 프레임워크

SET은 보안팀이 "우리 조직 사람들이 가짜 피싱·가짜 사이트에 얼마나 잘 속는지"를 합법적·동의 하에 점검하기 위한 침투 테스트(모의 해킹) 프레임워크입니다. 화려한 GUI 없이 터미널에서 숫자를 골라가며 진행하는 메뉴 구동 콘솔 앱이고, 코드의 78.7%가 Python입니다. 보안 도구로 유명하지만, 개발자 입장에서 진짜 배울 거리는 "하나의 거대한 코어 모듈 + 동적 플러그인 로딩 + 평문 설정 파일"로 짜인 플러그인 디스패처 아키텍처입니다. (trustedsec/social-engineer-toolkit · Python · BSD 3-Clause · v8.1.3 · ⭐15k)
먼저 읽어 주세요 · 합법적 사용 전제
이 문서는 "공격 방법"이 아니라 "코드 구조"를 배우는 자료입니다

SET은 TrustedSec가 만든 합법적 레드팀·보안 인식 훈련 도구로, 명시적 허가와 범위(scope)가 정해진 환경에서만 사용해야 합니다. 동의 없는 시스템·계정·사람을 대상으로 쓰는 것은 불법입니다. 이 공부자료는 실제 공격 실행 절차를 다루지 않으며, 파이썬 프레임워크 설계·모듈 구조·빌드 방식 같은 소프트웨어 공학 관점에만 집중합니다. 보안 학습은 반드시 본인 소유의 격리된 실습 환경(VM)에서 진행하세요.

목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로 — 이게 뭐 하는 물건인가

"보안 담당자가 터미널에서 메뉴 번호를 눌러가며, 우리 조직 구성원을 대상으로 한 모의 피싱·모의 사회공학 훈련을 설계·실행하는 콘솔 프레임워크"입니다. 사회공학(social engineering)이란 기술적 취약점이 아니라 사람의 심리(신뢰·호기심·급함)를 노려 정보를 얻어내는 공격을 말합니다. SET은 그런 공격이 실제로 통하는지를 합의된 범위 안에서 시연해, 직원 교육과 보안 통제 검증에 쓰는 도구입니다.

이름 SET은 Social-Engineer Toolkit의 약자입니다. 2009년 보안 연구자 David Kennedy(별명 ReL1K)가 만들었고, 지금은 보안 컨설팅 회사 TrustedSec가 유지합니다. Kali Linux에 기본 포함될 만큼 업계 표준 도구이며, 15,000개가 넘는 GitHub 스타와 1만 5천 회 이상의 커밋이 쌓인 오래되고 검증된 코드베이스입니다.

핵심 비유

"소방 훈련용 가짜 화재경보기" — 진짜 불을 내지 않고 대피 능력을 점검한다

건물 관리자는 직원들이 비상시 잘 대피하는지 보려고 실제 불을 지르지 않고 훈련용 경보를 울립니다. 누가 우왕좌왕하는지, 비상구를 못 찾는지 관찰하고 교육에 반영하죠.

SET이 바로 그 "훈련용 경보 발생기"입니다. 진짜 해커가 쓰는 수법(가짜 로그인 페이지, 위장 이메일)을 안전하게 재현해서, 직원들이 얼마나 속는지 측정하고 보완점을 찾게 해 줍니다. 도구 자체는 중립이고, 합법적 훈련이라는 맥락이 핵심입니다.

용어
사회공학 (Social Engineering)
시스템의 기술적 허점이 아니라 사람의 심리를 공략해 비밀번호·정보·접근권을 얻는 공격 기법. 피싱 메일, 보이스피싱, 위장 전화 등이 모두 여기 속한다. "가장 약한 고리는 사람"이라는 보안 격언이 배경이다.
용어
침투 테스트 / 레드팀 (Penetration Test / Red Team)
방어가 실제로 작동하는지 확인하려고 허가받은 모의 공격을 수행하는 활동. "레드팀"은 공격자 역할, "블루팀"은 방어자 역할을 맡는다. 핵심 전제는 항상 사전 동의와 범위 합의다.

2왜 주목받는가

트렌딩 이유 · 다른 도구 대비 위치

SET은 2009년부터 있던 고전 도구인데도 트렌딩에 다시 오릅니다. 이유는 두 가지가 겹칩니다. 하나는 v8.1.3로의 현대화 작업(Python 3.11~3.13 대응, pyproject.toml 기반 패키징 전환)이고, 다른 하나는 보안 인식 훈련 수요가 계속 늘면서 "가장 널리 쓰이는 무료 사회공학 프레임워크"로서의 위상이 재조명되기 때문입니다.

다른 도구와의 위치

도구성격SET과의 관계
Metasploit종합 익스플로잇 프레임워크SET이 페이로드 생성·리스너에 Metasploit을 연동(보완 관계)
Gophish웹 기반 피싱 캠페인 관리GUI·캠페인 추적에 강함 / SET은 콘솔·공격 벡터 다양성에 강함
SET메뉴 구동 사회공학 프레임워크여러 공격 벡터를 한 콘솔에서 가이드형으로 묶은 점이 차별점

개발자 관점에서 흥미로운 이유

보안 기능을 떼어 놓고 봐도, SET은 "오래된 파이썬 프레임워크가 어떻게 진화하고, 어디서 기술 부채를 안고 있는가"를 보여 주는 살아 있는 교재입니다. 단일 거대 코어 모듈(setcore.py가 무려 77KB), 평문 key=value 설정 파일, exec()로 플러그인을 불러오는 방식 등은 "이렇게 짜면 빠르지만 이런 대가를 치른다"는 트레이드오프를 적나라하게 드러냅니다.

한 줄 요약

SET은 "20년 된 맥가이버 칼"과 같다. 새 도구들이 더 예쁜 GUI를 내놓아도, 한 손에 모든 공격 벡터를 쥐여 주는 편의성과 검증된 안정성 덕에 현장에서 안 사라진다. 트렌딩 이유는 v8 현대화지만, 개발자가 배울 것은 "거대 단일 코어 + 동적 플러그인"이라는 프레임워크 설계의 빛과 그림자다.

3기술 스택 전체 지도

언어 · 패키징 · 의존성 · 엔트리포인트를 각각 뜯어본다

SET은 웹 프레임워크 같은 화려함이 없는 순수 파이썬 CLI 스택입니다. 핵심은 "표준 라이브러리 위에 얇은 의존성을 얹고, 외부 보안 도구들을 호출해 묶는다"는 점입니다. 즉 SET 자신은 오케스트레이터(지휘자)에 가깝고, 실제 무거운 작업(익스플로잇·페이로드 실행)은 Metasploit 같은 외부 도구에 위임합니다.

언어 & 패키징

항목내용
주 언어Python 78.7% — 메뉴·로직·오케스트레이션 전부
보조 언어C++ 13.0%·C 1.9%(RATTE 등 네이티브 페이로드), Shell 3.6%, Java 1.4%(자바 애플릿 템플릿), CSS 0.9%(클론 페이지)
Python 버전requires-python = ">=3.11,<3.14" — 3.11~3.13 지원
패키징(현대)pyproject.toml + setuptools(>=69) 백엔드. pip install -e .로 개발 설치
패키징(레거시)setup.py/usr/local/share/setoolkit에 복사 + /etc/setoolkit/set.config 생성
배포Kali/WSL에서 sudo apt install set, Dockerfile도 제공
버전8.1.3 (단, 설정 스키마 버전은 별도로 CONFIG_VERSION=7.7.9)

핵심 외부 의존성 (requirements.txt)

패키지역할
pexpect다른 CLI 프로그램(예: Metasploit 콘솔)을 자식 프로세스로 띄워 자동 제어
pycryptodome암호화(AES 등) — 페이로드·통신 일부에 사용
requestsHTTP 요청 — 웹 자원 가져오기·간단한 통신
pyopensslSSL 인증서 생성(자체 서명) — HTTPS 클론 페이지용
pefileWindows PE(실행파일) 구조 분석·조작
impacketSMB 등 네트워크 프로토콜 구현 모음(Fast-Track 모듈에서 사용)
qrcode / pillowQR 코드 생성 + 이미지 처리
pymssql<3.0MSSQL 연결(Fast-Track). 주석에 "프로젝트 단종됨" 경고가 달린 유일한 버전 핀
설계 포인트
무거운 일은 외부 도구에 위임하는 "오케스트레이터" 패턴

SET은 익스플로잇 엔진을 자체 구현하지 않는다. 대신 pexpectMetasploit·Apache·Ettercap 같은 외부 프로그램을 자식 프로세스로 띄워 제어한다. 설정 파일의 METASPLOIT_PATH가 그 연결고리다. 덕분에 SET 코드는 "사용자 안내 + 외부 도구 조율"에 집중하고, 실제 기능은 검증된 타 도구가 담당한다. 작은 코어로 큰 일을 하는 전형적 통합(integration) 설계다.

4개의 엔트리포인트 스크립트

SET은 하나의 실행파일이 아니라 용도가 다른 4개의 최상위 스크립트로 구성됩니다. pyproject.tomlscript-files에 등록되어 설치 시 시스템 경로에 들어갑니다.

스크립트역할
setoolkit메인 대화형 콘솔(~290줄). 메뉴 루프의 진입점
seautomate"응답 파일"을 읽어 메뉴 선택을 자동 재생 — 비대화형 자동화 하니스
seproxy간단한 프록시 런처
seupdategit pull 기반 자가 업데이트

4아키텍처 심화 분석

메뉴 구동 디스패처 + 동적 플러그인 로딩

SET의 큰 그림은 "메뉴 구동 명령 디스패처(menu-driven dispatcher)"입니다. 화면에 번호 목록을 출력하고, 사용자가 숫자를 입력하면 거대한 if/elif 사다리가 해당 모듈을 골라 실행합니다. 객체지향의 우아한 명령 패턴(Command Pattern) 대신, 문자열·숫자 비교로 분기하는 절차적 구조가 특징입니다. 아래 도식은 setoolkit 진입부터 모듈 실행까지의 흐름입니다.

+========================================================+ | setoolkit (진입점 · 약 330줄) | | 1) root 권한 확인 (os.geteuid() != 0 → 종료) | | 2) 경로 부트스트랩 (소스 체크아웃 vs 설치 위치 판별) | | 3) 설정 동기화 (config.baseline → /etc/setoolkit/) | +========================================================+ | import v +========================================================+ | src/core/setcore.py ← 공유 "코어" 파사드 (77KB) ★★ | | check_os() · check_config() · create_menu · | | setprompt() · module_reload() · log() ... | +========================================================+ | v +========================================================+ | while True: 메인 메뉴 루프 | | create_menu(text.main_text, text.main_menu) ← 출력 | | choice = input(setprompt(...)) ← 입력 | | if choice=='1': import src.core.set (사회공학) | | if choice=='2': import src.core.fasttrack (펜테스트)| | if choice=='3': import src.core.module_handler(플러그인)| | if choice=='4': core.update_set() (업데이트) ... | +========================================================+ | 3) 선택 시 v +========================================================+ | module_handler.py : 서드파티 플러그인 로더 | | glob("modules/*.py") → 각 파일에서 MAIN= 라벨 파싱 | | → exec import name → exec name.main() 호출 | +========================================================+ | [외부 도구] Metasploit · Apache · Ettercap (pexpect로 제어)

메뉴 하나가 처리되는 흐름

# 메뉴 선택의 일생
1. 화면 출력    → create_menu(text.X_text, text.X_menu)  (그리기만 담당)
2. 입력 받기    → input(core.setprompt(...))  (set:webattack> 형태 프롬프트)
3. 분기         → 거대한 if/elif 사다리가 숫자 문자열 비교
4. 모듈 적재    → try module_reload(mod) except import mod
5. 실행         → 모듈의 최상위 코드가 import 시점에 실행됨
비유

옛날 ARS 전화 상담과 같다. "상담은 1번, 예약은 2번"을 안내(create_menu)하고, 누른 번호(input)에 따라 해당 부서로 연결(if/elif)한다. 부서(모듈)는 통화가 연결될 때마다 새로 호출된다(module_reload). 화려하진 않지만 누구나 즉시 이해하는 구조이며, SET이 입문 보안 도구로 사랑받는 이유이기도 하다.

핵심 설계 패턴 ① — 단일 거대 코어 파사드

거의 모든 모듈이 from src.core.setcore import * 또는 import src.core.setcore as core로 시작합니다. 즉 setcore.py 하나가 설정 읽기·메뉴 그리기·프롬프트 생성·로깅·OS 판별을 전부 담은 평평한 유틸리티 네임스페이스입니다. 이를 "팻 코어(fat core)" 패턴이라 부릅니다 — 쓰기는 편하지만 77KB까지 비대해진 건 모듈 결합도가 높다는 안티패턴 사례이기도 합니다. 좋은 면과 나쁜 면을 동시에 배우는 교재입니다.

핵심 설계 패턴 ② — 데이터와 동작의 분리(메뉴)

메뉴 화면은 src/core/menu/text.py평행한 리스트로 데이터화되어 있습니다. 예컨대:

# src/core/menu/text.py (발췌)
main_text = " Select from the menu:\n"
main_menu = ['Social-Engineering Attacks',
             'Penetration Testing (Fast-Track)',
             'Third Party Modules',
             'Update the Social-Engineer Toolkit', ...]

그리고 create_menu 클래스는 출력만 합니다 — 분기는 전혀 하지 않습니다. "데이터(메뉴 항목)"와 "표현(렌더링)"과 "동작(if/elif 분기)"을 따로 둔 셈인데, 분기가 객체가 아니라 절차적 비교라는 점이 한계입니다.

# src/core/setcore.py — create_menu는 렌더링 전용
class create_menu:
    def __init__(self, text, menu):
        print(text)
        for i, option in enumerate(menu):
            menunum = i + 1
            # "0D" 센티넬이면 '메인 메뉴로 복귀' 출력
            print('   %s) %s' % (menunum, option))

핵심 설계 패턴 ③ — 평문 설정 레지스트리

SET의 모든 동작 토글은 /etc/setoolkit/set.config라는 평문 KEY=VALUE 파일에서 읽힙니다. 약 65개 옵션이 들어 있고, check_config("KEY=") 함수가 파일을 줄 단위로 훑어 값을 찾습니다.

# src/core/setcore.py — 평문 설정 파서 (핵심 로직)
def check_config(param):
    fileopen = open("/etc/setoolkit/set.config", "r")
    for line in fileopen:
        line = line.rstrip()
        if line.startswith(param):
            line = line.replace('"','').replace("'","")
            return line.split("=", 1)[1]

이 파서는 startswith로만 매칭하므로 옵션 이름이 서로 접두사가 겹치면 안 됩니다. 단순하지만 깨지기 쉬운 설계로, "왜 설정 파서에 정식 포맷(INI/TOML)을 쓰는가"를 역으로 가르쳐 줍니다. 설정 버전은 CONFIG_VERSION 토큰으로 관리되어, 낡은 설정은 자동으로 백업(.bak) 후 갱신됩니다.

핵심 설계 패턴 ④ — 관례 기반 플러그인 계약

서드파티 모듈은 modules/ 폴더에 .py 파일을 떨어뜨리기만 하면 됩니다. 계약은 단 두 가지: 파일에 MAIN="설명" 마커가 있고, main() 함수를 노출하면 됩니다. module_handler.pyglob으로 파일을 찾아 메뉴를 만들고, 선택 시 exec로 불러옵니다.

코드에서 배우는 보안 교훈
exec() + 파일명 기반 import = 교과서적 "풋건(footgun)"

플러그인 로더는 exec("import " + name)처럼 문자열로 만든 코드를 그대로 실행한다. 신뢰된 로컬 파일만 다루는 전제라 동작은 하지만, 외부 입력이 섞이면 코드 인젝션으로 이어질 수 있는 위험한 패턴이다. 보안 도구의 내부에서 거꾸로 "동적 코드 실행을 왜 피해야 하는가"를 배우는, 아이러니하지만 훌륭한 반면교사다. 안전한 대안은 importlib.import_module() + 명시적 인터페이스다.

5디렉토리 구조 해부

주요 폴더의 역할 — 어디에 무엇이 있나

최상위는 4개의 엔트리 스크립트 + 패키징 파일 + src/로 단순합니다. 진짜 구조는 src/ 안에서 "공격 벡터 = 폴더 하나" 형태로 갈립니다. 폴더 이름만 봐도 어떤 기능인지 짐작됩니다.

social-engineer-toolkit/ ├── setoolkit # 메인 대화형 콘솔 진입점 ★★ ├── seautomate # 응답 파일 재생(비대화형 자동화) ├── seproxy seupdate # 프록시 런처 · git 자가 업데이트 ├── pyproject.toml # 현대 패키징(버전·의존성·스크립트) ★ ├── setup.py # 레거시 시스템 설치 스크립트 ├── requirements.txt # 런타임 의존성 목록 ├── Dockerfile # 컨테이너 빌드 ├── modules/ # ▼ 서드파티 플러그인 드롭 폴더(MAIN= + main()) ★ ├── readme/ # LICENSE(BSD) · User_Manual.pdf ├── docs/ tests/ # 문서 · pytest 테스트 └── src/ ├── core/ # ▼ 프레임워크 엔진 ★★ │ ├── setcore.py # 공유 코어 파사드(77KB): 설정·메뉴·로깅 ★★ │ ├── set.py # 사회공학 공격 서브메뉴 엔진(58KB) │ ├── fasttrack.py # Fast-Track 펜테스트 서브메뉴 │ ├── module_handler.py # 서드파티 플러그인 로더(glob+exec) ★ │ ├── menu/text.py # 메뉴 데이터(평행 리스트) ★ │ ├── config.baseline# 설정 원본(KEY=VALUE 65개) │ └── update_config.py# 설정 재생성·버전 관리 ├── webattack/ # 웹 기반 벡터: 사이트 클론·하베스터·탭내빙 등 ├── phishing/ # 스피어피싱·대량메일 + smtp/ ├── powershell/ # PowerShell 페이로드 생성기 ├── payloads/ # 페이로드 아티팩트: exe/ powershell/ ratte/(C++) ├── fasttrack/ # Fast-Track 모듈: mssql·psexec·autopwn·sccm ├── teensy/ # HID/Arduino(.ino) 생성기 — 하드웨어 공격 ├── wireless/ # 무선 공격 오케스트레이션(airbase-ng 래핑) ├── qrcode/ # QR 코드 생성기(qrcode 의존) ├── html/ # 클론 사이트용 웹서버 + 페이지 템플릿 └── templates/ # *.template 피싱 페이지/메일 본문

구조에서 읽어야 할 신호

세 가지가 핵심입니다. 첫째, 코어와 벡터의 분리입니다. src/core/가 프레임워크 엔진이고, 나머지 폴더(webattack/, phishing/…)는 그 위에 얹힌 공격 벡터입니다. 둘째, "기능 = 디렉토리" 규칙이 일관됩니다 — 웹 공격을 보려면 webattack/만 열면 됩니다. 셋째, modules/는 사용자 확장 지점입니다 — 코어를 건드리지 않고 새 모듈을 추가하는 통로입니다. 코드 탐색의 출발점은 setoolkit(진입) → src/core/setcore.py(엔진) → src/core/menu/text.py(메뉴 데이터) 세 파일입니다.

탐색 팁
읽는 순서: setoolkit → setcore.py → menu/text.py

먼저 setoolkit 상단 40줄에서 "root 확인 → 경로/설정 부트스트랩 → 메인 루프"의 뼈대를 잡는다. 그다음 setcore.py에서 create_menu·check_config·module_reload 세 함수만 읽으면 엔진의 80%가 보인다. 마지막으로 menu/text.py로 "메뉴 데이터가 어떻게 코드와 분리됐는지"를 확인하면 전체 구조가 머릿속에 들어온다.

6학습 포인트 (기술별)

각 기술에서 무엇을 배울 수 있나 + 실습 아이디어

① 메뉴 구동 CLI 프레임워크 설계

SET은 "콘솔 앱을 프레임워크처럼 구조화하는 법"을 통째로 보여 줍니다. 메뉴 데이터(menu/text.py), 렌더러(create_menu), 디스패처(if/elif)를 분리한 방식을 관찰하세요. 실습: 같은 패턴으로 "메인메뉴 → 서브메뉴 → 동작"의 3단계 CLI 미니앱을 직접 짜 보고, SET의 절차적 분기를 파이썬 dict 디스패치 테이블로 리팩터링해 비교하기.

② pexpect로 외부 프로세스 자동 제어

다른 대화형 CLI(예: 데이터베이스 셸)를 코드로 띄워 답을 주고받는 pexpect는 자동화·테스트에 매우 유용한 기술입니다. 실습: pexpect로 로컬 파이썬 인터프리터나 bc 계산기를 자식 프로세스로 띄워, "프롬프트를 기다렸다가 입력을 보내고 출력을 파싱"하는 30줄 스크립트 작성하기. SET이 Metasploit을 어떻게 조종하는지 원리가 보입니다.

③ 동적 모듈 로딩(플러그인 시스템)

glob + importlib로 폴더의 .py를 자동 발견·로딩하는 구조는 확장 가능한 앱의 기본기입니다. 실습: plugins/ 폴더의 모든 모듈을 찾아 각자 register()를 호출하는 미니 플러그인 시스템을 exec 없이 importlib.import_module()로 구현해, SET의 exec 방식과 안전성을 대조하기.

④ 설정 관리 — 평문 vs 정식 포맷

SET의 check_config는 "직접 만든 파서가 왜 위험한가"를 보여 줍니다. 실습: SET의 config.baselineconfigparser(INI)나 tomllib(TOML)로 다시 표현하고, 접두사 충돌·따옴표 처리 같은 엣지 케이스가 어떻게 자동 해결되는지 확인하기.

⑤ 레거시 → 현대 패키징 마이그레이션

SET v8은 setup.py에서 pyproject.toml로 넘어가는 과도기를 보여 줍니다. 실습: 두 파일을 나란히 열어 script-files·requires-python·의존성 선언이 어떻게 대응되는지 매핑하고, 본인 토이 프로젝트를 pyproject.toml만으로 패키징해 pip install -e . 해 보기.

⑥ 보안 인식 — 공격을 알아야 방어한다

코드를 읽으며 "피싱이 기술적으로 어떻게 구성되는가"를 이해하면, 역으로 방어(이메일 필터·2FA·사용자 교육)의 필요성이 또렷해집니다. 실습: SET의 templates/ 피싱 메일 본문을 읽고, "이 메일을 받은 직원이 의심해야 할 신호 5가지"를 정리해 사내 보안 체크리스트로 만들기. (실제 발송이 아니라 분석·교육 목적)

7하드웨어 / 시스템 요구사항

설치·실행에 필요한 것
항목요구사항
대상 OSLinux(주력) · macOS(실험적) · Windows는 WSL/WSL2 Kali를 통해서만
Python3.11 ~ 3.13 (>=3.11,<3.14)
권한POSIX에서 root/sudo 필수setoolkitos.geteuid()로 강제
핵심 외부 도구Metasploit(설정상 "정상 동작에 필요"), 선택적으로 Apache·Ettercap·dsniff·Sendmail
Python 의존성pexpect·pycryptodome·requests·pyopenssl·pefile·impacket·qrcode·pillow·pymssql
설치 위치(레거시)/usr/local/share/setoolkit + 설정 /etc/setoolkit/set.config
실습 환경격리된 VM 강력 권장 — 실제 네트워크와 분리
법적·윤리적 주의 (반복 강조)
반드시 본인 소유의 격리 환경에서, 허가받은 대상에만

SET은 root 권한으로 네트워크 서비스(80·443 포트 웹서버 등)를 띄우고 외부 도구를 호출한다. 동의·범위 합의 없는 사용은 명백한 불법이며, 학습 시에도 인터넷과 분리된 가상머신(VirtualBox/VMware의 호스트 전용 네트워크) 안에서만 다뤄야 한다. 이 문서의 실습 과제는 모두 "코드 읽기·구조 분석" 중심이며, 실제 공격 송출을 권하지 않는다.

가장 안전한 시작 — 코드만 읽는 방법

# 실행하지 않고 소스만 받아 구조를 분석 (가장 안전)
git clone --depth 1 https://github.com/trustedsec/social-engineer-toolkit set
cd set

# 엔진의 핵심 3파일만 먼저 읽기
less setoolkit                  # 진입점·메인 루프
less src/core/setcore.py        # 코어 파사드(검색: create_menu, check_config)
less src/core/menu/text.py      # 메뉴 데이터 구조

# 실제 실행이 필요하면 반드시 격리된 Kali VM 안에서:
#   python3 -m venv .venv && source .venv/bin/activate
#   pip install -e .   →   sudo setoolkit  (VM 한정)

8직접 해볼 수 있는 실습 과제

난이도별 — 코드 읽기·재구현 중심(공격 송출 아님)
난이도 ★☆☆ 입문

엔트리포인트 해부하기

setoolkit 상단 40줄을 읽고 "root 확인 → 경로 부트스트랩 → 설정 동기화 → 메인 루프"의 4단계를 주석으로 정리한다. 각 단계가 어떤 함수(core.check_os() 등)를 호출하는지 표로 만들기.

난이도 ★☆☆ 입문

나만의 메뉴 구동 CLI 만들기

SET의 create_menu 패턴을 흉내 내, 메뉴 데이터를 리스트로 분리하고 렌더러·디스패처를 나눈 50줄짜리 콘솔 메뉴 앱을 작성한다. "데이터/표현/동작 분리"를 체득하기.

난이도 ★★☆ 중급

설정 파서를 configparser로 교체

check_configstartswith 기반 평문 파서를 configparser 또는 tomllib로 다시 구현한다. 접두사가 겹치는 옵션(WEB/WEB_PORT 같은) 케이스를 만들어 두 방식의 차이를 입증하기.

난이도 ★★☆ 중급

안전한 플러그인 로더 재작성

module_handler.pyglob+exec 로딩을 importlib.import_module() 기반으로 바꾼다. 플러그인이 main()·DESCRIPTION을 노출하는 명시적 인터페이스를 정의하고, exec 제거가 왜 더 안전한지 보고서로 정리하기.

난이도 ★★★ 고급

pexpect 자동 제어 미니 프로젝트

pexpect로 로컬 대화형 프로그램(예: python3 REPL)을 띄워, 프롬프트를 기다렸다가 명령을 보내고 결과를 파싱하는 자동화 스크립트를 만든다. SET이 seautomate로 메뉴 응답을 재생하는 원리를 직접 재현하기.

난이도 ★★★ 고급

코어 결합도 측정·리팩터링 제안

setcore.py(77KB)가 다른 모듈들에서 얼마나 많이 import되는지 정적 분석(예: grep -r "import.*setcore")으로 세고, "팻 코어"를 책임별 하위 모듈(config/menu/log)로 쪼개는 리팩터링 설계도를 그린다.

9관련 기술 심화 학습 로드맵

주차별 — 이 레포를 발판으로 더 멀리
주차학습 주제실천 목표
1주차사회공학·보안 윤리피싱·프리텍스팅 유형 이해, 합법적 레드팀의 범위·동의 절차 학습
2주차SET 코드 구조 읽기setoolkit·setcore.py·menu/text.py 정독, 메뉴 디스패치 흐름 도식화
3주차파이썬 CLI 프레임워크argparse·click·rich로 현대적 CLI 작성, SET 패턴과 비교
4주차프로세스 자동화(pexpect)외부 대화형 도구를 코드로 제어, 입출력 파싱 익히기
5주차플러그인 아키텍처importlib·entry_points로 안전한 확장 시스템 구현
6주차패키징·배포pyproject.toml·setuptools·Docker로 CLI 도구 배포
7주차방어 관점(블루팀)피싱 탐지·이메일 인증(SPF/DKIM/DMARC)·2FA·사용자 교육 설계
8주차보안 도구 생태계Metasploit·Gophish·Kali 도구 연계 구조 이해, 합법 실습 랩 구축

10핵심 키워드 사전

이 프로젝트에 등장하는 주요 용어
용어
SET (Social-Engineer Toolkit)
TrustedSec가 만든 오픈소스 사회공학 침투 테스트 프레임워크. 메뉴 구동 콘솔로 모의 피싱·사이트 클론 등 공격 벡터를 합법적 훈련 목적으로 묶어 제공한다. Kali Linux 기본 포함.
용어
사회공학 (Social Engineering)
기술적 취약점이 아니라 사람의 심리를 노려 정보·접근권을 얻는 공격. 피싱, 보이스피싱, 위장 등이 포함된다.
용어
메뉴 구동 디스패처 (Menu-driven Dispatcher)
번호 목록을 출력하고 입력 숫자에 따라 동작을 고르는 콘솔 앱 구조. SET은 객체형 명령 패턴 대신 if/elif 비교로 분기하는 절차적 디스패처를 쓴다.
용어
팻 코어 (Fat Core) 파사드
설정·메뉴·로깅 등 다양한 책임을 한 모듈에 몰아넣은 거대 유틸리티 네임스페이스. SET의 setcore.py(77KB)가 예시로, 편의성과 높은 결합도를 동시에 보여 준다.
용어
동적 모듈 로딩 (Dynamic Module Loading)
실행 중에 폴더의 코드 파일을 발견·적재하는 기법. SET은 glob+exec로 구현했으나, 안전한 방식은 importlib.import_module()이다.
용어
pexpect
대화형 CLI 프로그램을 자식 프로세스로 띄워, 프롬프트를 기다렸다 입력을 보내고 출력을 파싱하는 파이썬 라이브러리. SET이 Metasploit 등 외부 도구를 조종하는 핵심 수단.
용어
Metasploit
가장 널리 쓰이는 종합 익스플로잇·페이로드 프레임워크. SET은 이를 자체 구현하지 않고 연동(오케스트레이션)해 페이로드 생성·리스너 기능을 빌려 쓴다.
용어
페이로드 (Payload) / 리스너 (Listener)
페이로드는 대상에서 실행될 코드, 리스너는 그 페이로드와의 연결을 기다리는 서버 측 구성요소. 합법적 테스트에서는 통제된 환경의 연결 검증에 쓰인다.
용어
Fast-Track
SET에 통합된 펜테스트 모듈 묶음(mssql·psexec·autopwn 등). 사회공학 외의 자동화된 침투 보조 기능을 메뉴 2번으로 제공한다.
용어
pyproject.toml vs setup.py
파이썬 패키징의 현대 표준(pyproject.toml)과 레거시 방식(setup.py). SET v8은 둘을 함께 두어 마이그레이션 과도기를 보여 준다.
용어
평문 설정 레지스트리 (Plain-text Config)
KEY=VALUE 한 줄씩 적힌 설정 파일. SET의 set.config가 예시로, startswith 매칭의 한계(접두사 충돌) 때문에 정식 포맷(INI/TOML)의 필요성을 역설한다.
용어
레드팀 / 블루팀
공격자 역할(레드)과 방어자 역할(블루). SET은 레드팀 도구지만, 코드 학습은 블루팀(탐지·교육) 설계에도 직접 도움이 된다.

11참고 링크

더 깊이 파고들 때
링크설명
GitHub 저장소소스 전체. setoolkit·src/core/가 출발점
README.md지원 플랫폼·설치·사용·책임 있는 사용 안내
SECURITY.md취약점 보고 절차(공개 이슈 금지)
pyproject.toml버전·의존성·엔트리포인트 선언(현대 패키징)
TrustedSecSET을 유지하는 보안 컨설팅 회사 공식 사이트
TrendShift 페이지트렌딩 추이(일간 18위, 2026-06-10)
Kali Tools — SETKali Linux의 SET 패키지 문서
사회공학 (위키백과)공격 유형·방어 개념 개관
pexpect 문서프로세스 자동 제어 라이브러리 공식 문서