Pupy 利用分析——Windows 平台下的屏幕控制

发布于 2024-10-17 21:12:24 字数 7038 浏览 7 评论 0

0x00 前言

Pupy 在 Windows 平台下的后渗透模块包括一个实用的功能:屏幕控制。这个功能不仅能够查看屏幕内容,也能够发送鼠标和键盘消息。本文将要对这个功能的实现方法进行分析,换一种思路实现类似的功能,便于二次开发。

0x01 简介

本文将要介绍以下内容:

  • Pupy 的屏幕控制模块测试
  • Pupy 的实现方法
  • 另一种实现方法

0x02 Pupy 的屏幕控制模块测试

Pupy 的基本使用方法可以参考之前的文章《Pupy 利用分析——Windows 平台下的功能》

获得 session 后,输入 rdesktop 加载屏幕控制模块,如下图

Alt text

浏览器访问 url 可以对屏幕进行查看和操作,如下图

Alt text

这里支持输入键盘消息和鼠标单击的操作

在使用普通用户权限进行操作时需要注意 UAC 的问题(无法对 UAC 的弹框进行操作)

弹出 UAC 时会创建进程 consent.exe

需要使用 System 权限关闭这个进程,关闭后弹出对话框提示 The storage control block address is invalid.

如下图

Alt text

注:

关闭 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

实现代码:

3.Server

通过浏览器控制目标屏幕,包括以下功能:

  • 在浏览器显示 Client 的屏幕内容
  • 获取当前浏览器的鼠标和键盘消息并发送至 transfer

实现代码:

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,如下图

Alt text

启动 run.py

在另一系统上,通过浏览器访问指定 url,获得屏幕内容,如下图

Alt text

注:

使用时需要开启防火墙规则,对应的 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

实现代码:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

吻风

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

回眸一遍

文章 0 评论 0

一心憧憬

文章 0 评论 0

沙与沫

文章 0 评论 0

mb_L9V1seZC

文章 0 评论 0

angellghost

文章 0 评论 0

旧梦荧光笔

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文