Étiquette : pyvmomi

  • Récupérer un fichier dans une machine virtuelle à l’aide des VMWare Tools

    Récupérer un fichier dans une machine virtuelle à l’aide des VMWare Tools

    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.