如何成为一名渗透测试员
引言
我收到大量电子邮件(请别再增加了,谢谢!)。不幸的是,我的空闲时间不如以前多,或者不如我希望的那么多,所以我经常别无选择,只能将问题重定向到我们的论坛或IRC频道(freenode上的#corelan),希望社区的其他成员会介入并帮助我回答这些问题。
最常见的问题之一是“我如何成为一名渗透测试员”。
根据你问这个问题的对象,你可能会得到不同的结果,或者被告知采取特定的方法。通过这篇文章,我试图阐述我对这个问题的看法(侧重于过程而非技术方面),希望能为那些处于类似情况的人提供一个良好的起点。
需要说明的是,我不是一名渗透测试员……但我尝试用常识(加上一点纯逻辑)来应对挑战和生活中的几乎所有情况。请随时提供反馈、建议更改,或者告诉我闭嘴滚开。任何有动力的补充或更改都非常欢迎,我会根据需要更新此页面。
从哪里开始……还是?
有几种开始信息安全的方法。随着时间的推移,技术变化,新平台被设计和实施等,方法也会改变。所有这些都会影响应该成为最新“热门”话题的内容。在此之前,无论你采取哪种方法,都应该问自己两个基本问题:
1. 我愿意投入多少努力(时间等)?
我从事漏洞开发多年。事实是,我没有系统编程的高级背景,也没有接受过最新技术的培训。所需要的只是大量的时间和奉献精神,以及学习和吸收新事物的强烈意愿。你可以学得和你的大脑能够处理和记住的速度一样快,而练习能够将知识锁定在你的脑海中,将其转化为经验。有些人学得快,有些人需要更多时间。两种方法都没有错,但自我意识、对自己的能力有自知之明,并对你能够并愿意投入支持学习过程的时间保持现实态度是很重要的。另一个需要考虑的因素是你在生活中各种力量之间的平衡。如果你有家庭,请确保与家人交谈,并在与他们共度和花时间学习之间找到良好的平衡。即使你独自一人,也要时不时出去走走。不要急于求成,而是尝试剂量化并应用健康的时间消耗模型。让你的大脑处理、思考,并慢慢来。
这个“时间”因素将我们带到第二点:
2. 我的目标是什么?
人们一直在设定目标。目标在所需的知识和经验方面可能很遥远,它们甚至可能遥远到看起来更像一个梦想而不是其他任何东西。好消息是,有野心和梦想是可以的。然而,根据我的经验,通过将梦想分解为更小的目标,实现你的野心会更容易。所以,我对目标或靶子的(相当有限的)定义是现实的东西,你可以通过一个或多个步骤(行动)实现的东西。我们可以讨论语义、词汇和定义,但那不是我陈述的重点。让我们将梦想/目标/靶子的逻辑应用到本文的主题上。假设成为渗透测试员是你的梦想。成为渗透测试员的概念相当令人兴奋,但同时也相当模糊。你到底想做什么?你想测试什么类型的笔……呃……目标。你为什么想这样做?
如果你还没有答案,与渗透测试员交谈并询问他们做什么类型的工作,看看你是否感兴趣,可能很有用。假设你的理想场景涉及测试企业网络的整体安全水平,对Web应用程序执行审计,并对“移动设备”做些什么,因为人们是这么告诉你的。也许是社会工程。你选择什么并不重要,那些是你的目标。它们是“渗透测试员”定义的一部分,但你刚刚将梦想分解为目标和靶子。
为什么我对此如此哲学化?嗯,成为一名擅长所有类型审计的渗透测试员可能毕竟不现实。技术变化如此之快,以至于不可能立即成为所有方面的专家。试图理解和掌握一切不是一个现实的目标。它可能仍然是一个梦想,你最终可能会达到那里。这完全取决于你愿意投入多少努力。再进一步,不要因为别人说的话而气馁或过于热情。时机是个人的,没有好坏之分。好消息是:你可以做任何你想做的事,有些事会比其他事花更多时间。这不是关于“如果”你能做到,而是关于“何时”,以及这个“何时”有多现实。
成为渗透测试员也不意味着擅长使用工具。它是关于能够理解事物如何工作、如何配置、人们犯什么错误以及如何通过创造性找到这些弱点。成为渗透测试员不是关于对互联网启动Metasploit。
几年前,我对摄影产生了兴趣。在用智能手机拍了很多照片,并被不断重复我的照片有多棒的家庭成员鼓励后,我决定买一台单反相机。猜猜怎么着。买更好的相机或镜头并不会让我成为更好的摄影师。事实上,它让事情变得更糟,因为我不理解光如何工作,相机如何调整以处理光,以及我们如何影响光以获得更好的照片。智能手机的设计让你不必考虑这些。初学者的错误。现实是,学习事物如何工作是耗时的、令人沮丧的……但最终会有回报。我仍然不是一个好摄影师,但我不介意承认这一点。我认为这是一段旅程,至少我决心先理解基础知识;尝试并犯很多错误;并且不害怕寻求帮助。
所以,这让我回到最初的问题:“从哪里开始”。现在应该很清楚,也许你应该先尝试回答“你想在哪里结束”,因为这会告诉你从哪里开始。别担心,即使你犯了错误,即使你发现你选择了错误的(“不那么令人兴奋的”)目标,你仍然赢了。你获得的任何知识在某种程度上都是有价值的,并且可以在途中有所帮助。
还有第二种看待“目标”的方式。你也可以将你的目标定义为“你产生收入的能力”。为了本文的目的,假设你想作为渗透测试员赚钱。这意味着你可能必须选择某些将提供经济价值的技术目标(知识)。这可能由某些类型技术的流行驱动(例如Web应用程序);或相对较新的领域(物联网、移动等)。所以,即使你想做很多事情(并且应该着眼于更广阔的视角),你很可能会必须专注于特定领域。
在继续之前,我想引用@thelightcosine引用HD Moore的话:“如果你不认为自己是菜鸟,那你就不够努力”。挑战自己。尝试了解更多关于某事,尝试轻轻推动你的极限,但要以现实的方式去做。永不放弃。这是一段痛苦、漫长但非常有回报的旅程。
好的,明白了。那么,从哪里开始?
假设你知道你想在哪里结束,并且你有一个现实的计划,包括投入时间和努力;你应该用你的时间做什么?
在谈论可能的道路之前,我想简要提及将成为你旅程最重要部分的东西。它是你、你的态度和心态。你将是你做工作的人。你是设定目标并想要开始工作的人。你是将使这项工作成功的人。但这需要特定的态度才能做到。这就是所谓的“黑客”态度。黑客这个词有很多定义;但大多数都归结为:渴望理解事物如何真正工作,以便你可以优化/改变行为,或应用理解来弯曲游戏规则。黑客倾向于破坏东西;渗透测试员也倾向于破坏东西。目标应该是破坏东西,以便提出如何改进的解决方案。如果目的是破坏东西,以便你可以证明你可以破坏东西,并且系统/人有缺陷……新闻快报:我们已经知道这一点。你在浪费你的时间。你是一个破坏者,而不是黑客。如果你真的想成为黑客,破坏东西是因为你想修复它,让它变得更好。黑客这个词可以应用于许多学科。它不需要与计算机绑定,也可以应用于一般科学。事实上,没有黑客,我们就不会有药物或技术进化。
对你所看到的持批判态度。尝试理解你所看到的。提出问题,不要接受“我不知道,它就是那样工作的,那是有人告诉我的,接受它并继续前进”。问自己“如果我必须设计X或Y,我会怎么做”。将你的思维过程置于他人的心态中将帮助你理解事物为什么以它们的方式工作,它们是如何设计的,以及人们如何以他们使用的方式使用它们。使用同理心并理解他人有不同的观点将拓宽你对事物的理解,这反过来将帮助你发现优点和弱点。
好的好的,别废话了,从哪里开始?
等等。我们快到了。在给你一些关于如何接近你的旅程的提示之前,我想分享一些关于提问的想法。事实上,除非你生来就有所有答案,否则你最终可能会提出问题。即使你知道你的最终目标是什么,你可能不知道如何到达那里,或者需要什么才能到达那里。弄清楚的唯一方法是提出问题。有趣的是,你提问的方式和你提出的问题类型将决定你是否得到你需要的答案。
我经常在IRC的各种频道中闲逛,并且长期订阅了一堆邮件列表。我看到人们提问和其他人每天试图回答问题。你会认为提问或回答问题是微不足道的事情,但有趣的是,人们因为试图找到他们不知道的答案而被吼叫、从IRC频道踢禁,或在公共场合羞辱。很多人最终感到沮丧,因为他们未能得到满意的答案,而其他人感到沮丧,因为他们觉得在浪费时间。
究竟是什么导致了这种冲突,双方如何更有效地提问和回答问题,并希望避免痛苦的情况?下面的大多数项目基于可以直接交互的情况(IRC、即时消息等),但它们可以很容易地推广,并适用于任何形式的通信(电子邮件、支持表单、论坛)。
提问
提问很容易。提出一个好问题似乎远非易事。一个问题需要什么才能引发有价值的答案,你如何避免人们开始对你扔桌子、自行车和电梯,因为你只是想得到一个答案?我试图收集一些关于如何更有效地提问并增加不仅得到答案而且得到有帮助答案的机会的想法。几年前,我在Twitter上做了一项小调查,以发现人们认为什么是“坏”问题的成分。结果包括:
- 没有迹象表明提问者做了任何自己的研究或试图找到答案,谷歌搜索Bing或Bing搜索谷歌;
- 当问题模糊时;
- 当你忘记问问题时;
- 大量的前言才到达问题。
有几件事你可以做,以避免常见的陷阱,并使你的问题被标记为“坏”。首先,我不认为存在坏问题。总是有一个问题的原因,或问题背后的逻辑。它可能不清楚到底是什么,因为沟通不畅或其他原因,但这并不使问题变坏。我在下面列出一些想法,没有特定顺序。
避免明显的答案。 思考你的问题。在线、维基百科、通过简单的谷歌搜索或阅读产品文档找到答案有多容易?如果你懒,不要指望人们会欣赏这一点。相信我,诚实地承认你的懒惰也不会有所帮助。如果你因为懒惰而被从IRC踢禁,并且你宣传或承认它,你可能活该。
表现出你值得一个答案并预期。 做你的功课。在互联网上查看关于你的问题可以找到什么,自己尝试一些事情,并记录你做了什么。准备好展示你做了什么。诚实和准确。如果你表现出你已经尝试并愿意尝试更多,人们更有可能帮助。一旦人们感觉到你只想被喂食,你的支持渠道将在你面前爆炸。人们可能会要求你重现导致你当前情况的步骤,所以你可以预期到这一点。在提问之前将你的文档和程序放在Pastebin或Pastie上,并准备在需要时提供你的文档链接。
不要遗漏重要信息或为你所做的某事感到尴尬,即使你认为你不应该做它。 它很可能是问题的一部分,如果你想要一个解决方案,你最好诚实。在描述你的问题时尽可能事实,不要让你的思维过程接管。描述症状和重现症状所需的确切步骤将比解释你认为问题是什么更有效。你可能遗漏了一些明显的东西,如果你不分享所有事实,人们可能无法发现真正出了什么问题。
如果你在尝试一个程序或工具时收到错误消息,有可能其他人遇到过同样的情况。谷歌错误消息(省略特定部分,如IP地址等),看看你自己能找到什么。确保构建你的问题,让人们相信你只想要一个轻轻推向正确方向。而不是问“我不明白这是如何工作的”或“我想黑Gmail”,你也可以问“你会推荐我学习什么来做这个或那个”,或“有人有关于针对Oracle数据库的SQL注入的推荐资源吗”?你试图实现相同的目标,并且你几乎在问同样的事情,但你将焦点转移到学习和找到解决方案的过程,而不是引起对问题或目标本身的注意。问“一些正确方向的指针”是完全没问题的。有一个著名的中国谚语说“授人以鱼不如授人以渔”。如果你有一个问题,你可以选择最快和最简单的路径,让别人通过立即给你解决方案来为你修复它。如果你被教导如何解决问题,你可能能够增加你的洞察力,并提高你自己预防和修复未来问题的能力。你越将问题聚焦在你可以和应该自己做什么上,就越容易说服某人帮助你。
通常也有帮助的是先向朋友解释你的问题。 在某些情况下,解释问题并让朋友尝试理解问题也可能暴露解决方案。这发生在我身上,并在许多情况下帮助了我。简而言之,你投入自己寻找解决方案的工作越多,你的问题就越精确,人们会欣赏这一点。
分解事物并对自己持批判态度。 在提问之前,将你的问题分解为技术层和组件。你是否完全理解重现问题所需的其他组件或先决条件?如果你在问关于攻击远程计算机的问题,确保你理解网络层,并检查了你的设备和远程计算机之间的一切设置正确。如果你对网络了解不够,你不应该攻击使用网络的东西。
不要忘记或忽略其他人必须经历与你相同的学习经历,并必须为之工作。如果你的问题表明你只想跳过学习基础知识,人们可能会被冒犯,因为你基本上不尊重他们过去所做的艰苦工作。
考虑有可能你还有很长的路要走,并且“理解”某事并不一定意味着你以正确的方式应用它。而不是问为什么某种技术对某种情况不起作用,你可能需要想知道你是否完全理解该技术。
不要以道歉开始。 没有必要为不知道某事而道歉。它通常只会让人们短暂地扬起眉毛然后继续。你应该只为自己没有提出适当的问题或没有准备好工作或学习而道歉。不要为你说或理解英语的缺乏而道歉。人们不在乎。如果它不好,他们会注意到它不好。你有机会通过阅读文档、与人互动来提高你的英语,所以你不妨做点什么。如果你不确定,提前准备你的问题并放松。如果你问了一个好的和准备充分的问题,没有人会甚至注意到。当然,如果支持可用你的母语,那应该是你的第一选择。我不是试图说道歉是坏事。它是成熟和尊重的象征,在冲突情况和谈判中可能非常强大。我只是不相信它会帮助你得到答案。不要躲在你说一种语言不好的事实后面来侮辱人们。我以前见过这种情况:有人走进IRC频道,先为他的糟糕英语道歉,然后公然侮辱房间里的每个人。坏主意。借口不是愚蠢的魔法补丁。
友好、礼貌且不要不耐烦。 即使你的问题很紧急,如果你决定依赖社区支持,你也必须意识到并接受人们也有生活,并且可能有其他优先事项而不是回答你的问题。10分钟后问“为什么”你没有得到答案可能会触发人们忽略你,所以不要这样做。也许你需要重新思考你的问题,或者找到另一个信息或支持来源。公共论坛和IRC频道不是私人支持频道。不要指望整个世界人口关心你的问题,所以确保不要用你的问题淹没频道。尽管IRC和即时消息工具允许直接通信,但它不保证通信会在你想要的时候和你想要的速度进行。时区是真实的,有答案的人可能睡着了。接受它。
即使你认为一个工具严重损坏,专注于你可能做错了什么。其他人会欣赏如果你问“我做了什么错”或“我应该做什么不同”,即使它是应用程序或工具中的真正错误。如果你开始说你认为某个工具坏了或问“为什么”一个工具坏了,你会以不好的方式引起对自己的注意。工具中的一个错误并不使工具变坏,所以不要不尊重许多可能正在阅读你评论的人的工作。你是开启讨论的人,你永远不会有第二次机会给人第一印象。讨论的其余部分的基调将在你启动通信时设定,所以要友好和尊重。
关于你自己或你的情况的笑话当然是一个例外,并且通常被很好地感知。抱怨你糟糕的互联网连接以及它如何让你考虑再次发送传真,或评论你的狗如此胖以至于干扰了房子里的Wi-Fi信号,只是如何帮助设定友好基调的几个例子。
要有创意,不要过度,并仔细选择你的时机。也许你对将要提问的人的技能印象深刻。不要开始大喊你认为他们有多“l33t”或“专业”,以及那些人回答你的问题有多容易。这可能会引发一些危险信号,让人们认为你是一个巨魔。做你自己,正常行事,有礼貌,你就会没事。
让回答变得容易。 如果你的问题太宽泛或包含太多可供解释、模糊、可疑或含糊的元素,不要指望任何人会休几周假来带你四处看看。
选择你的听众。 哪里是找到你问题答案的最佳地点,谁会是回答你问题的合适人选?论坛和IRC频道通常专注于某个主题,所以尝试选择正确的媒体和频道来提问。如果你的问题与工具的使用有关,找到其他用户可能是一个好主意,而不是立即将你的问题发送给工具开发人员(或使用他们提供的支持机制)。
问问题。 不要以问你是否可以问一个问题开始。没有必要问某人是否在线或可用回答你的问题。就问那个该死的问题。如果有人在线,并且你的问题有意义,你会得到一个答案。除非你从之前的讨论中接续,否则不要针对特定的人。如果你暗示只有特定的人可以回答问题,其他人可能会忽略你的问题。如果你想得到答案,确保问题是什么完全清楚。如果你简单地说“我有X或Y的问题”、“这个工具不工作”或“我的漏洞被防病毒检测到”,你在技术上只是做一个陈述,而不是问一个问题。问你做错了什么或你可以做什么使某事工作(更好)更可能让你得到你想要的。即使你必须解释你的问题的背景,尝试保持简短,切中要点,并尽快转到提问。
倾听、互动并在需要时寻求澄清。 尝试理解答案,不要立即回复。如果有人告诉你调查其他事情,就去做。不要继续锤击,忽略给你的建议。如果答案不清楚,请求澄清,但以表明你试图学习(过程)而不是被喂食(解决方案)的方式去做。如之前解释,你越擅长设定正确的基调并表明你只想要一些正确方向的提示,某人帮助你的机会就越高。当请求澄清时,尝试以解释你理解和不理解的部分的方式表述。重新表述或总结某些部分通常有助于显示答案的哪部分清楚,以及哪部分需要进一步澄清。重新表述/考虑以以下方式开始一个新问题:
- 如果我正确理解你,
- 你说的是……
- 换句话说,
- 如果
- 那是否意味着……
如果你根本没有理解答案,不要害怕这样说。问那个人是否可以重新表述,以不同的方式解释某事或详细说明答案的某个部分,并以礼貌的方式去做。
感激并在你能的时候回馈。 如果有人试图帮助你,告诉那个人你欣赏帮助,即使它没有完全回答你的问题。意识到很多人有其他事情要做而不是回答问题