一站式网站建设价格,提升学历的目的和意义,网站建设项目设计报告,网站建设经费立项报告0x00 认识VNC
先我们看看VNC运行的工作流程#xff1a; VNC客户端通过浏览器或VNC Viewer连接至VNC Server#xff1b; VNC Server传送一个对话窗口至客户端#xff0c;要求输入连接密码#xff08;可能为空#xff09;#xff0c;以及存取的VNC Server显示装置#…0x00 认识VNC
先我们看看VNC运行的工作流程 VNC客户端通过浏览器或VNC Viewer连接至VNC Server VNC Server传送一个对话窗口至客户端要求输入连接密码可能为空以及存取的VNC Server显示装置 在客户端输入连接密码后VNC Server验证客户端是否具有存取权限; 若是客户端通过VNC Server的验证客户端即要求VNC Server显示桌面环境 被控端将画面显示控制权交由VNC Server负责 VNC Server将把被控端的桌面环境利用通信协议送至客户端并且允许客户端控制VNC Server的桌面环境及输入装置。
0x01 VNC攻击工具vncpwdump
国内很少没有针对VNC攻击技术的专门研究团队大部分的VNC攻击技术和相关工具都是国外攻击者推出的所以如果要深入研究VNC的攻防技术在国内比较难找到新的技术资料如这里将要介绍的Vncpwdump。Vncpwdump是一个很早以前就已经推出的VNC综合性的攻击和破解工具最新的可以针对各版本VNC进行密码破解和攻击的vncpwdump是1.0.6版具有非常强悍的各项功能。Vncpwdump是个开源的程序不但可以下载到它还可以下载到它的源代码进行修改和增加、删除相关功能。
Vncpwdump的主要功能是获取VNC的密码它提供多种获取方式比如从NTUSERDAT文件中获取从命令行输入获取注入VNC线程获取注册表中获取等方式。
0x02 使用vncpwdump进行攻击模拟
Vncpwdump的功能很多从它的使用界面来看有如下的功能参数
下面对各参数的具体含义和使用方式做简单演示。
首先是-c和-s参数这两个参数的意义是从注册表的HKEY_CURRENT USER或HKEY_LOCAL MACHINE下读取VNC的密码因为版本不同的关系上述两个注册表键值中的其中一个会存在VNC的密码。其中HKCU 是简写代表注册表中得HKEY_CURRENT_USER位置。当我们打开注册表找到相应位置得时候密码内容就逐步浮出水面可以找到里面有一行如下显示
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\WinVNC4]
Passwordhex:49,40,15,f9,a3,5e,8b,22
SecurityTypesVncAuth
ReverseSecurityTypesNone
QueryConnectdword:00000000
QueryOnlyIfLoggedOndword:00000000
PortNumberdword:0000170c
IdleTimeoutdword:00000e10
HTTPPortNumberdword:000016a8
LocalHostdword:00000000
Hosts,
AcceptKeyEventsdword:00000001
AcceptPointerEventsdword:00000001
AcceptCutTextdword:00000001
SendCutTextdword:00000001
DisableLocalInputsdword:00000000
DisconnectClientsdword:00000001
AlwaysShareddword:00000000
NeverShareddword:00000000
DisconnectActionNone
RemoveWallpaperdword:00000000
RemovePatterndword:00000000
DisableEffectsdword:00000000
UpdateMethoddword:00000001
PollConsoleWindowsdword:00000001
UseCaptureBltdword:00000001
UseHooksdword:00000001
Protocol3.3dword:00000000 这password后得值就是加密的密码虽然我们不能直接读懂他我们可以使用多种方法来破解比如VNCX4和我们下面要介绍的vncpwdump均可.
以VNC 4为例使用-s参数可以直接得到相关的密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gYFAC0DW-1690884037395)(./pic/2019-07-30-01-48-30.png)]
“-r参数后的说明是decrypts password in ”也就是从文件中读出密码通常情况下攻击者会尝试使用NTUSER.DAT文件读取密码。NTUSER.DAT和NTUSER.ini都属于系统的用户配置文件里面存储了一些用户的相关配置信息有一些版本的VNC会将密码存储于这个文件之中不过大家不必担心一般情况下这个文件无法读出密码。
“-d参数的说明是dumps the password by injecting into running process”意思是以注入进程的方式读取密码。在实际的网络中考虑到服务器的稳定性一般不适用这个参数进行攻击。
“-k参数和”-e参数是相对应的配套参数“-k的作用是在获得系统中存在的加密VNC密码以后解密”-e参数的作用是将没有经过VNC加密的密码进行加密。
先看看-e是什么效果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwhEzxcw-1690884037396)(./pic/2019-07-30-01-51-03.png)]
从上图中可以看到使用命令后得到加密后的KEY是494015F9A35E8B22实际上这个key如果是VNC的链接密码的话VNC会将这个密码存放在注册表中的一个固定的地方每当用户连接的时候都会验证如果管理员修改密码这个值也跟着改变。再看看使用-k参数进行解密的命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7W5H5Df-1690884037396)(./pic/2019-07-30-01-50-45.png)]
可以看到密码123456已经被破解出来。
“-s和”-c参数也是成对使用的功能类似。“-s参数用于直接修改VNCserver的链接密码”-c参数用户修改当前用户的密码。
举例来说如果使用-s参数将vnc的链接密码改成123则使用如下命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ALPHx4VS-1690884037397)(./pic/2019-07-30-01-49-44.png)]
这里需要注意的是vncpwdump的各个参数都是区分大小写的大小写不同作用也不同大家在实际使用过程中一定要注意区分。在实际的网络攻击中当攻击者无法获得VNC密码时候就可以使用-s参数来强制改变VNC密码但这样做也会被管理员发现。
0x03 针对的扫描
在这里我们使用的是vncscan工具。运行截图如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvhc1ejf-1690884037397)(./pic/2019-07-30-01-49-58.png)]
从上图可知这个程序主要包含个部分分别是target、“scantype”、“option”,其中target用于定义扫描的IP地址范围scantype确定扫描的方式option是附带的其他参数。
举例来说要批量扫描内部网络中安装了VNC的计算机确定IP地址段为192.168.0.1-192.168.0.254,VNC默认端口是5900,这样需要构造的命令如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cxB9KQMW-1690884037397)(./pic/2019-07-30-01-50-13.png)]
其中有6个输出参数分别如下
FOUND 表示得到的结果数据PORT扫描的端口数IP 扫描的数STATUS 完成进度THREADS 线程TOTAL/REMAINING用时;从结果中我们看出192.168.0.243开放了5900端口。在实际的攻击过程中攻击者往往都会利用自己控制的肉鸡进行大范围的扫描如果只通过在CMD下运行并查看结果这样比较繁琐所以这个扫描程序会在程序目录生成一个TXT文件里面有扫描结果的记录。例如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMkotLod-1690884037398)(./pic/2019-07-30-01-50-22.png)]
VNC_bypauth.txt文件会记录开放5900端口的IP地址及VNC状态。其中只有VULNERABLE是存在直接可以利用的漏洞可以被攻击者利用的而patched,banned这两种状态没有用。
0x04 加固方法
修改默认端口设置强口令
修改启动文件vncserver
# vim /usr/bin/vncserver
查找5900修改两处地方$vncPort 5900 $displayNumber;if (!bind(S, pack(S n x12, $AF_INET, 5900 $n)))
为$vncPort 15900 $displayNumber; //数字自定义但不能与其他端口冲突最好选择10000以后的端口if (!bind(S, pack(S n x12, $AF_INET, 15900 $n))) //与上面的自定义的数字保持一致限制访问ip 利用iptables来限制ip访问
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.1/24 --dport 5901 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 5901 -m state --state ESTABLISHED -j ACCEPT使用ssh隧道连接登录
服务器 - 配置vnc只允许本地访问 - vim编辑完文件后保存并重启VNC服务端。
本地客户端 - 假定服务器ip 是 128.128.128.128 - 假定服务器SSH 端口是 8888
ssh -v -C -L 5901:localhost:5901 root128.128.128.128 -p 8888登录VNC客户端 只需将vnc服务器填本机即可。 VNC SERVER:127.0.0.1:5901
拓展民生银行openstack中的vnc加固方法
1 前言
在构建企业私有云时除了平台的功能性和稳定性安全性也是非常重要的因素尤其对于银行业数据中心以及监管部门对平台的安全性要求更高。
OpenStack 是 IaaS 的开源实现经过几年的发展OpenStack 的功能越来越完善运行也越来越稳定目前已经成为企业构建私有 IaaS 云的主流选择之一。
民生银行从 2016 年就开始研究和使用 OpenStack 了不仅积累了大量的 OpenStack 云平台开发和运维经验还针对 OpenStack 平台的安全性进行了探索与研究对社区 OpenStack 进行了大量的安全加固优化本文接下来将详细分享我们针对开源 OpenStack 的安全加固优化方案。
2 配置文件明文密码加密
2.1 为什么明文密码需要加密
密码是非常重要的敏感数据一旦密码被泄露系统就有可能被非授权人员利用导致信息泄露、篡改因此密码的安全性保障是企业的重中之重工作。避免在服务器上保存文本明文密码是防止密码泄露的有效手段之一对于银行业来说也是监管部门的硬性要求之一。
目前我们已基于开源 OpenStack 构建了多套 IaaS 云平台社区 OpenStack 配置文件使用的都是明文密码存储存在巨大的安全隐患社区针对这个问题也有讨论。不过至今社区还没有现成的配置文件密码加密方案但已经在尝试使用 Secrets Management 管理密码如 Castellan详细文档可参考社区关于 secrets-management 的讨论不过该方案离完全实现可能还需要一段时间。
然而由于我们线上系统的安全要求我们对配置文件密码加密具有更迫切的需求不得不在社区方案实现前完成 OpenStack 密码安全加固对明文密码进行整改对配置文件包含的所有敏感数据进行加密处理。
3 计算节点 VNC 加密
3.1 OpenStack 虚拟机 VNC 简介
虚拟机的 VNC 是非常重要的功能类似于物理服务器的带外 console能够不依赖于虚拟机操作系统的网络进行远程访问与控制。当虚拟机操作系统出现故障或者网络不通时往往需要通过 VNC 进行远程连接修复。
OpenStack 原生支持 Web VNC 功能用户可通过 Nova API 获取虚拟机的 VNC 链接VNC 链接会带上一个授权的临时 Token。用户访问 Web VNC 时其实访问的是 Nova 的 nova-novncproxy 服务nova-novncproxy 会首先检查 Token 是否有效如果有效则会转发到对应虚拟机所在计算节点监听的 VNC 地址否则连接将会被强制阻断。
因此用户通过 OpenStack 平台访问虚拟机 VNC 是安全的能够有效阻止非授权人员通过端口扫描非法访问 VNC。
然而原生 OpenStack 的 Libvirt Driver 目前还没有实现 VNC 连接密码认证功能意味着非法人员可以不需要任何认证直接连接计算节点绕过 OpenStack 访问虚拟机 VNC利用 VNC 可发送电源指令或者 CtrlAltDelete 指令重启虚拟机并进入单用户模式绕过操作系统 root 认证直接登录虚拟机这显然存在巨大的安全隐患。
社区针对这个问题也有讨论但一直没有实现参考社区 bug #1450294[4]。
3.2 VNC 加密优化
针对如上 OpenStack 虚拟机没有配置 VNC 密码问题我们对 OpenStack 进行了二次开发增加了 password 参数配置 VNC 密码核心代码如下
staticmethod
def _guest_add_video_device(guest):# ...if CONF.vnc.enabled and guest.virt_type not in (lxc, uml):graphics vconfig.LibvirtConfigGuestGraphics()graphics.type vncif CONF.vnc.keymap:graphics.keymap CONF.vnc.keymapif CONF.vnc.vnc_password:graphics.password CONF.vnc.vnc_passwordgraphics.listen CONF.vnc.server_listenguest.add_device(graphics)add_video_driver True# ...return add_video_driver如上实现了新创建虚拟机添加 VNC 密码功能但是对正在运行的虚拟机并无影响如果要使 VNC 密码生效必须重启虚拟机。但由于我们线上环境已经有业务在运行重启虚拟机意味着必须中断业务这显然不能接受。虚拟机不重启如何让其重刷配置呢我们自然想到了虚拟机热迁移办法虚拟机从一个宿主机热迁移到另一个宿主机理论上会重新生成虚拟机配置而又几乎对业务无影响。
然而当我们在测试环境上验证时发现虚拟机在线迁移并不会更新配置于是我们又分析了虚拟机在线迁移的流程发现在源端更新 xml 配置文件时没有添加 VNC 密码该功能代码位于 nova/virt/libvirt/migration.py 的 _update_graphics_xml( ) 方法
def _update_graphics_xml(xml_doc, migrate_data):listen_addrs graphics_listen_addrs(migrate_data)# change over listen addressesfor dev in xml_doc.findall(./devices/graphics):gr_type dev.get(type)listen_tag dev.find(listen)if gr_type in (vnc, spice):if listen_tag is not None:listen_tag.set(address, listen_addrs[gr_type])if dev.get(listen) is not None:dev.set(listen, listen_addrs[gr_type])return xml_doc我们修改了该方法实现增加了 VNC 密码的更新经过验证所有虚拟机通过在线迁移方法增加了 VNC 密码认证功能。
3.3 用户 VNC 连接
前面提到用户是通过 Nova 的 novncproxy 代理访问虚拟机 VNC 的novncproxy 北向接收用户请求南向连接计算节点的 VNC server由于我们的 VNC server 增加了密码认证功能因此 novncproxy 就无法直接连接 VNC server 了。
由于 VNC 使用了 RFBRemote Frame Buffer协议进行数据传输我们对 RFB 协议进行了研究通过重写 (overwrite)(nova/console/websocketproxy.py 的 do_proxy 方法实现 VNC 密码的代填功能从而实现用户能够沿用原有的方式通过 OpenStack 标准 API 访问虚拟机 VNC该部分实现准备在下一篇文章中进行详细介绍。