티스토리 뷰

AI가 스스로 정찰하고 취약점을 확인하는 자율 모의해킹 도구 PentestGPT를 직접 구축해 봤습니다. 설치 명령 몇 줄이면 끝날 줄 알았는데, 실제로는 구축 위치 선택부터 버전 함정, 실행 경로 변경까지 막히는 지점이 꽤 많았습니다. 이 글은 그 과정을 처음부터 끝까지, 막힌 곳과 해결 방법까지 정리한 기록입니다.

📌 3줄 요약

· PentestGPT는 에이전트가 명령을 직접 실행하므로, 회사 PC나 WSL보다 격리된 VirtualBox + Kali VM에 구축하는 게 안전합니다.

· v1.0부터 구조가 바뀌어, README의 make docker-run 대신 로컬 실행(make run)이 현재 동작하는 경로입니다.

· 구축은 VirtualBox 7.2 → Kali 가져오기 → SSH 보안 → Docker → PentestGPT·Claude 로그인 → 연습 앱으로 첫 실행 7단계면 됩니다.

※ 본 글은 실습 과정을 일반화한 기록이며 특정 조직·서비스와 무관합니다. 계정·도메인·IP 등 실제 환경 정보는 쓰지 않았고, 명령어 속 주소·포트는 누구나 쓰는 예시값입니다.


🤔 설치만 하면 끝일까요?

"AI가 모의해킹을 대신해 준다"는 이야기를 듣고 바로 설치해 보려는 분이 많습니다. 그런데 이런 질문부터 막히기 쉽습니다. 회사 PC에 그냥 깔아도 될까? WSL이면 충분하지 않을까? README대로 했는데 왜 실행이 안 될까?

특히 PentestGPT는 최근 큰 폭으로 구조가 바뀌어서, 예전 설치 글이나 README 예시만 보고 따라 하면 중간에 멈추게 됩니다. 아래에서 개념부터 짚고, 어디에 어떻게 올려야 하는지 순서대로 보겠습니다.


🧭 PentestGPT는 어떤 도구인가

PentestGPT는 대규모 언어 모델(LLM)을 이용해 침투 테스트 과정을 돕는 오픈소스 연구용 프로토타입입니다. 초기 버전은 사람이 명령을 실행하고 결과를 알려주면 다음 단계를 추천하는 대화형 도구였습니다. 지금은 v1.0 자율 에이전트로 바뀌어, 계획을 세우는 역할(Supervisor)과 실제 명령을 실행하는 역할(Executor)이 번갈아 돌며 정찰부터 취약점 확인까지 스스로 진행합니다.

 

추론은 외부 LLM 백엔드가 맡습니다. 현재 자율 모드는 Claude Code CLI(또는 Codex CLI)를 구동하는 방식이라, 구축 과정에 이 CLI 설치와 로그인이 포함됩니다. 이 글의 실습 구성은 위 그림처럼 Windows 호스트 → VirtualBox NAT → Kali VM → 에이전트 → 연습용 취약 앱 순서입니다.

구분 레거시(대화형) v1.0 자율 에이전트
동작 사람이 실행, 도구가 다음 단계 추천 에이전트가 명령을 직접 실행
설치 pip 기반 uv·Docker 기반, Python 3.12 이상
백엔드 여러 LLM API Claude Code CLI(자율 모드), Codex CLI

⚠️ 어디에 구축해야 할까

가장 먼저 정할 것은 "어디에 올리느냐"입니다. 핵심 기준은 두 가지입니다. 에이전트가 명령을 직접 실행하는가, 그리고 나중에 실제 서버로 옮길 계획인가입니다. 둘 다 "예"라면 VM이 답입니다.

기준 VirtualBox + Kali VM WSL2
격리 별도 커널·네트워크, 처음부터 닫힌 구조 Windows 파일·실행 파일과 연동이 기본으로 열려 있음
서버 이전 같은 Kali라 절차를 거의 그대로 재사용 전용 커널·네트워크 특성 때문에 일부 재작업 필요
롤백 스냅샷으로 즉시 복구 export/import로 가능하나 번거로움
가벼움 상대적으로 무거움 가볍고 빠름

⚠️ 회사 PC라면 먼저 확인할 것

