Vagrant Logo

TLDR;

Cactuscon 9 occured last weekend. For those that missed the 2021 talks, their currently available on this channel:

One of the talks caught our eye: CC9 Learn Offensive Security with Project V^3. Last year we talked about using Virtualbox, Vagrant and Anisble to quickly provision Virtual Machines (VMs) for challenges, self-learning or possibly CTF’s or sharing within the team. A link to our previous blog post is here:

V^3 is currently a small but ambitious project where they have converted publically available Vulnhub VMs to the virtualbox format, for ease of download and execution. In their github repository they have also included one VM from outside of Vulnhub a previous Cactuscon CTF image. We like their idea and use-cases as this could be expanded to include VMs from other platforms like HacktheBox or even retired Offensive Security VMs. For more details the project can be found here:

So in this post we talk more about Vagrant and how to manage it with virtualbox!

Vagrant

Initial Commands

We covered these two commands previosly but as a quick catch up the two most used commands are likely:

Start a VM

vagrant up

Remove a VM

vagrant destroy

More Vagrant Commands

We didn’t really cover these last time, but you may also want to know these commands:

Stop a VM (rather than remove/destroy)

vagrant halt

or even suspend an image

vagrant suspend

Alternatiely to resume an image

vagrant resume

If for some reason, the provisioning failed, or you messed up a VM in some fashion, you can reload and reprovision a VM:

vagrant reload
vagrant provision

When you use the vagrant destroy command, it deletes the Virtualbox image, but still stores a cached VM image in ~/.vagrant. If you are short on disk space you will probably want to permently delete these cached images:

List boxs:

vagrant box list

e.g

vagrant box list
RedHatAugust/Star-Wars-CTF-1 (virtualbox, 0.01)
kalilinux/rolling            (virtualbox, 2020.4.0)
ubuntu/bionic64              (virtualbox, 20210112.0.0)
ubuntu/trusty64              (virtualbox, 20190514.0.0)

If you then want to delete a box the command is

vagrant box remove <vm name>

Other Helpful Additions

Add a Kali Image

The project was missing a Kali Linux vagrant build (I think they left this intentionally open for people to use their own pentest builds), so attached is our Kali-Linux vagrant-file; Simply create a directory, and copy the following into Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  base_network = "192.168.99"

  config.vm.box = "kalilinux/rolling"
  # config.vm.box_check_update = false
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network :private_network, ip: "#{base_network}.10"
  config.vm.network :private_network, type: "dhcp", virtualbox__intnet: "haymarketers", adapter: "2"

  # config.vm.synced_folder "../data", "/vagrant_data"

  # All below is default, but you may want to tailor it for your personal systems
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #   vb.memory = "2048"
  #   vb.cpus = 2
  # end
  #
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

You may want to adjust the networking for your Virtualbox setup, but remember in Virtualbox the 1st interface is always natted, and this is the interface Vagrant SSH/provising will use in an attempt to perfrom any additional setup steps you may require.

Darwin Setup Script

The V^3 project currently has helper setup scripts for Windows in Powershell but not for Linux or OSX. Below is a small shell script we created for our junior team members on OSX; All the script does is use vboxmanage to setup the same haymarketers network like the powershell scripts in the repository:

#!/bin/sh

if [ $# -eq 0 ]; then
    echo "Usage:"
    echo "-----"
    echo "$0 install - install haymarketers network"
    echo "$0 uninstall - uninstall haymarketers network"
    exit 1
fi

OSTYPE=$(uname -s)
VBOX=$(which VBoxManage)

if [[ "$VBOX" == '' ]]; then
  echo "Error: VBoxManage not found in PATH!\nExiting!"
  exit 1
fi

install() {
  if [[ "$OSTYPE" == 'Darwin' ]]; then
    echo "Darwin Setup"
    VBoxManage dhcpserver add --netname haymarketers --ip 10.13.37.1 --netmask 255.255.255.0 --lowerip 10.13.37.5 --upperip 10.13.37.254 --enable    
    echo "Added haymarketers network"
  elif [[ "$OSTYPE" == 'Linux' ]]; then
    echo "todo..."
  else
    echo "unknown platform"
  fi
}

uninstall() {
  if [[ "$OSTYPE" == 'Darwin' ]]; then
    echo "Darwin Setup detected..."
    VBoxManage dhcpserver remove --network haymarketers
    echo "Removed Haymarketers Network"
  elif [[ "$OSTYPE" == 'Linux' ]]; then
    echo "todo..."
  else
    echo "unknown platform"
  fi
}

"$@"

Disclaimer

Images were sourced from Vagrant HashiCorp.


Share on: