自从创建了这个博客,只发了一篇随笔,然后就再也没发内容了,而技术性文章则是0,汗颜啊。
最初是想将这里作为一个起步,将日常工作学习中遇到的技术内容做一下总结分享,奈何沉浸在无休止的工作泥潭中难以自拔,考虑到ChatGpt类的火热,压力倍儿大,必须得在AI主导世界前些写内容了,否则,可能就真的是出师未捷身先死了
言归正传,几周前,手下兄弟工作中接手一个搭建h3c cas平台的case,为节省资源,采用了嵌套虚拟化方案,结果鼓捣了好几天也没搞掂,最后求助到我这里来了
就这个话题,和兄弟聊了聊,也问了问冰冰和狗狗,同时又找gpt侃了侃,有了一些基本信息:
- qemu已经开启了嵌套虚拟化
- h3c cas系统已经安装完毕,但是从web页面登录时,输入正确的用户名和密码,会出现“获取主机MAC地址失败。”的提示信息
- 当前,网上关于此问题的解决方案都是基于vmware平台的,手动修改vmx文件,添加如下2行
hypervisor.cpuid.v0 = "FALSE"
mce.enable = "TRUE"
第一个参数是屏蔽客户操作系统的虚拟化检测,让软件以为自己是运行在物理机上;而第二个参数则是CPU检测和报告硬件问题的参数
根据这俩参数的思路,对应qemu做了一堆参数调整,不断验证,问题依旧
哥是开发出身,遇到困难要想办法解决,不能被页面一行红色出错信息给拦住,嗯,h3c的cas有控制台,能直接登录到linux系统中,登录进去看看啥情况,直接选择“Local Command Shell”,输入root的密码password,略等几秒就看到了熟悉的bash提示符了
接下来,是顺藤摸瓜的过程
- 根据监听的80端口,找到了进程id,发现运行的是nginx
- 通过nginx配置文件,发现cas是导引到本机8080端口
- 根据监听的8080端口,找到进程id,发现运行的是tomcat,其base目录是/var/lib/tomcat8,日志配置文件是/var/lib/tomcat8/conf/logging.properties
- 打开日志配置文件,发现日志输出目录是${catalina_base}/logs目录,也就是/var/lib/tomcat8/logs目录
- 发现/var/lib/tomcat8/logs是一个link,指向/var/log/tomcat8目录
查阅日志文件,发现打印错误的相关语句
据此,找到是java类con.virtual.plat.server.license.LicenseUtil打印的错误信息
在tomcat目录下,查找此类,发现位于2个jar包中(vmc.jar、cic.jar)
因日志文件提示cic.jar,好吧,直接获取到该jar包,反编译看看源码(java真好,程序猿做了啥都能看到,即便是混淆,也能看个7788)
真相了,他是直接调用系统命令lscpu,判断其输出是否包含Hypervisor字眼而走不同逻辑的,如果非虚拟机内,则调用a(var0),否则调用一个python脚本。(因我之目的并非破解而只是求简单试用,故不再去谈get_host_mac.pyc了)
此时,我们只需要想办法让软件识别不到Hypervisor字眼,然后看功能是否正常。思路有了,实现起来就很简单,用狸猫,将太子藏到后面去。既然软件是通过调用lscpu命令来识别虚拟机的,那么我们就用一个脚本替换掉lscpu,不让他输出虚拟机的信息来着。
有图有真相,直接贴图
然后,从web页面登录(用户名:admin,密码:Cloud@1234),天下太平,擂鼓!
总结一下:
- 从cas控制台登录linux系统。用户名:root,密码:password
- 用脚本替代/usr/bin/lscpu文件,将包含Hypervisor的内容去除
# 进入lscpu所在目录
cd /usr/bin
# 复制一份lscpu文件为lscpu.1,为免去做权限调整,直接用了cp而不是mv
cp lscpu lscpu.1
# 形成新的lscpu
cat <<EOF>lscpu
#!/bin/bash
/usr/bin/lscpu.1 | grep -v Hypervisor
EOF
老苍子,书写于2023年4月1日