GOAD(Game of Active Directory) Lab 구축 2 - 명령어
GOAD(Game of Active Directory) Lab 구축 2 - 명령어
빌드를 끝낸 랩을 켜고, 끄고, 스냅샷을 찍고, 접속하고, 문제를 진단하는 데 쓰는 명령을 모았다. 빌드 과정은
README.md를 참조한다.
0. 핵심 식별자 (먼저 확인)
| 항목 | 값 | 확인 명령 |
|---|---|---|
| 인스턴스 ID | 2ec88e-minilab-vmware (랜덤 생성) | WSL$ ls /mnt/c/GOAD/workspace |
| DC01 vmx | C:\GOAD\workspace\2ec88e-minilab-vmware\provider\.vagrant\machines\DC01\vmware_desktop\<UUID>\WindowsServer2019.vmx | PS> & "C:\Program Files\VMware\VMware Workstation\vmrun.exe" list |
| WS01 vmx | ...\machines\WS01\vmware_desktop\<UUID>\windows_10.vmx | 동일 |
| DC01 / WS01 IP | 192.168.56.30 / 192.168.56.31 | — |
| 도메인 | MINILAB | — |
| 랩 네트워크 | 192.168.56.0/24 (VMnet2 = 192.168.56.1) | — |
인스턴스 ID와 vmx의
<UUID>폴더는 빌드할 때마다 달라진다. 아래처럼$dc,$ws변수를 매번vmrun list로 채워 쓰는 방식을 권장한다.
자주 쓰는 변수는 먼저 이렇게 잡아 둔다(PowerShell).
$vmrun = "C:\Program Files\VMware\VMware Workstation\vmrun.exe"
$inst = "C:\GOAD\workspace\2ec88e-minilab-vmware" # ← 본인 인스턴스명으로
$dc = (Get-ChildItem "$inst\provider\.vagrant\machines\DC01" -Recurse -Filter *.vmx).FullName
$ws = (Get-ChildItem "$inst\provider\.vagrant\machines\WS01" -Recurse -Filter *.vmx).FullName
$dc; $ws
1. 랩 라이프사이클 (권장 = GOAD/Vagrant)
전체 시작과 정지는 상태가 어긋나지 않게 GOAD나 Vagrant로 하는 편이 안전하다. vmrun 직접 조작은 스냅샷이나 임시 조작 같은 보조 용도로만 쓴다.
1-1. GOAD 스크립트로 (가장 권장)
# 정지 (모든 VM)
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t stop -i 2ec88e-minilab-vmware'
# 시작 (모든 VM)
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t start -i 2ec88e-minilab-vmware'
# 상태
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t status -i 2ec88e-minilab-vmware'
# 재시작
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t restart -i 2ec88e-minilab-vmware'
# 완전 삭제(VM 파기) — 주의!
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t destroy -i 2ec88e-minilab-vmware'
1-2. GOAD 대화형 콘솔
PS> wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh'
콘솔 안에서:
help # 명령 목록
ls # 인스턴스 목록
load 2ec88e-minilab-vmware # 인스턴스 선택
status # 현재 인스턴스 VM 상태
start | stop | restart # 전원 제어
snapshot # 전 VM 정지→스냅샷→재시작 (GOAD 내장)
destroy # 파기
exit
1-3. Vagrant 직접 (provider 폴더에서)
PS> $env:VAGRANT_CWD = "$inst\provider"
PS> & "C:\Program Files\Vagrant\bin\vagrant.exe" status
PS> & "C:\Program Files\Vagrant\bin\vagrant.exe" up # 전체 기동
PS> & "C:\Program Files\Vagrant\bin\vagrant.exe" halt # 전체 정지
PS> & "C:\Program Files\Vagrant\bin\vagrant.exe" up DC01 # 특정 VM만
PS> & "C:\Program Files\Vagrant\bin\vagrant.exe" halt WS01
2. VMware CLI — vmrun (보조 제어 + 스냅샷)
vmrun은 .vmx 경로를 받아 동작한다. 호스트 타입은 -T ws(Workstation)로 준다.
2-1. 조회
PS> & $vmrun list # 실행 중인 VM + vmx 경로
PS> & $vmrun -T ws listSnapshots $dc # 스냅샷 목록
PS> & $vmrun -T ws getGuestIPAddress $dc # 게스트 IP (VMware Tools 필요)
2-2. 전원
PS> & $vmrun -T ws start $dc nogui # 백그라운드로 켜기 (gui 로 창 띄움)
PS> & $vmrun -T ws stop $dc soft # 정상 종료 (hard = 강제 전원차단)
PS> & $vmrun -T ws suspend $dc # 일시정지(메모리 보존, 빠른 재개)
PS> & $vmrun -T ws reset $dc soft # 재부팅
2-3. 스냅샷 워크플로우 (펜테스트 필수)
공격 실습에 들어가기 전에 깨끗한 상태를 저장해 두고, 망가뜨린 뒤 그 지점으로 되돌린다.
# 두 VM 모두 'clean-base' 스냅샷 생성 (정지 상태에서 권장)
PS> & $vmrun -T ws stop $dc soft; & $vmrun -T ws stop $ws soft
PS> & $vmrun -T ws snapshot $dc "clean-base"
PS> & $vmrun -T ws snapshot $ws "clean-base"
PS> & $vmrun -T ws start $dc nogui; & $vmrun -T ws start $ws nogui
# 실습 후 깨끗한 상태로 복원
PS> & $vmrun -T ws revertToSnapshot $dc "clean-base"
PS> & $vmrun -T ws revertToSnapshot $ws "clean-base"
PS> & $vmrun -T ws start $dc nogui; & $vmrun -T ws start $ws nogui
# 스냅샷 삭제
PS> & $vmrun -T ws deleteSnapshot $dc "clean-base"
복원한 뒤 VMnet2 IP가 어긋나면
Phase 6/9의 보정(아래 5장)을 실행한다.
2-4. 게스트 안에서 명령 실행 (자격증명 필요)
# vagrant 박스 기본 계정: vagrant / vagrant
PS> & $vmrun -T ws -gu vagrant -gp vagrant runProgramInGuest $dc "C:\Windows\System32\cmd.exe" "/c ipconfig /all"
PS> & $vmrun -T ws -gu vagrant -gp vagrant copyFileFromHostToGuest $dc "C:\host\tool.exe" "C:\Users\vagrant\tool.exe"
3. VMware CLI — vmcli (신형) & REST API
# vmcli (Workstation 17+; 버전/도움말)
PS> & "C:\Program Files\VMware\VMware Workstation\vmcli.exe" --version
PS> & "C:\Program Files\VMware\VMware Workstation\vmcli.exe" --help
# 예: 전원 상태 조회 (모듈명 Power 는 대문자, 동작 query/Start/Stop/Reset/Suspend 등)
PS> & "C:\Program Files\VMware\VMware Workstation\vmcli.exe" $dc Power query
PS> & "C:\Program Files\VMware\VMware Workstation\vmcli.exe" $dc Power Stop # 정지 (Start/Suspend/Reset 도 가능)
REST API(vmrest)로 프로그램 연동도 가능:
# 별도 터미널에서 데몬 기동(기본 127.0.0.1:8697). 최초 1회 자격증명 설정:
PS> & "C:\Program Files\VMware\VMware Workstation\vmrest.exe" -C # 사용자/암호 설정
PS> & "C:\Program Files\VMware\VMware Workstation\vmrest.exe" # 서버 기동
# 이후 http://127.0.0.1:8697/api 로 REST 호출 (VM 목록/전원/네트워크 등)
지금
192.168.56.x랩의 vmrest는 vagrant-vmware-utility가 내부(127.0.0.1:1431, API 9922)에서 쓰고 있다. 직접 연동할 때는 다른 포트를 쓴다.
4. Tailscale 관리
4-1. 이 노트북(subnet router)
PS> tailscale status # tailnet 멤버/온라인 상태
PS> tailscale debug prefs | Select-String 'AdvertiseRoutes' # 광고 중인 라우트
PS> tailscale set --advertise-routes=192.168.56.0/24 # 라우트 광고(이미 설정됨)
PS> tailscale set --advertise-routes= # 광고 해제(필요시)
PS> tailscale ip -4 # 이 노드 tailnet IP (100.109.121.34)
- 라우트 승인은 콘솔에서 한다. https://login.tailscale.com/admin/machines 에서
claude를 열고 Subnet routes를 승인한다. - 포워딩 상태는 이렇게 확인한다.
PS> Get-NetIPInterface -AddressFamily IPv4 | Where-Object { $_.InterfaceAlias -like '*Tailscale*' -or $_.InterfaceAlias -like '*VMnet2*' } | Select InterfaceAlias,Forwarding
4-2. Kali(공격 머신)
kali$ sudo tailscale set --accept-routes # 광고 라우트 수락 (현행 공식 구문)
# (구버전 호환: sudo tailscale up --accept-routes 도 동작 — 실제 이 명령으로 적용했음)
kali$ tailscale status # claude 가 보이는지
kali$ ip route | grep 192.168.56 # 192.168.56.0/24 라우트가 잡혔는지
5. 네트워크 보정 (VMnet2 IP)
재부팅이나 스냅샷 복원 뒤에 랩에 닿지 않는다면, VMnet2가 APIPA(169.254)로 돌아갔을 수 있다.
5-1. 자동 (부팅 예약작업)
PS> Get-ScheduledTask -TaskName 'GOAD-VMnet2-IP' | Select TaskName,State
PS> Start-ScheduledTask -TaskName 'GOAD-VMnet2-IP' # 수동 즉시 실행
PS> Get-Content 'C:\ProgramData\GOAD\vmnet2-boot.log' -Tail 5 # 실행 로그
5-2. 수동 폴백
PS> Get-NetIPAddress -InterfaceAlias "*VMnet2*" -AddressFamily IPv4 | Select IPAddress,PrefixLength # 현재 IP 확인
# 169.254.* 면 보정:
PS> $idx=(Get-NetAdapter -InterfaceAlias "*VMnet2*").ifIndex
PS> Get-NetIPAddress -InterfaceIndex $idx -AddressFamily IPv4 | Where-Object {$_.IPAddress -like '169.254.*'} | Remove-NetIPAddress -Confirm:$false
PS> New-NetIPAddress -InterfaceIndex $idx -IPAddress 192.168.56.1 -PrefixLength 24
6. 랩 접속 & 정찰 (Kali에서) — 학습 로드맵 진입점
# 살아있는 호스트 + SMB 정보 (NetExec)
kali$ nxc smb 192.168.56.30 192.168.56.31
# 심어진 자격증명으로 인증
kali$ nxc smb 192.168.56.30 -u alice -p 'F0llOwTheWh1teR@bit'
# 공유/사용자/패스워드정책 (※ --sessions 는 일부 NetExec 버전에 없음 → 제외)
kali$ nxc smb 192.168.56.30 -u alice -p 'F0llOwTheWh1teR@bit' --shares --users --pass-pol
# 익명(널 세션) 열거 — DC가 Null Auth:True 라 자격증명 없이도 됨
kali$ nxc smb 192.168.56.30 -u '' -p '' --users
kali$ nxc smb 192.168.56.30 -u guest -p '' --rid-brute
# 본인 버전의 정확한 플래그 확인
kali$ nxc smb --help
# LDAP 열거
kali$ nxc ldap 192.168.56.30 -u alice -p 'F0llOwTheWh1teR@bit'
# BloodHound 수집 (도메인: MINILAB)
kali$ nxc ldap 192.168.56.30 -u alice -p 'F0llOwTheWh1teR@bit' --bloodhound --collection All --dns-server 192.168.56.30
# 포트 빠른 확인
kali$ nc -zv 192.168.56.30 445 # SMB
kali$ nc -zv 192.168.56.30 5985 # WinRM
포트 참고 — 445=SMB, 5985=WinRM, 389/636=LDAP(S), 88=Kerberos, 3389=RDP. WS01(워크스테이션)은 빌드 후 방화벽이 꺼져 있어 445도 응답한다.
7. 서비스/프로세스 상태 점검 (호스트)
# VMware Utility 서비스 (vagrant-vmware-desktop 연동 필수)
PS> Get-Service VagrantVMware | Select Name,Status
PS> Restart-Service VagrantVMware # 문제 시 재시작
# 실행 중 VM
PS> Get-Process vmware-vmx -EA SilentlyContinue | Select Id,@{N='RAM_GB';E={[math]::Round($_.WS/1GB,1)}}
# 호스트→VM 포트
PS> Test-NetConnection 192.168.56.30 -Port 5985
# 빌드 로그(있다면)
PS> Get-Content "C:\GOAD\install.log" -Tail 30
8. 트러블슈팅 빠른 표
| 증상 | 점검/해결 |
|---|---|
| Kali에서 랩 안 닿음 | ① 콘솔 라우트 승인됐나 ② Kali tailscale up --accept-routes ③ 호스트 Set-NetIPInterface ... -Forwarding Enabled ④ VMnet2 IP=192.168.56.1 인가(5장) |
| VMnet2가 169.254 | 5장 자동/수동 보정 |
| VagrantVMware 서비스 중지 | Restart-Service VagrantVMware; 안 되면 README Phase 3-4의 reg copy 재실행 |
WSL vagrant.exe 못 찾음 | ln -sf "/mnt/c/Program Files/Vagrant/bin/vagrant.exe" /usr/local/bin/vagrant.exe |
vmrun getGuestIPAddress 빈값/오류 | 게스트 부팅·VMware Tools 기동 대기 후 재시도 |
| ansible가 WinRM 연결 실패 | 호스트→VM 5985 Test-NetConnection 확인 → 네트워크(5장) 점검 |
| VM이 느림 | Hyper-V 공존 모드 영향. 불필요한 프로그램 종료(23.4GB라 여유 적음) |
9. 랩 정보 카드 (요약)
도메인 : mini.lab (NetBIOS: MINILAB)
랩 네트워크 : 192.168.56.0/24 (VMnet2 host-only, GW=192.168.56.1)
DC01 : 192.168.56.30 컴퓨터명 DC Windows Server 2019 (도메인 컨트롤러; 445/5985/389; Null Auth 허용)
WS01 : 192.168.56.31 컴퓨터명 WS Windows 10 (445/5985; SMB signing=False → relay 대상)
박스 기본계정 : vagrant / vagrant
심어진 자격증명 : MINILAB\alice / F0llOwTheWh1teR@bit (runas: spongebob)
인스턴스 ID : 2ec88e-minilab-vmware (workspace 폴더명; 재빌드 시 변동)
subnet router : 이 노트북 tailnet 'claude' (100.109.121.34)
공격 머신 : Kali tailnet 'kali-linux' (100.113.199.118)
부팅 자동복구 : 예약작업 'GOAD-VMnet2-IP' + C:\ProgramData\GOAD\fix-vmnet2-ip.ps1
10. 자주 쓰는 한 줄 모음
# 랩 켜기/끄기 (GOAD)
wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t start -i 2ec88e-minilab-vmware'
wsl -d Ubuntu-24.04 -- bash -lc 'cd /mnt/c/GOAD && bash goad.sh -t stop -i 2ec88e-minilab-vmware'
# 실행 중 VM + 경로
& "C:\Program Files\VMware\VMware Workstation\vmrun.exe" list
# 스냅샷(정지 후)
& "C:\Program Files\VMware\VMware Workstation\vmrun.exe" -T ws snapshot "<vmx>" clean-base
# 네트워크 보정
Start-ScheduledTask -TaskName 'GOAD-VMnet2-IP'
# Kali 접속 테스트
# kali$ nc -zv 192.168.56.30 5985← ALL POSTS