0x00 前言 近日,从 Vulnhub 下载了一个靶机镜像 Stapler: 1 作为练习,以巩固攻防实战技巧。谁知,开始之初便受阻,导入镜像所遇问题颇多,特此记录其探解过程,以备待查。
本文操作环境为 Windows 10 操作系统与 VMware Workstation 15 Pro 虚拟机,其中 VMware OVF Tool 版本为 4.3.0。
0x01 vmdk 导入受阻 将 Stapler 靶机镜像压缩包下载至本地后,发现其 Stapler 目录下包含三个文件:Stapler-disk1.vmdk
、Stapler.ovf
与 Stapler.mf
:
其压缩包的 MD5 与官网上的一致,确认文件完整性无误:
上述三个文件的含义及用途如下:
相关文件的完整释义见下图,并可参考:Open Virtualization Format (OVF and OVA)
通过打开 ovf 导入 vmdk 首先,采用常规方式,通过 VMware 打开 ovf 文件来导入 vmdk。依次点击 VMware 左上角的 文件 -> 打开 ,选中解压目录下的 Stapler.ovf
文件:
接着点击 打开 ,发现 VMware 弹出以下报错:
大意为不支持 Caption
元素、缺少 ElementName
子元素等。
通过新建虚拟机导入 vmdk 既然常规方法受阻,则需另辟蹊径,直接通过新建虚拟机来导入 vmdk。
由于导入方法步骤繁多,此处不展开说明,具体请参考:VMware通过vmdk文件创建虚拟机
虽然 vmdk 导入成功,但虚拟机却启动失败。点击 开启此虚拟机 ,只见终端出现 error: failure writing sector 0xec800 to `hd0'.
报错:
按下任意键继续执行,发现 Apache、PHP、MySQL 等模块启动失败,迟迟无法加载进入登录界面:
0x02 ovf 探而复之 镜像导入失败,本人略显无奈。还好,功夫不负有心人,终于找到一种解法,能够通过打开 ovf 导入 vmdk。
探求误因 经探究,在 Converting OVF file using ovftool from VirtualBox produces error “Line 39: Unsupported element ‘Caption’” and many more errors 帖子中遇到类似问题,其中一条评论提到,需要调整 ovf 文件中 <Item>
子元素的顺序:
类似地,在 Issues with OVF Template 帖子中同样有人提到,RASD 元素字段必须以字母顺序排列:
根据以上线索,查找 ovf 文件格式的相关标准,终于在 Open Virtualization Format Specification (DSP0243_2.1.0) 文档中的第 8 章找到解释说明,图中 CIM 类的 XML 元素应该按照 Unicode 码位顺序排列:
并给出了参考样例,注意到 <Item>
子元素确实是按字母顺序排列:
回头检查压缩包中的 Stapler.ovf
文件,发现在 <Envelope>
元素中引入了 CIM_ResourceAllocationSettingData
类的命名空间,并且 <Item>
子元素默认为乱序排列,与上述两帖中遇到的问题基本吻合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 <?xml version="1.0" encoding="UTF-8" ?> <Envelope vmw:buildId ="build-3018522" xmlns ="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim ="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf ="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd ="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw ="http://www.vmware.com/schema/ovf" xmlns:vssd ="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" > <References > <File ovf:href ="Stapler-disk1.vmdk" ovf:id ="file1" ovf:size ="757926912" /> </References > <DiskSection > <Info > Virtual disk information</Info > <Disk ovf:capacity ="20" ovf:capacityAllocationUnits ="byte * 2^30" ovf:diskId ="vmdisk1" ovf:fileRef ="file1" ovf:format ="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize ="2212560896" /> </DiskSection > <NetworkSection > <Info > The list of logical networks</Info > <Network ovf:name ="hostonly" > <Description > The hostonly network</Description > </Network > </NetworkSection > <VirtualSystem ovf:id ="vm" > <Info > A virtual machine</Info > <Name > Stapler</Name > <OperatingSystemSection ovf:id ="93" vmw:osType ="ubuntuGuest" > <Info > The kind of installed guest operating system</Info > </OperatingSystemSection > <VirtualHardwareSection > <Info > Virtual hardware requirements</Info > <System > <vssd:Caption > Virtual Hardware Family</vssd:Caption > <vssd:InstanceID > 0</vssd:InstanceID > <vssd:VirtualSystemIdentifier > Stapler</vssd:VirtualSystemIdentifier > <vssd:VirtualSystemType > vmx-11</vssd:VirtualSystemType > </System > <Item > <rasd:AllocationUnits > hertz * 10^6</rasd:AllocationUnits > <rasd:Description > Number of Virtual CPUs</rasd:Description > <rasd:Caption > 1 virtual CPU(s)</rasd:Caption > <rasd:InstanceID > 1</rasd:InstanceID > <rasd:ResourceType > 3</rasd:ResourceType > <rasd:VirtualQuantity > 1</rasd:VirtualQuantity > </Item > <Item > <rasd:AllocationUnits > byte * 2^20</rasd:AllocationUnits > <rasd:Description > Memory Size</rasd:Description > <rasd:Caption > 1024MB of memory</rasd:Caption > <rasd:InstanceID > 2</rasd:InstanceID > <rasd:ResourceType > 4</rasd:ResourceType > <rasd:VirtualQuantity > 1024</rasd:VirtualQuantity > </Item > <Item > <rasd:Address > 0</rasd:Address > <rasd:Description > SATA Controller</rasd:Description > <rasd:Caption > sataController0</rasd:Caption > <rasd:InstanceID > 3</rasd:InstanceID > <rasd:ResourceSubType > AHCI</rasd:ResourceSubType > <rasd:ResourceType > 20</rasd:ResourceType > </Item > <Item ovf:required ="false" > <rasd:Address > 0</rasd:Address > <rasd:Description > USB Controller (EHCI)</rasd:Description > <rasd:Caption > usb</rasd:Caption > <rasd:InstanceID > 4</rasd:InstanceID > <rasd:ResourceSubType > vmware.usb.ehci</rasd:ResourceSubType > <rasd:ResourceType > 23</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="ehciEnabled" vmw:value ="true" /> </Item > <Item > <rasd:Address > 0</rasd:Address > <rasd:Description > SCSI Controller</rasd:Description > <rasd:Caption > scsiController0</rasd:Caption > <rasd:InstanceID > 5</rasd:InstanceID > <rasd:ResourceSubType > lsilogic</rasd:ResourceSubType > <rasd:ResourceType > 6</rasd:ResourceType > </Item > <Item > <rasd:AddressOnParent > 2</rasd:AddressOnParent > <rasd:AutomaticAllocation > true</rasd:AutomaticAllocation > <rasd:Connection > hostonly</rasd:Connection > <rasd:Description > PCNet32 ethernet adapter on " hostonly" </rasd:Description > <rasd:Caption > ethernet0</rasd:Caption > <rasd:InstanceID > 6</rasd:InstanceID > <rasd:ResourceSubType > PCNet32</rasd:ResourceSubType > <rasd:ResourceType > 10</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> <vmw:Config ovf:required ="false" vmw:key ="wakeOnLanEnabled" vmw:value ="false" /> </Item > <Item ovf:required ="false" > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > video</rasd:Caption > <rasd:InstanceID > 7</rasd:InstanceID > <rasd:ResourceType > 24</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="enable3DSupport" vmw:value ="false" /> <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item ovf:required ="false" > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > vmci</rasd:Caption > <rasd:InstanceID > 8</rasd:InstanceID > <rasd:ResourceSubType > vmware.vmci</rasd:ResourceSubType > <rasd:ResourceType > 1</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item > <rasd:AddressOnParent > 0</rasd:AddressOnParent > <rasd:Caption > disk0</rasd:Caption > <rasd:HostResource > ovf:/disk/vmdisk1</rasd:HostResource > <rasd:InstanceID > 9</rasd:InstanceID > <rasd:Parent > 3</rasd:Parent > <rasd:ResourceType > 17</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item ovf:required ="false" > <rasd:AddressOnParent > 1</rasd:AddressOnParent > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > cdrom0</rasd:Caption > <rasd:InstanceID > 10</rasd:InstanceID > <rasd:Parent > 3</rasd:Parent > <rasd:ResourceType > 15</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <vmw:Config ovf:required ="false" vmw:key ="cpuHotAddEnabled" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="memoryHotAddEnabled" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.powerOffType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.resetType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.suspendType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="tools.afterPowerOn" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.afterResume" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.beforeGuestShutdown" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.beforeGuestStandby" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.syncTimeWithHost" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.toolsUpgradePolicy" vmw:value ="upgradeAtPowerCycle" /> </VirtualHardwareSection > <AnnotationSection ovf:required ="false" > <Info > A human-readable annotation</Info > <Annotation > --[[~~Enjoy. Have fun. Happy Hacking.~~]]-- + There are multiple methods to-do this machine: At least -- Two (2) paths to get a limited shell -- At least three (3) ways to get a root access</Annotation > </AnnotationSection > </VirtualSystem > </Envelope >
修复验证 根据 DSP0243 标准文档中的规则,主要调整了 <rasd:Caption>
元素与 <rasd:Description>
元素的顺序,将 Stapler.ovf
文件恢复为正确排列格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 <?xml version="1.0" encoding="UTF-8" ?> <Envelope vmw:buildId ="build-3018522" xmlns ="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim ="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf ="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd ="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw ="http://www.vmware.com/schema/ovf" xmlns:vssd ="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" > <References > <File ovf:href ="Stapler-disk1.vmdk" ovf:id ="file1" ovf:size ="757926912" /> </References > <DiskSection > <Info > Virtual disk information</Info > <Disk ovf:capacity ="20" ovf:capacityAllocationUnits ="byte * 2^30" ovf:diskId ="vmdisk1" ovf:fileRef ="file1" ovf:format ="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize ="2212560896" /> </DiskSection > <NetworkSection > <Info > The list of logical networks</Info > <Network ovf:name ="hostonly" > <Description > The hostonly network</Description > </Network > </NetworkSection > <VirtualSystem ovf:id ="vm" > <Info > A virtual machine</Info > <Name > Stapler</Name > <OperatingSystemSection ovf:id ="93" vmw:osType ="ubuntuGuest" > <Info > The kind of installed guest operating system</Info > </OperatingSystemSection > <VirtualHardwareSection > <Info > Virtual hardware requirements</Info > <System > <vssd:Caption > Virtual Hardware Family</vssd:Caption > <vssd:InstanceID > 0</vssd:InstanceID > <vssd:VirtualSystemIdentifier > Stapler</vssd:VirtualSystemIdentifier > <vssd:VirtualSystemType > vmx-15</vssd:VirtualSystemType > </System > <Item > <rasd:AllocationUnits > hertz * 10^6</rasd:AllocationUnits > <rasd:Caption > 1 virtual CPU(s)</rasd:Caption > <rasd:Description > Number of Virtual CPUs</rasd:Description > <rasd:InstanceID > 1</rasd:InstanceID > <rasd:ResourceType > 3</rasd:ResourceType > <rasd:VirtualQuantity > 1</rasd:VirtualQuantity > </Item > <Item > <rasd:AllocationUnits > byte * 2^20</rasd:AllocationUnits > <rasd:Caption > 1024MB of memory</rasd:Caption > <rasd:Description > Memory Size</rasd:Description > <rasd:InstanceID > 2</rasd:InstanceID > <rasd:ResourceType > 4</rasd:ResourceType > <rasd:VirtualQuantity > 1024</rasd:VirtualQuantity > </Item > <Item > <rasd:Address > 0</rasd:Address > <rasd:Caption > sataController0</rasd:Caption > <rasd:Description > SATA Controller</rasd:Description > <rasd:InstanceID > 3</rasd:InstanceID > <rasd:ResourceSubType > AHCI</rasd:ResourceSubType > <rasd:ResourceType > 20</rasd:ResourceType > </Item > <Item ovf:required ="false" > <rasd:Address > 0</rasd:Address > <rasd:Caption > usb</rasd:Caption > <rasd:Description > USB Controller (EHCI)</rasd:Description > <rasd:InstanceID > 4</rasd:InstanceID > <rasd:ResourceSubType > vmware.usb.ehci</rasd:ResourceSubType > <rasd:ResourceType > 23</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="ehciEnabled" vmw:value ="true" /> </Item > <Item > <rasd:Address > 0</rasd:Address > <rasd:Caption > scsiController0</rasd:Caption > <rasd:Description > SCSI Controller</rasd:Description > <rasd:InstanceID > 5</rasd:InstanceID > <rasd:ResourceSubType > lsilogic</rasd:ResourceSubType > <rasd:ResourceType > 6</rasd:ResourceType > </Item > <Item > <rasd:AddressOnParent > 2</rasd:AddressOnParent > <rasd:AutomaticAllocation > true</rasd:AutomaticAllocation > <rasd:Caption > ethernet0</rasd:Caption > <rasd:Connection > hostonly</rasd:Connection > <rasd:Description > PCNet32 ethernet adapter on " hostonly" </rasd:Description > <rasd:InstanceID > 6</rasd:InstanceID > <rasd:ResourceSubType > PCNet32</rasd:ResourceSubType > <rasd:ResourceType > 10</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> <vmw:Config ovf:required ="false" vmw:key ="wakeOnLanEnabled" vmw:value ="false" /> </Item > <Item ovf:required ="false" > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > video</rasd:Caption > <rasd:InstanceID > 7</rasd:InstanceID > <rasd:ResourceType > 24</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="enable3DSupport" vmw:value ="false" /> <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item ovf:required ="false" > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > vmci</rasd:Caption > <rasd:InstanceID > 8</rasd:InstanceID > <rasd:ResourceSubType > vmware.vmci</rasd:ResourceSubType > <rasd:ResourceType > 1</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item > <rasd:AddressOnParent > 0</rasd:AddressOnParent > <rasd:Caption > disk0</rasd:Caption > <rasd:HostResource > ovf:/disk/vmdisk1</rasd:HostResource > <rasd:InstanceID > 9</rasd:InstanceID > <rasd:Parent > 3</rasd:Parent > <rasd:ResourceType > 17</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <Item ovf:required ="false" > <rasd:AddressOnParent > 1</rasd:AddressOnParent > <rasd:AutomaticAllocation > false</rasd:AutomaticAllocation > <rasd:Caption > cdrom0</rasd:Caption > <rasd:InstanceID > 10</rasd:InstanceID > <rasd:Parent > 3</rasd:Parent > <rasd:ResourceType > 15</rasd:ResourceType > <vmw:Config ovf:required ="false" vmw:key ="slotInfo.pciSlotNumber" vmw:value ="33" /> </Item > <vmw:Config ovf:required ="false" vmw:key ="cpuHotAddEnabled" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="memoryHotAddEnabled" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.powerOffType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.resetType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="powerOpInfo.suspendType" vmw:value ="soft" /> <vmw:Config ovf:required ="false" vmw:key ="tools.afterPowerOn" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.afterResume" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.beforeGuestShutdown" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.beforeGuestStandby" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.syncTimeWithHost" vmw:value ="true" /> <vmw:Config ovf:required ="false" vmw:key ="tools.toolsUpgradePolicy" vmw:value ="upgradeAtPowerCycle" /> </VirtualHardwareSection > <AnnotationSection ovf:required ="false" > <Info > A human-readable annotation</Info > <Annotation > --[[~~Enjoy. Have fun. Happy Hacking.~~]]-- + There are multiple methods to-do this machine: At least -- Two (2) paths to get a limited shell -- At least three (3) ways to get a root access</Annotation > </AnnotationSection > </VirtualSystem > </Envelope >
更新 Stapler.ovf
文件后,切记需重新计算其 SHA-1 散列值,并在 Stapler.mf
文件中替换,否则无法通过文件完整性校验:
完成以上步骤后,再次打开 Stapler.ovf
文件,发现不再报错,并提示导入虚拟机:
选择虚拟机存储路径后,导入并开机,最终成功初始化,出现了 Stapler 靶机的登录界面:
有待深究 至此,镜像导入问题暂时得到解决,不过仍留有两处问题,有待深究:
Stapler 的镜像提供者,在用 VMware 导入镜像时,其 ovf 文件为什么不是按标准格式排序,而是乱序?
为什么通过新建虚拟机导入 vmdk 会初始化失败?
0x03 小结 由于本人时间精力有限,此文旨在记录 VMware 镜像导入问题的解决过程,对部分问题未能继续深究,望谅解。文中不足之处,还请各位不吝赐教,感谢阅读!
本文相关参考请见:
VMware fix “Invalid OVF manifest entry” error Difference between OVA and OVF Open Virtualization Format (OVF and OVA) Open Virtualization Format Specification (DSP0243_1.1.0) Open Virtualization Format Specification (DSP0243_2.0.0)