[第 5 章](05.html#aid-1DOR01"Chapter 5. Exploiting Services with Python")*使用 Python*开发服务,重点介绍如何识别利用漏洞以获得初始访问权,如何研究利用后技术以获得特权访问权,以及如何利用该访问权使用自动脚本访问其他系统。
[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*使用 Python*评估 Web 应用程序,是以自动化分析 Web 应用程序弱点为中心的技术的高潮。在这里,可以使用 Python 改进对使用链式技术的复杂应用程序的评估。
[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*使用 Python*评估 Web 应用,是以自动化分析 Web 应用弱点为中心的技术的高潮。在这里,可以使用 Python 改进对使用链式技术的复杂应用的评估。
[第 7 章](07.html#aid-1NA0K2"Chapter 7. Cracking the Perimeter with Python")*用 Python*破解周界,强调了一些真正的恶意参与者和评估人员用来访问组织的半可信和可信网络的常见技术。这是使用包括 Python 在内的工具和技术完成的,并取决于当前的行业实践。
在快速切入之前,在本章中,我们将实际定义什么是渗透测试,什么不是,**渗透测试执行标准**(**PTES**)是什么,以及将使用的工具。这些信息将有助于指导您可能参与的未来业务。本章将帮助指导新的评估员和组织,他们希望建立自己的业务。如果你想直接进入代码和细节,我建议你跳到[第 2 章](02.html#aid-KVCC1"Chapter 2. The Basics of Python Scripting"),*Python 脚本的基础*。我提醒你,阅读本章的好处在于,它将提供一个框架和思维方式,帮助你将脚本儿童与专业人士区分开来。那么,让我们从什么是渗透测试开始。
...
...
@@ -38,9 +38,9 @@
## 逆向工程项目
倒车可以是渗透测试的一部分,但今天比过去难得多。[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")、*利用 Python、Metasploit 和免疫*进行的漏洞开发将更详细地讨论这一点,因为这里将描述实际的漏洞开发。当前的渗透测试可能包括漏洞开发,但其目的是创建与国产代码相关的概念证明,并获得对数据可能驻留的关键系统的访问权。
倒车可以是渗透测试的一部分,但今天比过去难得多。[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")、*利用 Python、Metasploit 和Immunity*进行的漏洞开发将更详细地讨论这一点,因为这里将描述实际的漏洞开发。当前的渗透测试可能包括漏洞开发,但其目的是创建与国产代码相关的概念证明,并获得对数据可能驻留的关键系统的访问权。
有多种与渗透测试相关的评估方法。一些方法的例子包括**开源安全测试方法手册**(**OSSTMM**),用于 Web 评估的**开放 Web 应用程序安全项目**(**OWASP**),以及**国家标准与技术研究所**(**NIST**特别出版物 800-115《信息安全测试和评估技术指南》和 PTES。本书中我们将重点介绍的方法是 PTES,因为它是新评估人员的可靠资源。
有多种与渗透测试相关的评估方法。一些方法的例子包括**开源安全测试方法手册**(**OSSTMM**),用于 Web 评估的**开放 Web 应用安全项目**(**OWASP**),以及**国家标准与技术研究所**(**NIST**特别出版物 800-115《信息安全测试和评估技术指南》和 PTES。本书中我们将重点介绍的方法是 PTES,因为它是新评估人员的可靠资源。
Burp Suite 是透明代理的标准,或者是用于直接交互和处理从浏览器发送到浏览器的 web 流量流的工具。该工具有一个 pro 版本,它添加了一个体面的 web 漏洞扫描器。使用时应小心,因为它可能会导致论坛、电子邮件和交互的多次提交。
同样的道理也可以用它的 Spider 工具来解释,它与范围广泛的 web 应用程序进行交互,并将它们映射为类似于 Google 和 Bing 这样的网络爬虫。确保当您使用这些工具时,您首先禁用自动提交和登录,直到您更好地理解应用程序。更多关于 Burp 和类似 web 工具的信息将在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*使用 Python 评估 web 应用程序*中介绍。其他类似工具包括**Zed 攻击代理**(**ZAP**),该工具现在还包含名为 DirBuster 的未链接文件夹和文件研究工具。
同样的道理也可以用它的 Spider 工具来解释,它与范围广泛的 web 应用进行交互,并将它们映射为类似于 Google 和 Bing 这样的网络爬虫。确保当您使用这些工具时,您首先禁用自动提交和登录,直到您更好地理解应用。更多关于 Burp 和类似 web 工具的信息将在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*使用 Python 评估 web 应用*中介绍。其他类似工具包括**Zed 攻击代理**(**ZAP**),该工具现在还包含名为 DirBuster 的未链接文件夹和文件研究工具。
这在编写漏洞利用时非常重要,因为可以使用此运算符将多个十六进制值附加到同一个字符串,如前面的字符串连接示例所示,其中两个字符串被添加到一起。[第 8 章](08.html#aid-1T1401 "Chapter 8. Exploit Development with Python, Metasploit, and Immunity")*利用 Python、Metasploit 和免疫*开发漏洞,当您开发**远程代码执行**n(**RCE**漏洞时,将涵盖更多内容。在此之前,请考虑此表以查看不同的赋值运算符及其使用情况:
这在编写漏洞利用时非常重要,因为可以使用此运算符将多个十六进制值附加到同一个字符串,如前面的字符串连接示例所示,其中两个字符串被添加到一起。[第 8 章](08.html#aid-1T1401 "Chapter 8. Exploit Development with Python, Metasploit, and Immunity")*利用 Python、Metasploit 和Immunity*开发漏洞,当您开发**远程代码执行**n(**RCE**漏洞时,将涵盖更多内容。在此之前,请考虑此表以查看不同的赋值运算符及其使用情况:
今天,渗透测试和利用服务的一个重大误解是,普遍存在可利用的**远程代码执行**(**RCE**漏洞。事实是,找到数百个只需要一个**互联网协议**(**IP**地址就可以插入工具的容易利用的服务的日子已经一去不复返了。您仍然会发现可以通过溢出堆栈或堆来利用的漏洞,它们只是显著减少或更复杂。我们将在[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")中解释为什么在今天的软件中更难利用这些漏洞,*使用 Python、Metasploit 和免疫进行漏洞开发*,不用担心,我们会说到这一点。
今天,渗透测试和利用服务的一个重大误解是,普遍存在可利用的**远程代码执行**(**RCE**漏洞。事实是,找到数百个只需要一个**互联网协议**(**IP**地址就可以插入工具的容易利用的服务的日子已经一去不复返了。您仍然会发现可以通过溢出堆栈或堆来利用的漏洞,它们只是显著减少或更复杂。我们将在[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")中解释为什么在今天的软件中更难利用这些漏洞,*使用 Python、Metasploit 和Immunity进行漏洞开发*,不用担心,我们会说到这一点。
因此,如果您希望每次都进入网络并利用 Microsoft 安全公告 MS08-067、MS03-024 或 MS06-40 获得立足点,那么您就大错特错了。不要担心,它们仍然存在,但不是在每个主机上都能找到它,而是在网络中可能有一个系统与它在一起。更糟糕的是,对于我们这些模拟的恶意参与者来说,它甚至可能无法让我们进入一个盒子,让我们能够继续参与。通常,它是一个遗留系统或供应商产品,甚至没有使用不同的凭据集连接到域。现在,这并不是说,情况总是这样。
与基础设施评估相比,Web 应用程序评估或 Web 应用程序渗透测试是不同的动物。这也取决于评估的目标。与移动应用程序评估一样,Web 应用程序评估也经常以错误的方式进行。网络或基础设施渗透测试已经成熟,客户对结果的预期也越来越明智。对于 web 应用程序或移动应用程序评估,这并不总是正确的。有多种工具可用于分析应用程序的漏洞,包括 Metasploit、Nexpose、Nessus、Core Impact、WebInspect、AppScan、Acunetix 等。对于 web 应用程序漏洞评估,有些方法要比其他方法好得多,但它们都有一些共同点。其中之一是,它们不能替代渗透测试。
与基础设施评估相比,Web 应用评估或 Web 应用渗透测试是不同的动物。这也取决于评估的目标。与移动应用评估一样,Web 应用评估也经常以错误的方式进行。网络或基础设施渗透测试已经成熟,客户对结果的预期也越来越明智。对于 web 应用或移动应用评估,这并不总是正确的。有多种工具可用于分析应用的漏洞,包括 Metasploit、Nexpose、Nessus、Core Impact、WebInspect、AppScan、Acunetix 等。对于 web 应用漏洞评估,有些方法要比其他方法好得多,但它们都有一些共同点。其中之一是,它们不能替代渗透测试。
当评估大型环境以包括**内容交付网络**(**CDN**)时,您会发现您将识别数百个开放的 web 端口。大多数这些 web 端口都没有在这些端口上部署活动的 web 应用程序,因此您需要访问每个页面或请求 web 页面标题。只需对站点的`http://`和`https://`版本执行`HEAD`请求即可。使用`urllib2`的 Python 脚本可以非常轻松地执行此操作。此脚本只需获取主机**互联网协议**(**IP**地址)的文件,然后构建创建相关**统一资源定位器**(**URL**的字符串。在请求每个站点时,如果它收到成功的请求,则数据将写入文件:
当评估大型环境以包括**内容交付网络**(**CDN**)时,您会发现您将识别数百个开放的 web 端口。大多数这些 web 端口都没有在这些端口上部署活动的 web 应用,因此您需要访问每个页面或请求 web 页面标题。只需对站点的`http://`和`https://`版本执行`HEAD`请求即可。使用`urllib2`的 Python 脚本可以非常轻松地执行此操作。此脚本只需获取主机**互联网协议**(**IP**地址)的文件,然后构建创建相关**统一资源定位器**(**URL**的字符串。在请求每个站点时,如果它收到成功的请求,则数据将写入文件:
```
#!/usr/bin/env python
...
...
@@ -80,7 +80,7 @@ defhost_test(filename):
# 用 Python 识别隐藏文件和目录
当我们访问已识别 IP 地址的站点时,我们看到它是**该死的易受攻击的 Web 应用程序**(**DVWA**)。我们还看到,它已将默认登录页的详细信息附加到我们的初始请求中。这意味着我们从`http://192.168.195.145/dvwa/login.php`站点开始,如以下屏幕截图所示:
当我们访问已识别 IP 地址的站点时,我们看到它是**该死的易受攻击的 Web 应用**(**DVWA**)。我们还看到,它已将默认登录页的详细信息附加到我们的初始请求中。这意味着我们从`http://192.168.195.145/dvwa/login.php`站点开始,如以下屏幕截图所示:
![Identifying hidden files and directories with Python](../Images/image00344.jpeg)
从[下载打嗝套件免费版 http://portswigger.net/burp/download.html](http://portswigger.net/burp/download.html) 然后运行它。确保您使用的浏览器不会干扰应用程序测试的评估。大多数当前浏览器将自动减轻大部分测试,并且这些保护措施中的大多数无法关闭,以完成不受阻碍的测试。Firefox 具有这些保护功能,但可以在开发和安全分析时关闭这些功能。此外,Firefox 的插件支持允许您更好地评估应用程序。许多刚刚开始的评估人员无法理解为什么他们刚刚执行的一些新的**跨站点脚本**(**XSS**攻击被阻止。通常,是 Chrome 或 Internet Explorer 中的一些内置浏览器保护说它关闭了,但实际上不是。
从[下载打嗝套件免费版 http://portswigger.net/burp/download.html](http://portswigger.net/burp/download.html) 然后运行它。确保您使用的浏览器不会干扰应用测试的评估。大多数当前浏览器将自动减轻大部分测试,并且这些保护措施中的大多数无法关闭,以完成不受阻碍的测试。Firefox 具有这些保护功能,但可以在开发和安全分析时关闭这些功能。此外,Firefox 的插件支持允许您更好地评估应用。许多刚刚开始的评估人员无法理解为什么他们刚刚执行的一些新的**跨站点脚本**(**XSS**攻击被阻止。通常,是 Chrome 或 Internet Explorer 中的一些内置浏览器保护说它关闭了,但实际上不是。
Python 有几个库,它们对于执行 web 应用程序评估非常有用,但也有一些限制。Python 最适合用于 web 应用程序的小型自动化组件,这些组件无法通过透明代理(如 Burp)手动模拟。这意味着您在应用程序中找到的特定工作流可能会动态生成,并且无法通过透明代理轻松复制。如果存在时间问题,这一点尤其正确。因此,如果您需要使用多种请求和响应机制与后端服务器进行交互,那么 Python 可能适合您的需求。
Python 有几个库,它们对于执行 web 应用评估非常有用,但也有一些限制。Python 最适合用于 web 应用的小型自动化组件,这些组件无法通过透明代理(如 Burp)手动模拟。这意味着您在应用中找到的特定工作流可能会动态生成,并且无法通过透明代理轻松复制。如果存在时间问题,这一点尤其正确。因此,如果您需要使用多种请求和响应机制与后端服务器进行交互,那么 Python 可能适合您的需求。
## 了解何时使用特定库
在使用 web 应用程序时,主要有五个库。从历史上看,我最常使用`urllib2`库,这是因为它具有强大的功能和简单的代码原型制作方法,但该库很旧。您会发现它缺少一些主要功能,与新时代 web 应用程序交互的更高级方法被认为是不可靠的,这与下面描述的较新的库相比。当您与网站交互时,`httplib2`Python 库提供了强大的功能,但它比`urllib2`、`mechanize`、`request`和`twill`更难使用。这就是说,如果您正在处理与代理相关的棘手的检测功能,这可能是您的最佳选择,因为发送的头数据可以被完全操纵,以完美地模拟标准浏览器流量。在将其用于实际应用程序之前,应在模拟环境中对其进行全面测试。通常,库提供错误的响应仅仅是因为客户端请求的编制方式。
在使用 web 应用时,主要有五个库。从历史上看,我最常使用`urllib2`库,这是因为它具有强大的功能和简单的代码原型制作方法,但该库很旧。您会发现它缺少一些主要功能,与新时代 web 应用交互的更高级方法被认为是不可靠的,这与下面描述的较新的库相比。当您与网站交互时,`httplib2`Python 库提供了强大的功能,但它比`urllib2`、`mechanize`、`request`和`twill`更难使用。这就是说,如果您正在处理与代理相关的棘手的检测功能,这可能是您的最佳选择,因为发送的头数据可以被完全操纵,以完美地模拟标准浏览器流量。在将其用于实际应用之前,应在模拟环境中对其进行全面测试。通常,库提供错误的响应仅仅是因为客户端请求的编制方式。
如果您来自 Perl 世界,您可能会在进入库时立即被吸引到`mechanize`,但它不能很好地用于动态网站,在某些情况下,它根本无法用于动态网站。那么今天的答案是什么?`request`图书馆。它非常干净,提供了必要的功能,可以快速应对当今复杂的 web 服务的挑战。为了突出两者与原型代码之间的差异,我使用`httplib2`和`request`创建了应用程序凭据攻击脚本。这些脚本的目的是识别实时凭证集并捕获相关 cookie。完成此操作后,可以向任一脚本添加其他功能。此外,这两个脚本突出显示了库集之间的差异。
如果您来自 Perl 世界,您可能会在进入库时立即被吸引到`mechanize`,但它不能很好地用于动态网站,在某些情况下,它根本无法用于动态网站。那么今天的答案是什么?`request`图书馆。它非常干净,提供了必要的功能,可以快速应对当今复杂的 web 服务的挑战。为了突出两者与原型代码之间的差异,我使用`httplib2`和`request`创建了应用凭据攻击脚本。这些脚本的目的是识别实时凭证集并捕获相关 cookie。完成此操作后,可以向任一脚本添加其他功能。此外,这两个脚本突出显示了库集之间的差异。
第一个例子是`httplib2`版本,如下所示:
...
...
@@ -244,11 +244,11 @@ Python 有几个库,它们对于执行 web 应用程序评估非常有用,
今天,我们必须应对**Web 应用程序防火墙**(**WAFs**)和可以绕过的保护工具,但您需要知道这些保护是如何设置的,以及哪些字符编码可以绕过它们。请记住,如果存在白名单或黑名单,它们会键入特定的字符集和/或编码,这可能会阻止您的攻击尝试。通过自动化测试,我们可以识别捕获上的关键项,从而防止 web 应用程序被利用,并由此调整注入以绕过已设置的保护。
今天,我们必须应对**Web 应用防火墙**(**WAFs**)和可以绕过的保护工具,但您需要知道这些保护是如何设置的,以及哪些字符编码可以绕过它们。请记住,如果存在白名单或黑名单,它们会键入特定的字符集和/或编码,这可能会阻止您的攻击尝试。通过自动化测试,我们可以识别捕获上的关键项,从而防止 web 应用被利用,并由此调整注入以绕过已设置的保护。
### 提示
用于 web 应用程序评估的字符编码与生成有效负载完全不同。所以,你应该明白这些说法并不矛盾。大多数 WAF 在将数据与其白名单和/或黑名单进行比较之前,不会智能地检测和解码数据。因此,您可以通过将字符格式更改为应用程序可以理解但 WAF 无法理解的格式来绕过这些保护机制。
用于 web 应用评估的字符编码与生成有效负载完全不同。所以,你应该明白这些说法并不矛盾。大多数 WAF 在将数据与其白名单和/或黑名单进行比较之前,不会智能地检测和解码数据。因此,您可以通过将字符格式更改为应用可以理解但 WAF 无法理解的格式来绕过这些保护机制。
从安全工程师多年来提出的评估、妥协和建议来看,如今公开服务的主要例子是 web 应用程序。这些应用程序可以位于多种端口上,包括非标准端口。它们通常是负载平衡的,并且可能通过复杂的**内容交付网络**(**CDN**)提供服务,这些网络可以有效地为请求用户群附近的服务器提供的材料的缓存版本提供服务。此外,这些应用程序可以通过虚拟化平台提供服务,虚拟化平台是提供商环境中其他系统的沙盒。因此,即使您破解了 web 应用程序,也可能无法访问目标网络。如果您想知道为什么在破解 web 应用程序系统后无法取得任何进展,请记住这一点。还要确保您有权测试不受客户端控制的网络。
从安全工程师多年来提出的评估、妥协和建议来看,如今公开服务的主要例子是 web 应用。这些应用可以位于多种端口上,包括非标准端口。它们通常是负载平衡的,并且可能通过复杂的**内容交付网络**(**CDN**)提供服务,这些网络可以有效地为请求用户群附近的服务器提供的材料的缓存版本提供服务。此外,这些应用可以通过虚拟化平台提供服务,虚拟化平台是提供商环境中其他系统的沙盒。因此,即使您破解了 web 应用,也可能无法访问目标网络。如果您想知道为什么在破解 web 应用系统后无法取得任何进展,请记住这一点。还要确保您有权测试不受客户端控制的网络。
## 加密远程访问服务
...
...
@@ -48,7 +48,7 @@
# 使用打嗝套件破解收件箱
在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*中,我们重点介绍了如何使用 Burp Suite 运行密码喷雾,并使用 Python*评估 Web 应用程序。Burp 套件的最佳目标之一是面向互联网的**Outlook Web Access**(**OWA**接口。这是您可以执行的最简单的攻击之一,但也是最响亮的攻击之一。如前几章所述,您应该始终减少点击收件箱的时间,并使用符合 Active Directory 复杂性要求的非常常见的密码。
在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")*中,我们重点介绍了如何使用 Burp Suite 运行密码喷雾,并使用 Python*评估 Web 应用。Burp 套件的最佳目标之一是面向互联网的**Outlook Web Access**(**OWA**接口。这是您可以执行的最简单的攻击之一,但也是最响亮的攻击之一。如前几章所述,您应该始终减少点击收件箱的时间,并使用符合 Active Directory 复杂性要求的非常常见的密码。
在研究过程中或在罕见的参与中,您可能需要开发或修改漏洞利用以满足您的需求。Python 是一种非常棒的语言,它可以快速生成代码原型,用于测试漏洞,或者帮助将来修改 Metasploit 模块。本章重点介绍编写利用漏洞的方法,而不是如何为这些软件产品创建特定的利用漏洞,以便需要更多的测试来提高可靠性。首先,我们需要了解**中央处理单元**(**CPU**)如何注册,以及 Windows 内存在可执行文件运行时的结构。在此之前,在 Windows XP 运行模式**虚拟机****虚拟机**上,您需要一些工具来测试这一点。
### 注
在 Windows XP Run 上下载并安装以下组件:模式 VM、Python 2.7、Notepad++、免疫调试器、MinGW(包含所有基本软件包)和免费 MP3 CD 裂土器版本 1.0。还可以使用您当前的 Kali 构建来帮助生成我们将在本章中重点介绍的相关细节。
在 Windows XP Run 上下载并安装以下组件:模式 VM、Python 2.7、Notepad++、Immunity调试器、MinGW(包含所有基本软件包)和免费 MP3 CD 裂土器版本 1.0。还可以使用您当前的 Kali 构建来帮助生成我们将在本章中重点介绍的相关细节。
如果您回顾[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")、*利用 Python、Metasploit 和免疫*进行开发,并查看 Windows 内存的定义区域,您将更好地了解线程和进程在 Windows 内存结构中的工作方式。请记住,其他**操作系统****操作系统**处理这些内存位置的方式是不同的。
如果您回顾[第 8 章](08.html#aid-1T1401"Chapter 8. Exploit Development with Python, Metasploit, and Immunity")、*利用 Python、Metasploit 和Immunity*进行开发,并查看 Windows 内存的定义区域,您将更好地了解线程和进程在 Windows 内存结构中的工作方式。请记住,其他**操作系统****操作系统**处理这些内存位置的方式是不同的。
我们将使用之前在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")中创建的`head_request.py`脚本,*使用 Python*评估 Web 应用程序,并将其作为一个新脚本进行成熟。此脚本将使用队列来保存所有需要处理的任务,这些任务将在执行期间动态分配。该队列是通过从文件中读取值并存储这些值以供以后处理而构建的。我们将合并新的记录器库,以便在脚本执行时将详细信息输出到`results.log` 文件。以下屏幕截图显示了此新脚本执行后的结果:
我们将使用之前在[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")中创建的`head_request.py`脚本,*使用 Python*评估 Web 应用,并将其作为一个新脚本进行成熟。此脚本将使用队列来保存所有需要处理的任务,这些任务将在执行期间动态分配。该队列是通过从文件中读取值并存储这些值以供以后处理而构建的。我们将合并新的记录器库,以便在脚本执行时将详细信息输出到`results.log` 文件。以下屏幕截图显示了此新脚本执行后的结果:
![Creating a multithreaded script in Python](../Images/image00435.jpeg)
...
...
@@ -78,7 +78,7 @@ class Agent(threading.Thread):
target_secure = "https://" + host
```
从这里开始,我们将处理主机潜在网站的不安全和安全版本。以下代码用于网站的不安全部分,其工作类似于[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")、*使用 Python*评估 Web 应用程序中突出显示的脚本。唯一的区别在于,我们添加了新的记录器功能,以将详细信息打印到结果日志文件中。正如您在下面的代码中所看到的,将详细信息写入记录器与写入 print 语句几乎相同。您还将注意到,我们使用了`with`语句来锁定线程进程,以便打印详细信息。这对于 I**/O**是不必要的,但如果不是这样,则很难阅读:
从这里开始,我们将处理主机潜在网站的不安全和安全版本。以下代码用于网站的不安全部分,其工作类似于[第 6 章](06.html#aid-1HIT81"Chapter 6. Assessing Web Applications with Python")、*使用 Python*评估 Web 应用中突出显示的脚本。唯一的区别在于,我们添加了新的记录器功能,以将详细信息打印到结果日志文件中。正如您在下面的代码中所看到的,将详细信息写入记录器与写入 print 语句几乎相同。您还将注意到,我们使用了`with`语句来锁定线程进程,以便打印详细信息。这对于 I**/O**是不必要的,但如果不是这样,则很难阅读: