Python 仍然是渗透测试(pentesting)和信息安全领域的领先语言。基于 Python 的工具包括各种工具(用于输入大量随机数据以查找错误和安全循环漏洞)、代理,甚至漏洞利用框架。如果您对修补 pentesting 任务感兴趣,Python 是最好的学习语言,因为它有大量的反向工程和开发库。
多年来,Python 得到了大量的更新和升级。例如,Python 2 于 2000 年发布,Python 3 于 2008 年发布。不幸的是,Python3 不向后兼容,因此大多数用 Python2 编写的程序在 Python3 中都不能工作。尽管 Python 3 在 2008 年发布,但大多数库和程序仍然使用 Python 2。为了更好地进行渗透测试,测试人员应该能够读取、编写和重写 Python 脚本。
Python 是一种脚本语言,安全专家更喜欢 Python 作为开发安全工具包的语言。它的可读代码、模块化设计和大量的库为安全专家和研究人员提供了一个使用它创建复杂工具的起点。Python 附带了一个巨大的库(标准库),它容纳了几乎所有的内容,从简单的 I/O 到特定于平台的 API 调用。许多默认和用户贡献的库和模块可以帮助我们使用构建工具进行渗透测试,以实现有趣的任务。
在本章中,我们将介绍以下内容:
您的脚本环境基本上就是您日常工作中使用的计算机,以及其中用于编写和运行 Python 程序的所有工具。最好的学习系统是您现在正在使用的系统。本节将帮助您在计算机上配置 Python 脚本环境,以便您可以创建和运行自己的程序。
如果您在您的计算机上使用 Mac OS X 或 Linux 安装,您可能已经在其中预装了 Python 解释器。要查看是否有,请打开终端并键入python
。您可能会看到如下内容:
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more
information.
>>>
从前面的输出中,我们可以看到Python 2.7.6
安装在这个系统中。通过在终端中发出python
命令,您在交互模式下启动了 Python 解释器。在这里,您可以使用 Python 命令,输入的内容将运行,您将立即看到输出。
您可以使用喜爱的文本编辑器编写 Python 程序。如果您没有,那么尝试安装 Geany 或 Sublime 文本,它应该非常适合您。这些是简单的编辑器,提供了编写和运行 Python 程序的简单方法。在 Geany 中,输出显示在单独的终端窗口中,而升华文本使用嵌入式终端窗口。Sublime 文本不是免费的,但它有一个灵活的试用策略,允许您无需任何限制地使用编辑器。它是为数不多的适合初学者的跨平台文本编辑器之一,具有针对专业人士的全方位功能。
Linux 系统的构建方式使得用户能够顺利地开始 Python 编程。大多数 Linux 发行版已经安装了 Python。例如,Ubuntu 和 Fedora 的最新版本附带 Python2.7。此外,Redhat Enterprise(RHEL)和 CentOS 的最新版本还附带了 Python 2.6。不过,为了记录在案,您可能需要检查一下。
如果未安装,安装 Python 的最简单方法是使用发行版的默认包管理器,如apt-get
、yum
等。通过在终端中发出以下命令来安装 Python:
$ sudo apt-get install python2
$sudo yum install python
要安装 Geany,请利用发行版的软件包管理器:
$sudo apt-get install geany geany-common
$ sudo yum install geany
尽管 Macintosh 是学习 Python 的好平台,但许多使用 Macs 的人实际上在他们的计算机上运行一些 Linux 发行版或其他版本,或者在虚拟 Linux 机器中运行 Python。MacOSX 的最新版本 Yosemite 预装了 Python 2.7。一旦您确认它工作正常,请安装 Sublime Text。
为了让 Python 在 Mac 上运行,您必须安装 GCC,这可以通过下载较小的命令行工具 XCode 获得。此外,我们还需要安装程序包管理器 Homebrew。
要安装自制软件,请打开终端并运行以下操作:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 Homebrew 后,必须将 Homebrew 目录插入到PATH
环境变量中。您可以通过在~/.profile
文件中包含以下行来完成此操作:
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
现在我们已经准备好安装 Python2.7 了。在终端中运行以下命令,该命令将执行其余操作:
$ brew install python
要安装升华文本,请转到的升华文本下载页面 http://www.sublimetext.com/3 ,点击OS X链接。这将为您的 Mac 电脑提供 Sublime 文本安装程序。
Windows 没有预先安装 Python。要检查是否已安装,请打开命令提示符并键入单词python
,然后按键进入。在大多数情况下,您会收到一条消息,说明 Windows 不将python
识别为命令。
我们必须下载一个将 Python 设置为 Windows 的安装程序。然后我们必须安装并配置 Geany 来运行 Python 程序。
转到 Python 的下载页面https://www.python.org/downloads/windows/ 下载与您的系统兼容的 Python 2.7 安装程序。如果您不了解操作系统的体系结构,请下载 32 位安装程序,这两种体系结构都适用,但 64 位安装程序仅适用于 64 位系统。
要安装 Geany,请转到位于的 Geany 下载页面 http://www.geany.org/Download/Releases 下载完整的安装程序变体,该变体有一个描述完整的安装程序,包括 GTK 2.16。默认情况下,Geany 不知道 Python 在您的系统中的位置。所以我们需要手动配置它。
为此,在 Geany 中编写一个Hello world
程序,并将其保存为hello.py
并运行。
有三种方法可用于在 Geany 中运行 Python 程序:
当 Geany 中有一个正在运行的hello.py
程序时,请执行以下步骤:
C:\Python27\python -m py_compile "%f"
输入 python 命令选项。C:\Python27\python "%f"
执行命令。建议将 Kali Linux 发行版作为虚拟机运行,并将其用作脚本环境。Kali Linux 附带了许多预先安装的工具,并且基于 Debian Linux,因此您还可以安装各种附加工具和库。此外,有些库在 Windows 系统上无法正常工作。
在本书中,我们将使用许多 Python 库,本节将帮助您安装和使用第三方库。
第三方 Python 软件中最有用的部分之一是Setuptools。使用 Setuptools,您可以通过一个命令下载和安装任何兼容的 Python 库。
在任何系统上安装 Setuptools 的最佳方法是从下载ez_setup.py
文件 https://bootstrap.pypa.io/ez_setup.py 并在 Python 安装中运行此文件。
在 Linux 中,使用ez_setup.py
脚本的正确路径在终端中运行:
$ sudo python path/to/ez_setup.py
对于 Windows 8 或安装了 PowerShell 3 的旧版本 Windows,请以管理权限启动 PowerShell,并在其中运行以下命令:
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
对于未安装 PowerShell 3 的 Windows 系统,请使用 web 浏览器从前面的链接下载ez_setup.py
文件,并在 Python 安装中运行该文件。
Pip 是一个包管理系统,用于安装和管理用Python编写的软件包。成功安装 Setuptools 后,只需打开命令提示符并运行以下命令即可安装pip
:
$ easy_install pip
或者,您也可以使用默认分发包管理器安装pip
:
$ sudo apt-get install python-pip
$ sudo yum install python-pip
现在您可以从命令行运行pip
。尝试安装带有pip
的软件包:
$ pip install packagename
虚拟环境有助于分离不同项目所需的依赖项,通过在虚拟环境中工作,它还有助于保持全局站点包目录的干净。
Virtualenv是一个 Python 模块,它有助于为我们的脚本实验创建隔离的 Python 环境,为基本 Python 项目创建一个包含所有必要可执行文件和模块的文件夹。
您可以使用以下命令安装virtualenv
:
$ sudo pip install virtualenv
要创建新的虚拟环境,请创建一个文件夹,然后从命令行输入该文件夹:
$ cd your_new_folder
$ virtualenv name-of-virtual-environment
这将在您当前的工作目录中启动一个包含所有 Python 可执行文件和pip
库的文件夹,并使用提供的名称,这将有助于在您的虚拟环境中安装其他软件包。
您可以通过提供更多参数来选择 Python 解释器,如以下命令:
$ virtualenv -p /usr/bin/python2.7 name-of-virtual-environment
这将使用 Python2.7 创建一个虚拟环境。我们必须在开始使用此虚拟环境之前激活它:
$ source name-of-virtual-environment/bin/activate
现在,在命令提示符的左侧,将显示活动虚拟环境的名称。在此提示符中使用pip
安装的任何软件包都将属于活动虚拟环境,该虚拟环境将与所有其他虚拟环境和全局安装隔离。
您可以使用以下命令停用并退出当前虚拟环境:
$ deactivate
虚拟说唱歌手提供了更好的使用virtualenv
的方式。它还将所有虚拟环境组织在一个地方。
要安装,我们可以使用pip
,但在安装virtualwrapper
之前,我们要确保已经安装了virtualenv
。
Linux 和 OS X 用户可以使用以下方法进行安装:
$ pip install virtualenvwrapper
另外,将这三行添加到 shell 启动文件中,例如.bashrc
或.profile
:
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
这会将主目录中的Devel
文件夹设置为虚拟环境项目的位置。
对于 Windows 用户,我们可以使用另一个软件包:virtualenvwrapper-win
。也可与pip
一起安装:
$ pip install virtualenvwrapper-win
要使用virtualwrapper
创建虚拟环境:
$ mkvirtualenv your-project-name
这将在~/Envs
内创建一个具有提供名称的文件夹。
要激活此环境,我们可以使用workon
命令:
$ workon your-project-name
这两个命令可以与单个命令组合,如下所示:
$ mkproject your-project-name
我们可以在virtualenv
中使用相同的停用命令停用虚拟环境。要删除虚拟环境,可以使用以下命令:
$ rmvirtualenv your-project-name
在本节中,我们将介绍变量、字符串、数据类型、网络和异常处理的概念。对于一个有经验的程序员来说,本节只是对您已经了解的 Python 知识的总结。
Python 在变量方面非常出色。变量指向存储在内存位置的数据。此内存位置可能包含不同的值,例如整数、实数、布尔值、字符串、列表和字典。
当您为此变量设置一些值时,Python 将解释和声明变量。例如,如果我们设置了a=1和b=2。
然后我们用以下公式打印这两个变量的总和:
print (a+b)
结果将是3
,因为 Python 将计算出a和b都是数字。
但是,如果我们分配了a=“1”和b=“2”,那么输出将是12
,因为a和b都将被视为字符串。在这里,我们不必在使用变量之前声明变量或其类型,因为每个变量都是一个对象。type()
方法可用于获取变量类型。
与任何其他编程语言一样,字符串是 Python 中的重要内容之一。它们是不变的。因此,一旦定义,它们就无法更改。有许多 Python 方法可以修改字符串。它们对原始文件不做任何修改,而是创建一个副本并在修改后返回。字符串可以用单引号、双引号分隔,或者在有多行的情况下,我们可以使用三引号语法。我们可以使用\
字符来转义字符串中的附加引号。
常用的字符串方法如下:
string.count('x')
:返回字符串中'x'
的出现次数string.find('x')
:返回字符'x'
在字符串中的位置string.lower()
:将字符串转换为小写string.upper()
:将字符串转换为大写string.replace('a', 'b')
:将字符串中的所有a
替换为b
此外,我们还可以通过len()
方法获得字符串中的字符数,包括空格:
#!/usr/bin/python
a = "Python"
b = "Python\n"
c = "Python "
print len(a)
print len(b)
print len(c)
您可以在此处阅读有关字符串函数的更多信息:https://docs.python.org/2/library/string.html 。
列表允许我们在其中存储多个变量,并为 Python 中的对象数组排序提供了更好的方法。它们还有一些方法可以帮助操纵其中的值:
list = [1,2,3,4,5,6,7,8]
print (list[1])
这将打印2
,因为 Python 索引从 0 开始。要打印整个列表,请使用以下代码:
list = [1,2,3,4,5,6,7,8]
for x in list:
print (x)
这将遍历所有元素并打印它们。
有用的列表方法如下所示:
.append(value)
:在列表末尾追加一个元素.count('x')
:获取列表中'x'
的编号.index('x')
:返回列表中'x'
的索引.insert('y','x')
:在'y'
位置插入'x'
.pop()
:返回最后一个元素,并将其从列表中删除.remove('x')
:这将从列表中删除第一个'x'
.reverse()
:这将反转列表中的元素.sort()
:按字母升序排列列表,或按数字升序排列列表Python 字典是键:值对的存储方法。Python 词典用大括号括起来,{}
。例如:
dictionary = {'item1': 10, 'item2': 20}
print(dictionary['item2'])
这将输出20
。我们不能用同一个键创建多个值。这将覆盖重复键的上一个值。字典上的操作是唯一的。字典中不支持切片。
我们可以使用 update 方法将两个不同的字典合并为一个。此外,如果现有元素发生冲突,更新方法将合并这些元素:
a = {'apples': 1, 'mango': 2, 'orange': 3}
b = {'orange': 4, 'lemons': 2, 'grapes ': 4}
a.update(b)
Print a
这将返回以下内容:
{'mango': 2, 'apples': 1, 'lemons': 2, 'grapes ': 4, 'orange': 4}
要从字典中删除元素,我们可以使用del
方法:
del a['mango']
print a
这将返回以下内容:
{'apples': 1, 'lemons': 2, 'grapes ': 4, 'orange': 4}
套接字是计算机进行所有网络通信的基本模块。所有网络通信都通过一个插座。因此,套接字是可能位于相同或不同计算机上的两个应用程序之间的任何通信通道的虚拟端点。
Python 中的 socket 模块为我们提供了一种使用 Python 创建网络连接的更好方法。因此,要使用此模块,我们必须将其导入脚本:
import socket
socket.setdefaulttimeout(3)
newSocket = socket.socket()
newSocket.connect(("localhost",22))
response = newSocket.recv(1024)
print response
此脚本将从服务器获取响应头。我们将在后面的章节中讨论更多关于网络的内容。
即使我们编写了语法正确的脚本,在执行它们时也会出现一些错误。因此,我们必须正确处理错误。Python 中处理异常的最简单方法是使用try-except
:
在 Python 解释器中尝试将数字除以零:
>>> 10/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
所以,我们可以用try-except
块重写这个脚本:
try:
answer = 10/0
except ZeroDivisionError, e:
answer = e
print answer
这将返回错误integer division or modulo by zero
。
下载示例代码
您可以从您的帐户下载本书的示例代码文件 http://www.packtpub.com 。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。
您可以通过以下步骤下载代码文件:
您也可以通过点击 Packt Publishing 网站上该书网页上的Code Files
按钮下载代码文件。在搜索框中输入图书名称即可进入本页面。请注意,您需要登录到您的 Packt 帐户。
下载文件后,请确保使用以下最新版本解压或解压缩文件夹:
该书的代码包也托管在 GitHub 上的https://github.com/PacktPublishing/Effective-Python-Penetration-Testing 。我们在上还提供了丰富的书籍和视频目录中的其他代码包 https://github.com/PacktPublishing/ 。看看他们!
现在我们对编码之前必须进行的基本安装和配置有了一个概念。此外,我们还学习了 Python 语言的基础知识,这可能有助于我们在后面的章节中加快脚本编写速度。在下一章中,我们将讨论使用 Scapy、数据包嗅探和数据包注入进行更多的网络流量调查。