·
  • Etat des services
  • 03 57 75 61 46
  • Espace Client
Devclic
 
Récupérer un fichier dans une machine virtuelle à l’aide des VMWare Tools
Actualités|vendredi 23 février 2024

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.