관리 대상 회사 PC는 공격성 보안 도구 설치가 정책상 금지됐거나, 보안 관제(EDR)에 탐지될 수 있습니다. 반드시 사내 승인을 받고, 점검은 인가된 대상에만 하세요. 또 WSL과 VirtualBox는 하이퍼바이저를 두고 충돌할 수 있으니 한쪽을 주력으로 정하는 게 좋습니다.


💡 실수하기 쉬운 지점 7가지

직접 해보며 실제로 막혔던 지점들입니다. 가장 의외였던 건 공식 README에 나온 실행 명령이 현재는 동작하지 않는다는 점이었습니다. 같은 저장소의 Docker 상태 문서에는 자율 프레임워크가 아직 이미지에 포함되지 않아 make docker-run이 일부러 실패하도록 돼 있다고 적혀 있습니다.

지점 원인 해결
확장 팩 Extension Pack은 개인·교육용(PUEL) 라이선스 이 용도엔 불필요, 회사 PC엔 설치하지 않음
실행 명령 make docker-run은 현재 미구현 호스트에서 make run(로컬 실행) 사용
설치 범위 루트 make install은 레거시만 설치, 백엔드 SDK는 선택 항목 pentestgpt_agent 폴더에서 uv sync --extra claude
로그인 claude setup-token은 토큰을 화면에 출력만 하고 저장하지 않음 claude 대화형 로그인으로 자격증명을 파일에 저장
SSH 끊김 OpenSSH 9.8부터 실패한 접속을 출발지 주소별로 차단, NAT에선 모두 한 주소로 보임 잠시 대기 또는 NAT 게이트웨이 주소만 예외 처리
셸 차이 Kali 기본 셸은 zsh라 bash식 read -p가 실패 bash -c로 감싸거나 에디터로 직접 작성

참고로 이번 실습은 처음에 RHEL 계열 리눅스로 시작했다가, v1.0의 구조 변경(uv·Docker 기반)과 점검 도구 기본 탑재를 고려해 Kali로 바꿨습니다. 또 사내망처럼 HTTPS를 중간에서 검사하는 환경이라면 Docker 빌드·uv·Claude 설치 곳곳에서 인증서 오류가 납니다. 이 부분은 분량이 커서 다음 편에서 따로 정리합니다.


🛠 단계별 구축 방법

1단계 — VirtualBox 7.2 설치

virtualbox.org에서 Windows용 7.2 계열 최신판을 받아, 같은 페이지의 SHA256 값과 대조한 뒤 설치합니다. 설치 중 가상 네트워크 드라이버가 깔리면서 호스트 네트워크가 잠깐 끊기니 원격 작업이 없을 때 진행하세요.

# Windows PowerShell (일반 권한)
Get-FileHash "$env:USERPROFILE\Downloads\VirtualBox-7.2.*-Win.exe" -Algorithm SHA256

2단계 — Kali 사전 빌드 VM 가져오기

kali.org의 Virtual Machines → VirtualBox 이미지를 받아 해시를 확인하고, 영문 경로에 압축을 푼 뒤 등록합니다. 명령은 관리자가 아닌 일반 PowerShell에서 실행해야 VirtualBox 관리자 화면과 VM 목록이 어긋나지 않습니다.

$VBM = "$env:ProgramFiles\Oracle\VirtualBox\VBoxManage.exe"
& $VBM registervm "D:\VMs\kali-linux-2026.x-virtualbox-amd64.vbox"
$KVM = "kali-linux-2026.x-virtualbox-amd64"

# 메모리·CPU, NAT, 클립보드·드래그앤드롭 차단
& $VBM modifyvm $KVM --memory 6144 --cpus 4 --nic1 nat --clipboard disabled --draganddrop disabled

# SSH 포트포워딩은 호스트의 127.0.0.1에만 묶기 (예시 포트 2222)
& $VBM modifyvm $KVM --natpf1 "ssh,tcp,127.0.0.1,2222,,22"

# 부팅 전 스냅샷
& $VBM snapshot $KVM take "00_imported"

🔐 보안 포인트

포트포워딩에서 호스트 IP를 비워 두면 PC의 모든 네트워크 인터페이스로 VM이 열립니다. 사내망에 VM SSH가 노출되지 않도록 반드시 127.0.0.1을 지정하세요.

