引言
我收到很多邮件。 (请别让它变得更糟,谢谢!)不幸的是,我不像以前或希望的那样有那么多空闲时间,所以我常常别无选择,只能将问题转到我们的论坛或 IRC 频道(freenode 上的 #corelan),希望社区的其他成员能参与进来,帮助我回答这些问题。
最常被问到的问题之一是“我如何成为一名渗透测试员”。
根据你问这个问题的对象不同,你可能会得到不同的结果,或者被告知要采取特定的方法。在这篇文章中,我试图阐述我对这个问题的看法(重点在于过程而非技术层面),希望能为那些身处类似境况的人提供一个良好的起点。
需要说明的是,我并非一名渗透测试员……但我尝试将常识(辅以一点纯粹的逻辑)应用于挑战和生活中的几乎所有情况。欢迎提供反馈、建议修改,或者让我闭嘴滚开。任何有建设性的补充或更改都非常欢迎,我会根据需要更新此页面。
从哪里开始……或者?
有几种方法可以开始信息安全领域的学习。随着时间流逝、技术变化、新平台的设计与实施等,这些方法也会改变。所有这一切都会影响到应该投入的最新“热门”话题。然而,在这样做之前,无论你采取哪种方法,都应该问自己两个根本问题:
1. 我愿意为此投入多少精力(时间,……)?
我从事漏洞利用开发多年。事实是,我没有高级的系统编程背景,也没有接受过最新技术的培训。这一切都需要大量的时间和投入、强大的学习意愿和吸收新事物的能力。你可以根据大脑处理和记忆的速度来学习,并通过练习将知识固化为经验。有些人学得快,有些人需要更多时间。两种方法都没有错,但要有自知之明,了解自己的能力,并对你能够且愿意投入到支持学习过程中的时间保持现实态度,这很重要。另一个需要考虑的因素是你生活中各种力量之间的平衡。如果你有家庭,请务必与家人沟通,找到陪伴他们和投入学习之间的良好平衡。即使你独自一人,也要时不时出去走走。不要急于求成,尝试剂量并采用健康的时间消耗模式。让你的大脑处理、思考,从容不迫。
这个“时间”因素引出了第二点:
2. 我的目标是什么?
人们一直在设定目标。目标在所需知识和经验方面可能很遥远,甚至可能远看起来更像一个梦想。好消息是,有抱负和有梦想是没问题的。然而,根据我的经验,将梦想分解为更小的目标、更小的目的,将更容易实现你的抱负。所以,我对目标或靶子的(相当有限的)定义是:现实的东西,你可以通过一个或多个步骤(行动)来实现的东西。我们可以讨论语义、词汇和定义,但这并不是我陈述的重点。让我们将梦想/目标/靶子的逻辑应用到本文的主题上。假设你的梦想是成为一名渗透测试员。“成为一名渗透测试员”这个概念相当令人兴奋,但同时又相当模糊。你到底想做什么?你想测试什么类型的笔…呃…目标。你为什么要做这件事?
如果你还没有答案,与渗透测试员交流,问问他们做什么类型的工作,看看你是否感兴趣,可能会有所帮助。假设你的理想场景包括测试企业网络的整体安全级别、对 Web 应用程序执行审计,以及做一些与“移动设备”相关的事情,因为别人是这么告诉你的。也许是社会工程。你选择什么并不重要,那些就是你的目标。它们是“渗透测试员”定义的一部分,但你刚刚将梦想分解为了目标和靶子。
我为什么要如此哲学地谈论它?嗯,成为一名精通所有类型审计的渗透测试员可能终究是不现实的。技术变化如此之快,以至于不可能立即成为所有方面的专家。试图理解和掌握一切将不是一个现实的目标。它可能仍然是一个梦想,并且你最终可能会达到那里。这完全取决于你愿意投入多少努力。更进一步,不要因别人说的话而气馁或过于兴奋。时机是个人化的,没有好坏之分。好消息是:你可以做任何你想做的事,有些事情会比另一些花更多时间。这不是关于“是否”能做到,而是关于“何时”,以及这个“何时”有多现实。
成为一名渗透测试员也不意味着擅长使用工具。它关乎能够理解事物的工作原理、事物的配置方式、人们会犯什么错误以及如何通过创造性找到这些弱点。成为一名渗透测试员不仅仅是向互联网发起 Metasploit 攻击。
几年前,我对摄影产生了兴趣。在用智能手机拍摄了许多照片,并受到不断重复说我的照片有多棒的家庭成员的鼓励后,我决定购买一台单反相机。猜猜怎么着。购买更好的相机或镜头并不会让我成为更好的摄影师。事实上,它让事情变得更糟,因为我不理解光的工作原理、相机如何调整来处理光,以及我们如何影响光来获得更好的照片。智能手机的设计让你无需思考这些问题。初学者的错误。现实是,学习事物的工作原理是耗时的、令人沮丧的……但最终会很有回报。我仍然不是一个好的摄影师,但我也并不介意承认这一点。我认为这是一段旅程,至少我决心先理解基础知识;尝试并多犯错误;并且不害怕寻求帮助。
那么,这让我回到了最初的问题:“从哪里开始”。现在应该清楚了,也许你应该先试着回答“你想在哪里结束”,因为这将会告诉你从哪里开始。别担心,即使你犯了错误,即使你发现你选择了错误(“不那么令人兴奋”)的目标,你仍然赢了。你获得的任何知识在某种程度上都是有价值的,并能在途中有所帮助。
看待“目标”还有第二种方式。你也可以将你的目标定义为“你产生收入的能力”。为了本文起见,我们假设你想作为一名渗透测试员赚钱。这意味着你可能必须选择能提供经济价值的某些技术目标(知识)。这可能是由某些类型技术的流行度(例如 Web 应用)驱动的;或者是相对较新的领域(物联网、移动设备等)。所以,即使你想做很多事情(并且应该着眼于更广阔的视角),你很可能不得不专注于特定领域。
在继续之前,我想引用 @thelightcosine 引用 HD Moore 的话:“如果你不认为自己是菜鸟,那说明你不够努力。”挑战你自己。尝试学习更多关于某事的知识,尝试温和地推动你的极限,但要现实地去做。永不放弃。这是一段痛苦、漫长但非常有回报的旅程。
好的,明白了。那么,从哪里开始呢?
假设你知道你想在哪里结束,并且你有一个现实的计划,涉及投入时间和精力;你应该用你的时间做什么?
在谈论可能的道路之前,我想简单提一下将成为你旅程中最重要的部分。那就是你和你的态度与心态。你是那个做工作的人。你是那个设定目标并想要开始工作的人。你是那个将让这一切成功的人。但这需要一种特定的态度。这就是所谓的“黑客”态度。关于“黑客”这个词有很多定义;但它们大多数可以归结为:渴望理解事物真正的工作原理,以便你可以优化/改变其行为,或应用这种理解来改变游戏规则。黑客倾向于破坏东西;渗透测试员也倾向于破坏东西。目标应该是为了破坏而破坏,从而提出如何改进的解决方案。如果目的是为了证明你能破坏而破坏,并且系统/人都有缺陷……新闻快讯:我们已经知道这一点了。你是在浪费时间。你是个破坏者,不是黑客。如果你真想成为一名黑客,因为你想修复它、让它变得更好而破坏它。“黑客”这个词可以应用于许多学科。它不需要与计算机绑定,也可以应用于广义的科学。事实上,没有黑客,我们就不会有药物,也不会有技术演进。
对所见持批判态度。尝试理解你看到的东西。提出问题,不要接受“我不知道,它就是那样工作的,别人就是这么告诉我的,接受它并继续前进”。问自己这个问题“如果我必须设计 X 或 Y,我会怎么做”。将你的思维过程置于他人的心态中,将帮助你理解事物为何以它们的方式工作、它们是如何设计的,以及人们为何以他们的方式使用它们。运用同理心并理解他人有不同的观点,将拓宽你对事物的理解,这反过来将帮助你发现优点和弱点。
好吧好吧,别废话了,从哪里开始?
等等。我们快到了。在给你一些关于如何开启旅程的提示之前,我想分享一些关于提问的想法。事实上,除非你天生就知道所有答案,否则你很可能最终会问问题。即使你知道你的终极目标是什么,你可能不知道如何到达那里,或者需要什么才能到达那里。唯一弄清楚的方法就是提问。有趣的是,你提问的方式和你问的问题类型,将决定你是否能得到你需要的答案。
我经常在 IRC 的各种频道里闲逛,并且订阅了许多邮件列表很长时间。我每天都看到人们提问和他人试图回答问题。你会认为提问或回答问题是件小事,但有趣的是,人们因为试图找到他们不知道的某事的答案而被呵斥、被踢出 IRC 频道,或在公共场合被羞辱。很多人因为未能得到满意的答案而感到沮丧,而另一些人则因为他们觉得在浪费时间而感到沮丧。
到底是什么导致了这种冲突,双方如何才能更有效地提问和回答问题,并希望避免痛苦的情况?以下大部分项目基于可以直接互动的情况(IRC、即时消息等),但它们很容易推广,适用于任何形式的沟通(电子邮件、支持表单、论坛)。
提问
提问很容易。提出一个好问题似乎远非易事。一个问题如何才能引发有价值的答案?你如何避免人们因为你只是想得到一个答案而开始向你扔桌子、自行车和电梯?我尝试收集了一些关于如何更有效地提问并增加你不仅得到答案而且得到有帮助答案的机会的想法。几年前,我在 Twitter 上进行了一项小调查,以了解人们认为什么是“坏”问题的要素。结果包括:
- 没有迹象表明提问者做过任何自己的研究或试图寻找答案,例如用 Google 搜索或 Bing 搜索;
- 当问题含糊不清时;
- 当你忘了问问题时;
- 在进入正题前有大量的铺垫。
你可以做几件事来避免常见的陷阱,并防止你的问题被贴上“坏”的标签。首先,我不认为存在坏问题。总是有问题提出的原因或背后的逻辑。可能只是由于沟通不畅或其他原因,不清楚到底是什么,但这并不使问题变坏。我在下面列出了一些想法,没有特定顺序。
避免显而易见的问题。 思考一下你的问题。在网上、维基百科上、通过简单的谷歌搜索或阅读产品文档找到答案有多容易?如果你懒惰,别指望人们会欣赏这一点。相信我,对你的懒惰保持诚实,也无济于事。如果你因为懒惰而被踢出 IRC 频道,并且你还宣传或承认这一点,你可能活该。
证明你值得得到答案,并做好预期。 做你的功课。看看你能在网上找到关于你问题的什么信息,自己尝试一些事情,并记录你做了什么。准备好展示你所做的。诚实和准确。如果你表现出你已经尝试过并愿意尝试更多,人们更有可能帮助你。一旦人们感觉到你只想被填鸭式喂养,你的支持渠道就会在你面前爆炸。人们可能会要求你重现导致你当前情况的步骤,所以你可以提前做好准备。在提问之前,把你的文档和步骤放到 Pastebin 或 Pastie 上,并准备好在被需要时提供链接。不要遗漏重要信息,也不要为你所做的某件事感到尴尬,即使你认为你不应该做那件事。 它很可能就是问题的一部分,如果你想要解决方案,你最好诚实。尽可能如实地描述你的问题,不要让你的思维过程主导。描述症状和重现症状所需的确切步骤,比解释你认为问题是什么更有效。你可能遗漏了一些明显的东西,如果你不分享所有事实,人们可能无法发现真正的问题所在。
如果你正在尝试一个步骤或工具,并且收到错误消息,很可能其他人也遇到过同样的情况。谷歌搜索错误消息(省略特定部分,如 IP 地址等),看看你自己能找到什么。确保以让人们相信你只想要一个温和的正确方向指引的方式来构建你的问题。 与其问“我不明白这是如何工作的”或“我想黑掉 Gmail”,你还可以问“你推荐我应该学习什么才能做这个或那个”,或者“有人有关于针对 Oracle 数据库进行 SQL 注入的推荐资源吗”?你试图达到同样的目标,你基本上是在要求同样的事情,但你把重点转移到了学习和寻找解决方案的过程上,而不是引起对问题或目标本身的注意。询问“一些正确的方向指引”是完全可以的。有一句著名的中国谚语说:“授人以鱼,不如授人以渔”。如果你有一个问题,你可以选择最快最简单的路径,让别人通过直接给你解决方案来为你解决。如果你被教导如何解决问题,你可能会增加你的洞察力,并提高你自己预防和解决未来问题的能力。你越是把问题集中在你自己能做什么和应该做什么上,就越容易说服别人帮助你。首先向朋友解释你的问题也常常有帮助。 在某些情况下,解释问题并让朋友尝试理解问题也可能揭示解决方案。这在我身上发生过,并在许多情况下帮助了我。简而言之,你在自己寻找解决方案上投入的工作越多,你的问题就会越精确,人们会欣赏这一点。
把事情分解开,对自己持批判态度。 在提问之前,将你的问题分解成技术层面和组件。你是否完全理解重现问题所需的其他组件或先决条件?如果你在问一个关于攻击远程计算机的问题,确保你理解网络层,并检查了你的设备和远程计算机之间的设置是否正确。如果你对网络了解不够,你就不应该攻击使用网络的东西。
不要忘记或忽视,其他人也必须经历与你相同的学习过程,并且必须为此努力。如果你的问题暗示你只是想跳过学习基础知识,人们可能会感到被冒犯,因为你基本上是在不尊重他们过去所做的辛勤工作。考虑一下你还有很长的路要走,并且“理解”某事物并不一定意味着你以正确的方式应用它。与其问为什么某个技术对某个案例不起作用,你可能需要思考你是否完全理解该技术。
不要以道歉开头。 没有必要为不知道某事而道歉。它通常只会让人们短暂地扬一下眉毛,然后继续前进。你应该只对自己没有问好问题或没有准备好工作或学习而道歉。不要为你英语口语或理解能力差而道歉。人们不在乎。如果它很差,他们会注意到它很差。你可以通过阅读文档、与人交流来改善你的英语,所以你不妨为此做点什么。如果你不确定,提前准备好你的问题,然后放松。如果你问了一个准备充分的好问题,甚至没有人会注意到。当然,如果有你的母语支持可用,那应该是你的首选。我不是说道歉是件坏事。它是成熟和尊重的象征,在冲突情况和谈判中可以非常强大。我只是不相信它会帮助你得到答案。不要以你语言说得不好为借口来侮辱别人。 我以前见过这种情况:有人走进一个 IRC 频道,首先为他的英语不好道歉,然后公然侮辱房间里的每个人。坏主意。借口不是愚蠢的万能补丁。
友善、礼貌,不要不耐烦。 即使你的问题很紧急,如果你决定依赖社区支持,你也必须意识到并接受,人们也有自己的生活,可能有比回答你的问题更优先的事情。在 10 分钟后问“为什么”你没有得到答案可能会触发人们忽略你,所以不要那样做。也许你需要重新思考你的问题,或者寻找其他信息来源或支持。公共论坛和 IRC 频道不是私人支持频道。不要指望全世界的人都关心你的问题,所以确保不要用你的问题淹没频道。尽管 IRC 和即时通讯工具允许直接交流,但它并不能保证交流会按你希望的时间和速度进行。时区是真实存在的,可能掌握答案的人正在睡觉。接受它。
即使你认为一个工具糟糕透顶,也要关注你可能做错了什么。即使是一个应用程序或工具中真正的错误,其他人也会欣赏你问“我做错了什么”或“我应该怎么做不同”,而不是说工具坏了。如果你一开始就说你认为某个工具坏了,或者问“为什么”一个工具坏了,你将以一种糟糕的方式吸引注意力。工具中的一个错误并不使工具变差,所以不要不尊重许多可能正在阅读你评论的人的工作。你是开启讨论的人,你永远不会有第二次机会留下第一印象。一旦你开始沟通,讨论的基调就会被设定,所以要友善和尊重。
关于你自己或你情况的玩笑当然是例外,并且通常会被很好地接受。抱怨你糟糕的网络连接,以及它如何让你考虑再次发送传真,或者评论你的狗胖到干扰了家里的 Wi-Fi 信号,这些只是如何帮助设定友好基调的几个例子。
要有创意,不要过度,并仔细选择时机。 也许你会对你要提问的那些人的技能印象深刻。不要开始大喊你认为他们有多“牛”或“专业”,以及对他们来说回答你的问题有多容易。这可能会引发一些危险信号,让人们认为你是一个捣乱者。做你自己,正常行事,有礼貌,你就会没事。
让答案变得容易。 如果你的问题太宽泛,或者包含太多容易引起歧义、有疑问或模糊的元素,别指望有人会花几周的假期来指导你。
选择你的听众。 哪里是找到你问题答案的最佳场所?谁会是回答你问题的合适人选?论坛和 IRC 频道通常专注于某个特定主题,所以试着选择正确的媒介和频道来提问。如果你的问题与工具的使用有关,那么找到其他用户可能是个好主意,而不是直接向工具开发者发送问题(或者使用他们提供的支持机制)。
问问题。 不要一开始就问你是否可以问一个问题。没有必要问是否有人在线上或是否有空回答你的问题。直接问那个该死的问题。如果有人在线并且你的问题有意义,你会得到答案。除非你是在继续之前的讨论,否则不要针对特定的人。如果你暗示只有特定的人才能回答这个问题,其他人可能会忽略你的问题。如果你想得到答案,确保问题是什么非常清楚。如果你只是陈述“我在 X 或 Y 上遇到问题”、“这个工具不起作用”或“我的漏洞利用被防病毒软件检测到了”,从技术上讲,你只是在做一个陈述,而不是在提问。问你做错了什么,或者你能做什么让某事(更好地)工作,更有可能让你得到你想要的。即使你必须解释问题的背景,也要尽量保持简短、切中要害,并尽快进入提问。
倾听、互动,并在需要时寻求澄清。 尝试理解答案,不要马上回复。如果有人告诉你调查其他事情,就去做。不要继续锤击,忽略给你的建议。如果一个答案不清楚,请求澄清,但要以一种表明你试图学习(过程)而不是被填鸭式喂养(解决方案)的方式来做。如前所述,你越是擅长设定正确的基调并表明你只想要一些正确的方向指引,有人帮助你的机会就越大。当请求澄清时,尝试用一种解释你理解了什么和没理解什么的方式来表述。重新措辞或总结某些部分通常有助于显示答案的哪部分是清楚的,哪部分需要进一步澄清。重新措辞/考虑以以下方式开始一个新问题:
- 如果我没理解错的话,
- 你是说……
- 换句话说,
- 如果……会怎样
- 这是否意味着……
如果你完全没有理解答案,不要害怕说出来。以礼貌的方式询问那个人是否可以重新措辞、用不同的方式解释某事或详细说明答案的某个部分。
心怀感激,并在力所能及时回馈。 如果有人试图帮助你,告诉那个人你感谢他的帮助,即使它没有完全回答你的问题。要意识到很多人除了回答问题还有其他事情要做。如果他们试图帮助,是因为他们想要帮助,尽管有紧张的时间表、工作中的截止日期和其他优先事项。感谢他们花时间。用一种简短、清晰和有效的方式来做。提及答案是如何有帮助的。如果你觉得你问的问题是一个非常常见的问题,并且你的直觉告诉你,回答这个问题的人实际上已经厌倦了一遍又一遍地处理这个问题,你可能想考虑帮他一把。记录你的问题和解决方案,并把它放在网上的某个地方。它将帮助你理解原因和解决方案,你可以请帮助过你的人核实你的文档以确保其准确性,并且你可以通过简单地将其指向你的在线文档来帮助其他人。这表明你想学习,你已经倾听过并且想要回馈。不要等到你有了所有答案才去分享。猜猜怎么着,你总会找到另一个问题。
回答问题
提出好问题绝对是一门需要一些准备的艺术。如果你想真正帮助某人,回答问题也不简单。尽管某些情况可能暗示相反,但并没有专门的提问者和专门的回答者(不确定这是否是一个有效的词)。无论你多么有经验,你有时可能仍然会发现自己处于故事的两边。当你有能力回答问题时,你确实处于一个独特的位置。想想看,你有权决定是否要回答问题,除此之外,你可以选择如何回答问题,这将直接影响答案是否有价值。如果你决定花时间以帮助某人的意图来回答问题,你最好把事情做对。也许以下一些指导方针可能有所帮助:
友善。 问题以某种方式提出是有原因的。你应该能够感觉到一个只想快速取胜的人和一个真诚、真正想学习但不知道如何很好沟通的人之间的区别。当你不确定时,给那个人怀疑的好处,你以后仍然可以对他大喊大叫。如果一个人太模糊或表达不清,有一个简单的方法可以帮助他。简单地重新措辞问题,并问他是否想知道的就是那个,或者只是告诉他的问题没有意义,并要求那个人更具体些。这将确保你正确理解问题,并向那个人展示下次如何正确地表述问题。没有理由取笑某人或让他/她感觉糟糕。他或她已经承认对某事一无所知。
回答前先思考,询问更多信息。 你真的理解这个问题吗?你的答案会有帮助吗?如果问题不清楚,请求澄清。重新措辞;要求一个例子。尝试重现导致问题的步骤,并要求更多细节和文档。
不要因为你必须回答而回答。 只因为你想帮助并且有时间帮助才回答问题。尽管第一个问题似乎合理,但它可能很容易变得更糟。如果你决定介入帮助某人,至少你必须试图让提问者走上正确的道路,而很难事先估计你需要多少时间。如果你做得对并且很好地理解了问题,回答这个问题应该不会太难或太耗时,或者将提问者指向正确的资源。
用问题来回答。 棘手的技巧。有些人总是喜欢这样做,这可能会完全吓坏人并破坏正常的交流,所以确保只在特定情况下使用这种技巧。用问题来回答当然有很多价值,前提是问题暗示了解决方案,或者旨在获取更多信息。让我们来看一个快速的例子:
问题:“我对目标计算机运行了一个漏洞利用,漏洞利用说我无法获得反向 shell。”
这个场景可能有很多问题,很难用几句话来回答。问几个简短的问题可能会让那个人回去工作,尝试获取更多关于他的程序为何不起作用的细节。例如,你可以问两台主机是否能够相互连接。这表明可能存在与网络相关的问题。它表明你理解与利用远程计算机相关的各个层面,并且你用结构化的方法帮助他解决这类问题。对问题本身提出问题可能会揭示潜在的原因和动机。有时人们因为几乎能感觉到自己做错了某事,或者也许他们知道自己在做非法的事情而感到尴尬。通过询问他们为什么要做某事的具体问题,或者建议他们以不同的方式做事(以一种不涉及潜在非法活动的方式),可能会给你一些关于那个人的有用信息,以及他的意图是否合法。如果有人对互联网上的机器运行漏洞利用遇到问题,你可能建议他在私人实验室模拟这个过程。如果那个人选择忽略你的建议,并坚持要在互联网上做,你几乎可以肯定他图谋不轨。尝试发现那个人试图做什么。 如果有人问是否有可能做某件事,问他试图达到什么目的。理想情况下,这将迫使那个人解释并揭示任何潜在的动机。
诚实。 如果你不确定答案,就如实说。承认你不确定某事没有错。猜测是可以接受的,只要你表明你是在猜测。它可能暗示可能的解决方案,也许已经将那个人引向了正确的方向。
激励,而不是打击。 你可以通过提供有帮助的答案来展示你的技能,而不是炫耀或强调你有多聪明。根据问题的具体程度,以及它反映出询问者的知识水平,你可以相应地调整答案的详细程度。如果你需要解释某事是错的或糟糕的,别忘了解释为什么它是错的或糟糕的,并给出如何避免或修复问题的指引。你不需要像在给他们读教程一样详细地回答。一个温和的正确方向指引通常足以激励学习过程。把某人引向正确的道路,并在他想在未来取得进展时指出他应该学习的资源,这是可以的,但不要只是把网址扔给他。如果对方理解为什么他需要学习某事,说服他付出努力去做会更容易。当然,如果同一个人只是继续提问,并且不想花时间正确地学习,那么你的答案显然不会再有任何帮助,那个人可能并不想被帮助。他只是想让别人替他工作。在这种情况下,尝试是没有价值的。等到那个人意识到他需要为此努力,并在证明之前忽略他。
语言。 英语是国际 IT 或信息安全社区的重要语言。然而,这并不意味着每个人都是英语母语者,甚至与之相差甚远。使用通用术语完全可以,但尽量让你的句子尽可能简单。我们不想让那个可怜的家伙承受不必要的痛苦,对吧?如果你在对话中注意到对方没有真正理解你的答案,挑战他并核实他理解了你所说的。试着弄清楚这是语言问题还是知识问题。如果这是你们第一次交谈,直接问提问者是否理解你所说的,以便在需要时调整你的词汇,这可能是可以接受的。看看你是否能举个例子来澄清,或者就你的解释问一个问题。如果你心情好,你可以说一些暗示如果需要可以问更多问题的话,这应该能打破如果询问者有点害羞的僵局。
识别捣乱者。 当然,有些人有太多时间在手,没有真正的生活,试图通过问一些愚蠢和聪明问题组合来浪费大家的时间,只是为了好玩。这些所谓的捣乱者中,有一小部分人实际上非常精通所涉及的细微差别,可能会让听起来他们有一个真正的问题,然后继续将愚蠢的问题与好的问题结合起来。如果做得好,这些人可能会让你忙上一阵子。幸运的是,大多数捣乱者的忍者技能很差,很容易被识别出来。浪费勇敢的志愿者和真正想帮助他人的时间可不是件好事。被踢出并被封禁,他们活该。
提供反馈。 如果什么都不起作用,并且你有几分钟时间,解释为什么某个问题或评论没有效果。也许提问者说了些不尊重的话,或者暗示他并不真的想正确地学习东西。最坏的情况是,他会忽略你的建议,你也可以选择忽略他。最好的情况是,他会从你的反馈中学习,下次会以不同的方式处理事情。
更新:查看 http://xyproblem.info/
唉。好吧。请问,从哪里开始呢?
水平还是垂直?
我真的不在乎你更喜欢站着还是躺着学习新事物。我用“水平还是垂直”这个标题的意思是:你是应该先专注于学习广泛多样的东西(水平),还是应该直接深入你感兴趣的领域(垂直)?
好问题。这两种情况肯定各有利弊,有意见的人比人多。我也有幸拥有意见,所以我将分享我的个人观点。首先理解全局是有用的。 如果你的目标是成为一名 Web 应用程序渗透测试员,首先学习所有涉及的层可能是有意义的,包括操作系统、网络、Web 服务器和应用程序技术、常用数据库平台和常用开发语言。这是一个庞然大物。你感兴趣的信息量,通常取决于你需要什么。同时,你越理解事物的工作原理,就越容易理解如何打破规则。我的建议是:先尝试尽可能多地理解各个层面。不要急于求成,立即深入研究寻找漏洞或利用的细节。特别是工具的可用性会让你手痒,并降低立即开始攻击系统的门槛。始终记住,工具不是魔法。它们只是自动化了某些事情。你越理解它们做什么,就越容易使用它们。不要误解我的意思,工具很有用。只是在你理解它们做什么、如何配置它们、如何正确使用它们之前,不要使用它们。
所以,我认为尝试理解系统的系统工程方面很有价值。理解事物如何通信、如何设置、保护、运行。但也不要过度。你不需要成为一个理解所有 RFC 规范的 IP 专家。你可能需要的比滥用它所需的更多。你需要足够的知识来使用和滥用它。
此外,要理解你可以采取分阶段的方法。你不必是 BGP 路由专家才能执行 Web 应用程序测试。如果你是,这并没有坏处,但当你想扩大视野并深入安全审计的其他方面时,你仍然可以学习它。对设定的目标要现实,并尝试准确地确定达到那里所需的先决条件。如果不确定,请征求多方意见,并且不要害怕学得太多而不是学得不够。
如何学习?
学习新事物有很多方法,其中一些相当个人化(= 意思是:它们只对你们中的一些人有效,对另一些人无效)。有些人能够通过阅读书籍或博客文章来学习新事物。有些人需要将事物可视化,而另一些人则需要有人通过视频或面对面来解释事物。每种方法论都有解决方案。你可以购买书籍或在线阅读出版物。你可以上课(在线或现实生活中),并且可以找到许多在线挑战来练习你的新技能。
只要你能理解哪种方法最适合你,从而相应调整你的策略,这些方法都没有错。所有这些学习方法的共同点是进行练习。自己尝试事物(有指导或无指导)将使你更容易记住,并最终将知识转化为理解和经验。
无论如何,建立一个虚拟实验室环境会非常有用。如今,虚拟化技术已在大多数常见平台上可用,它便宜/免费且提供了很大的灵活性。VirtualBox、VMWare、Parallels、Xen、Hyper-V 只是几个例子。
虽然这不是一个万能的建议,但通过安装一个 Windows 和一个 *Nix/Linux 系统,你将走得很远。当然,理解如何管理和操作这些系统是根本重要的。你不想把时间花在与你应该用来支持学习经验的工具作斗争上。
填鸭式教学
填鸭式教学听起来像是我们对婴儿做的事,对吧?如果你问有经验的人填鸭式教学是对还是错,我敢打赌大多数人会告诉你这是不好的。我认为答案不是非黑即白的。这取决于。首先,我们都曾被填鸭式教学过。(或者至少我们大多数人是)。这是当我们无法自己进食时,父母对我们做的。这是当你对某事物完全陌生时,老师对你做的。这是我们应该做的,以便让人们走上正确的道路。我们都曾被告诉过某些事情,以便让我们练习、变得更好,并进入下一阶段。在以支持性的方式激励和完全放任不管之间有一条细线。
在《领导力和一分钟经理——通过情境领导力 II 提高效率》中,Ken Blanchard 解释了 4 种不同的“发展水平”。其中一个水平定义为高承诺和低能力。这可能就是你现在的处境。你对学习新事物相当兴奋,但你完全不知道从哪里开始。对于这样的场景,一些填鸭式教学可能是有用的。这并不意味着别人会为你做所有艰苦的工作,但如果只是被告知“自己去解决”,而不给出具体的指引或提示,也同样没有帮助。一旦你学到更多(并变得更有能力),你会发现还有更多要学。此时,你可能会发现自己变得不那么投入了,因为你开始意识到前路还很漫长(这可能会让人相当沮丧)。这也是正常的。此时,填鸭式教学将无济于事。在这种情况下,辅导更为合适。提出正确的问题将迫使人们思考,应用他们已经拥有的知识,并寻找答案。如果他们最终还是卡住了,并且无法自己发现答案,也许终究是时候退一步,寻求一些详细的帮助了。所以——请在负面看待填鸭式教学时要小心。具体情况(发展水平)决定了这是否是正确的方法。
还有什么别的吗?
不,没什么了。谢谢你的提问。是时候开始绘制将成为你旅程的树了。
1. 网络与操作系统
我建议从学习系统如何工作和通信开始。尝试对 TCP/IP、OSI 层、临时端口和服务端口、路由、端口转发、NAT、防火墙等有良好的理解。在尝试连接到目标时你会需要它,在使用工具时你会需要它,并且在配置你的环境以使你的安全审计成功时你也会需要它。
你还需要能够管理和操作常见的操作系统。与网络一起,这应该是你的主要起点。我们大多数人对一个操作系统很熟悉,但了解如何使用和配置 Windows 和 Linux/Unix “并没有坏处”(= 轻描淡写的说法)。你应该熟练于设置网络配置、基本安全功能和实现,使用命令行工具和 GUI 工具。开始将这些系统作为你的主要桌面使用,每天使用它们,以便迫使自己熟悉它们。
我知道,我知道,你想立即开始攻击系统,而不花费太多“开销”,对吧?我完全理解立即开始使用端口扫描器或其他工具听起来非常令人兴奋,但如果你不知道工具的输出意味着什么,使用这些工具有什么意义呢?更糟糕的是,如果你不知道自己在做什么,很容易造成损害。
2. 多用途资源
接下来,尝试对攻击形势有一个广泛的了解。也许你已经下定决心要成为一名 Web 应用程序渗透测试员,但了解一下还有什么其他领域仍然没有坏处。关于这个主题有很多资源,但我决定列出最重要的几个(至少是那些涵盖广泛技能的):
- A hands-on introduction to hacking
- Grey Hat Hacking – The Ethical Hackers Handbook
- “Hacking Exposed” 系列
- Professional Penetration Testing
(如果你觉得遗漏了重要的资源,请告诉我。哦,对于出版商/作者:如果你愿意为我们的读者提供折扣优惠码,请联系我 :-) )
除了对形势有更好的了解外,你还会学到一些关于渗透测试方法论和途径的知识,包括将技术发现转化为客户或企业可以使用和理解的东西这一困难的艺术。成为一名渗透测试员确实也涉及文书工作。只是说说而已。再次强调,运用真正的黑客心态。为了让它变得更好而破坏它,而不是为了破坏而破坏。如果没有真正尝试“让事情变得更好”的现实,你只是一个破坏者。(所以——不要抱怨别人犯的错误。思考并修复。增加价值。学习如何安全、加固和保护也同样重要。)
3. 脚本与工具
无论你看多久,你最终都会使用自动执行某些任务的脚本和工具。你甚至可能想要修改现有工具或编写自己的工具来让你的生活更轻松。毕竟,这就是脚本的目的。它们是一种工具,而不是目标。熟悉 Python 和 Ruby 等脚本语言是必须的。你不需要成为专家,当你开始使用它们时,你会变得更好。理解一些 C / C++ 也可能很有用,因为有些人倾向于用低级语言编写工具(主要是出于性能原因)。无论如何,理解工具做什么比编写自己的工具更重要。编写你自己的工具可能很有用,因为它证明了你理解需要做什么。
这可能是开始使用所谓的“渗透测试发行版”的好时机,这是一个预配置的系统,包含大量安全评估工具。尝试从头开始创建自己的系统可能会有所帮助,但也很耗时,而且在完全掌握现有系统之前可能没有必要。Kali Linux 是最常用/最流行的发行版之一。它拥有庞大的用户群,并且得到了大多数工具开发者的良好支持。
除了更多以攻击者为导向的工具外,扩展你的实验室环境,包括本地和在线的设计为易受攻击的系统,以便使用可用的工具测试你的知识,这也是一个好主意。如果你对 Web 应用程序安全感兴趣,一个好的起点是 https://www.pentesterlab.com/exercises 或 http://www.amanhardikar.com/mindmaps/PracticeUrls.html。你可以在下面列出的网站上找到更多链接。
4. 深入挖掘
只有当你准备好了,选择你想要的靶子,并制定一个现实的行动计划来实现目标。有些主题需要几天,其他主题则需要几周、几个月,甚至几年的时间来理解。从容不迫,一步一步来。对于每种类型的靶子,你都可以找到特定的资源(书籍、在线出版物、课程、虚拟实验室等)。
一些好的资源包括这里列出的网站:
- https://code.google.com/p/pentest-bookmarks/wiki/BookmarksList
- http://www.vulnerabilityassessment.co.uk/Penetration%20Test.html
- http://wiki.securityweekly.com/wiki/index.php/Penetration_Testing_Tips_%26_Tricks
- https://github.com/enaqx/awesome-pentest
- https://www.owasp.org/index.php/OWASP_Testing_Guide_v3_Table_of_Contents
- http://www.dfir.org/?q=node/8
- https://www.owasp.org/index.php/The_OWASP_Testing_Framework
- http://www.pentest-standard.org
(在浏览资源材料时别忘了提问。)
虽然我鼓励每个人找到自己的专业领域,但如果你认真想成为一名专业的渗透测试员,你将不得不学习一些关于 Web 应用程序安全的知识。毕竟,很多公司使用 Web 应用程序服务向他们的员工、客户、合作伙伴、供应商等提供应用程序。由于 Web 应用程序在很多情况下需要暴露给外部世界,它们也是一个重要的目标(也是犯罪分子入侵的途径)。理解 HTTP 的工作原理、Web 应用程序如何开发、保护,以及底层数据库平台如何工作,将构成旅程的一大部分。你的任务,如果你选择接受它,就是找到你需要深入你希望专注的领域所需的依赖项和先决条件,并将其转化为行动计划。再次强调,只要需要,就随时提问。
5. 倾听、参与、帮助
使用社交媒体关注影响者、激励过他人的人,以及通常更有经验的人。与人互动,友善。提问并在学习过程中提供帮助。
如果你有机会参加信息安全会议/研讨会:请务必参加。这是一个结识更有经验的人并与他们交谈的好方法。问问他们在做什么工作。分享你正在做的事情并征求建议。问问他们崇拜谁,或受到谁的启发,也去了解他们。成为社区的一部分。(哦,对了——会议也是找新工作的好地方)
开设一个网站/博客,分享你的发现。当然,你可能不是第一个走特定道路的人……但你也不会是最后一个。环境和技术的改变,所以当你应用你新获得的知识时,尝试跟踪你的进度并记录它如何应用于最新技术。事实上,你可能在学习过程中最终会做笔记。你不妨将它们结构化,并放在网上供他人查看。潜在的雇主可能对你发布的内容不那么感兴趣,而是更关注你如何构建笔记、想法,以及你对事物潜在的创新方法。让你的工作可见,并教给别人。
不要害怕犯错。你会达到目标的。它所需要的只是时间和努力。
祝你好运。
6. 不要做傻事
除非你在攻击自己的系统,或者你已经获得适当的许可,否则攻击一个系统(在网络、本地、物理等)都是犯罪。不要做傻事。