python渗透测试编程技术
python渗透测试编程技术:从socket到自动化利用
凌晨两点,渗透我盯着终端里滚动的测试十六进制数据,目标主机的编程3306端口终于吐出了MySQL的版本横幅。那不是技术一次顺利的扫描——nmap被防火墙拦了三个来回,最后是渗透我用Python写了三十行socket脚本,手动完成了TCP握手,测试才从响应延迟里嗅出了端口状态。编程这大概就是技术Python渗透测试的第一课:工具会失效,但代码不会。渗透
拿socket说事儿最直白。测试一个典型的编程端口扫描器,核心逻辑不过二十行:socket.socket()创建连接,技术connect_ex()返回0就是渗透端口开着,返回10061之类就是测试拒绝。但别小看这个基础,编程真正的技巧在于怎么绕防火墙——比如把SYN包拆开,随机化源端口,或者用setsockopt()修改TTL值让目标以为是同一台内网主机在访问。我见过一个老白帽,就用这种“慢速扫描”跑了一整夜,硬是把某银行核心服务器的非标准端口摸了个遍。
再往上走,就是协议层面的交互了。HTTP的请求头、Cookie的篡改、SQL注入的payload构造,这些用Python的requests库做起来是降维打击。有一次测试某CMS系统,登录接口有个参数user_role,前端隐藏域默认是“guest”。我直接写了个脚本,把值改成“admin”然后POST,服务器居然真放了管理员权限回来。代码就三行:data['user_role']='admin',r=requests.post(url,data=data),print(r.text[:200])。那种感觉——就像你发现抽屉的锁是塑料做的,一拧就碎。
但真正的分水岭在自动化利用。写POC(概念验证)脚本时,你得考虑目标环境的差异。同一个反序列化漏洞,在Java 8和Java 11上的利用链完全不同。我的习惯是先把漏洞触发条件拆成布尔判断:if 'error' in response.text,if time.time()-start_time > 3——时间盲注就是这么干的。再用threading或asyncio做并发,把几百个目标跑一遍,结果写进CSV。效率比手工快十倍不止。
有一回渗透测试某政务系统,对方用了WAF,把常见的SQL注入关键字全过滤了。我琢磨了一下午,最后用Python的base64库把payload编码,塞进一个Cookie头字段里,WAF检查了GET参数和POST表单,偏偏漏了Cookie。当数据库表名“users”从延迟差异里被盲注出来时,我差点从椅子上跳起来。这活儿,纯手工做能把你逼疯,但写代码就是几分钟的事。
Python渗透测试的另一个大杀器是内存取证和流量分析。用scapy库读pcap文件,提取出恶意流量里的C2服务器地址;用volatility跑内存镜像,找出注入的进程。这些活儿看似是蓝队干的,但红队也得懂——打进去之后怎么清理痕迹,总得知道对方会查什么吧。
说句实在话,现在很多工具已经把这些功能做得很完善了,比如Metasploit的msfvenom生成payload,一键搞定。但工具是死的,网络是活的。你总会碰到那种奇葩环境——Python 2.7的老系统、没有pip的离线机器、只开放443端口的严格策略。这时候,你手里那几百行手写的脚本,就是你唯一的武器。
别指望学几节课就能成为黑客。渗透测试的编程,本质是“理解协议+理解漏洞+理解防御”的三重叠加。Python只是把这些理解变成可执行代码的胶水。但反过来,如果你连胶水都调不好,那些深层的理解也只能烂在脑子里。写吧,从第一个socket脚本开始,你会爱上那种“代码跑通,权限到手”的瞬间。