vagd ==== .. py:module:: vagd Submodules ---------- .. toctree:: :maxdepth: 1 /autoapi/vagd/__main__/index /autoapi/vagd/box/index /autoapi/vagd/cli/index /autoapi/vagd/gdb/index /autoapi/vagd/helper/index /autoapi/vagd/templates/index /autoapi/vagd/virts/index /autoapi/vagd/wrapper/index Classes ------- .. autoapisummary:: vagd.Box vagd.Dogd vagd.Logd vagd.Qegd vagd.Shgd vagd.Vagd Package Contents ---------------- .. py:class:: Box constants class for recommended images and boxes .. py:attribute:: QEMU_NOBLE :value: 'https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img' .. py:attribute:: QEMU_JAMMY :value: 'https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img' .. py:attribute:: QEMU_FOCAL :value: 'https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img' .. py:attribute:: QEMU_BIONIC :value: 'https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img' .. py:attribute:: QEMU_UBUNTU :value: 'https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img' .. py:attribute:: QEMU_NOBLE_ARM :value: 'https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-arm64.img' .. py:attribute:: QEMU_JAMMY_ARM :value: 'https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-arm64.img' .. py:attribute:: DOCKER_NOBLE :value: 'ubuntu:noble' .. py:attribute:: DOCKER_JAMMY :value: 'ubuntu:jammy' .. py:attribute:: DOCKER_FOCAL :value: 'ubuntu:focal' .. py:attribute:: DOCKER_BIONIC :value: 'ubuntu:bionic' .. py:attribute:: DOCKER_XENIAL :value: 'ubuntu:xenial' .. py:attribute:: DOCKER_UBUNTU :value: 'ubuntu:noble' .. py:attribute:: DOCKER_I386_FOCAL :value: 'i386/ubuntu:focal' .. py:attribute:: DOCKER_I386_BIONIC :value: 'i386/ubuntu:bionic' .. py:attribute:: DOCKER_I386_XENIAL :value: 'i386/ubuntu:xenial' .. py:attribute:: DOCKER_ALPINE_320 :value: 'alpine:3.20' .. py:attribute:: DOCKER_ALPINE :value: 'alpine:3.20' .. py:attribute:: VAGRANT_JAMMY64 :value: 'ubuntu/jammy64' .. py:attribute:: VAGRANT_FOCAL64 :value: 'ubuntu/focal64' .. py:attribute:: VAGRANT_BIONIC64 :value: 'ubuntu/bionic64' .. py:attribute:: VAGRANT_XENIAL64 :value: 'ubuntu/xenial64' .. py:class:: Dogd(binary: str, image: str = DEFAULT_IMAGE, user: str = DEFAULT_USER, forward: Optional[Dict[str, int]] = None, packages: Optional[List[str]] = None, symbols: bool = True, rm: bool = True, ex: bool = False, fast: bool = False, alpine: bool = False, **kwargs: Any) Bases: :py:obj:`vagd.virts.shgd.Shgd` | Docker virtualization for pwntools :param binary: binary to execute :param image: docker base image :param user: name of user on docker container :param forward: Dictionary of forwarded ports, needs to follow docker api format: 'hostport/(tcp|udp)' : guestport :param packages: packages to install on the container :param symbols: additionally install libc6 debug symbols (also updates libc6) :param ex: if experimental features, e.g. alpine, gdbserver should be enabled :param rm: remove container after exit :param alpine: if the conainter is alpine (also autochecks image name) :param fast: mounts libs locally for faster symbol extraction (experimental) NOT COMPATIBLE WITH ALPINE :param kwargs: parameters to pass through to super | SSH from cmd .. code-block:: bash vagd ssh # or ssh -o "StrictHostKeyChecking=no" -i ~/.share/local/vagd/keyfile -p $(cut .vagd/docker.lock -d":" -f 2) vagd@0.0.0.0 | connect with docker exec .. code-block:: bash docker exec -it $(cut ./.vagd/docker.lock -d":" -f 1) /bin/bash | Kill from cmd: .. code-block:: bash vagd clean #or docker kill $(cut ./.vagd/docker.lock -d":" -f 1) | Docker containers are automatically removed after they stop | Docker images need to be manually removed from docker | Dockerfiles are stored in home directory to allow caching ~/.share/local/vagd/docker//Dockerfile .. code-block:: bash docker images # list images docker rmi # remove correct image .. py:attribute:: _image :type: str .. py:attribute:: _name :type: str .. py:attribute:: _user :type: str .. py:attribute:: _port :type: int .. py:attribute:: _packages :type: List[str] .. py:attribute:: _client :type: docker.client .. py:attribute:: _id :type: str .. py:attribute:: _dockerdir :type: str .. py:attribute:: _dockerfile :type: str .. py:attribute:: _isalpine :type: bool .. py:attribute:: _rm :type: bool .. py:attribute:: _ex :type: bool .. py:attribute:: _forward :type: Dict[str, int] .. py:attribute:: _symbols :type: bool .. py:attribute:: VAGD_PREFIX :value: 'vagd-' .. py:attribute:: TYPE :value: 'dogd' .. py:attribute:: DOCKERHOME .. py:attribute:: DEFAULT_USER :value: 'vagd' .. py:attribute:: DEFAULT_PORT :value: 2222 .. py:attribute:: DEFAULT_IMAGE :value: 'ubuntu:noble' .. py:attribute:: DEFAULT_PACKAGES :value: ['gdbserver', 'python3', 'sudo', 'openssh-server'] .. py:attribute:: LOCKFILE :value: './.vagd/docker.lock' .. py:method:: _create_dockerfile() .. py:method:: _create_docker_instance() .. py:method:: _build_image() .. py:method:: _vm_create() .. py:method:: _vm_setup() -> None pass .. py:class:: Logd(binary: str, **kwargs: Any) Bases: :py:obj:`vagd.virts.pwngd.Pwngd` local execution of binary :param binary: binary to execute .. py:attribute:: _binary :type: str .. py:method:: _vm_setup() -> None NOT IMPLEMENTED .. py:method:: _ssh_setup() -> None NOT IMPLEMENTED .. py:method:: _sync(file: str) -> None NOT IMPLEMENTED .. py:method:: _mount(remote_dir: str, local_dir: str) -> None NOT IMPLEMENTED .. py:method:: _mount_lib(remote_lib: str = '/usr/lib') -> None NOT IMPLEMENTED .. py:method:: system(cmd: str) -> None NOT IMPLEMENTED .. py:method:: _install_packages(packages: Iterable) NOT IMPLEMENTED .. py:method:: put(file: str, remote: Optional[str] = None) NOT IMPLEMENTED .. py:method:: debug(**kwargs: Any) -> pwnlib.tubes.process.process run binary with gdb locally :param kwargs: pwntool arguments :rtype: pwnlib.tubes.process.process .. py:method:: pwn_debug(argv: Optional[list[str]] = None, **kwargs: Any) -> pwnlib.tubes.process.process run binary with gdb locally :param argv: comandline arguments for binary :param kwargs: pwntool arguments :rtype: pwnlib.tubes.process.process .. py:method:: process(argv: Optional[list[str]] = None, **kwargs: Any) -> pwnlib.tubes.process.process run binary locally :param argv: comandline arguments for binary :param kwargs: pwntool parameters :return: pwntools process .. py:method:: start(argv: Optional[list[str]] = None, gdbscript: str = '', api: bool = False, **kwargs: Any) -> pwnlib.tubes.process.process start binary locally and return pwnlib.tubes.process.process :param argv: commandline arguments for binary :param gdbscript: GDB script for GDB :param api: if GDB API should be enabled (experimental) :param kwargs: pwntool parameters :return: pwntools process, if api=True tuple with gdb api .. py:class:: Qegd(binary: str, img: str = DEFAULT_IMG, user: str = DEFAULT_USER, forward: Optional[Dict[str, int]] = None, packages: Optional[List[str]] = None, arm: bool = False, qemu: str = DEFAULT_QEMU_CMD, cpu: str = DEFAULT_QEMU_CPU, memory: str = DEFAULT_QEMU_MEMORY, machine: str = DEFAULT_QEMU_MACHINE, cores: str = DEFAULT_QEMU_CORES, bios: Optional[str] = None, detach: bool = False, custom: str = '', **kwargs: Any) Bases: :py:obj:`vagd.virts.shgd.Shgd` | QEMU Virtualization for pwntools :param binary: binary for VM debugging :param img: qemu image to use (requires ssh) :param user: user inside qemu image :param ports: forwarded ports :param packages: packages to install on vm :param arm: emulate arm in qemu :param qemu: qemu cmd :param cpu: value for :code -cpu :param memory: value for :code -m :param cores: value for :code -smp :param machine: value for :code -machine :param bios: value for :code -bios :param custom: custom qemu arguments :param detach: run qemu in new terminal :param kwargs: parameters to pass through to super | SSH from cmd .. code-block:: bash vagd ssh # or ssh -o "StrictHostKeyChecking=no" -i ~/.share/local/vagd/keyfile -p $(cat .vagd/qemu.lock) ubuntu@0.0.0.0 | Kill from cmd: .. code-block:: bash vagd clean # or kill $(pgrep qemu) | Qemu images are cached in the home directory: :code:`~/.share/local/vagd/qemu-imgs/` | | current used images are stored in the local directory: :code:`./.vagd/current.img` | These should be deleted automatically, but if a machine gets improperly stopped | (shutdown host while vm is running) it might remain and use up space. You can find remaining images with: .. code-block:: bash find ~/ -name current.img rm .. py:attribute:: DEFAULT_IMG :value: 'https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img' .. py:attribute:: QEMU_DIR :value: './.vagd/' .. py:attribute:: IMGS_DIR .. py:attribute:: DEFAULT_USER :value: 'vagd' .. py:attribute:: DEFAULT_HOST :value: '0.0.0.0' .. py:attribute:: TYPE :value: 'qegd' .. py:attribute:: DEFAULT_PORT :value: 2222 .. py:attribute:: DEFAULT_QEMU_CMD :value: 'qemu-system-x86_64' .. py:attribute:: DEFAULT_QEMU_ARM_CMD :value: 'qemu-system-aarch64' .. py:attribute:: DEFAULT_QEMU_MACHINE_PREFIX :value: '-machine' .. py:attribute:: DEFAULT_QEMU_MACHINE :value: 'accel=kvm,type=q35' .. py:attribute:: DEFAULT_QEMU_ARM_MACHINE :value: 'virt' .. py:attribute:: DEFAULT_QEMU_CPU_PREFIX :value: '-cpu' .. py:attribute:: DEFAULT_QEMU_CPU :value: 'host' .. py:attribute:: DEFAULT_QEMU_ARM_CPU :value: 'cortex-a72' .. py:attribute:: DEFAULT_QEMU_CORES_PREFIX :value: '-smp' .. py:attribute:: DEFAULT_QEMU_CORES :value: '2' .. py:attribute:: DEFAULT_QEMU_BIOS_PREFIX :value: '-bios' .. py:attribute:: DEFAULT_QEMU_ARM_BIOS :value: '/usr/share/edk2/aarch64/QEMU_EFI.fd' .. py:attribute:: DEFAULT_QEMU_MEMORY_PREFIX :value: '-m' .. py:attribute:: DEFAULT_QEMU_MEMORY :value: '2G' .. py:attribute:: _img :type: str .. py:attribute:: _local_img :type: str .. py:attribute:: _user :type: str .. py:attribute:: _host :type: str .. py:attribute:: _port :type: int .. py:attribute:: _forward :type: Dict[str, int] .. py:attribute:: _qemu :type: str .. py:attribute:: _cpu :type: str .. py:attribute:: _cores :type: str .. py:attribute:: _memory :type: str .. py:attribute:: _bios :type: str .. py:attribute:: _machine :type: str .. py:attribute:: _detach :type: bool .. py:attribute:: _custom :value: '' .. py:method:: _is_local(url) -> bool :staticmethod: check if provided url is local or remote :param url: url to check :return: if the url is local or remote .. py:attribute:: CURRENT_IMG :value: './.vagd/current.img' .. py:method:: _set_local_img() get local image for qemu machine .. py:attribute:: METADATA_FILE :value: './.vagd/metadata.yaml' .. py:attribute:: _METADATA :value: Multiline-String .. raw:: html
Show Value .. code-block:: python """instance-id: iid-local01 local-hostname: cloudimg """ .. raw:: html
.. py:attribute:: USER_DATA_FILE :value: './.vagd/user-data.yaml' .. py:attribute:: _USER_DATA :value: Multiline-String .. raw:: html
Show Value .. code-block:: python """#cloud-config users: - default - name: {user} groups: sudo shell: /bin/bash sudo: ['ALL=(ALL) NOPASSWD:ALL'] ssh_authorized_keys: - {pubkey} """ .. raw:: html
.. py:attribute:: SEED_FILE :value: './.vagd/seed.img' .. py:attribute:: _GENERATE_SEED_IMG :value: 'cloud-localds ./.vagd/seed.img ./.vagd/user-data.yaml ./.vagd/metadata.yaml' .. py:method:: _setup_seed() create seed.img with config data like ssh keypair in .qemu .. py:attribute:: _QEMU_PORT_FORWARDING :value: ',hostfwd={type}::{guest}-:{host}' .. py:attribute:: _QEMU_START :value: '{qemu} {machine} {cores} {cpu} {memory} -nographic {bios} -device virtio-net-pci,netdev=net0... .. py:attribute:: _QEMU_PIPE :value: '&> /dev/null; ' .. py:attribute:: _QEMU_SUFFIX :value: 'rm {lock} {current}' .. py:attribute:: _QEMU_ARM_START :value: '' .. py:attribute:: LOCKFILE :value: './.vagd/qemu.lock' .. py:method:: _qemu_start() start qemu machine .. py:method:: _new_vm() -> None create new vm .. py:method:: _vm_setup() -> None setup qemu machine .. py:class:: Shgd(binary: str, user: str = DEFAULT_USER, host: str = DEFAULT_HOST, port: int = DEFAULT_PORT, keyfile: str = Pwngd.KEYFILE, **kwargs: Any) Bases: :py:obj:`vagd.virts.pwngd.Pwngd` ssh interface for pwntools :param binary: binary to execute :param user: ssh user :param host: ssh hostname :param port: ssh port :param keyfile: ssh keyfile (default in .vagd) :param kwargs: parameters to pass through to super .. py:attribute:: DEFAULT_HOST :value: 'localhost' .. py:attribute:: DEFAULT_PORT :value: 22 .. py:attribute:: DEFAULT_USER :value: 'root' .. py:attribute:: _user :type: str .. py:attribute:: _host :type: str .. py:attribute:: _port :type: int .. py:attribute:: _keyfile :type: str .. py:attribute:: _ssh :type: pwnlib.tubes.ssh.ssh .. py:method:: bind(port: int) -> int bind port from ssh connection locally :param port: :return: .. py:method:: _vm_setup() -> None pass .. py:attribute:: _TRIES :value: 3 .. py:method:: _ssh_setup() -> None setup ssh connection .. py:class:: Vagd(binary: str, vagrantfile: str = VAGRANTFILE_PATH, vbox: Optional[str] = None, packages: Optional[List[str]] = None, **kwargs: Any) Bases: :py:obj:`vagd.virts.shgd.Shgd` | Vagrant Virtualization for pwntools :param binary: binary for VM debugging :param vbox: vagrant box to use :param vagrantfile: location of Vagrantfile :param packages: packages to install on vm :param kwargs: arguments to pass through to super | SSH from cmd: .. code-block:: bash vagd ssh # or VAGRANT_CWD=.vagd vagrant ssh | halt from cmd .. code-block:: bash VAGRANT_CWD=.vagd vagrant halt | destroy from cmd .. code-block:: bash vagd clean # or VAGRANT_CWD=.vagd vagrant destroy .. py:attribute:: VAGRANTFILE_PATH :value: './.vagd/Vagrantfile' .. py:attribute:: VAGRANTFILE_BOX :value: 'config.vm.box' .. py:attribute:: VAGRANT_BOX :value: 'ubuntu/jammy64' .. py:attribute:: KEYFILE :value: './.vagd/.vagd/.vagrant/machines/default/virtualbox/private_key' .. py:attribute:: TYPE :value: 'vagd' .. py:attribute:: _box :type: str .. py:attribute:: _vagrantfile :type: str .. py:attribute:: _v :type: object .. py:method:: _get_box() -> str returns box of current vagrantfile @:rtype box name of Vagrantfile .. py:method:: _vm_setup() -> None setup vagrant machine creates new one if no Vagrantfile is specified or box does not match