我们开始创建一些小功能函数。
键盘记录
键盘记录器很常见。优秀的第三方python库 PyHook能让我们很容易捕获所有键盘事件。它利用了原生的windows函数SetWindowsHookEx,这个函数允许我们安装自定义钩子,当特定的windows事件发生时,这个钩子函数就会被调用。我们通过注册键盘事件的钩子函数能捕获目标机器触发的所有按键信息。除此之外,我们还需要精确的知道哪些进程中执行了这些按键。PyHook封装了所有底层编程方法,我们只需要关注键盘记录的核心逻辑。
pyhook 下载地址:https://sourceforge.net/projects/pyhook/
1 | from ctypes import * |
GetForegroundWindow 返回目标桌面上当前活动窗口句柄
GetWindowThreadProcessId 获取进程id
1 | from ctypes import * |
上面是完整的键盘钩子代码。我们定义了PyHook的HookManger管理器,然后将我们自定义的回调函数KeyStroke与keyDown事件进行绑定。 通过PyHook钩住了所有按键事件,然后继续消息循环。回调函数通过返回True来允许执行消息队列中的下一个hook事件。
截取屏幕快照
我们可以使用pyWin32库,通过调用本地windowsAPI的方式来实现抓屏功能。
1 | import win32gui |
Python方式的shellcode执行
有时候,你可能需要与目标机器中的某一台主机进行交互,或者在目标主机上运行你钟爱的渗透测试框架中某种新的漏洞利用模块。我们需要具备在目标机器上执行shellcode的方法。
执行原生的二进制shellcode。我们只需要在内存中申请缓冲区,然后利用ctypes模块创建指向这片内存的函数指针,最后调用这个函数。 这个例子中,我们将利用urllib32模块从web服务器上下载base64编码shellcode然后执行。
1 | import urllib2 |
附录:https://www.offensive-security.com/metasploit-unleashed/generating-payloads/
沙盒检测
防病毒软件越来越多地使用了某种类型的沙盒来检测可疑样本行为。无论沙盒在哪个位置,我们都要尽量避免网络上可能的防御。使用一些标识来尝试确定我们的木马是否运行在沙盒内部。我们将会监视目标机器最近的用户输入,包括键盘输入和鼠标点击。
以下代码来搜寻键盘事件、鼠标点击和双击事件。脚本还尝试判断沙盒的管理者是否在重复发送输入信号,管理者通过这种行为调用原始的沙盒检测方法。我们将对用户与机器最后交互的时间与机器开机时间进行对比,这是判断是否在沙盒内部运行的极好方式。在沙盒环境钟通常没有用户的交互。
对沙盒进行检测,我们可以决定我们的木马是否应该继续运行。
1 | import ctypes |
先定义了LASTINPUTINFO结构体,它用来保存系统检测到的最后输入事件的时间戳(毫秒为单位)。
需要注意的是,你必须在调用函数写入时间戳之前,初始化cbSize变量,将它设置为结构体大小。之后,我们调用
GetLastInputInfo函数,将系统最后输入事件时间填充到struct_lastinputinfo.dwTime。kernel32.GetTickCount()获取开机至现在运行时间。
最后是一个简单的测试,在脚本运行期间是否可以移动鼠标、敲击键盘上的按键,观察代码输出。
我们下一步定义一些与用户输入相关的阈值。不同的目标和攻击方法设置的阈值都不一样。如:需要用户点击的操作(钓鱼邮件),木马在运行前的一两分钟内,目标系统上都有用户输入。假如目标系统运行十分钟,而用户输入也十分钟之前,那可能就是在沙盒里面。
我们使用ctypes记录按键
1 | def get_key_press(): |
上述函数获得目标系统上鼠标点击数量、鼠标点击的时间,以及按键盘的次数。
1 | import ctypes |