dissect.target 3.15.dev29__tar.gz → 3.15.dev31__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {dissect.target-3.15.dev29/dissect.target.egg-info → dissect.target-3.15.dev31}/PKG-INFO +1 -1
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugin.py +2 -2
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +68 -28
- dissect.target-3.15.dev31/dissect/target/plugins/os/unix/bsd/citrix/history.py +130 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31/dissect.target.egg-info}/PKG-INFO +1 -1
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect.target.egg-info/SOURCES.txt +2 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/conftest.py +7 -3
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_citrix.py +10 -7
- dissect.target-3.15.dev31/tests/plugins/os/unix/bsd/citrix/test__os.py +65 -0
- dissect.target-3.15.dev31/tests/plugins/os/unix/bsd/citrix/test_history.py +88 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_plugin.py +4 -4
- dissect.target-3.15.dev29/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -43
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/COPYRIGHT +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/LICENSE +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/MANIFEST.in +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/README.md +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/container.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/asdf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/ewf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/hdd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/hds.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/qcow2.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/raw.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/split.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/vdi.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/vhd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/vhdx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/vmdk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/exceptions.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystem.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/ad1.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/btrfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/cb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/dir.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/exfat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/extfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/fat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/ffs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/itunes.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/jffs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/ntfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/smb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/squashfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/tar.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/vmfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/xfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/filesystems/zip.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/cache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/path_310.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/path_311.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/path_312.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/path_39.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/compat/path_common.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/configutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/cyber.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/data/windowsZones.xml +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/descriptor_extensions.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/docs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/fsutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/hashutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/keychain.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/lazy.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/loaderutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/localeutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/mount.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/network_managers.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/polypath.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/record.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/record_modifier.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/regutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/shell_folder_ids.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/ssh.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/targetd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/helpers/utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loader.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/ad1.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/asdf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/cb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/cyber.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/dir.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/hyperv.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/itunes.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/kape.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/local.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/log.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/multiraw.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/ova.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/ovf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/phobos.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/profile.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/pvm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/pvs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/raw.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/remote.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/res.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/smb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/tanium.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/tar.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/target.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/targetd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/utm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/vb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/vbox.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/velociraptor.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/vma.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/vmwarevm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/vmx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/loaders/xva.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/av/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/av/mcafee.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/av/sophos.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/av/symantec.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/browser.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/chrome.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/chromium.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/edge.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/firefox.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/container/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/container/docker.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/shell/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/shell/powershell.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/ssh/putty.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/apache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/iis.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/esxi.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/hyperv.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/virtuozzo.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/vmware_workstation.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/child/wsl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/icat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/resolver.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/walkfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/filesystem/yara.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/default.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/example.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/loaders.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/osinfo.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/plugins.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/scrape.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/general/users.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/datetime.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/etc.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/generic.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/history.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/fortigate/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/fortigate/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/services.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/locale.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/atop.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/audit.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/auth.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/journal.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/messages.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/unix/shadow.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/_os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/amcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/catroot.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/cim.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/clfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/datetime.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/defender.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/env.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/generic.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/lnk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/locale.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/etl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/evt.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/notifications.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/prefetch.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/registry.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/sam.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/services.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/sru.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/syscache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/tasks.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/ual.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/plugins/os/windows/wer.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/report.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/target.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/build_pluginlist.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/dd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/dump/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/dump/run.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/dump/state.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/dump/utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/fs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/info.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/logging.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/mount.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/query.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/reg.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/shell.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/tools/utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volume.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/bde.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/ddf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/disk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/luks.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/lvm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/md.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/volumes/vmfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect.target.egg-info/dependency_links.txt +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect.target.egg-info/entry_points.txt +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect.target.egg-info/requires.txt +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect.target.egg-info/top_level.txt +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/pyproject.toml +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/setup.cfg +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/_docs/Makefile +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/_docs/conf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/_docs/index.rst +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/_utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/containers/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/containers/test_split.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_cb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_dir.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_exfat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_fat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_ntfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_smb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_tar.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/filesystems/test_zip.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_cache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_configutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_docs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_fsutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_hashutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_keychain.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_loaderutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_localeutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_modifier.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_record.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_regutil.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/helpers/test_utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_asdf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_cb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_dir.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_hyperv.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_kape.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_local.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_log.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_multiraw.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_ova.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_ovf.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_phobos.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_pvm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_pvs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_remote.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_smb.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_tanium.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_tar.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_utm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_vbox.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_velociraptor.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/loaders/test_vmwarevm.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/av/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/av/test_mcafee.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/av/test_sophos.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/av/test_symantec.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/av/test_trendmicro.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/browser/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/browser/test_browser.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/container/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/container/test_docker.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/shell/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/shell/test_powershell.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/ssh/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/ssh/test_openssh.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/ssh/test_putty.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/vpn/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webhosting/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_apache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_caddy.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_iis.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_nginx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_webserver.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/child/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/child/test_hyperv.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/child/test_virtuozzo.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/child/test_wsl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_icat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_resolver.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_walkfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/test_yara.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/unix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/unix/test_capability.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/filesystem/unix/test_suid.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/test_config.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/test_default.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/test_plugins.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/test_scrape.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/general/test_users.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/bsd/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_environ.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_modules.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_proc.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_processes.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_services.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_atop.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_audit.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_auth.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_messages.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/log/test_utmp.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test__os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_generic.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_history.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_ips.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_journal.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_locale.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_packagemanager.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_shadow.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_users.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/unix/test_version.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/log/test_etl.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/log/test_evt.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/log/test_evtx.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_cit.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test__os.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_adpolicy.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_amcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_clfs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_datetime.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_defender.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_dpapi.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_env.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_generic.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_lnk.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_locale.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_mru.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_notifications.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_prefetch.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_recyclebin.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_registry.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_sam.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_shimcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_sru.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_syscache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_tasks.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_thumbcache.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_ual.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/os/windows/test_wer.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_container.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_filesystem.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_registration.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_report.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_target.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/test_volume.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_dump.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_fs.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_mount.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_query.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_shell.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/tools/test_utils.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/volumes/__init__.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/volumes/test_bde.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/volumes/test_md.py +0 -0
- {dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tox.ini +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.15.
|
3
|
+
Version: 3.15.dev31
|
4
4
|
Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
6
6
|
License: Affero General Public License v3
|
@@ -495,7 +495,7 @@ def register(plugincls: Type[Plugin]) -> None:
|
|
495
495
|
root["exports"] = plugincls.__exports__
|
496
496
|
root["namespace"] = plugincls.__namespace__
|
497
497
|
root["fullname"] = ".".join((plugincls.__module__, plugincls.__qualname__))
|
498
|
-
root["
|
498
|
+
root["is_osplugin"] = issubclass(plugincls, OSPlugin)
|
499
499
|
|
500
500
|
|
501
501
|
def internal(*args, **kwargs) -> Callable:
|
@@ -1117,7 +1117,7 @@ def plugin_function_index(target: Optional[Target]) -> tuple[dict[str, PluginDes
|
|
1117
1117
|
available["exports"].remove("get_all_records")
|
1118
1118
|
|
1119
1119
|
for exported in available["exports"]:
|
1120
|
-
if
|
1120
|
+
if available["is_osplugin"] and os_type == general.default.DefaultPlugin:
|
1121
1121
|
# This makes the os plugin exports listed under the special
|
1122
1122
|
# "OS plugins" header by the 'plugins' plugin.
|
1123
1123
|
available["module"] = ""
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
3
3
|
import re
|
4
4
|
from typing import Iterator, Optional
|
5
5
|
|
6
|
-
from dissect.target.filesystem import Filesystem
|
6
|
+
from dissect.target.filesystem import Filesystem
|
7
7
|
from dissect.target.helpers.record import UnixUserRecord
|
8
8
|
from dissect.target.plugin import OperatingSystem, export
|
9
9
|
from dissect.target.plugins.os.unix.bsd._os import BsdPlugin
|
@@ -18,12 +18,12 @@ RE_CONFIG_USER = re.compile(r"bind system user (?P<user>[^ ]+) ")
|
|
18
18
|
RE_LOADER_CONFIG_KERNEL_VERSION = re.compile(r'kernel="/(?P<version>.*)"')
|
19
19
|
|
20
20
|
|
21
|
-
class
|
21
|
+
class CitrixPlugin(BsdPlugin):
|
22
22
|
def __init__(self, target: Target):
|
23
23
|
super().__init__(target)
|
24
24
|
self._ips = []
|
25
25
|
self._hostname = None
|
26
|
-
self.
|
26
|
+
self._config_usernames = []
|
27
27
|
self._parse_netscaler_configs()
|
28
28
|
|
29
29
|
def _parse_netscaler_configs(self) -> None:
|
@@ -49,26 +49,46 @@ class CitrixBsdPlugin(BsdPlugin):
|
|
49
49
|
|
50
50
|
@classmethod
|
51
51
|
def detect(cls, target: Target) -> Optional[Filesystem]:
|
52
|
-
|
53
|
-
|
52
|
+
ramdisk = None
|
53
|
+
for fs in target.filesystems:
|
54
|
+
# /netscaler can be present on both the ramdisk and the harddisk. Therefore we also check for the /log
|
55
|
+
# folder, which is not present on the ramdisk. We regard the harddisk as the system volume, as it is
|
56
|
+
# possible to only have a disk image of a Netscaler. However, in the case where we only have the ramdisk,
|
57
|
+
# we want to fall back on that as the system volume. Thus we store that filesystem in a fallback variable.
|
58
|
+
if fs.exists("/netscaler"):
|
59
|
+
if fs.exists("/log"):
|
60
|
+
return fs
|
61
|
+
ramdisk = fs
|
62
|
+
|
63
|
+
# At this point, we could not find the filesystem for '/var'. Thus, we fall back to the ramdisk variable, which
|
64
|
+
# is either 'None' (in which case this isn't a Citrix netscaler), or points to the filesystem of the ramdisk.
|
65
|
+
return ramdisk
|
66
|
+
|
67
|
+
@classmethod
|
68
|
+
def create(cls, target: Target, sysvol: Filesystem) -> CitrixPlugin:
|
69
|
+
# A disk image of a Citrix Netscaler contains two partitions, that after boot are mounted to /var and /flash.
|
70
|
+
# The rest of the filesystem is recreated at runtime into a 'ramdisk'. Currently, this plugin does not
|
71
|
+
# yet support recreating the ramdisk from a 'clean' state. This might be possible in a future iteration but
|
72
|
+
# requires further research.
|
73
|
+
|
74
|
+
# When the ramdisk is present within the target's filesystems, mount it accordingly,
|
54
75
|
for fs in target.filesystems:
|
55
76
|
if fs.exists("/bin/freebsd-version"):
|
56
|
-
|
57
|
-
|
77
|
+
# If available, mount the ramdisk first.
|
78
|
+
target.fs.mount("/", fs)
|
79
|
+
# The 'disk' filesystem is mounted at '/var'.
|
80
|
+
target.fs.mount("/var", sysvol)
|
81
|
+
|
82
|
+
# Enumerate filesystems for flash partition
|
58
83
|
for fs in target.filesystems:
|
59
84
|
if fs.exists("/nsconfig") and fs.exists("/boot"):
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
newfilesystem.map_fs("/var", fs)
|
64
|
-
is_citrix = True
|
65
|
-
if is_citrix:
|
66
|
-
return newfilesystem
|
67
|
-
return None
|
85
|
+
target.fs.mount("/flash", fs)
|
86
|
+
|
87
|
+
return cls(target)
|
68
88
|
|
69
89
|
@export(property=True)
|
70
90
|
def hostname(self) -> Optional[str]:
|
71
|
-
return self._hostname
|
91
|
+
return self._hostname or super().hostname
|
72
92
|
|
73
93
|
@export(property=True)
|
74
94
|
def version(self) -> Optional[str]:
|
@@ -96,16 +116,21 @@ class CitrixBsdPlugin(BsdPlugin):
|
|
96
116
|
@export(record=UnixUserRecord)
|
97
117
|
def users(self) -> Iterator[UnixUserRecord]:
|
98
118
|
nstmp_users = set()
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
119
|
+
seen = set()
|
120
|
+
nstmp_path = self.target.fs.path("/var/nstmp/")
|
121
|
+
|
122
|
+
# Build a set of nstmp users
|
123
|
+
if nstmp_path.exists():
|
124
|
+
for entry in nstmp_path.iterdir():
|
125
|
+
if entry.is_dir() and entry.name != "#nsinternal#":
|
126
|
+
# The nsmonitor user has a home directory of /var/nstmp/monitors rather than /var/nstmp/nsmonitor
|
127
|
+
username = "nsmonitor" if entry.name == "monitors" else entry.name
|
128
|
+
nstmp_users.add(username)
|
129
|
+
|
130
|
+
# Yield users from the config, matching them to their 'home' in /var/nstmp if it exists.
|
106
131
|
for username in self._config_usernames:
|
107
|
-
nstmp_home =
|
108
|
-
user_home = nstmp_home if
|
132
|
+
nstmp_home = nstmp_path.joinpath(username)
|
133
|
+
user_home = nstmp_home if nstmp_home.exists() else None
|
109
134
|
|
110
135
|
if user_home:
|
111
136
|
# After this loop we will yield all users who are not in the config, but are listed in /var/nstmp/
|
@@ -114,13 +139,28 @@ class CitrixBsdPlugin(BsdPlugin):
|
|
114
139
|
|
115
140
|
if username == "root" and self.target.fs.exists("/root"):
|
116
141
|
# If we got here, 'root' is present both in /var/nstmp and in /root. In such cases, we yield
|
117
|
-
# the 'root' user as having '/root' as a home, not in /var/nstmp
|
118
|
-
|
142
|
+
# the 'root' user as having '/root' as a home, not in /var/nstmp, as there is no 'nscli_history'
|
143
|
+
# for the root user in /var/nstmp.
|
144
|
+
user_home = self.target.fs.path("/root")
|
119
145
|
|
146
|
+
seen.add((username, user_home.as_posix() if user_home else None, None))
|
120
147
|
yield UnixUserRecord(name=username, home=user_home)
|
121
148
|
|
149
|
+
# Yield all users in nstmp that were not observed in the config
|
122
150
|
for username in nstmp_users:
|
123
|
-
|
151
|
+
# The nsmonitor user has a home directory of /var/nstmp/monitors rather than /var/nstmp/nsmonitor
|
152
|
+
home = nstmp_path.joinpath(username) if username != "nsmonitor" else nstmp_path.joinpath("monitors")
|
153
|
+
seen.add((username, home.as_posix(), None))
|
154
|
+
yield UnixUserRecord(name=username, home=home)
|
155
|
+
|
156
|
+
# Yield users from /etc/passwd if we have not seem them in previous loops
|
157
|
+
for user in super().users():
|
158
|
+
if (user.name, user.home.as_posix(), user.shell) in seen:
|
159
|
+
continue
|
160
|
+
# To prevent bogus command history for all users without a home whenever a history is located at the root
|
161
|
+
# of the filesystem, we set the user home to None if their home is equivalent to '/'
|
162
|
+
user.home = user.home if user.home != "/" else None
|
163
|
+
yield user
|
124
164
|
|
125
165
|
@export(property=True)
|
126
166
|
def os(self) -> str:
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import re
|
2
|
+
from typing import Iterator, Optional
|
3
|
+
|
4
|
+
from dissect.target.helpers.fsutil import TargetPath
|
5
|
+
from dissect.target.helpers.record import UnixUserRecord
|
6
|
+
from dissect.target.helpers.utils import year_rollover_helper
|
7
|
+
from dissect.target.plugin import export
|
8
|
+
from dissect.target.plugins.os.unix.history import (
|
9
|
+
CommandHistoryPlugin,
|
10
|
+
CommandHistoryRecord,
|
11
|
+
)
|
12
|
+
|
13
|
+
RE_CITRIX_NETSCALER_BASH_HISTORY_DATE = re.compile(r"(?P<date>[^<]+)\s")
|
14
|
+
|
15
|
+
CITRIX_NETSCALER_BASH_HISTORY_RE = re.compile(
|
16
|
+
r"""
|
17
|
+
(?P<date>[^<]+)
|
18
|
+
\s
|
19
|
+
<
|
20
|
+
(?P<syslog_facility>[^\.]+)
|
21
|
+
\.
|
22
|
+
(?P<syslog_loglevel>[^>]+)
|
23
|
+
>
|
24
|
+
\s
|
25
|
+
(?P<hostname>[^\s]+)
|
26
|
+
\s
|
27
|
+
(?P<process_name>[^\[]+)
|
28
|
+
\[
|
29
|
+
(?P<process_id>\d+)
|
30
|
+
\]
|
31
|
+
:
|
32
|
+
\s
|
33
|
+
(?P<username>.*)\s
|
34
|
+
on\s
|
35
|
+
(?P<destination>[^\s]+)\s
|
36
|
+
shell_command=
|
37
|
+
\"
|
38
|
+
(?P<command>.*)
|
39
|
+
\"
|
40
|
+
$
|
41
|
+
""",
|
42
|
+
re.VERBOSE,
|
43
|
+
)
|
44
|
+
|
45
|
+
|
46
|
+
class CitrixCommandHistoryPlugin(CommandHistoryPlugin):
|
47
|
+
COMMAND_HISTORY_ABSOLUTE_PATHS = (("citrix-netscaler-bash", "/var/log/bash.log*"),)
|
48
|
+
COMMAND_HISTORY_RELATIVE_PATHS = CommandHistoryPlugin.COMMAND_HISTORY_RELATIVE_PATHS + (
|
49
|
+
("citrix-netscaler-cli", ".nscli_history"),
|
50
|
+
)
|
51
|
+
|
52
|
+
def _find_history_files(self) -> list[tuple[str, TargetPath, Optional[UnixUserRecord]]]:
|
53
|
+
"""Find history files on the target that this plugin can parse."""
|
54
|
+
history_files = []
|
55
|
+
for shell, history_absolute_path_glob in self.COMMAND_HISTORY_ABSOLUTE_PATHS:
|
56
|
+
for path in self.target.fs.path("/").glob(history_absolute_path_glob.lstrip("/")):
|
57
|
+
history_files.append((shell, path, None))
|
58
|
+
|
59
|
+
# Also utilize the _find_history_files function of the parent class
|
60
|
+
history_files.extend(super()._find_history_files())
|
61
|
+
return history_files
|
62
|
+
|
63
|
+
def _find_user_by_name(self, username: str) -> Optional[UnixUserRecord]:
|
64
|
+
"""Cached function to return the matching UnixUserRecord for a given username."""
|
65
|
+
if username is None:
|
66
|
+
return None
|
67
|
+
|
68
|
+
user_details = self.target.user_details.find(username=username)
|
69
|
+
return user_details.user if user_details else None
|
70
|
+
|
71
|
+
@export(record=CommandHistoryRecord)
|
72
|
+
def commandhistory(self) -> Iterator[CommandHistoryRecord]:
|
73
|
+
"""Return shell history for all users.
|
74
|
+
|
75
|
+
When using a shell, history of the used commands is kept on the system.
|
76
|
+
"""
|
77
|
+
|
78
|
+
for shell, history_path, user in self._history_files:
|
79
|
+
if shell == "citrix-netscaler-cli":
|
80
|
+
yield from self.parse_netscaler_cli_history(history_path, user)
|
81
|
+
elif shell == "citrix-netscaler-bash":
|
82
|
+
yield from self.parse_netscaler_bash_history(history_path)
|
83
|
+
|
84
|
+
def parse_netscaler_bash_history(self, path: TargetPath) -> Iterator[CommandHistoryRecord]:
|
85
|
+
"""Parse bash.log* contents."""
|
86
|
+
for ts, line in year_rollover_helper(path, RE_CITRIX_NETSCALER_BASH_HISTORY_DATE, "%b %d %H:%M:%S "):
|
87
|
+
line = line.strip()
|
88
|
+
if not line:
|
89
|
+
continue
|
90
|
+
|
91
|
+
match = CITRIX_NETSCALER_BASH_HISTORY_RE.match(line)
|
92
|
+
if not match:
|
93
|
+
continue
|
94
|
+
|
95
|
+
group = match.groupdict()
|
96
|
+
command = group.get("command")
|
97
|
+
user = self._find_user_by_name(group.get("username"))
|
98
|
+
|
99
|
+
yield CommandHistoryRecord(
|
100
|
+
ts=ts,
|
101
|
+
command=command,
|
102
|
+
shell="citrix-netscaler-bash",
|
103
|
+
source=path,
|
104
|
+
_target=self.target,
|
105
|
+
_user=user,
|
106
|
+
)
|
107
|
+
|
108
|
+
def parse_netscaler_cli_history(
|
109
|
+
self, history_file: TargetPath, user: UnixUserRecord
|
110
|
+
) -> Iterator[CommandHistoryRecord]:
|
111
|
+
"""Parses the history file of the Citrix Netscaler CLI.
|
112
|
+
|
113
|
+
The only difference compared to generic bash history files is that the first line will start with
|
114
|
+
``_HiStOrY_V2_``, which we will skip.
|
115
|
+
"""
|
116
|
+
for idx, line in enumerate(history_file.open("rt")):
|
117
|
+
if not (line := line.strip()):
|
118
|
+
continue
|
119
|
+
|
120
|
+
if idx == 0 and line == "_HiStOrY_V2_":
|
121
|
+
continue
|
122
|
+
|
123
|
+
yield CommandHistoryRecord(
|
124
|
+
ts=None,
|
125
|
+
command=line,
|
126
|
+
shell="citrix-netscaler-cli",
|
127
|
+
source=history_file,
|
128
|
+
_target=self.target,
|
129
|
+
_user=user,
|
130
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dissect.target
|
3
|
-
Version: 3.15.
|
3
|
+
Version: 3.15.dev31
|
4
4
|
Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
6
6
|
License: Affero General Public License v3
|
@@ -198,6 +198,7 @@ dissect/target/plugins/os/unix/shadow.py
|
|
198
198
|
dissect/target/plugins/os/unix/bsd/_os.py
|
199
199
|
dissect/target/plugins/os/unix/bsd/citrix/__init__.py
|
200
200
|
dissect/target/plugins/os/unix/bsd/citrix/_os.py
|
201
|
+
dissect/target/plugins/os/unix/bsd/citrix/history.py
|
201
202
|
dissect/target/plugins/os/unix/bsd/freebsd/__init__.py
|
202
203
|
dissect/target/plugins/os/unix/bsd/freebsd/_os.py
|
203
204
|
dissect/target/plugins/os/unix/bsd/ios/__init__.py
|
@@ -461,6 +462,7 @@ tests/plugins/os/unix/test_version.py
|
|
461
462
|
tests/plugins/os/unix/bsd/__init__.py
|
462
463
|
tests/plugins/os/unix/bsd/citrix/__init__.py
|
463
464
|
tests/plugins/os/unix/bsd/citrix/test__os.py
|
465
|
+
tests/plugins/os/unix/bsd/citrix/test_history.py
|
464
466
|
tests/plugins/os/unix/bsd/osx/__init__.py
|
465
467
|
tests/plugins/os/unix/bsd/osx/test__os.py
|
466
468
|
tests/plugins/os/unix/bsd/osx/test_user.py
|
@@ -12,7 +12,7 @@ from dissect.target.helpers.regutil import VirtualHive, VirtualKey, VirtualValue
|
|
12
12
|
from dissect.target.plugin import OSPlugin
|
13
13
|
from dissect.target.plugins.general import default
|
14
14
|
from dissect.target.plugins.os.unix._os import UnixPlugin
|
15
|
-
from dissect.target.plugins.os.unix.bsd.citrix._os import
|
15
|
+
from dissect.target.plugins.os.unix.bsd.citrix._os import CitrixPlugin
|
16
16
|
from dissect.target.plugins.os.unix.bsd.osx._os import MacPlugin
|
17
17
|
from dissect.target.plugins.os.unix.linux._os import LinuxPlugin
|
18
18
|
from dissect.target.plugins.os.unix.linux.android._os import AndroidPlugin
|
@@ -301,11 +301,15 @@ def target_osx(tmp_path: pathlib.Path, fs_osx: Filesystem) -> Iterator[Target]:
|
|
301
301
|
|
302
302
|
|
303
303
|
@pytest.fixture
|
304
|
-
def target_citrix(tmp_path: pathlib.Path, fs_bsd:
|
305
|
-
mock_target =
|
304
|
+
def target_citrix(tmp_path: pathlib.Path, fs_bsd: VirtualFilesystem) -> Target:
|
305
|
+
mock_target = next(make_mock_target(tmp_path))
|
306
|
+
mock_target._os_plugin = CitrixPlugin
|
307
|
+
|
308
|
+
mock_target.filesystems.add(fs_bsd)
|
306
309
|
|
307
310
|
var_filesystem = VirtualFilesystem()
|
308
311
|
var_filesystem.makedirs("/netscaler")
|
312
|
+
var_filesystem.makedirs("/log")
|
309
313
|
mock_target.filesystems.add(var_filesystem)
|
310
314
|
|
311
315
|
flash_filesystem = VirtualFilesystem()
|
{dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/tests/plugins/apps/webserver/test_citrix.py
RENAMED
@@ -1,6 +1,8 @@
|
|
1
1
|
from datetime import datetime, timedelta, timezone
|
2
2
|
from io import BytesIO
|
3
3
|
|
4
|
+
from dissect.target.filesystem import VirtualFilesystem
|
5
|
+
from dissect.target.plugins.apps.webserver.apache import ApachePlugin
|
4
6
|
from dissect.target.plugins.apps.webserver.citrix import (
|
5
7
|
LOG_FORMAT_CITRIX_NETSCALER_ACCESS_COMBINED_RESPONSE_TIME,
|
6
8
|
LOG_FORMAT_CITRIX_NETSCALER_ACCESS_COMBINED_RESPONSE_TIME_WITH_HEADERS,
|
@@ -30,10 +32,10 @@ def test_infer_access_log_citrix_netscaler_combined_response_time_with_headers()
|
|
30
32
|
assert logformat == LOG_FORMAT_CITRIX_NETSCALER_ACCESS_COMBINED_RESPONSE_TIME_WITH_HEADERS
|
31
33
|
|
32
34
|
|
33
|
-
def test_access_logs(target_citrix: Target) -> None:
|
35
|
+
def test_access_logs(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
34
36
|
tz = timezone(timedelta(hours=1))
|
35
37
|
data_file = absolute_path("_data/plugins/apps/webserver/citrix/httpaccess.log")
|
36
|
-
|
38
|
+
fs_bsd.map_file("var/log/httpaccess.log", data_file)
|
37
39
|
|
38
40
|
target_citrix.add_plugin(CitrixWebserverPlugin)
|
39
41
|
|
@@ -69,9 +71,9 @@ def test_access_logs(target_citrix: Target) -> None:
|
|
69
71
|
assert citrix_netscaler_headers_combined_response_log.pid == 82775
|
70
72
|
|
71
73
|
|
72
|
-
def test_error_logs(target_citrix: Target) -> None:
|
73
|
-
|
74
|
-
|
74
|
+
def test_error_logs(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
75
|
+
fs_bsd.map_file("var/log/httperror-vpn.log", BytesIO(b"Foo"))
|
76
|
+
fs_bsd.map_file("var/log/httperror.log", BytesIO(b"Bar"))
|
75
77
|
|
76
78
|
target_citrix.add_plugin(CitrixWebserverPlugin)
|
77
79
|
access_log_paths, error_log_paths = target_citrix.citrix.get_log_paths()
|
@@ -79,10 +81,11 @@ def test_error_logs(target_citrix: Target) -> None:
|
|
79
81
|
assert len(error_log_paths) == 2
|
80
82
|
|
81
83
|
|
82
|
-
def test_access_logs_webserver_namespace(target_citrix: Target) -> None:
|
84
|
+
def test_access_logs_webserver_namespace(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
83
85
|
data_file = absolute_path("_data/plugins/apps/webserver/citrix/httpaccess.log")
|
84
|
-
|
86
|
+
fs_bsd.map_file("var/log/httpaccess.log", data_file)
|
85
87
|
|
88
|
+
target_citrix.add_plugin(ApachePlugin, check_compatible=False)
|
86
89
|
target_citrix.add_plugin(CitrixWebserverPlugin)
|
87
90
|
target_citrix.add_plugin(WebserverPlugin)
|
88
91
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
import textwrap
|
2
|
+
from io import BytesIO
|
3
|
+
|
4
|
+
from dissect.target.filesystem import VirtualFilesystem
|
5
|
+
from dissect.target.plugins.os.unix.bsd.citrix._os import CitrixPlugin
|
6
|
+
from dissect.target.target import Target
|
7
|
+
|
8
|
+
|
9
|
+
def test_citrix_os(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
10
|
+
example_etc_passwd = """
|
11
|
+
# $FreeBSD: releng/11.4/etc/master.passwd 359448 2020-03-30 17:11:21Z brooks $
|
12
|
+
#
|
13
|
+
root:*:0:0:Charlie &:/root:/usr/bin/bash
|
14
|
+
bind:*:53:53:Bind Sandbox:/:/usr/sbin/nologin
|
15
|
+
nobody:*:65534:65534:Unprivileged user:/nonexistent:/usr/sbin/nologin
|
16
|
+
"""
|
17
|
+
|
18
|
+
fs_bsd.map_file_fh("/root/.cli_history", BytesIO(b'echo "hello world"'))
|
19
|
+
fs_bsd.map_file_fh("/var/nstmp/robin/.cli_history", BytesIO(b'echo "hello world"'))
|
20
|
+
fs_bsd.map_file_fh("/var/nstmp/alfred/.cli_history", BytesIO(b'echo "bye world"'))
|
21
|
+
fs_bsd.map_file_fh("/etc/passwd", BytesIO(textwrap.dedent(example_etc_passwd).encode()))
|
22
|
+
|
23
|
+
target_citrix.add_plugin(CitrixPlugin)
|
24
|
+
|
25
|
+
assert target_citrix.os == "citrix-netscaler"
|
26
|
+
hostname = target_citrix.hostname
|
27
|
+
version = target_citrix.version
|
28
|
+
users = sorted(list(target_citrix.users()), key=lambda user: (user.name, str(user.home) if user.home else ""))
|
29
|
+
ips = target_citrix.ips
|
30
|
+
ips.sort()
|
31
|
+
|
32
|
+
assert hostname == "mynetscaler"
|
33
|
+
assert version == "NetScaler 13.1 build 30 (ns-13.1-30.52)"
|
34
|
+
|
35
|
+
assert ips == ["10.0.0.68", "10.0.0.69"]
|
36
|
+
|
37
|
+
assert target_citrix.timezone == "Europe/Amsterdam"
|
38
|
+
|
39
|
+
assert len(users) == 8
|
40
|
+
|
41
|
+
assert users[0].name == "alfred" # Only listed in /var/nstmp
|
42
|
+
assert users[0].home == "/var/nstmp/alfred"
|
43
|
+
|
44
|
+
assert users[1].name == "batman" # Only listed in config
|
45
|
+
assert users[1].home is None
|
46
|
+
|
47
|
+
assert users[2].name == "bind" # User entry from /etc/passwd, home overwritten from '/' to None
|
48
|
+
assert users[2].home is None
|
49
|
+
|
50
|
+
assert users[3].name == "jasontodd" # Only listed in config backup
|
51
|
+
assert users[3].home is None
|
52
|
+
|
53
|
+
assert users[4].name == "nobody" # User entry for the nobody user from /etc/passwd
|
54
|
+
assert users[4].home == "/nonexistent"
|
55
|
+
|
56
|
+
assert users[5].name == "robin" # Listed in config and /var/nstmp
|
57
|
+
assert users[5].home == "/var/nstmp/robin"
|
58
|
+
|
59
|
+
assert users[6].name == "root" # User entry for /root, from the config
|
60
|
+
assert users[6].home == "/root"
|
61
|
+
assert users[6].shell is None
|
62
|
+
|
63
|
+
assert users[7].name == "root" # User entry for /root, from /etc/passwd
|
64
|
+
assert users[7].home == "/root"
|
65
|
+
assert users[7].shell == "/usr/bin/bash"
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import datetime
|
2
|
+
import gzip
|
3
|
+
import textwrap
|
4
|
+
from io import BytesIO
|
5
|
+
|
6
|
+
from dissect.target.filesystem import VirtualFilesystem
|
7
|
+
from dissect.target.plugins.os.unix.bsd.citrix.history import CitrixCommandHistoryPlugin
|
8
|
+
from dissect.target.target import Target
|
9
|
+
|
10
|
+
|
11
|
+
def test_netscaler_bash_history_absolute_path_glob(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
12
|
+
commandhistory_data = """\
|
13
|
+
Aug 9 12:56:00 <local7.notice> ns bash[23841]: root on /dev/pts/0 shell_command="find . -name '*ci.php*'"
|
14
|
+
Aug 10 11:57:39 <local7.notice> ns bash[56440]: (null) on /dev/pts/1 shell_command="debug "hello world""
|
15
|
+
"""
|
16
|
+
|
17
|
+
fs_bsd.map_file_fh(
|
18
|
+
"/var/log/bash.log",
|
19
|
+
BytesIO(textwrap.dedent(commandhistory_data).encode()),
|
20
|
+
)
|
21
|
+
|
22
|
+
target_citrix.add_plugin(CitrixCommandHistoryPlugin)
|
23
|
+
|
24
|
+
results = list(target_citrix.commandhistory())
|
25
|
+
assert len(results) == 2
|
26
|
+
# Due to the usage of year_rollover_helper, the results are returned back-to-front. Moreover, it takes the
|
27
|
+
# year from the file's mtime, which in this mocked version is epoch 0 (thus the year 1970)
|
28
|
+
assert results[1].ts == datetime.datetime(1970, 8, 9, 12, 56, 0, tzinfo=datetime.timezone.utc)
|
29
|
+
assert results[1].command == "find . -name '*ci.php*'"
|
30
|
+
assert results[1].shell == "citrix-netscaler-bash"
|
31
|
+
assert results[1].source.as_posix() == "/var/log/bash.log"
|
32
|
+
|
33
|
+
assert results[0].ts == datetime.datetime(1970, 8, 10, 11, 57, 39, tzinfo=datetime.timezone.utc)
|
34
|
+
assert results[0].command == 'debug "hello world"'
|
35
|
+
assert results[0].shell == "citrix-netscaler-bash"
|
36
|
+
assert results[0].source.as_posix() == "/var/log/bash.log"
|
37
|
+
|
38
|
+
|
39
|
+
def test_netscaler_commandhistory_decompress(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
40
|
+
commandhistory_data = """\
|
41
|
+
Aug 9 12:56:00 <local7.notice> ns bash[23841]: root on /dev/pts/0 shell_command="find . -name '*ci.php*'"
|
42
|
+
Aug 10 11:57:39 <local7.notice> ns bash[56440]: (null) on /dev/pts/1 shell_command="debug "hello world""
|
43
|
+
"""
|
44
|
+
|
45
|
+
fs_bsd.map_file_fh(
|
46
|
+
"/var/log/bash.log.0.gz",
|
47
|
+
BytesIO(gzip.compress(textwrap.dedent(commandhistory_data).encode())),
|
48
|
+
)
|
49
|
+
|
50
|
+
target_citrix.add_plugin(CitrixCommandHistoryPlugin)
|
51
|
+
|
52
|
+
results = list(target_citrix.commandhistory())
|
53
|
+
assert len(results) == 2
|
54
|
+
# Due to the usage of year_rollover_history, the results are returned back-to-front
|
55
|
+
assert results[1].ts == datetime.datetime(1970, 8, 9, 12, 56, 0, tzinfo=datetime.timezone.utc)
|
56
|
+
assert results[1].command == "find . -name '*ci.php*'"
|
57
|
+
assert results[1].shell == "citrix-netscaler-bash"
|
58
|
+
assert results[1].source.as_posix() == "/var/log/bash.log.0.gz"
|
59
|
+
|
60
|
+
assert results[0].ts == datetime.datetime(1970, 8, 10, 11, 57, 39, tzinfo=datetime.timezone.utc)
|
61
|
+
assert results[0].command == 'debug "hello world"'
|
62
|
+
assert results[0].shell == "citrix-netscaler-bash"
|
63
|
+
assert results[0].source.as_posix() == "/var/log/bash.log.0.gz"
|
64
|
+
|
65
|
+
|
66
|
+
def test_netscaler_cli_history(target_citrix: Target, fs_bsd: VirtualFilesystem) -> None:
|
67
|
+
commandhistory_data = """\
|
68
|
+
_HiStOrY_V2_
|
69
|
+
help
|
70
|
+
shell
|
71
|
+
"""
|
72
|
+
|
73
|
+
fs_bsd.map_file_fh("/var/nstmp/user/.nscli_history", BytesIO(textwrap.dedent(commandhistory_data).encode()))
|
74
|
+
|
75
|
+
target_citrix.add_plugin(CitrixCommandHistoryPlugin)
|
76
|
+
|
77
|
+
results = list(target_citrix.commandhistory())
|
78
|
+
assert len(results) == 2
|
79
|
+
|
80
|
+
assert not results[0].ts
|
81
|
+
assert results[0].command == "help"
|
82
|
+
assert results[0].shell == "citrix-netscaler-cli"
|
83
|
+
assert results[0].source.as_posix() == "/var/nstmp/user/.nscli_history"
|
84
|
+
|
85
|
+
assert not results[1].ts
|
86
|
+
assert results[1].command == "shell"
|
87
|
+
assert results[1].shell == "citrix-netscaler-cli"
|
88
|
+
assert results[1].source.as_posix() == "/var/nstmp/user/.nscli_history"
|
@@ -2,7 +2,7 @@ import os
|
|
2
2
|
from functools import reduce
|
3
3
|
from pathlib import Path
|
4
4
|
from typing import Optional
|
5
|
-
from unittest.mock import
|
5
|
+
from unittest.mock import Mock, patch
|
6
6
|
|
7
7
|
import pytest
|
8
8
|
from flow.record import Record
|
@@ -82,9 +82,9 @@ class MockOSWarpPlugin(OSPlugin):
|
|
82
82
|
@patch(
|
83
83
|
"dissect.target.plugin.plugins",
|
84
84
|
return_value=[
|
85
|
-
{"module": "test.x13", "exports": ["f3"], "namespace": "Warp", "class": "x13", "
|
86
|
-
{"module": "os", "exports": ["f3"], "namespace": None, "class": "f3", "
|
87
|
-
{"module": "os.warp._os", "exports": ["f6"], "namespace": None, "class": "warp", "
|
85
|
+
{"module": "test.x13", "exports": ["f3"], "namespace": "Warp", "class": "x13", "is_osplugin": False},
|
86
|
+
{"module": "os", "exports": ["f3"], "namespace": None, "class": "f3", "is_osplugin": False},
|
87
|
+
{"module": "os.warp._os", "exports": ["f6"], "namespace": None, "class": "warp", "is_osplugin": True},
|
88
88
|
],
|
89
89
|
)
|
90
90
|
@patch("dissect.target.Target", create=True)
|
@@ -1,43 +0,0 @@
|
|
1
|
-
from io import BytesIO
|
2
|
-
|
3
|
-
from dissect.target.plugins.os.unix.bsd.citrix._os import CitrixBsdPlugin
|
4
|
-
|
5
|
-
|
6
|
-
def test_unix_bsd_citrix_os(target_citrix):
|
7
|
-
target_citrix.add_plugin(CitrixBsdPlugin)
|
8
|
-
|
9
|
-
assert target_citrix.os == "citrix-netscaler"
|
10
|
-
|
11
|
-
target_citrix.fs.mounts["/"].map_file_fh("/root/.cli_history", BytesIO(b'echo "hello world"'))
|
12
|
-
target_citrix.fs.mounts["/"].map_file_fh("/var/nstmp/robin/.cli_history", BytesIO(b'echo "hello world"'))
|
13
|
-
target_citrix.fs.mounts["/"].map_file_fh("/var/nstmp/alfred/.cli_history", BytesIO(b'echo "bye world"'))
|
14
|
-
|
15
|
-
hostname = target_citrix.hostname
|
16
|
-
version = target_citrix.version
|
17
|
-
users = sorted(list(target_citrix.users()), key=lambda user: (user.name, user.home if user.home else ""))
|
18
|
-
ips = target_citrix.ips
|
19
|
-
ips.sort()
|
20
|
-
|
21
|
-
assert hostname == "mynetscaler"
|
22
|
-
assert version == "NetScaler 13.1 build 30 (ns-13.1-30.52)"
|
23
|
-
|
24
|
-
assert ips == ["10.0.0.68", "10.0.0.69"]
|
25
|
-
|
26
|
-
assert target_citrix.timezone == "Europe/Amsterdam"
|
27
|
-
|
28
|
-
assert len(users) == 5
|
29
|
-
|
30
|
-
assert users[0].name == "alfred" # Only listed in /var/nstmp
|
31
|
-
assert users[0].home == "/var/nstmp/alfred"
|
32
|
-
|
33
|
-
assert users[1].name == "batman" # Only listed in config
|
34
|
-
assert users[1].home is None
|
35
|
-
|
36
|
-
assert users[2].name == "jasontodd" # Only listed in config backup
|
37
|
-
assert users[2].home is None
|
38
|
-
|
39
|
-
assert users[3].name == "robin" # Listed in config and /var/nstmp
|
40
|
-
assert users[3].home == "/var/nstmp/robin"
|
41
|
-
|
42
|
-
assert users[4].name == "root" # User entry for /root
|
43
|
-
assert users[4].home == "/root"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{dissect.target-3.15.dev29 → dissect.target-3.15.dev31}/dissect/target/containers/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|