Pupy 利用分析——Windows 平台下的屏幕控制
0x00 前言
Pupy 在 Windows 平台下的后渗透模块包括一个实用的功能:屏幕控制。这个功能不仅能够查看屏幕内容,也能够发送鼠标和键盘消息。本文将要对这个功能的实现方法进行分析,换一种思路实现类似的功能,便于二次开发。
0x01 简介
本文将要介绍以下内容:
- Pupy 的屏幕控制模块测试
- Pupy 的实现方法
- 另一种实现方法
0x02 Pupy 的屏幕控制模块测试
Pupy 的基本使用方法可以参考之前的文章《Pupy 利用分析——Windows 平台下的功能》
获得 session 后,输入 rdesktop
加载屏幕控制模块,如下图
浏览器访问 url 可以对屏幕进行查看和操作,如下图
这里支持输入键盘消息和鼠标单击的操作
在使用普通用户权限进行操作时需要注意 UAC 的问题(无法对 UAC 的弹框进行操作)
弹出 UAC 时会创建进程 consent.exe
需要使用 System 权限关闭这个进程,关闭后弹出对话框提示 The storage control block address is invalid.
如下图
注:
关闭 UAC 弹框提示的 cmd 命令:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f
开启 UAC 弹框提示的 cmd 命令:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 5 /f
0x03 Pupy 的实现方法
rdesktop 模块的实现代码: https://github.com/n1nj4sec/pupy/blob/unstable/pupy/modules/rdesktop.py
在实现上分成以下三部分:
1.Client
同目标屏幕进行交互,包括以下功能:
- 回传目标当前的屏幕内容
- 接收 Server 的鼠标和键盘消息并执行
实现代码:https://github.com/n1nj4sec/pupy/blob/unstable/pupy/packages/all/rdesktop.py
2.transfer
Client 和 Server 之间通信的桥梁,包括如下功能:
- 接收 Client 的消息,解码后转发至本地的指定端口,用作浏览器访问
- 编码浏览器的鼠标和键盘消息并发送至 Client
实现代码:
- https://github.com/n1nj4sec/pupy/blob/unstable/pupy/network/lib/transports/websocket.py
- https://github.com/n1nj4sec/pupy/blob/unstable/pupy/network/transports/ws/conf.py
3.Server
通过浏览器控制目标屏幕,包括以下功能:
- 在浏览器显示 Client 的屏幕内容
- 获取当前浏览器的鼠标和键盘消息并发送至 transfer
实现代码:
- https://github.com/n1nj4sec/pupy/blob/unstable/pupy/webstatic/rdesktop/index.html
- https://github.com/n1nj4sec/pupy/blob/unstable/pupy/webstatic/rdesktop/rdesktop.js
Pupy 在实现上,Client 和 Server 之间通过 transfer 处理数据,使用 RSA+AES 加密,优点是增加还原通信数据的难度
为了直观的读取通信数据,便于屏幕控制功能的二次开发,所以这里尝试去掉 transfer 功能,实现 Client 和 Server 之间的直接通信
0x04 另一种实现方法
这里基于 HTTP-Remote-Desktop-Server 进行介绍
1.HTTP-Remote-Desktop-Server 的环境搭建
HTTP-Remote-Desktop-Server 的 run.py 中使用了 Python2 下的 PyGtk 库(import gtk.gdk)
而最新的 PyGtk 库不再支持 Python2,改为 Python3
为了能够编译代码,这里需要注意以下问题:
(1) 需要安装 32 位的 Python2
64 位系统也需要安装 32 位的 Python2,否则无法使用 PyGtk 库
(2) 下载 Python2 下的 PyGtk 库
地址:http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.24/pygtk-all-in-one-2.24.0.win32-py2.7.msi
(3) 安装其他包
pip install -U wxPython
pip install pyautogui
2.HTTP-Remote-Desktop-Server 的测试
修改 run.py 中的 IP,设置为当前操作系统的 ip,如下图
启动 run.py
在另一系统上,通过浏览器访问指定 url,获得屏幕内容,如下图
注:
使用时需要开启防火墙规则,对应的 cmd 命令如下:
netsh advfirewall firewall add rule name="test" protocol=TCP dir=in localport=9010 action=allow
3.HTTP-Remote-Desktop-Server 的实现
(1)Client
同目标屏幕进行交互,包括以下功能:
- 截取当前屏幕,保存为
screenshot.png
- 接收 Server 的鼠标和键盘消息并执行
实现代码:https://github.com/BernardoGO/HTTP-Remote-Desktop-Server/blob/master/run.py
(2)Server
通过浏览器控制目标屏幕,包括以下功能:
- 在浏览器显示
screenshot.png
- 获取当前浏览器的鼠标和键盘消息并发送至 Client
实现代码:
- https://github.com/BernardoGO/HTTP-Remote-Desktop-Server/blob/master/index.html
- https://github.com/BernardoGO/HTTP-Remote-Desktop-Server/blob/master/scripts.js
HTTP-Remote-Desktop-Server 在实现上通过截取屏幕(screenshot.png) 显示和发送命令,所以无法连续显示,需要刷新后才能获得新的屏幕内容
支持键盘输入,但需要刷新后才能获得新的屏幕内容
4.HTTP-Remote-Desktop-Server 的优化
我 fork 了原代码,修改后的代码地址:https://github.com/3gstudent/HTTP-Remote-Desktop-Server
优化如下:
(1) 将 index.html 中引用 jQuery 的地址改成相对路径
(2) 修改 run.py,通过参数传入监听的 IP 和端口
(3) 将 Python 代码编译成独立的 exe 文件
使用 Pyinstaller,命令如下:
C:\Python27\Scripts\pyinstaller.exe -F run.py
编译后的文件地址:https://github.com/3gstudent/HTTP-Remote-Desktop-Server/releases/download/v1.0/run.exe
为了支持鼠标双击操作,可以修改 run.py,添加如下代码:
pyautogui.click(clicks=2)
在二次开发上需要注意如下问题:
(1) 通信数据未做编码,可以选择压缩算法提高效率
(2) 访问 url:port/screenshot.png
可以获得屏幕截图
(3) 使用时需要开启防火墙规则,对应的 cmd 示例命令如下:
netsh advfirewall firewall add rule name="test" protocol=TCP dir=in localport=9010 action=allow
0x05 小结
本文分析了 Pupy 的实现方法,以 HTTP-Remote-Desktop-Server 为模板介绍了第二种实现方法,便于二次开发。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 域渗透——DNS 记录与 MachineAccount
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论