Vulnerable Virtual Machines
Downloadable vulnerable VMs to practice exploitation techniques locally. Perfect for offline learning and building foundational skills.
Getting Started
Image Freshness And Integrity
Isolate First
Host-only keeps Kali and the targets on one segment your LAN cannot route to. The distinction that trips people up: plain NAT carries each guest out through the host and cannot do VM-to-VM traffic, while a NAT Network is a private segment with DHCP and outbound access. Pick one deliberately — plain NAT gives you neither isolation nor reachability.
- Network type
- Host-only adapter (a NAT Network if you need DHCP)
- Lab network
- lab-vms
- Subnet
- 10.20.20.0/24
IP plan
| Role | IP |
|---|---|
| Kali attack VM (Kali) | 10.20.20.10 |
| Target VM A | 10.20.20.21 |
| Target VM B | 10.20.20.22 |
Create it
VirtualBox (VBoxManage)
# hostonlyif create prints the vboxnetN name — use that name below
VBoxManage hostonlyif create
VBoxManage hostonlyif ipconfig vboxnet0 --ip 10.20.20.1 --netmask 255.255.255.0
VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet0
# attach each VM to it instead of the default NAT adapter
VBoxManage modifyvm "Kali" --nic2 hostonly --hostonlyadapter2 vboxnet0
VBoxManage modifyvm "Target" --nic1 hostonly --hostonlyadapter1 vboxnet0VMware, Hyper-V or KVM
# VMware: Virtual Network Editor > Add Network > Host-only, 10.20.20.0/24, DHCP off
# Hyper-V: New-VMSwitch -Name lab-vms -SwitchType Internal; then assign 10.20.20.1/24 to vEthernet (lab-vms)
# KVM: <forward mode='none'/> network on 10.20.20.0/24 (virsh net-define / net-start)Prove it is isolated
nmap -sn 10.20.20.0/24; ip -4 routeExpected: only the lab VMs answer the scan, and the host-only adapter owns only 10.20.20.0/24. A 192.168.x host in the result, or a default route on that adapter, means the target is reachable from your home LAN.
Never bridge a vulnerable target VM — it will be scanned and exploited from your home network within hours, not days.
Lab Runbook
Use this page as a controlled lab build, not a production hardening guide. Prove the network is isolated before running exercises, then validate and clean up from the operational section at the end of the page.
Plan
4-12 GB; 40-120 GB. Free. Isolation: Host-only or internal network; never bridged to home LAN.
Outcomes
- - Target inventory
- - Known IP plan
- - Connectivity from Kali
- - Clean rollback snapshot
Web Application Practice
DVWA
BeginnerDamn Vulnerable Web Application - PHP/MySQL app with multiple security levels.
- ✓ SQL Injection
- ✓ XSS (Reflected, Stored, DOM)
- ✓ Command Injection
- ✓ File Upload
- ✓ CSRF
- ✓ Brute Force
docker run --rm -it -p 127.0.0.1:8081:80 ghcr.io/digininja/dvwabWAPP
BeginnerBuggy Web Application - Over 100 web vulnerabilities to exploit.
- ✓ OWASP Top 10 coverage
- ✓ 100+ vulnerabilities
- ✓ API Security issues
- ✓ XML/XXE attacks
docker run -d -p 127.0.0.1:8082:80 raesene/bwapp
Unmaintained: the bWAPP project is archived and the raesene/bwapp image
has not been rebuilt since 2022. Pin the image digest, keep it host-only, and prefer DVWA,
WebGoat or Mutillidae II for current practice.
OWASP WebGoat
IntermediateJava-based vulnerable app with guided lessons for each vulnerability type.
- ✓ Guided lessons
- ✓ Modern vulnerabilities
- ✓ JWT attacks
- ✓ Client-side security
docker run -p 127.0.0.1:8080:8080 -p 127.0.0.1:9090:9090 webgoat/webgoatOWASP Juice Shop
IntermediateModern Node.js app with 100+ challenges covering OWASP Top 10 and beyond.
- ✓ CTF-style challenges
- ✓ Score tracking
- ✓ Modern tech stack
- ✓ API + SPA vulnerabilities
docker run --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shopNetwork & System Exploitation
Metasploitable 2
LegacyClassic vulnerable Linux VM for learning fundamentals. Treat it as legacy practice, not a model for modern enterprise exposure.
- ✓ Vulnerable services
- ✓ Weak configurations
- ✓ Metasploit modules
- ✓ Privilege escalation
Metasploitable 3
LegacyWindows and Linux VMs with useful practice paths, but old operating systems and provisioning assumptions.
- ✓ Windows Server 2008
- ✓ Ubuntu 14.04
- ✓ CTF-style flags
- ✓ Vagrant provisioning
VulnHub VMs
VariousHundreds of community-created vulnerable VMs, many with walkthroughs available.
- ✓ Kioptrix series (beginner)
- ✓ Mr. Robot (intermediate)
- ✓ Stapler (intermediate)
- ✓ Brainpan series (advanced)
HackTheBox Retired
VariousDownload retired HTB machines for offline practice (VIP subscription).
- ✓ Real-world scenarios
- ✓ Official walkthroughs
- ✓ Windows & Linux
- ✓ Various difficulties
HackMyVM
VariousFree community-driven platform with actively maintained VMs, flag submission, and leaderboards. The modern alternative to VulnHub.
- ✓ Actively maintained (new VMs weekly)
- ✓ Flag submission & scoring
- ✓ Difficulty ratings
- ✓ Walkthroughs available
Proving Grounds
VariousOffSec's official practice platform. PG Play is free with community VMs. PG Practice for OSCP prep.
- ✓ PG Play (free tier)
- ✓ PG Practice (paid, OSCP-like)
- ✓ Community & OffSec-made machines
- ✓ Windows & Linux targets
Quick Setup Script
Launch multiple vulnerable apps using Docker Compose:
# docker-compose.yml for vulnerable lab
services:
dvwa:
image: ghcr.io/digininja/dvwa
ports:
- "127.0.0.1:8081:80"
juice-shop:
image: bkimminich/juice-shop
ports:
- "127.0.0.1:3000:3000"
webgoat:
image: webgoat/webgoat
ports:
- "127.0.0.1:8080:8080"
- "127.0.0.1:9090:9090"
bwapp:
image: raesene/bwapp # unmaintained since 2022 - pin the digest, host-only only
ports:
- "127.0.0.1:8082:80"
# Run with: docker compose up -d
# Verify: curl -s http://localhost:3000 | head -5Troubleshooting FAQ
Can't reach vulnerable VM from Kali
- Both VMs must be on the same network (host-only or NAT network)
- Check IPs:
ip addron both machines - Try pinging from each direction to isolate the issue
- VirtualBox: use "NAT Network" (not just "NAT") for VM-to-VM communication
VulnHub OVA import failing
- Try importing with "Import Appliance" not drag-and-drop
- If checksums fail, re-download the OVA
- Some OVAs are VMware-only — convert with
qemu-img convert - VirtualBox: uncheck "Import hard drives as VDI" if import fails
Docker container crashes immediately
- Check logs:
docker logs container_name - Port already in use: change host port (
-p 9080:80) - Out of disk:
docker system dfanddocker system prune - Architecture mismatch on Apple Silicon: add
--platform linux/amd64
Readiness And Evidence
What this lab must have before you start, and what to capture so the work is repeatable and reportable.
Minimum Viable Setup
- One Kali VM and one vulnerable target VM
- Host-only or internal network only
- Target snapshot before exploitation
Evidence To Capture
- VM network mode screenshot
- Target checksum or source URL note
- Nmap service scan from Kali
- Snapshot name before first exploit
Keep It Fresh
Re-check these against the current release before you trust the lab again.
-
VM images Before download
Prefer official pages and verify checksums when available.
-
Legacy targets Per exercise
Label old OS images as archival practice.
Setup Anti-Patterns
Habits that turn a useful lab into an unnecessary risk.
- Bridging vulnerable VMs onto home or work networks
- Trusting old OVA mirrors without integrity checks
- Treating legacy VMs as modern enterprise examples
Operational Safety Baseline
Apply these rules before running any lab command on this page.
- Work only on systems you own or have explicit authorization to test.
- Keep vulnerable services off your home LAN and off public interfaces.
- Take clean snapshots before every exercise and before every vulnerable configuration change.
- Use dedicated cloud accounts, subscriptions, and projects with billing alerts before deployment.
- Write down the teardown command before you run the setup command.
Validation Checkpoints
- -Kali and target share only the lab network
- -Nmap sees expected services
- -Snapshots exist before exploitation
Cleanup And Rollback
- -Revert target snapshots after compromise
- -Delete stale OVAs from downloads
- -Document any custom target changes