Dans le cadre d’un projet pour un client, nous avons été amené à récupérer des fichiers présents dans une machine virtuelle à l’aide des VMWare Tools. Pour ce faire, rien de plus simple, il faut utiliser l’API de VMWare, dans notre cas, nous avons fait le choix d’utiliser du Python et pyvmomi
But de l’opération ?
Sur une machine par exemple piratée, il est alors possible, en déconnectant la machine du réseau, de récupérer son contenu qui pourrait ne pas avoir été sauvegardé, ou bien encore, à travers une autre API de VMWare, lancer un exécutable qui écrirait dans un fichier de logs le résultat et en récupérer le résultat pour analyser.
On peut récupérer des fichiers mais on peut également en envoyer et on peut également lancer des commandes à travers les VMWare Tools. La récupération de données ne peut se faire que sur des fichiers, il faut donc zipper le contenu si vous avez besoin de récupérer un ensemble de fichiers.
On veut du code …
from pyVim.connect import SmartConnectNoSSL, Disconnect
from pyVmomi import vim, vmodl
import argparse
import getpass
def get_args():
parser = argparse.ArgumentParser(description='Arguments for talking to vCenter')
parser.add_argument('--host', required=True, action='store', help='vCenter host')
parser.add_argument('--user', required=True, action='store', help='User name to use')
parser.add_argument('--password', required=False, action='store', help='Password to use')
parser.add_argument('--vm-name', required=True, action='store', help='Name of VM to interact with')
parser.add_argument('--file-path', required=True, action='store', help='Path of the file to retrieve from the VM')
parser.add_argument('--guest-user', required=True, action='store', help='Guest OS user')
parser.add_argument('--guest-password', required=True, action='store', help='Guest OS password')
args = parser.parse_args()
if not args.password:
args.password = getpass.getpass(prompt='Enter password for vCenter: ')
return args
def main():
args = get_args()
# Connect to the host without SSL certification verification
si = SmartConnectNoSSL(host=args.host, user=args.user, pwd=args.password)
content = si.RetrieveContent()
# Find the VM
vm = None
for child in content.rootFolder.childEntity:
if hasattr(child, 'vmFolder'):
datacenter = child
vmFolder = datacenter.vmFolder
vmList = vmFolder.childEntity
for vm in vmList:
if vm.name == args.vm_name:
break
if vm:
break
if not vm:
print("VM not found")
return
# Set up guest file manager
creds = vim.vm.guest.NamePasswordAuthentication(username=args.guest_user, password=args.guest_password)
gfm = content.guestOperationsManager.fileManager
# Define the file to retrieve
guestFilePath = args.file_path
# Generate a URL to download the file
try:
fileTransferInformation = gfm.InitiateFileTransferFromGuest(vm, creds, guestFilePath)
print(f"Download URL: {fileTransferInformation.url}")
except vmodl.MethodFault as error:
print("Error: ", error.msg)
# Disconnect from the host
Disconnect(si)
if __name__ == "__main__":
main()
Vous pouvez récupérer votre fichier à l’adresse indiquée par Download URL. Comme vous pouvez le voir, les VMWare tools doivent être installés et fonctionnels. Il faut également un nom d’utilisateur et un mot de passe pour pouvoir récupérer du contenu.