Easily find IP of VMs in a Virtualbox Internal Network
For quite sometime I’ve been Vulnhub boxes and following their suggestion about setting-up lan network. But sometimes getting the IP address maybe a pain, as the MOTD scripts may not work.
In that case entire network scans using tools like netdiscover, which takes up un-necessary time.
But that can be easily prevented. Remember that Host-Only networks are essentially virtualized by the hypervisor and thus the IP allocation is managed by itself.
Thus we can use the hypervisor tools, here Virtualbox’s VboxManage tools, to get the leased IP by the DHCP server
And I’ve done just that. The script has mainly 3 parts. Let’s break it down.
Part 1 - Getting a list of running VMs
function running_vms() {
VBoxManage list runningvms | grep -o '".*"' | tr -d '"'
}
This one is pretty simple. I get the list of running VMs. The list contains the names of running VMs enclosed in ".
I extracted that using grep and then use tr to delete the ". Now I’ve the names of the running VMs
Part 2 - Getting the MAC address of each running VMs
function running_vm_mac() {
VBoxManage showvminfo "$1" --details | awk '{ print $4 }' | tr -d ','
}
So quite a few things is going on here. Lets unpack
- This function expects a argument, which is supposed to be a running VM name. This name is used to get the entire details of VM, which includes the Network Info
- Once the info is fetched, I use
awkto select the 4th element in the line. Nowawkbasically splits the input line by whitespaces, and using the$<number>we can basically index into the array of split words. Here the actual MAC is the 4th element - Now that I’ve the MAC address of the running VM, the only thing that remains is to delete the trailing , That’s done by
tr
And after all this, I’ve the MAC address of the VM. That will be used to query the Virtualbox DHCP server to find the IP leased out
Part 3 - Querying the IP for a particular VM
function running_vm_ip() {
VBoxManage dhcpserver findlease --interface=vboxnet0 --mac-address="$1" | awk '/IP/ { print $3 }'
}
Much like the previous function, this one has 2 parts
- This function expects a argument, which is supposed to be a running VM MAC Address.
- Use the
dhcpserver findleasecommand is used to query Virtualbox’s internal DHCP server in a particular interface. Here the interface isvboxnet0Host-Only network. Like every DHCP server, it will need a MAC address to actually query and find the corresponding IP address. - The ouput is pipped into
awkthat matches for a line with IP pattern and extract the 3rd word from that. It’s the IP address assigned to the MAC address, and by extension the running VM.
Stiching it all together
Now let’s make use of the above 3 functions to make a final function that will ease the process of fetching the IP addresses
function vm_ip() {
# If called without arguments, shows the IP for every running VM
# Else just show the IP of the specified VM name
if [[ $# == 0 ]]; then
running_vms | while read vm; do
mac=$( running_vm_mac "$vm" )
ip=$(running_vm_ip $mac )
echo "$vm $ip"
done
else
mac=$( running_vmc_mac "$1" )
ip=$( running_vm_ip $mac )
echo "$1 $ip"
fi
}
This function can be used in two ways
- Either you can call this function from the command-line with the name of specific VM. If the VM exists and uses the
vboxnet0Host-Only network, then the function will find it’s IP and echo it out. - If it’s called without any arguments, then the function will first call the
running_vmsfunction to get the names of all the currently running VMs, then iterate over them usingwhile readloop and for each running VM userunning_vm_macto get it’s MAC address and then callrunning_vm_ipfunction with the MAC address to get it’s IP address. Once done, output in a properly formatted way.
And there you have it, a simple way to get the IP addresses of VMs using a particular Virtualbox Host-Only adapter. Here’s a screenshot on my machine
