▌ TRANSMISSION · [CONCEPT]

GOAD(Game of Active Directory) Lab 구축 2 - 명령어


GOAD(Game of Active Directory) Lab 구축 2 - 명령어

빌드를 끝낸 랩을 켜고, 끄고, 스냅샷을 찍고, 접속하고, 문제를 진단하는 데 쓰는 명령을 모았다. 빌드 과정은 README.md를 참조한다.

0. 핵심 식별자 (먼저 확인)

항목확인 명령
인스턴스 ID2ec88e-minilab-vmware (랜덤 생성)WSL$ ls /mnt/c/GOAD/workspace
DC01 vmxC:\GOAD\workspace\2ec88e-minilab-vmware\provider\.vagrant\machines\DC01\vmware_desktop\<UUID>\WindowsServer2019.vmxPS> & "C:\Program Files\VMware\VMware Workstation\vmrun.exe" list
WS01 vmx...\machines\WS01\vmware_desktop\<UUID>\windows_10.vmx동일
DC01 / WS01 IP192.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)
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.2545장 자동/수동 보정
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