首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
IoT安全
发新帖
32
19
[原创]获取虚拟机的shell
发表于: 2024-4-11 19:29
16342
[原创]获取虚拟机的shell
badmonkey7
1
2024-4-11 19:29
16342
# 获取虚拟机的shell # 前言 很多读者可能会问,为什么要获取虚拟机shell?虚拟机不是自带root权限的shell嘛?实际上很多商业产品,商业防火墙,商业waf,商业邮件服务都是通过软件虚拟机进行部署的。而这类具有商业性质的产品都不会直接给一个root shell。但是作为安全研究人员,白盒审计要比黑盒测试的效率高的多,因此获取此类虚拟机的root shell,进行代码审计和漏洞挖掘是非常有必要的。 # 背景知识 大多数产品会使用定制化的linux虚拟机部署产品,因为基于linux的开发环境和组件已经十分成熟了。虚拟机的磁盘中保存了所有的后端逻辑代码,但是不同的厂家的安全措施做的不同,有的厂家会对虚拟机磁盘进行加密,而有的则不会。 ## 磁盘挂载 一般来说可以通过下面几种方式进行磁盘挂载 - qemu-nbd 挂载 ```bash sudo modprobe nbd max_part=8 # 加载 nbd 模块 sudo qemu-nbd --connect=/dev/nbd0 ./sonicwall.qcow2 # 挂载镜像 sudo fdisk /dev/nbd0 -l # 查看分区信息 ``` - guestmount挂载 ```bash mkdir rootfs sudo virt-filesystems -a img.qcow2 # 分区信息 sudo guestmount -a img.qcow2 -m /dev/sda4 rootfs # 挂载/dev/sda4 到rootfs ``` - diskgenius 打开  通常可以结合diskgenius查看分区信息,然后决定挂载那个分区 - luks磁盘挂载 ```bash sudo cryptsetup --key-file key luksOpen /dev/xxx root sudo mount /dev/mapper/root myrootfs1 ``` # Patch文件系统获得shell 所谓patch文件系统获得shell,其实是通过对磁盘进行挂载,修改系统的启动逻辑,增加一个telnet或者ssh启动进程,在系统启动后,研究人员可以通过ssh或者telnet拿到一个调试shell,而不影响系统的正常运行。但是patch文件系统需要对磁盘进行挂载,下面针对两种情况进行样例分析。 ## 磁盘未被加密 如果磁盘本身没有进行加密,那么可通过直接挂载磁盘然后修改rc.local 等启动脚本,更改启动逻辑或者添加用户。  ### SonicWall sma 本来想直接更改文件系统中的/etc/passwd 和 /etc/shadow 然后开启sshd获取root shell,但是修改后没有正常启动,经过分析发现固件启动时会更换内核及文件系统  因为需要对INITRD.gz 文件系统进行修改。可以挂载INITRD修改后对应的文件系统,然后使用guestmount挂载虚拟机磁盘并更新INITRD.gz。 ```bash sudo virt-filesystems -a old_sma.qcow2 ## find /dev/sda4 sudo guestmount -a old_sma.qcow2 -m /dev/sda4 rootfs sudo su cd rootfs cp cf/firmware/current/INITRD.GZ ../ # patch INITRD.GZ cp ../INITRD.gz cf/firmware/current/INITRD.GZ cd .. guestunmount rootfs ``` 修改INITRD.GZ ```bash mkdir ramfs sudo su mount -t ext2 INITRD ramfs/ cd ramfs echo '#!/bin/bash' > ./usr/src/EasyAccess/bin/graphd # delete graphd vim etc/passwd vim etc/EasyAccess/etc/shadow cp ../busybox bin/ chmod 777 bin/busybox vim etc/rc.d/rc.local # open telent cd .. umount ramfs gzip -9 -f INITRD ``` ## 磁盘被加密 如果磁盘经过了加密,那么就需要通过调试的手段,获取加密密钥,然后对磁盘进行解密,然后在进行挂载和修改。 ### SonicWall NSV 首先挂载磁盘,发现磁盘被加密  使用7zip解压后发现多个镜像使用了luks加密  且使用了grub引导,根据grub配置文件发现kernel为/xen/pvboot-x86_64.elf,其中有一些新的grub配置信息  因此可以确定是使用了luks对磁盘进行加密,然后在启动时对磁盘进行cryptomount,所以如果能够恢复密钥,那么就可以对文件系统进行patch,开启root shell。通过对luks的加解密关键函数进行定位可以找到boot分区下的luks.mod 对应了insmod luks  根据grub_crypto_pbkdf2的定义可知,a4为密钥,因此调试时,dump出a4的值即可。这里根据链接1使用kvm进行调试,流程如下,新建虚拟机使用/dev/nbd0作为磁盘导入,然后使用virsh edit vm1 将第一行替换为 ``` <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> ``` devices标签后加入 ``` <qemu:commandline> <qemu:arg value='-S'/> <qemu:arg value='-gdb'/> <qemu:arg value='tcp::1234'/> </qemu:commandline> ``` 需要让虚拟机启动时找不到文件,从而进入救援模式,然后恢复文件,进行正常的grub引导和调试  通过检索字符串,只发现了一处显然不是正确的函数地址,但是查看此地址的后面的值,发现是连续的字符串  然后根据汇编代码进行find  ``` find /b 0x3ff56000,0x3ffff000,0x51,0x52,0x6a,0x20,0xff,0xb5 ```  因此可以在0x3ff56890处下断点  然后再断点处,dump $rdx 处的值即可  实际上通过对luks.mod的逆向,可以发现luks的密钥生成逻辑是对luks的header进行了异或操作,然后得到luks的密钥。然后使用密钥进行挂载。详见链接2 ### Another 在实际漏洞挖掘的过程中遇到了一个产品,也是使用了加密的文件系统 其grub的配置为  可以看到使用了decrypt_initrd的参数,加密格式也是luks  通过对decrypt_initrd进行定位,首先将kernel.img进行解压提取其中发现了decryt_initrd等参数  其中有一个debug字段以及quiet字段,其中quiet是一个内核启动参数,大胆的猜测debug参数也是一个内核启动时的参数,使用qemu启动内核 ```bash qemu-system-x86_64 -m 1024 -s -no-kvm -initrd initramfs.img -kernel kernel.img -append "decrypt_initrd decrypt debug no_timer_check elevator=loop product=spam" ``` 开启debug后可以看到一系列的日志信息,其中可以看到decrypt的日志信息,根据关键字定位逻辑  定位到解密逻辑  继续跟进decrypt函数,发现其接受两个参数,很容易联想到其中一个参数为密文,一个为密钥  因此可以在0xFFFFFFFF827B540D处下断点  首先查看rdi寄存器的值  而实际的initramfs.img的值  结合两者可以知道第一个参数为密文地址,第二个参数为密钥,因此可以确定rdi会指向被加密的img,然后对其解密,所以可以在在0xFFFFFFFF827B5412下断点获取解密后的结果,解密后的明文为  在此处dump出83923818字节就是被解密后的ramfs,最后可以在ramfs中发现luks密钥。 以上两个例子都是通过调试,直接或者间接的获得密钥,然后使用密钥进行luks挂载,patch文件系统,增加一个root shell。 # Patch内存获得shell 相较于patch文件系统而言,patch内存来的更加直接。因为如果厂商使用的是各种奇奇怪怪的文件系统,加密方式,操作系统,那么通过调试获取密码更加困难。比如在实际分析的过程中发现过一个使用freebsd和geli加密的磁盘文件,  patch内存的方式是通过对虚拟机打快照,然后劫持某个程序实现的,例如劫持cli为/bin/bash,当执行cli时,会执行一个sh,这样子就拿到了一个虚拟机的shell ### Pulse Secure 早在blackhat 2019的时候orange就提出了使用内存patch的方式获得虚拟机shell的方式,但是没有具体操作的细节,首先时分析出了pulse secure在进行cli操作时,需要先按回车,然后进入一个config的界面,对应着按下回车后会执行一个/home/bin/dsconfig.pl  因此考虑,在按下回车之前打一个快照,快照格式为vmem,使用01editor将所有的`/home/bin/dsconfig.pl`字符换成`///////////////bin/sh`  可以劫持得到一个rootshell  ### Another 实际分析到上文提到过的使用freebsd和geli加密的磁盘时,也是有一个类似的config界面  这里通过对benchmarks关键字进行检索定位到了  因此可以将此字段,进行劫持为`////////////////////////////////////////bin/sh` 然后执行run benchmarks,就可以得到一个交互式的shell  实际上通过内存patch不仅可以实现shell的获取,还可以做更多的事情,比如关闭白名单限制等  更多的可能性,还需要遇到实际问题做更多的探索。 # 参考链接 <a href="elink@24eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8Y4q4#2j5h3&6C8k6g2)9J5k6h3y4G2L8g2)9J5c8Y4m8G2M7%4c8Q4x3V1k6A6k6q4)9J5c8U0t1$3y4U0l9%4z5l9`.`."><mark class="encrypted">b2cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8Y4q4#2j5h3&6C8k6g2)9J5k6h3y4G2L8g2)9J5c8Y4m8G2M7%4c8Q4x3V1k6A6k6q4)9J5c8U0t1$3y4U0l9%4z5l9`.`.</mark></a> <a href="elink@b4bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3M7X3q4W2N6r3!0J5K9h3q4F1i4K6u0W2j5$3!0E0i4K6u0r3j5X3I4G2k6#2)9J5c8Y4y4G2L8X3W2U0N6$3q4D9L8q4)9J5k6r3y4#2M7%4c8G2L8g2)9J5k6r3N6J5N6h3u0Q4x3X3c8D9N6h3E0K6i4K6u0V1k6h3&6U0M7Y4W2H3N6r3W2G2L8W2)9J5c8R3`.`."><mark class="encrypted">f16K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3M7X3q4W2N6r3!0J5K9h3q4F1i4K6u0W2j5$3!0E0i4K6u0r3j5X3I4G2k6#2)9J5c8Y4y4G2L8X3W2U0N6$3q4D9L8q4)9J5k6r3y4#2M7%4c8G2L8g2)9J5k6r3N6J5N6h3u0Q4x3X3c8D9N6h3E0K6i4K6u0V1k6h3&6U0M7Y4W2H3N6r3W2G2L8W2)9J5c8R3`.`.</mark></a> <a href="elink@322K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0j5h3#2T1M7Y4g2A6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5$3i4K6u0r3x3e0q4Q4x3V1k6J5L8$3!0@1K9h3&6Y4i4K6u0V1N6X3@1`."><mark class="encrypted">c71K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0j5h3#2T1M7Y4g2A6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5$3i4K6u0r3x3e0q4Q4x3V1k6J5L8$3!0@1K9h3&6Y4i4K6u0V1N6X3@1`.</mark></a> <a href="elink@6e1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6h3&6A6j5$3S2A6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5&6i4K6u0r3x3o6u0Q4x3V1j5I4x3#2)9J5c8V1c8W2j5Y4g2Y4i4K6u0V1e0r3W2F1N6i4S2Q4x3X3c8w2k6i4u0F1k6h3I4Q4x3X3c8i4K9i4c8Z5i4K6u0V1f1f1g2y4g2g2)9J5k6p5E0h3e0g2)9J5c8R3`.`."><mark class="encrypted">ce0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6h3&6A6j5$3S2A6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5&6i4K6u0r3x3o6u0Q4x3V1j5I4x3#2)9J5c8V1c8W2j5Y4g2Y4i4K6u0V1e0r3W2F1N6i4S2Q4x3X3c8w2k6i4u0F1k6h3I4Q4x3X3c8i4K9i4c8Z5i4K6u0V1f1f1g2y4g2g2)9J5k6p5E0h3e0g2)9J5c8R3`.`.</mark></a> <a href="elink@62cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6i4K6u0W2j5X3I4S2j5$3E0Z5j5i4c8Q4x3X3g2U0L8$3#2Q4x3V1k6g2f1@1q4Q4x3X3b7I4z5g2)9J5c8W2N6W2k6r3&6W2M7$3c8S2P5g2)9J5c8Y4g2K6i4K6u0V1x3e0W2Q4x3X3c8f1M7$3q4A6i4K6u0V1d9h3&6X3K9h3I4@1M7X3q4@1K9h3&6Y4i4K6u0V1b7$3!0J5M7r3!0J5j5i4c8W2i4K6u0V1d9h3&6@1M7X3q4F1k6i4c8Q4x3X3c8x3K9h3E0W2i4K6u0V1e0W2y4m8i4K6u0W2M7r3c8X3"><mark class="encrypted">f4cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6i4K6u0W2j5X3I4S2j5$3E0Z5j5i4c8Q4x3X3g2U0L8$3#2Q4x3V1k6g2f1@1q4Q4x3X3b7I4z5g2)9J5c8W2N6W2k6r3&6W2M7$3c8S2P5g2)9J5c8Y4g2K6i4K6u0V1x3e0W2Q4x3X3c8f1M7$3q4A6i4K6u0V1d9h3&6X3K9h3I4@1M7X3q4@1K9h3&6Y4i4K6u0V1b7$3!0J5M7r3!0J5j5i4c8W2i4K6u0V1d9h3&6@1M7X3q4F1k6i4c8Q4x3X3c8x3K9h3E0W2i4K6u0V1e0W2y4m8i4K6u0W2M7r3c8X3</mark></a> <a href="elink@78cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5K9i4c8U0L8$3&6Q4x3X3g2G2M7X3N6Q4x3V1j5J5x3o6t1K6i4K6u0r3b7@1#2f1i4K6u0r3j5h3N6W2L8X3c8S2i4K6u0r3z5e0y4S2j5$3c8U0j5K6u0Q4x3X3c8V1z5h3k6V1i4K6u0V1y4o6V1K6j5W2)9J5k6o6S2T1y4h3q4Q4x3X3b7K6k6o6R3I4x3U0N6W2z5o6b7%4k6o6c8Q4x3V1j5`."><mark class="encrypted">8a7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5K9i4c8U0L8$3&6Q4x3X3g2G2M7X3N6Q4x3V1j5J5x3o6t1K6i4K6u0r3b7@1#2f1i4K6u0r3j5h3N6W2L8X3c8S2i4K6u0r3z5e0y4S2j5$3c8U0j5K6u0Q4x3X3c8V1z5h3k6V1i4K6u0V1y4o6V1K6j5W2)9J5k6o6S2T1y4h3q4Q4x3X3b7K6k6o6R3I4x3U0N6W2z5o6b7%4k6o6c8Q4x3V1j5`.</mark></a>
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#固件分析
#技术分享
#安全研究
#家用设备
收藏
・
32
点赞
・
19
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
wx_晨梦
你的帖子非常有用,感谢分享!
2026-7-16 11:11
erduo001
这个讨论对我很有帮助,谢谢!
2026-5-22 22:18
beimingyouyu
非常支持你的观点!
2026-4-21 14:20
狗狗不赖啊
你的帖子非常有用,感谢分享!
2025-4-3 16:37
PLEBFE
为你点赞~
2024-5-31 01:26
e*16 a
为你点赞~
2024-5-5 15:12
jmpcall
为你点赞~
2024-4-15 15:30
令狐双
为你点赞~
2024-4-15 11:39
mb_ysroovkn
为你点赞~
2024-4-15 11:38
Arahat0
为你点赞~
2024-4-13 12:57
crackwiki
为你点赞~
2024-4-12 17:18
小夜的夜
为你点赞~
2024-4-12 16:03
Lpwn
为你点赞~
2024-4-12 11:52
bwner
为你点赞~
2024-4-12 11:13
0x指纹
为你点赞~
2024-4-12 10:29
wmsuper
为你点赞~
2024-4-12 10:01
tank小王子
为你点赞~
2024-4-12 09:38
vay
为你点赞~
2024-4-12 08:44
zhczf
为你点赞~
2024-4-11 21:41
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
9
)
nszy007
雪 币:
7294
活跃值:
(2493)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
34
粉丝
2
关注
私信
nszy007
2
楼
这类文章好少,终于有人愿意分享了
2024-4-12 06:39
0
秋狝
雪 币:
10077
活跃值:
(34146)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
1571
粉丝
39
关注
私信
秋狝
3
楼
感谢分享
2024-4-12 09:21
1
badmonkey7
雪 币:
1215
活跃值:
(522)
能力值:
( LV4,RANK:40 )
在线值:
发帖
1
回帖
2
粉丝
7
关注
私信
badmonkey7
1
4
楼
nszy007
这类文章好少,终于有人愿意分享了
2024-4-12 09:39
0
Lpwn
雪 币:
2154
活跃值:
(4147)
能力值:
( LV6,RANK:90 )
在线值:
发帖
2
回帖
17
粉丝
19
关注
私信
Lpwn
2
5
楼
好文章,狠狠学习
2024-4-12 11:53
0
HOWMP
雪 币:
1842
活跃值:
(5897)
能力值:
( LV6,RANK:80 )
在线值:
发帖
8
回帖
248
粉丝
8
关注
私信
HOWMP
1
6
楼
6啊,patch内存我是没想到
2024-4-12 13:46
0
mudebug
雪 币:
12377
活跃值:
(9915)
能力值:
( LV3,RANK:20 )
在线值:
发帖
10
回帖
335
粉丝
64
关注
私信
mudebug
7
楼
666
2024-4-12 20:24
0
caolinkai
雪 币:
3851
活跃值:
(4319)
能力值:
( LV2,RANK:10 )
在线值:
发帖
7
回帖
826
粉丝
1
关注
私信
caolinkai
8
楼
666666
2024-4-15 18:54
0
caolinkai
雪 币:
3851
活跃值:
(4319)
能力值:
( LV2,RANK:10 )
在线值:
发帖
7
回帖
826
粉丝
1
关注
私信
caolinkai
9
楼
感谢分享
2024-4-15 20:26
0
smile1110
雪 币:
255
活跃值:
(696)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
41
粉丝
1
关注
私信
smile1110
10
楼
66666
2026-4-19 01:22
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
badmonkey7
1
1
发帖
2
回帖
40
RANK
关注
私信
他的文章
[原创]获取虚拟机的shell
16342
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部