Python已然成为漏洞开发领域的行业标准,读者会发觉大多数概念验证工具都是用Python语言编撰的(不仅用Ruby写的安全漏洞检查工具)。Python容许开发者编撰脚本处理远程服务,处理二补码文件,与C语言库(或则Java的Jython/。Net的IronPython)以快速且简单的方法进行交互。它“内置电瓶”原则的巨大标准库,为开发省去对其它框架或则语言的依赖。
我想跟你们分享一下我个人的Python编程经历,这种显然会对你未来的工作有所帮助,让这个世界显得愈发安全一些(注:大多数事例基于Python3.0以上版本编撰的,有些可以兼容python所有分支)。
1.环境配置
对于你要编撰的大多数工程或则脚本linux黑客的python编程之道pdflinux黑客的python编程之道pdf,建议读者们最好将所有的依赖置于同一个位置(不仅有些在特殊工程中才用到的依赖)。为了满足上述要求,须要用到一个叫virtualenv的工具(Python3.3早已包括该工具),这个工具有一个简约的功能,就是在不搅乱全局环境的基础上,为你的Python工程生成独立的环境:
# 生成新环境的方法如下: $ virtualenv # 或者在Python3.3以上的环境中: $ python3 -mvenv # 使用这个环境之前,你要先激活它: $ source /bin/activate # 禁止该环境的方式也很简单: $ deactivate
2.安装依赖包
好多时侯你们会发觉,利用小型python社区中的python库编撰的个人工具,可以帮助我们很快得到结果。你可以通过个人软件管理包或则可用的python软件包管理器安装这种库,其中最权威的就是pip工具了。有了pip,你可以全局安装这种依赖包(#pipinstall),或则逐用户安装(
pipinstall)。读者可以自动地使用个人发行版包管理器,或则基于Python3.4提供的库,安装pip包。
有一个基本的python包叫iPython,一般在我不是100%肯定该怎么解决当前任务,想尝试做些实验时,我会安装这个依赖包。IPython是常用的python命令行,它是基于Python编撰的,有以下几个特征:
和平时一样,通过pip安装也很简单:$pipinstallipython
假如你想创建教程或则其它文本文件,ipython中的电脑特点(如今由jupyter提供)准许用户通过个人浏览器和IPython命令行交互,包括markdown、mathjax、matplotlib等工具支持。
(通过安装jupyter(pipinstalljupyter)可以使用它们,开启电脑服务通过(jupyternotebook))。
假如你在操作时须要与包括JSON/XML的HTTP服务交互,我建议非常好用的requests依赖库。该python库可以处理与网页交互面对的各种操作,如编码、解码、参数、标记、重定向等。诸如,恳请和解析一个JSON资源的代码如下:
r = requests.get('https://api.github.com/user', auth=('user', 'pass')) r.json() {u'private_gists': 419, u'total_private_repos': 77, ...}
大多数HTML解析和交互工作都可以交给BeautifulSoup库,该python库可以在任何现今浏览器上处理HTML输入,包括修补破损代码。
3.与网路交互
我们大多数目标都有可能在网路上获取,安装好的标准库中早已包含了通用的、有用的python库,这儿我对其进行简略的介绍。socket模块是基于BSDsocketAPI的瘦包装器,它在所有的通用操作系统都可用。
所以假如你已然有C语言socket编程经验,你可以将你的代码轻易地翻译成python代码。有好多非常便捷的函数,如create_connection函数可以创建TCPsocket,构建本机和给定主机或则端口的联接。另一个包装器是sendall方式,有些数据只有当所有给定数据都被发出,或则有错误发生能够在线路中传输linux操作系统教程,而sendall方式可以尝试重传这种数据。
from __future__ import unicode_literals import socket s = socket.create_connection(('www.ernw.de', 80)) s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ') print(s.recv(1024))
降低TSL加密链路也十分简单:
from __future__ import unicode_literals import socket import ssl s = socket.create_connection(('www.ernw.de', 443)) s = ssl.wrap_socket(s) s.sendall(b'GET / HTTP/1.1 Host: www.ernw.de ') print(s.recv(1024))
上述功能也可以在早已使用的联接中实现:
from __future__ import unicode_literals import socket import ssl s = socket.create_connection(('smtp.example.com', 25)) s.sendall(b'HELO smtp.example.com STARTTLS ') print(s.recv(1024)) s = ssl.wrap_socket(s) s.sendall(b'MAIL FROM: ') print(s.recv(1024))
怎样你不须要这种低级服务交互linux环境变量,还有些模块可以提供高层服务交互:
smtplib
ftplib
poplib
imaplib