μΉ¨ν¬ ν μ€νΈλ₯Ό μν Python κΈ°λ° μ΅μ€νλ‘μ κ°λ° νλ μμν¬ κ΅¬μΆμ νꡬν©λλ€. μν€ν μ², λͺ¨λ λ° μ€μ ꡬνμ λν΄ μμ보μΈμ.
Python μΉ¨ν¬ ν μ€νΈ: μ΅μ€νλ‘μ κ°λ° νλ μμν¬ κ΅¬μΆ
μ¬μ΄λ² 보μ μμμμ μΉ¨ν¬ ν μ€νΈλ μμ€ν λ° μ ν리μΌμ΄μ λ΄μ μ·¨μ½μ μ μλ³νκ³ μννλ λ° μ€μν μν μ ν©λλ€. Metasploitμ κ°μ μλ§μ κΈ°μ± λꡬ λ° νλ μμν¬κ° μ‘΄μ¬νμ§λ§, μ΅μ€νλ‘μ κ°λ°μ κΈ°λ³Έ μ리λ₯Ό μ΄ν΄νκ³ μ¬μ©μ μ μ λꡬλ₯Ό μμ±νλ κ²μ κ·μ€ν μ§μκ³Ό μ μ°μ±μ μ 곡ν©λλ€. Pythonμ κ΄λ²μν λΌμ΄λΈλ¬λ¦¬μ μ¬μ© νΈμμ±μΌλ‘ μΈν΄ μ¬μ©μ μ μ μ΅μ€νλ‘μ κ°λ° νλ μμν¬λ₯Ό ꡬμΆνκΈ°μ νλ₯ν μΈμ΄μ λλ€. μ΄ κΈ°μ¬μμλ μ΄λ¬ν νλ μμν¬λ₯Ό λ§λλ λ° κ΄λ ¨λ μ£Όμ κ°λ κ³Ό μ€μ λ¨κ³λ₯Ό μλ΄ν©λλ€.
μ¬μ©μ μ μ μ΅μ€νλ‘μ κ°λ° νλ μμν¬λ₯Ό ꡬμΆν΄μΌ νλ μ΄μ ?
Metasploitμ κ°μ κΈ°μ‘΄ νλ μμν¬λ κ΄λ²μν κΈ°λ₯μ μ 곡νμ§λ§, μ체 νλ μμν¬λ₯Ό ꡬμΆνλ©΄ λ€μκ³Ό κ°μ μ¬λ¬ κ°μ§ μ΄μ μ΄ μμ΅λλ€.
- λ κΉμ μ΄ν΄: κ° κ΅¬μ± μμλ₯Ό μ²μλΆν° ꡬμΆνλ©΄ μ΅μ€νλ‘μ κ°λ° μ리μ λν μ΄ν΄κ° ν₯μλ©λλ€.
- μ¬μ©μ μ μ: νΉμ μꡬ μ¬ν λ° νκ²½μ λ§κ² νλ μμν¬λ₯Ό μ‘°μ νμ¬ κ³ μ ν μ·¨μ½μ μ°κ΅¬μ μ μν©λλ€.
- μ μ°μ±: κΈ°μ‘΄ νλ μμν¬μμ μ¬μ©ν μ μλ μ¬μ©μ μ μ λͺ¨λ λ° λꡬλ₯Ό ν΅ν©ν©λλ€.
- νμ΅ κΈ°ν: μννΈμ¨μ΄ μ€κ³, 보μ μμΉ λ° νλ‘κ·Έλλ° κΈ°μ μ λν μ€μ΅ νμ΅ κ²½νμ μ 곡ν©λλ€.
- ννΌ μ°ν: μ¬μ©μ μ μ λꡬλ μΌλ°μ μΈ λκ΅¬κ° νΈλ¦¬κ±°νλ μΌλΆ νμ§ λ©μ»€λμ¦μ μ°νν κ°λ₯μ±μ΄ λ λμ μ μμ΅λλ€.
νλ μμν¬ μν€ν μ²
μ μ€κ³λ μ΅μ€νλ‘μ κ°λ° νλ μμν¬λ λͺ¨λμμ΄κ³ νμ₯ κ°λ₯ν΄μΌ ν©λλ€. λ€μμ μ μλ μν€ν μ²μ λλ€.
- μ½μ΄ μμ§: νλ μμν¬ μ΄κΈ°ν, λͺ¨λ λ‘λ© λ° μ€ν νλ¦μ μ²λ¦¬ν©λλ€.
- λͺ¨λ κ΄λ¦¬: λͺ¨λμ λ‘λ©, μΈλ‘λ© λ° κ΅¬μ±μ κ΄λ¦¬ν©λλ€.
- μ·¨μ½μ λ°μ΄ν°λ² μ΄μ€: CVE ID, μ€λͺ λ° κ΄λ ¨ μ΅μ€νλ‘μμ ν¬ν¨νμ¬ μλ €μ§ μ·¨μ½μ μ λν μ 보λ₯Ό μ μ₯ν©λλ€.
- μ΅μ€νλ‘μ λͺ¨λ: νΉμ μ·¨μ½μ μ λν κ°λ³ μ΅μ€νλ‘μμ ν¬ν¨ν©λλ€.
- νμ΄λ‘λ λͺ¨λ: λ€μν μν€ν μ² λ° μ΄μ 체μ μ λν νμ΄λ‘λ(μ Έμ½λ)λ₯Ό μμ±ν©λλ€.
- μΈμ½λ© λͺ¨λ: νμ§λ₯Ό νΌνκΈ° μν΄ νμ΄λ‘λλ₯Ό μΈμ½λ©ν©λλ€.
- νΌμ§ λͺ¨λ: νΌμ§ κΈ°μ μ ν΅ν΄ μλνλ μ·¨μ½μ κ²μμ νμ©ν©λλ€.
- μ νΈλ¦¬ν° λͺ¨λ: λ€νΈμν¬ ν΅μ , νμΌ μ‘°μ λ° λ°μ΄ν° λ³νκ³Ό κ°μ μ μ©ν κΈ°λ₯μ μ 곡ν©λλ€.
- λλ²κΉ μΈν°νμ΄μ€: μ΅μ€νλ‘μ λΆμ λ° κ°μ μ μν΄ GDB λλ Immunity Debuggerμ κ°μ λλ²κ±°μ ν΅ν©λ©λλ€.
νκ²½ μ€μ
μ½λλ‘ λ€μ΄κ°κΈ° μ μ νμν λκ΅¬κ° μ€μΉλμ΄ μλμ§ νμΈνμμμ€.
- Python 3: νλ μμν¬μ κΈ°λ³Έ νλ‘κ·Έλλ° μΈμ΄μ λλ€.
- κ°μ νκ²½(venv): νλ μμν¬μ μ’
μμ±μ 격리ν©λλ€.
python3 -m venv venv - Pip: Pythonμ ν¨ν€μ§ μ€μΉ νλ‘κ·Έλ¨μ
λλ€.
pip install -r requirements.txt(μ’ μμ±μ΄ μλrequirements.txtνμΌμ λ§λλλ€.) - λλ²κ±°: GDB (Linux), Immunity Debugger (Windows).
- λμ€μ΄μ λΈλ¬: IDA Pro, Ghidra.
- λ€νΈμν¬ λꡬ: Wireshark, tcpdump.
requirements.txt μμ:
requests
scapy
colorama
μ½μ΄ μμ§ κ΅¬ν
μ½μ΄ μμ§μ νλ μμν¬μ ν΅μ¬μ λλ€. μ΄κΈ°ν, λͺ¨λ λ‘λ© λ° μ€ν νλ¦μ μ²λ¦¬ν©λλ€. λ€μμ κΈ°λ³Έ μμ μ λλ€.
```python import os import importlib from colorama import Fore, Style class Framework: def __init__(self): self.modules = {} self.module_path = "modules" def load_modules(self): print(Fore.GREEN + "[*] Loading modules..." + Style.RESET_ALL) for filename in os.listdir(self.module_path): if filename.endswith(".py") and filename != "__init__.py": module_name = filename[:-3] try: module = importlib.import_module(f"{self.module_path}.{module_name}") for name, obj in module.__dict__.items(): if isinstance(obj, type) and hasattr(obj, 'run'): self.modules[module_name] = obj() print(Fore.GREEN + f"[+] Loaded module: {module_name}" + Style.RESET_ALL) except Exception as e: print(Fore.RED + f"[-] Failed to load module {module_name}: {e}" + Style.RESET_ALL) def run_module(self, module_name, options): if module_name in self.modules: try: self.modules[module_name].run(options) except Exception as e: print(Fore.RED + f"[-] Error running module {module_name}: {e}" + Style.RESET_ALL) else: print(Fore.RED + f"[-] Module {module_name} not found." + Style.RESET_ALL) def list_modules(self): print(Fore.BLUE + "[*] Available modules:" + Style.RESET_ALL) for module_name in self.modules: print(Fore.BLUE + f" - {module_name}" + Style.RESET_ALL) if __name__ == "__main__": framework = Framework() framework.load_modules() framework.list_modules() #Example: framework.run_module("example_exploit", {"target": "192.168.1.100", "port": 80}) ```μ΄ μ½λλ λ€μμ 보μ¬μ€λλ€.
modulesλλ ν 리μμ λͺ¨λμ λ‘λν©λλ€.- μ΅μ μ μ¬μ©νμ¬ νΉμ λͺ¨λμ μ€νν©λλ€.
- μ¬μ© κ°λ₯ν λͺ¨λμ λμ΄ν©λλ€.
μ΅μ€νλ‘μ λͺ¨λ λ§λ€κΈ°
μ΅μ€νλ‘μ λͺ¨λμλ νΉμ μ·¨μ½μ μ μ μ©νκΈ° μν λ‘μ§μ΄ ν¬ν¨λμ΄ μμ΅λλ€. λ€μμ κ°λ¨ν μ΅μ€νλ‘μ λͺ¨λμ μμ λλ€.
μ£Ό νλ μμν¬ μ€ν¬λ¦½νΈμ λμΌν λλ ν 리μ 'modules'λΌλ λλ ν 리λ₯Ό λ§λλλ€.
'modules' λλ ν 리 μμ example_exploit.pyλΌλ νμΌμ λ§λλλ€.
μ΄ λͺ¨λμ λ€μμ 보μ¬μ€λλ€.
runλ©μλκ° μλExampleExploitν΄λμ€λ₯Ό μ μν©λλ€.- λμ λ° ν¬νΈλ₯Ό μ΅μ μΌλ‘ μ¬μ©ν©λλ€.
- κ°λ¨ν λ²νΌ μ€λ²νλ‘ νμ΄λ‘λλ₯Ό 보λ λλ€. (μ°Έκ³ : μ΄κ²μ λ¨μνλ μμ΄λ©° λͺ¨λ μλ리μ€μμ μλνμ§ μμ μ μμ΅λλ€. νμ μ΅μ€νλ‘μμ μ± μκ° μκ³ μ€λ¦¬μ μΌλ‘ ν μ€νΈνμμμ€.)
νμ΄λ‘λ μμ±
νμ΄λ‘λλ μ±κ³΅μ μΈ μ΅μ€νλ‘μ ν λμ μμ€ν
μμ μ€νλλ μ
Έμ½λ λλ λͺ
λ Ήμ΄μ
λλ€. Pythonμ struct λ° pwntoolsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ 곡νμ¬ νμ΄λ‘λλ₯Ό μμ±ν©λλ€.
pwntools μ¬μ© μμ(pip install pwntoolsλ₯Ό μ¬μ©νμ¬ μ€μΉ):
μ΄ μ½λλ λ€μμ 보μ¬μ€λλ€.
shellcraftλ₯Ό μ¬μ©νμ¬/bin/shλ₯Ό μ€ννκΈ° μν μ Έμ½λλ₯Ό μμ±ν©λλ€.asmμ μ¬μ©νμ¬ μ Έμ½λλ₯Ό μ΄μ λΈν©λλ€.
μ·¨μ½μ κ²μμ μν νΌμ§
νΌμ§μ νλ‘κ·Έλ¨μ μλͺ»λ νμμ λλ μμμΉ λͺ»ν μ
λ ₯μ μ 곡νμ¬ μ·¨μ½μ μ κ²μνλ κΈ°μ μ
λλ€. Pythonμ νΌμ§μ μν AFL(American Fuzzy Lop) λ°μΈλ© λ° radamsaμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ 곡ν©λλ€.
κ°λ¨ν νΌμ§ μ κ·Ό λ°©μ μ¬μ© μμ:
```python import socket import random def fuzz(target, port): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((target, port)) # Generate a random string of bytes payload = bytearray(random.randbytes(random.randint(100, 2000))) s.send(payload) s.recv(1024) # Attempt to receive data; potential crash here s.close() return True # Survived the fuzzing attempt except Exception as e: print(f"Crash detected: {e}") return False # Likely crashed if __name__ == '__main__': TARGET = "192.168.1.100" #Replace with your target IP PORT = 80 #Replace with your target Port print(f"Fuzzing {TARGET}:{PORT}") for i in range(1000): print(f"Attempt {i+1}") if not fuzz(TARGET, PORT): break ```μ΄ μ½λλ λ€μμ 보μ¬μ€λλ€.
- λμμ μ°κ²°ν©λλ€.
- μμμ λ°μ΄νΈ νμ΄λ‘λλ₯Ό 보λ λλ€.
- ν¬λμλ₯Ό λͺ¨λν°λ§ν©λλ€.
νμ΄λ‘λ μΈμ½λ©
νμ΄λ‘λλ₯Ό μΈμ½λ©νλ©΄ λ°μ΄λ¬μ€ λ°±μ μννΈμ¨μ΄ λ° μΉ¨μ νμ§ μμ€ν μ μν νμ§λ₯Ό νΌνλ λ° λμμ΄ λ©λλ€. μΌλ°μ μΈ μΈμ½λ© κΈ°μ μλ XOR μΈμ½λ©, Base64 μΈμ½λ© λ° λ€νμ± μ½λ μμ±μ΄ ν¬ν¨λ©λλ€.
XOR μΈμ½λ© μμ:
```python def xor_encode(payload, key): encoded = bytearray() for i in range(len(payload)): encoded.append(payload[i] ^ key) return bytes(encoded) # Example usage payload = b"This is my payload" key = 0x41 encoded_payload = xor_encode(payload, key) print(f"Original payload: {payload}") print(f"Encoded payload: {encoded_payload}") decoded_payload = xor_encode(encoded_payload, key) # XOR with the same key to decode print(f"Decoded payload: {decoded_payload}") ```λλ²κΉ λ° λΆμ
λλ²κΉ μ μ΅μ€νλ‘μμ΄ μλνλ λ°©μμ μ΄ν΄νκ³ μ€λ₯λ₯Ό μλ³νλ λ° νμμ μ λλ€. GDB (Linux) λ° Immunity Debugger (Windows)μ κ°μ λλ²κ±°λ₯Ό μ¬μ©νλ©΄ μ½λλ₯Ό λ¨κ³λ³λ‘ μ€ννκ³ λ©λͺ¨λ¦¬λ₯Ό κ²μ¬νκ³ νλ‘κ·Έλ¨ λμμ λΆμν μ μμ΅λλ€.
μ£Όμ λλ²κΉ κΈ°μ :
- μ€λ¨μ μ€μ : μ½λμ νΉμ μ§μ μμ μ€νμ μΌμ μ€μ§ν©λλ€.
- μ½λ λ¨κ³λ³ μ€ν: μ½λλ₯Ό ν μ€μ© μ€νν©λλ€.
- λ©λͺ¨λ¦¬ κ²μ¬: λ©λͺ¨λ¦¬ μμΉμ λ΄μ©μ κ²μ¬ν©λλ€.
- λ μ§μ€ν° λΆμ: CPU λ μ§μ€ν°μ κ°μ λ΄ λλ€.
μλ₯Ό λ€μ΄ Immunity Debuggerλ₯Ό μ¬μ©νλ κ²½μ°:
- Immunity Debuggerλ₯Ό λμ νλ‘μΈμ€μ μ°κ²°ν©λλ€.
- μ΅μ€νλ‘μμ΄ νΈλ¦¬κ±°λ κ²μΌλ‘ μμλλ λͺ λ Ήμ΄μ μ€λ¨μ μ μ€μ ν©λλ€.
- μ΅μ€νλ‘μμ μ€ννκ³ μ€λ¨μ μ λλ¬νμ λ νλ‘κ·Έλ¨μ μνλ₯Ό κ΄μ°°ν©λλ€.
μ·¨μ½μ λ°μ΄ν°λ² μ΄μ€μ ν΅ν©
NVD(National Vulnerability Database) λ° Exploit-DBμ κ°μ μ·¨μ½μ λ°μ΄ν°λ² μ΄μ€μ ν΅ν©νλ©΄ μλ €μ§ μ·¨μ½μ μ λν κ΄λ ¨ μ΅μ€νλ‘μμ μ°Ύλ νλ‘μΈμ€λ₯Ό μλνν μ μμ΅λλ€. requests λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν λ°μ΄ν°λ² μ΄μ€λ₯Ό 쿼리ν μ μμ΅λλ€.
NVD API 쿼리 μμ(μ΄κ²μ NVD APIλ₯Ό μ΄ν΄νκ³ URL λ° νμ± λ‘μ§μ μ μ ν μ‘°μ ν΄μΌ ν©λλ€. μλ μ νμ κ³ λ €νμμμ€.):
```python import requests def search_nvd(cve_id): url = f"https://services.nvd.nist.gov/rest/json/cves/2.0?cveId={cve_id}" try: response = requests.get(url) response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) data = response.json() if data['totalResults'] > 0: print(f"Vulnerability Description: {data['vulnerabilities'][0]['cve']['descriptions'][0]['value']}") else: print("No results found for " + cve_id) except requests.exceptions.RequestException as e: print(f"Error querying NVD: {e}") if __name__ == '__main__': CVE_ID = "CVE-2023-0001" # Replace with an actual CVE ID search_nvd(CVE_ID) ```μ€λ¦¬μ κ³ λ € μ¬ν λ° λ²λ₯ μ€μ
μΉ¨ν¬ ν μ€νΈ λ° μ΅μ€νλ‘μ κ°λ°μ μμ€ν μμ μμ λͺ μμ μΈ μΉμΈνμλ§ μνν΄μΌ ν©λλ€. νμ λ€μμ ν¬ν¨νμ¬ μ€λ¦¬μ μ§μΉ¨ λ° λ²μ κ·μ μ μ€μνμμμ€.
- μλ©΄ λμ λ°κΈ°: μμ€ν μ ν μ€νΈνκΈ° μ μ μλ©΄ νκ°λ₯Ό ν보ν©λλ€.
- κ°μΈ μ 보 μ‘΄μ€: λ―Όκ°ν μ 보μ μ κ·Όνκ±°λ 곡κ°νμ§ λ§μμμ€.
- μν₯ μ΅μν: ν μ€νΈ μ€ μλΉμ€ μ€λ¨μ μ΅μννκΈ° μν μ‘°μΉλ₯Ό μ·¨ν©λλ€.
- μ·¨μ½μ λ³΄κ³ : λ°κ²¬λ μ·¨μ½μ μ μμ€ν μμ μμκ² μ μμ 곡κ°ν©λλ€.
- λ²λ₯ μ€μ: μ¬μ΄λ² 보μ λ° λ°μ΄ν° κ°μΈ μ 보 보νΈμ κ΄λ ¨λ λͺ¨λ ν΄λΉ λ²λ₯ λ° κ·μ μ μ€μν©λλ€. μ¬κΈ°μλ GDPR, CCPA λ° κΈ°ν μ§μ κ·μ μ΄ ν¬ν¨λ©λλ€.
κ²°λ‘
Python κΈ°λ° μ΅μ€νλ‘μ κ°λ° νλ μμν¬λ₯Ό ꡬμΆνλ κ²μ μ΄λ ΅μ§λ§ 보λ μλ λ Έλ ₯μ λλ€. μ΅μ€νλ‘μ κ°λ° μ리μ λν λ κΉμ μ΄ν΄λ₯Ό μ 곡νκ³ μ¬μ©μ μ μ κΈ°λ₯μ ν₯μμν€λ©° κ·μ€ν νμ΅ κ²½νμ μ 곡ν©λλ€. μ΄ κΈ°μ¬μ μ€λͺ λ λ¨κ³λ₯Ό λ°λ₯΄λ©΄ μΉ¨ν¬ ν μ€νΈ λ° μ·¨μ½μ μ°κ΅¬λ₯Ό μν κ°λ ₯νκ³ μ μ°ν λꡬλ₯Ό λ§λ€ μ μμ΅λλ€. μμ μμ νμ μ€λ¦¬μ κ³ λ € μ¬νκ³Ό λ²λ₯ μ€μλ₯Ό μ°μ μν΄μΌ ν©λλ€.
μΆκ° νμ΅ μλ£
- The Shellcoder's Handbook: μ΅μ€νλ‘μ κ°λ° κΈ°μ μ λν νλ₯ν μλ£μ λλ€.
- Practical Malware Analysis: 맬μ¨μ΄ λΆμ λ° λ¦¬λ²μ€ μμ§λμ΄λ§ κΈ°μ μ λ€λ£Ήλλ€.
- μ¨λΌμΈ κ°μ’: Cybrary, Offensive Security λ° SANSμ κ°μ νλ«νΌμ μΉ¨ν¬ ν μ€νΈ λ° μ΅μ€νλ‘μ κ°λ°μ λν ν¬κ΄μ μΈ κ°μ’λ₯Ό μ 곡ν©λλ€.
- 보μ λΈλ‘κ·Έ λ° ν¬λΌ: 보μ μ°κ΅¬μμ νλ‘μ°νκ³ Twitter, Reddit(r/netsec, r/reverseengineering) λ° Hacker Newsμ κ°μ νλ«νΌμμ ν λ‘ μ μ°Έμ¬νμμμ€.
- Capture the Flag(CTF) λν: CTF λνμ μ°Έκ°νμ¬ μ€μ νκ²½μμ κΈ°μ μ ν μ€νΈνκ³ ν₯μμν€μμμ€.