Python灰帽:黑客和逆向工程师的Python编程前言

“做好了吗?”这大概是豁免权里最常出现的一句话。你可能会在类似如下的场景中听到这样的问题:“我正准备为Immunity Debugger开发一个新的ELF loader”。短暂的停顿后,“搞定了吗?”或者“我刚刚在IE里发现了一个Bug!”又沉默了一会儿,“那个漏洞利用程序完成了吗?”在日常的安全项目中,我们几乎每时每刻都需要创建或重写自己的安全工具,并在这些频繁的活动中保持高速的开发节奏,这使得Python逐渐成为这个舞台上的明星。在下一个安全项目中,您可以选择Python作为自己的开发工具。也许你会用它来创建一个特殊的反编译器或者开发一个完整的调试器。

当我走进位于南迈阿密海滩的Ace Hardware,拿着螺丝刀沿着通道走时,我经常会感到头晕。你会看到近50种不同规格的螺丝刀整齐有序地陈列在货架上。每种规格的螺丝刀与相邻的螺丝刀都有微小但非常重要的区别。我不是一个合格的修理工,无法准确说出每一把螺丝刀的理想使用情况,但我敢肯定,类似的情况也可以适用于我们的安全工具软件。尤其是当你在进行Web类型或者其他高度定制的应用的安全审计时,你会发现每一项审计任务都需要一把特殊的“螺丝刀”来解决问题。要知道,能够及时拼凑出一些SQL API函数钩子之类的安全小工具,已经不止一次拯救了Immunity的工作团队。当然,这些工具不仅仅适用于安全审计任务。一旦可以用hook函数拦截SQL API,就可以轻松编写一个工具,实时检测可疑的异常SQL查询,并及时向客户公司提供修复方案,抵御顽固黑客的攻击。

我们都知道,要让你的每一个安全研究员真正成为团队的一份子,是一件很棘手的事情。无论面对什么样的问题,很多安全研究人员都满怀热情从零开始,试图完全重写自己需要的工具库。比如Immunity发现了一个SSL守护进程的安全漏洞,接下来很有可能发生的事情就是你突然发现你的一个安全研究员其实正在尝试从头开始编写一个SSL客户端。而他们对此通常的解释是“我能找到的所有SSL库都很丑。”

你需要尽力避免这种情况。事实上,现有的SSL库并不难看——它只是没有按照安全研究人员的特殊偏好风格来设计。我们真正要做的是深入分析大量现有的代码,快速发现问题,并根据自己的需求进行修改。这是及时建立一个可用的SSL库,并利用它开发一个尚处于保鲜期的漏洞利用程序的关键。为此,您需要让您的安全研究人员像真正的团队一样工作。一个掌握了Python的安全研究人员拥有了一个强大的武器,或许就像那些掌握了Ruby的人一样。但是,Python真正的不同之处在于,当Python狂热者们齐心协力的时候,他们会像一个高速奔跑的超级个体一样强大。就像你厨房里的蚂蚁大军,当数量多到足以形成一条大乌贼的时候,杀死它们会比杀死一条乌贼困难得多。这是本书试图告诉你的事实。

你可能已经为你想做的事情找到了一些工具。您可能会问,“我已经有了一个附带调试器的Visual Studio,为什么还要编写一个供我自己使用的调试器呢?”或者“WinDbg没有插件接口吗?”答案是肯定的。WinDbg确实提供了插件接口,你可以通过那些API慢慢拼凑出一些有用的东西。直到有一天,你很可能会说:“Heck,如果我能和WinDbg的5000个用户连接就好了,这样我们就可以交换我们的调试结果了。”如果一开始就选择Python,那么写100行左右的代码就可以搭建一个XML-RPC的客户端和服务器,然后整个团队就可以同步工作,让每个人都能及时享受到他人的成果和信息。

黑客攻击绝不等同于逆向工程——你的目标不是恢复整个应用程序的源代码。你的目标是比系统开发人员本身更深入地了解软件系统。一旦你能做到这一点,无论目标以什么形式出现,你最终都会成功地穿透它,并获得一个热门的利用机会。这也意味着你需要成为可视化、远程同步、图论、线性方程求解、静态分析技术等诸多方面的专家。所以Immunity决定在Python平台上把这些都标准化,这样一旦我们写了一个图论算法,它就会在我们所有的工具中通用。

在第六章中,Justin向你展示了如何用钩子窃取在Firefox浏览器中输入的用户名和密码。这正是恶意软件作者所做的——从之前的一些相关报道可以看出,恶意软件作者通常会使用一些更高级的语言来编写这类程序。但是,您也可以使用Python在15分钟内编写一个示例程序,向您的开发人员展示他们对其产品的安全性假设是不成立的。一些软件公司现在花了很多钱来保护软件的内部数据,因为他们声称安全问题。事实上,他们所做的往往只是为了实现一些版权保护和数字版权管理机制。

这正是本书试图教给你的:快速创建安全工具的能力。你应该能够利用这种能力给自己或者整个团队带来成功。这就是安全工具发展的未来:快速实现、快速修改和快速互联。我想,到最后,你剩下的唯一问题可能就是:“做完了吗?”

Dave Aitel,Immunine的创始人兼首席技术官

2009年2月,美国佛罗里达州迈阿密海滩。

谢谢你

我想借此机会感谢我的家人在我写这本书的过程中给予我的理解和支持。感谢我的四个可爱的孩子:艾米丽、卡特、科恩和布雷迪,他们给了我父亲一个完成这本书的理由。我非常高兴有你。我也想说谢谢姐姐哥哥们在这个过程中给我的鼓励。你们都经历过写书的严谨和艰辛。有你们这些对技术著作出版有同感的人——我爱你们,真的很有益。我还想告诉我爸,你的幽默感帮我度过了那些无法坚持写作的日子——我爱你,爸爸,不要停止让你周围的人发笑。

多亏了一路上许多优秀的安全研究人员的帮助,这本书才逐渐成长起来:杰瑞德·德莫特、佩德罗姆·阿米尼、科迪·皮尔斯、托马斯·海勒(传说中不可战胜的蟒蛇侠)和查理·米勒——我欠大家一个大大的感谢。至于豁免组,毫无疑问你一直在慷慨支持我写这本书。感谢你们的帮助,我不仅成长为一个Python小子,也成为了一名真正的开发者和安全技术研究者。尼科和达米花了额外的时间帮我解决了这个问题,他们非常感激。我的技术编辑戴夫·艾特尔(Dave Aitel)一直在推动这本书的进度,确保这本书的逻辑性和可读性。在此表示万分感谢。对于另一个戴夫,戴夫法伦,非常感谢你为我审查这本书。那些让我哭笑不得的错误,在CanSecWest大会上拯救笔记本电脑的英雄行为,还有你作为巫师的神奇网络知识,都给我留下了深刻的印象。

最后,最后总是要感谢的人是Nostarch出版团队。泰勒和我经历了这本书的整个出版过程(相信我,泰勒将是你见过的最有耐心的家伙),比尔给了我鼓励的声音,还有可爱的咖啡杯和Perl备忘单。梅根在书创作的最后给我省了很多麻烦,还有其他在幕后工作的团队成员出版这本书——谢谢!。我很感激你为我做的一切。现在这个感谢辞的长度几乎和格莱美的获奖感言一样长。最后,我想再次感谢所有帮助过我的朋友,但我可能忘了提一句——你知道你对这本书意味着什么。

贾斯汀·塞茨