3단계 — 첫 부팅 보안 조치 (VM 콘솔)

사전 빌드 이미지는 기본 계정이 공개돼 있고, SSH 호스트 키도 이미지에 미리 들어 있을 수 있습니다. 그래서 비밀번호 변경 → 호스트 키 재생성 → SSH 활성화 순서를 지켜야 합니다.

passwd                                   # 기본 비밀번호부터 변경
sudo rm /etc/ssh/ssh_host_*              # 미리 들어 있던 호스트 키 삭제
sudo dpkg-reconfigure openssh-server     # 새 호스트 키 생성
sudo systemctl enable --now ssh          # SSH 활성화 (Kali 서비스명은 ssh)
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub   # 지문 확인 (소문자 -l)

4단계 — SSH 키 인증과 설정 강화

VM 콘솔은 복사·붙여넣기가 안 되니, 이후 작업은 Windows 터미널에서 SSH로 붙어서 합니다. 첫 접속 때 표시되는 지문이 3단계에서 본 값과 같은지 꼭 비교하세요.

# Windows: 키 생성(암호 문구 설정 권장) 후 공개키 등록
ssh-keygen -t ed25519 -C "pentest-lab"
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh -p 2222 kali@127.0.0.1 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# Kali: 비밀번호·root 로그인 차단 (기존 세션은 열어둔 채로)
sudo tee /etc/ssh/sshd_config.d/01-hardening.conf >/dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers kali
PerSourcePenaltyExemptList 10.0.2.2
EOF
sudo /usr/sbin/sshd -t && sudo systemctl reload ssh

💡 파일 이름이 01-로 시작하는 이유

OpenSSH는 같은 항목이 여러 번 나오면 먼저 읽은 값을 씁니다. 그래서 추가 설정 파일은 이름순으로 앞에 오게 지어야 하고, 적용 전에는 sshd -t로 문법을 검사합니다. 10.0.2.2는 VirtualBox NAT에서 호스트가 VM에 보이는 기본 주소로, 127.0.0.1 바인딩과 함께일 때만 예외 처리가 안전합니다.

5단계 — Docker Engine 설치

Kali에는 같은 이름의 다른 패키지가 있어 컨테이너 엔진은 docker-ce(또는 docker.io)로 설치해야 합니다. Kali 2026은 Debian trixie 기반이라 저장소를 trixie로 지정합니다.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian trixie stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER            # 재접속 후 적용

docker 그룹은 사실상 root 권한입니다. 단일 사용자 실습 VM이라 편의상 추가하지만, 실제 서버로 옮길 때는 반드시 다시 검토하세요.

6단계 — PentestGPT·uv·Claude Code 설치와 로그인

설치 스크립트는 파이프로 바로 실행하지 말고, 받아서 내용을 한 번 본 뒤 실행하는 습관을 권합니다.

git clone https://github.com/GreyDGL/PentestGPT.git ~/PentestGPT

# uv (패키지 관리자)
curl -LsSf https://astral.sh/uv/install.sh -o /tmp/uv-install.sh && head -20 /tmp/uv-install.sh
sh /tmp/uv-install.sh

# Claude Code CLI (자율 모드 백엔드)
curl -fsSL https://claude.ai/install.sh -o /tmp/claude-install.sh && head -20 /tmp/claude-install.sh
bash /tmp/claude-install.sh
export PATH="$HOME/.local/bin:$PATH"
claude                                   # 첫 실행 시 URL+코드 방식으로 로그인

# 자율 에이전트 의존성 (Claude 백엔드 포함)
cd ~/PentestGPT/pentestgpt_agent && uv sync --extra claude

💡 브라우저 한글이 깨진다면

Kali 기본 환경에는 한글 글꼴이 없어 브라우저·PDF의 한글이 □로 보입니다. sudo apt install -y fonts-noto-cjk fonts-nanum 한 줄이면 해결됩니다.

7단계 — 연습용 취약 앱으로 첫 실행

첫 실행 대상은 내가 직접 띄운 연습용 취약 앱(OWASP Juice Shop)으로 합니다. 내 소유라 인가 문제가 없고, 127.0.0.1에만 묶어 외부로도 노출되지 않습니다. 컨테이너가 떠도 앱 준비까지 수십 초가 걸리니, 응답 코드 200을 확인한 뒤 실행하세요.

docker run -d --name juice-shop -p 127.0.0.1:3000:3000 bkimminich/juice-shop
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3000      # 200 확인

cd ~/PentestGPT
make run TARGET=http://127.0.0.1:3000 BACKEND=claude \
  GOAL="Identify web vulnerabilities on this authorized local test target."

실행 중에는 화면이 멈춘 것처럼 보이지만, 진행 내역은 runs/trial-*/traces/*/events.jsonl에 실시간으로 쌓입니다. 이번 실습에서 에이전트는 대상을 식별한 뒤 로그인 기능의 인증 우회 취약점을 직접 시험해 확인하고, 결과를 summary.json에 남겼습니다.

🚫 하지 말 것

인가받지 않은 대상을 TARGET에 넣지 마세요. 자율 에이전트는 스스로 공격적 명령을 실행합니다. 공개 데모 사이트도 내 소유가 아니면 대상이 아닙니다.


🎉 정리

PentestGPT 구축의 핵심은 설치 명령이 아니라 환경 선택과 격리였습니다. 명령을 스스로 실행하는 에이전트라서 격리된 Kali VM에 올리고, SSH·포트포워딩을 로컬에만 묶고, 첫 실행은 내 연습 앱으로 하는 것까지가 한 세트입니다. 그리고 v1.0에서 실행 경로가 바뀐 만큼, README와 함께 저장소의 상태 문서를 꼭 같이 읽어야 합니다.

✅ 구축 체크리스트

· VirtualBox가 지원 중인 7.2 계열인가, Extension Pack은 설치하지 않았는가

· Kali 이미지 해시를 확인했고, 기본 비밀번호·호스트 키를 바꿨는가

· 포트포워딩·연습 앱이 127.0.0.1에만 묶여 있는가

· SSH가 키 인증만 허용하고 root 로그인을 막는가

· pentestgpt_agent 폴더에서 uv sync --extra claude를 했는가

· TARGET이 인가받은 대상(또는 내 연습 앱)인가


💬 자주 묻는 질문

Q. WSL로는 안 되나요?
설치 자체는 가능합니다. 다만 에이전트가 명령을 직접 실행하고, 나중에 실제 서버로 옮길 계획이라면 격리와 재현성 면에서 VM이 낫습니다.

Q. 무료로 쓸 수 있나요?
PentestGPT는 오픈소스지만, 추론을 맡는 LLM 백엔드는 별도 이용 조건을 따릅니다. Claude 백엔드라면 구독 또는 API 사용료가 필요할 수 있으니 계정 조건을 먼저 확인하세요.

Q. 실행 결과를 보고서로 받을 수 있나요?
현재 자율 모드의 결과는 JSON·DB 형태의 원본 데이터로 남습니다. 사람이 읽는 보고서는 별도로 만들어야 하며, 이 내용과 실전 점검 후기는 시리즈 3편에서 다룹니다.


🔗 참고 자료

· PentestGPT 공식 저장소: https://github.com/GreyDGL/PentestGPT
· Kali 사전 빌드 VirtualBox 이미지 가져오기: https://www.kali.org/docs/virtualization/import-premade-virtualbox/
· Kali에 Docker 설치: https://www.kali.org/docs/containers/installing-docker-on-kali/
· VirtualBox 7.2 변경 이력: https://docs.oracle.com/en/virtualization/virtualbox/7.2/relnotes/ChangeLog.html
· OpenSSH 9.8 릴리스 노트(출발지별 차단 기능): https://www.openssh.com/txt/release-9.8
· Claude Code 네트워크 설정: https://code.claude.com/docs/en/network-config

다음 편에서는 사내망에서 Docker·uv·Claude·브라우저까지 줄줄이 막혔던 인증서 오류(self-signed certificate)의 진짜 원인과 도구별 해결법을 정리합니다.


※ 본 글은 실습 과정을 일반화한 기록으로, 특정 조직·서비스와 무관합니다. 실습은 사전 승인된 환경과 본인 소유 대상에서만 진행했습니다.