SET은 TrustedSec가 만든 합법적 레드팀·보안 인식 훈련 도구로, 명시적 허가와 범위(scope)가 정해진 환경에서만 사용해야 합니다. 동의 없는 시스템·계정·사람을 대상으로 쓰는 것은 불법입니다. 이 공부자료는 실제 공격 실행 절차를 다루지 않으며, 파이썬 프레임워크 설계·모듈 구조·빌드 방식 같은 소프트웨어 공학 관점에만 집중합니다. 보안 학습은 반드시 본인 소유의 격리된 실습 환경(VM)에서 진행하세요.
"보안 담당자가 터미널에서 메뉴 번호를 눌러가며, 우리 조직 구성원을 대상으로 한 모의 피싱·모의 사회공학 훈련을 설계·실행하는 콘솔 프레임워크"입니다. 사회공학(social engineering)이란 기술적 취약점이 아니라 사람의 심리(신뢰·호기심·급함)를 노려 정보를 얻어내는 공격을 말합니다. SET은 그런 공격이 실제로 통하는지를 합의된 범위 안에서 시연해, 직원 교육과 보안 통제 검증에 쓰는 도구입니다.
이름 SET은 Social-Engineer Toolkit의 약자입니다. 2009년 보안 연구자 David Kennedy(별명 ReL1K)가 만들었고, 지금은 보안 컨설팅 회사 TrustedSec가 유지합니다. Kali Linux에 기본 포함될 만큼 업계 표준 도구이며, 15,000개가 넘는 GitHub 스타와 1만 5천 회 이상의 커밋이 쌓인 오래되고 검증된 코드베이스입니다.
건물 관리자는 직원들이 비상시 잘 대피하는지 보려고 실제 불을 지르지 않고 훈련용 경보를 울립니다. 누가 우왕좌왕하는지, 비상구를 못 찾는지 관찰하고 교육에 반영하죠.
SET이 바로 그 "훈련용 경보 발생기"입니다. 진짜 해커가 쓰는 수법(가짜 로그인 페이지, 위장 이메일)을 안전하게 재현해서, 직원들이 얼마나 속는지 측정하고 보완점을 찾게 해 줍니다. 도구 자체는 중립이고, 합법적 훈련이라는 맥락이 핵심입니다.
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 현대화지만, 개발자가 배울 것은 "거대 단일 코어 + 동적 플러그인"이라는 프레임워크 설계의 빛과 그림자다.
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) |
| 패키지 | 역할 |
|---|---|
| pexpect | 다른 CLI 프로그램(예: Metasploit 콘솔)을 자식 프로세스로 띄워 자동 제어 |
| pycryptodome | 암호화(AES 등) — 페이로드·통신 일부에 사용 |
| requests | HTTP 요청 — 웹 자원 가져오기·간단한 통신 |
| pyopenssl | SSL 인증서 생성(자체 서명) — HTTPS 클론 페이지용 |
| pefile | Windows PE(실행파일) 구조 분석·조작 |
| impacket | SMB 등 네트워크 프로토콜 구현 모음(Fast-Track 모듈에서 사용) |
| qrcode / pillow | QR 코드 생성 + 이미지 처리 |
| pymssql<3.0 | MSSQL 연결(Fast-Track). 주석에 "프로젝트 단종됨" 경고가 달린 유일한 버전 핀 |
SET은 익스플로잇 엔진을 자체 구현하지 않는다. 대신 pexpect로 Metasploit·Apache·Ettercap 같은 외부 프로그램을 자식 프로세스로 띄워 제어한다. 설정 파일의 METASPLOIT_PATH가 그 연결고리다. 덕분에 SET 코드는 "사용자 안내 + 외부 도구 조율"에 집중하고, 실제 기능은 검증된 타 도구가 담당한다. 작은 코어로 큰 일을 하는 전형적 통합(integration) 설계다.
SET은 하나의 실행파일이 아니라 용도가 다른 4개의 최상위 스크립트로 구성됩니다. pyproject.toml의 script-files에 등록되어 설치 시 시스템 경로에 들어갑니다.
| 스크립트 | 역할 |
|---|---|
| setoolkit | 메인 대화형 콘솔(~290줄). 메뉴 루프의 진입점 |
| seautomate | "응답 파일"을 읽어 메뉴 선택을 자동 재생 — 비대화형 자동화 하니스 |
| seproxy | 간단한 프록시 런처 |
| seupdate | git pull 기반 자가 업데이트 |
SET의 큰 그림은 "메뉴 구동 명령 디스패처(menu-driven dispatcher)"입니다. 화면에 번호 목록을 출력하고, 사용자가 숫자를 입력하면 거대한 if/elif 사다리가 해당 모듈을 골라 실행합니다. 객체지향의 우아한 명령 패턴(Command Pattern) 대신, 문자열·숫자 비교로 분기하는 절차적 구조가 특징입니다. 아래 도식은 setoolkit 진입부터 모듈 실행까지의 흐름입니다.
# 메뉴 선택의 일생 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.py가 glob으로 파일을 찾아 메뉴를 만들고, 선택 시 exec로 불러옵니다.
플러그인 로더는 exec("import " + name)처럼 문자열로 만든 코드를 그대로 실행한다. 신뢰된 로컬 파일만 다루는 전제라 동작은 하지만, 외부 입력이 섞이면 코드 인젝션으로 이어질 수 있는 위험한 패턴이다. 보안 도구의 내부에서 거꾸로 "동적 코드 실행을 왜 피해야 하는가"를 배우는, 아이러니하지만 훌륭한 반면교사다. 안전한 대안은 importlib.import_module() + 명시적 인터페이스다.
최상위는 4개의 엔트리 스크립트 + 패키징 파일 + src/로 단순합니다. 진짜 구조는 src/ 안에서 "공격 벡터 = 폴더 하나" 형태로 갈립니다. 폴더 이름만 봐도 어떤 기능인지 짐작됩니다.
세 가지가 핵심입니다. 첫째, 코어와 벡터의 분리입니다. src/core/가 프레임워크 엔진이고, 나머지 폴더(webattack/, phishing/…)는 그 위에 얹힌 공격 벡터입니다. 둘째, "기능 = 디렉토리" 규칙이 일관됩니다 — 웹 공격을 보려면 webattack/만 열면 됩니다. 셋째, modules/는 사용자 확장 지점입니다 — 코어를 건드리지 않고 새 모듈을 추가하는 통로입니다. 코드 탐색의 출발점은 setoolkit(진입) → src/core/setcore.py(엔진) → src/core/menu/text.py(메뉴 데이터) 세 파일입니다.
먼저 setoolkit 상단 40줄에서 "root 확인 → 경로/설정 부트스트랩 → 메인 루프"의 뼈대를 잡는다. 그다음 setcore.py에서 create_menu·check_config·module_reload 세 함수만 읽으면 엔진의 80%가 보인다. 마지막으로 menu/text.py로 "메뉴 데이터가 어떻게 코드와 분리됐는지"를 확인하면 전체 구조가 머릿속에 들어온다.
SET은 "콘솔 앱을 프레임워크처럼 구조화하는 법"을 통째로 보여 줍니다. 메뉴 데이터(menu/text.py), 렌더러(create_menu), 디스패처(if/elif)를 분리한 방식을 관찰하세요. 실습: 같은 패턴으로 "메인메뉴 → 서브메뉴 → 동작"의 3단계 CLI 미니앱을 직접 짜 보고, SET의 절차적 분기를 파이썬 dict 디스패치 테이블로 리팩터링해 비교하기.
다른 대화형 CLI(예: 데이터베이스 셸)를 코드로 띄워 답을 주고받는 pexpect는 자동화·테스트에 매우 유용한 기술입니다. 실습: pexpect로 로컬 파이썬 인터프리터나 bc 계산기를 자식 프로세스로 띄워, "프롬프트를 기다렸다가 입력을 보내고 출력을 파싱"하는 30줄 스크립트 작성하기. SET이 Metasploit을 어떻게 조종하는지 원리가 보입니다.
glob + importlib로 폴더의 .py를 자동 발견·로딩하는 구조는 확장 가능한 앱의 기본기입니다. 실습: plugins/ 폴더의 모든 모듈을 찾아 각자 register()를 호출하는 미니 플러그인 시스템을 exec 없이 importlib.import_module()로 구현해, SET의 exec 방식과 안전성을 대조하기.
SET의 check_config는 "직접 만든 파서가 왜 위험한가"를 보여 줍니다. 실습: SET의 config.baseline을 configparser(INI)나 tomllib(TOML)로 다시 표현하고, 접두사 충돌·따옴표 처리 같은 엣지 케이스가 어떻게 자동 해결되는지 확인하기.
SET v8은 setup.py에서 pyproject.toml로 넘어가는 과도기를 보여 줍니다. 실습: 두 파일을 나란히 열어 script-files·requires-python·의존성 선언이 어떻게 대응되는지 매핑하고, 본인 토이 프로젝트를 pyproject.toml만으로 패키징해 pip install -e . 해 보기.
코드를 읽으며 "피싱이 기술적으로 어떻게 구성되는가"를 이해하면, 역으로 방어(이메일 필터·2FA·사용자 교육)의 필요성이 또렷해집니다. 실습: SET의 templates/ 피싱 메일 본문을 읽고, "이 메일을 받은 직원이 의심해야 할 신호 5가지"를 정리해 사내 보안 체크리스트로 만들기. (실제 발송이 아니라 분석·교육 목적)
| 항목 | 요구사항 |
|---|---|
| 대상 OS | Linux(주력) · macOS(실험적) · Windows는 WSL/WSL2 Kali를 통해서만 |
| Python | 3.11 ~ 3.13 (>=3.11,<3.14) |
| 권한 | POSIX에서 root/sudo 필수 — setoolkit이 os.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 한정)
setoolkit 상단 40줄을 읽고 "root 확인 → 경로 부트스트랩 → 설정 동기화 → 메인 루프"의 4단계를 주석으로 정리한다. 각 단계가 어떤 함수(core.check_os() 등)를 호출하는지 표로 만들기.
SET의 create_menu 패턴을 흉내 내, 메뉴 데이터를 리스트로 분리하고 렌더러·디스패처를 나눈 50줄짜리 콘솔 메뉴 앱을 작성한다. "데이터/표현/동작 분리"를 체득하기.
check_config의 startswith 기반 평문 파서를 configparser 또는 tomllib로 다시 구현한다. 접두사가 겹치는 옵션(WEB/WEB_PORT 같은) 케이스를 만들어 두 방식의 차이를 입증하기.
module_handler.py의 glob+exec 로딩을 importlib.import_module() 기반으로 바꾼다. 플러그인이 main()·DESCRIPTION을 노출하는 명시적 인터페이스를 정의하고, exec 제거가 왜 더 안전한지 보고서로 정리하기.
pexpect로 로컬 대화형 프로그램(예: python3 REPL)을 띄워, 프롬프트를 기다렸다가 명령을 보내고 결과를 파싱하는 자동화 스크립트를 만든다. SET이 seautomate로 메뉴 응답을 재생하는 원리를 직접 재현하기.
setcore.py(77KB)가 다른 모듈들에서 얼마나 많이 import되는지 정적 분석(예: grep -r "import.*setcore")으로 세고, "팻 코어"를 책임별 하위 모듈(config/menu/log)로 쪼개는 리팩터링 설계도를 그린다.
| 주차 | 학습 주제 | 실천 목표 |
|---|---|---|
| 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 도구 연계 구조 이해, 합법 실습 랩 구축 |
if/elif 비교로 분기하는 절차적 디스패처를 쓴다.setcore.py(77KB)가 예시로, 편의성과 높은 결합도를 동시에 보여 준다.glob+exec로 구현했으나, 안전한 방식은 importlib.import_module()이다.pyproject.toml)과 레거시 방식(setup.py). SET v8은 둘을 함께 두어 마이그레이션 과도기를 보여 준다.KEY=VALUE 한 줄씩 적힌 설정 파일. SET의 set.config가 예시로, startswith 매칭의 한계(접두사 충돌) 때문에 정식 포맷(INI/TOML)의 필요성을 역설한다.| 링크 | 설명 |
|---|---|
| GitHub 저장소 | 소스 전체. setoolkit·src/core/가 출발점 |
| README.md | 지원 플랫폼·설치·사용·책임 있는 사용 안내 |
| SECURITY.md | 취약점 보고 절차(공개 이슈 금지) |
| pyproject.toml | 버전·의존성·엔트리포인트 선언(현대 패키징) |
| TrustedSec | SET을 유지하는 보안 컨설팅 회사 공식 사이트 |
| TrendShift 페이지 | 트렌딩 추이(일간 18위, 2026-06-10) |
| Kali Tools — SET | Kali Linux의 SET 패키지 문서 |
| 사회공학 (위키백과) | 공격 유형·방어 개념 개관 |
| pexpect 문서 | 프로세스 자동 제어 라이브러리 공식 문서 |