Intro
我收到大量的电子邮件。(请不要再加重我的负担,谢谢!)不幸的是,我不再像过去那样,或者像我希望的那样,拥有那么多空闲时间,所以我经常别无选择,只能将问题引导到我们的论坛或我们的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和即时通讯工具允许直接交流,但这并不能保证在你想要的时候以及以你期望的速度进行交流。时区是真实存在的,那些知道答案的人可能正在睡觉。接受它。 即使你认为某个工具坏得离谱,也要关注你可能做错了什么。如果你问“我哪里做错了”或“我应该怎么做不同”,即使这是应用程序或工具中一个真正的bug,别人也会表示赞赏。如果你一开始就说你认为某个工具坏了,或者问“为什么”某个工具坏了,你会以一种糟糕的方式引起别人的注意。工具中的一个bug并不会使整个工具变坏,所以不要不尊重可能正在阅读你评论的许多人的工作。 你是开启讨论的人,你永远不会有第二次机会留下第一印象。讨论的其余部分的基调将在你发起沟通的那一刻确定,所以保持友好和尊重。
当然,关于自己或自己处境的笑话是例外,通常会被很好地接受。抱怨你糟糕的网络连接让你考虑重新发送传真,或者评论你的狗太胖以至于干扰了房子里的Wi-Fi信号,这些只是几个例子,说明如何帮助营造友好的氛围。
要有创造力,不要过度,并仔细选择时机。 也许你对将要提问的人的技能印象深刻。不要开始大喊你认为他们有多么“高手”或“专业”,以及对他们来说回答你的问题有多么容易。这可能会引发一些危险信号,让人们认为你是个“喷子”。做你自己,表现正常,保持礼貌,你就会没事。
让别人容易回答。 如果你的问题太宽泛,或者包含太多模棱两可、有疑问或含糊不清的要素,不要指望有人会请几个星期的假来指导你。
选择你的听众。 哪里是找到你问题答案的最佳地点?谁会是回答你问题的合适人选?论坛和IRC频道通常侧重于某个特定主题,所以试着选择正确的媒介和频道来提问。如果你的问题与工具的使用有关,找到其他用户可能是个好主意,而不是立即将问题发送给工具开发者(或者使用他们提供的支持机制)。
提出你的问题。 不要先问是否可以问问题。没有必要问某人是否在线或有空回答你的问题。直接问那个该死的问题。如果有人在线上,如果你的问题有意义,你会得到答案。除非你是从之前的讨论中继续对话,否则不要针对特定的人。如果你暗示只有某个特定的人才能回答问题,其他人可能会忽略你的问题。如果你想得到答案,请确保问题表述得完全清楚。如果你只是说“我在X或Y方面有问题”、“这个工具不能用”或“我的利用被杀毒软件检测到了”,从技术上讲,你只是在做陈述,而不是在提问。问自己哪里做错了,或者可以做些什么来让某物工作(得更好),更有可能让你得到你想要的东西。即使你需要解释问题的背景,也要尽量简洁,切中要害,并尽快进入提问环节。
倾听、互动,并在需要时寻求澄清。 试着理解答案,不要立即回复。如果有人告诉你调查别的东西,就去调查。不要继续纠缠,忽视别人给你的建议。如果一个答案不清楚,请求澄清,但要以一种表明你试图学习(过程)而不是试图被“喂食”(解决方案)的方式来进行。正如前面解释的那样,你越擅长设定正确的基调,并表明你只需要一些正确方向的提示,别人帮助你的可能性就越大。在请求澄清时,试着以解释你理解了什么和不理解什么的方式来表述。转述或总结某些部分通常有助于表明答案的哪些部分是清楚的,哪些部分需要进一步澄清。考虑用以下方式开始一个新问题:
- 如果我理解正确的话,
- 你的意思是……
- 换句话说,
- 假如……
- 这是否意味着……
如果你根本没有理解答案,不要害怕说出来。礼貌地询问那个人是否可以换种说法,用不同的方式解释,或者详细说明答案的某个部分。
心怀感激,并在可能的时候回馈。 如果有人试图帮助你,告诉那个人你感谢他的帮助,即使这并没有完全回答你的问题。要意识到许多人还有其他事情要做,而不仅仅是回答问题。如果他们试图帮助,是因为他们想要帮助,尽管工作日程紧张、截止日期和其他优先级。赞扬他们抽出时间。以一种简短、清晰、高效的方式去做。说明答案如何有帮助。如果你感觉你问的问题是一个非常常见的问题,并且直觉告诉你,回答这个问题的人实际上已经对不得不反复处理这个问题感到厌烦,你可能需要考虑帮他一把。将你的问题和解决方案记录下来,并放在网上的某个地方。这将帮助你理解原因和解决方案,你可以请帮助你的人核实你的文档以确保其准确性,并且你可以通过简单地引导其他人查看你的在线文档来帮助他们。这表明你想要学习,你认真听了,并且你想回馈。不要等到拥有所有答案才分享。猜猜看,你总会发现另一个问题。
回答问题
提出好问题绝对是一门需要一点准备的艺术。回答问题,如果你真的想帮助别人,也并非微不足道。虽然有些情况可能表明相反,但并没有专门的提问者和专门的回答者(甚至不确定这个词是否有效)。无论你经验多么丰富,你可能仍然会时不时地发现自己处于故事的两边。当你有能力回答问题时,你确实处于一个独特的位置。想想看,你有权决定是否要回答问题,而且最重要的是,你可以选择如何回答问题,这将直接影响答案是否有价值。如果你决定花时间回答问题,并打算帮助某人,你最好把事情做对。也许以下一些准则可能有所帮助:
保持友善。 问题以某种方式提出是有原因的。你应该能够感觉到,一个追求速胜的人和一个真诚、真的想学习但不知如何有效沟通的人之间的区别。当你不确定时,给予这个人怀疑的好处,你仍然可以稍后对他大喊大叫。如果一个人表达得太模糊或不清楚,有一个简单的方法可以帮助他。简单地重述问题,并询问那是否是他想知道的事情,或者直接告诉他问题没有意义,并要求他更具体一些。这将确保你正确理解问题,并将向那个人展示下次如何恰当地表达问题。没有理由取笑某人或让他/她感觉糟糕。他或她已经承认对某事一无所知。
在回答前思考,询问更多信息。 你真的理解这个问题吗?你的回答会有帮助吗?如果问题不清楚,请求澄清。转述;请求一个例子。试着重现导致问题的步骤,并要求提供更多细节和文档。
不要因为必须回答而回答。 只因为你想要帮助别人,并且有时间帮助,才回答问题。虽然第一个问题看起来可能合理,但情况很容易变得更糟。如果你决定介入帮助某人,至少你必须试着让提问者走上正确的道路,而且事先很难估计你需要为此花费多少时间。如果你做得对并且很好地理解了问题,直接回答问题,或者将提问者引导到正确的资源,应该不会太难或太耗时。
用问题来回答。 这是个棘手的方法。有些人总喜欢这样做,这可能会吓坏人们并破坏正常的交流,所以请确保只在特定情况下使用这个技巧。回复一个问题确实有很大的价值,前提是这个问题暗示了一个解决方案,或者旨在获取更多信息。让我们看一个简单的例子: 问题:“我对目标计算机运行了一个利用代码,利用代码说我无法获得一个反向shell。” 这个场景中可能有很多地方出错了,很难用几句话来回答这个问题。提出几个简短的问题可能会让这个人重新开始工作,尝试获取关于为什么他的程序没有工作的更多细节。例如,你可以问两台主机是否能互相连接。这表明可能存在与网络相关的问题。它表明你理解与攻击远程计算机相关的各个层面,并且你帮助他使用结构化的方法来排查此类问题。对问题本身进行提问可能会揭示潜在的原因和动机。有时候,人们因为几乎能感觉到自己做错了,或者可能知道自己正在做违法的事情,而感到尴尬而不敢承认某些事情。通过询问他们为什么想做某事,或者建议他们以不同的方式做事(不涉及潜在的非法活动),可能会给你提供一些关于那个人的有用信息,以及他的意图是否正当。如果有人对攻击互联网上的计算机有困难,你可能建议他在私人实验室模拟该过程。如果那个人选择忽略你的建议,并坚持要在互联网上进行,你几乎可以肯定他心怀不轨。 试着发现那个人试图做什么。如果有人问是否可能做某件事,问他想达到什么目的。理想情况下,这将迫使这个人解释并揭示任何潜在的动机。
诚实。 如果你不确定答案,直接说出来。承认你不确定某事没有什么错。猜测是可以接受的,只要你说清楚你是在猜测。它可能暗示了可能的解决方案,或许已经将这个人引上了正确的道路。
激励,而不是打击。 你可以通过提供有帮助的答案来展示你的技能,而不是炫耀,强调你有多聪明。根据问题的具体程度,以及它反映出提问者所拥有的知识水平,你可以相应地调整答案的详细程度。如果你需要解释某事是错误或不好的,不要忘记解释为什么它是错误或不好的,并给出如何避免或解决问题的指导。你不需要详细地回答每个问题,就好像在给他们读教程一样。正确方向的温和推动往往足以激发学习过程。将某人引上正确的道路,并在他想要在未来取得进展时引导他学习应学习的资源,这是可以的,但不要只是向他扔一堆URL。如果对方理解他为什么需要学习某些东西,说服他付出努力去做会更容易。 当然,如果同一个人只是继续提问,而不愿花时间正确地学习,你的答案显然不会再有任何帮助,那个人可能并不想被帮助。他只是想让别人替他工作。在那种情况下,尝试是没有价值的。等到这个人意识到他需要为此努力,然后忽略他,直到他证明了这一点。
语言。 英语在国际IT或信息安全社区中是一门重要的语言。然而,这并不意味着每个人都是以英语为母语的人,甚至与之相差甚远。使用通用术语是完全没问题的,但尽量让你的句子尽可能简单。我们不想让这个可怜的家伙遭受不必要的痛苦,对吧?如果你在对话中注意到对方没有真正理解你的答案,挑战他,并验证他是否理解了你所说的话。试着弄清楚是语言问题还是知识问题。如果这是你们第一次交谈,直接问提问者是否理解了你所说的内容,以便在需要时调整你的用词,这可能是可以接受的。看看是否能举例说明来澄清,或者就你的解释提问。如果你心情好,你可以说些表示如果需要可以问更多问题的话,这可能会打破如果提问者有点害羞而产生的僵局。
识别“喷子”。 当然,有些人时间太多,没有真实的生活,试图通过提出愚蠢和聪明问题的组合来浪费大家的时间,仅仅是为了好玩。这些所谓的“喷子”中有一小部分人实际上非常精通其中的微妙之处,可能会让它听起来像是有一个真正的问题,然后继续将愚蠢的问题和好的问题结合起来。如果做得好,这些人可能真的会让你忙上一阵子。幸运的是,大多数喷子的“忍者”技能很差,很容易被认出来。浪费勇敢的志愿者和真正想帮助他人的人的时间是不太好的。他们被踢出禁言是活该。
提供反馈。 如果一切都没有用,而你还有一些时间,解释为什么某个问题或评论无效。也许提问者说了不尊重的话,或者暗示他并不想真正地学习东西。最坏的情况,他会忽略你的建议,你也可以选择忽略他。最好的情况,他会从你的反馈中学习,下次以不同的方式处理事情。
更新:查看 http://xyproblem.info/
叹气。好吧。请问,从哪里开始呢?
水平还是垂直?
我其实不在乎你在学习新事物时喜欢站着还是躺着。“水平还是垂直”这个标题的意思是:你是应该首先专注于学习广泛的各类事物(水平),还是应该直接深入到你感兴趣的领域(垂直)?
问得好。这两种情况肯定各有利弊,意见比人多。鄙人也有幸拥有一些观点,所以我会分享我的个人看法。
首先理解全局是有用的。如果你的目标是成为一名Web应用程序渗透测试员,那么学习所有涉及的层面可能是有意义的,包括操作系统、网络、Web服务器和应用程序技术、常用数据库平台和常用开发语言。这是一个庞大的领域。你感兴趣的信息量通常取决于你的需求。同时,你越了解事物的工作原理,就越容易理解如何改变规则。我的建议是:首先试着尽可能多地了解各个层面。不要不耐烦,立即深入研究寻找漏洞或利用漏洞的细节。特别是工具的可用性会让你手痒,降低立即开始攻击系统的门槛。始终记住,工具不是魔法。它们只是自动化了某些事情。你越了解它们的作用,使用它们就越容易。别误会,工具是有用的。只是在你理解它们的作用、如何配置它们、如何正确使用它们之前,不要使用它们。
所以,我认为,尝试理解系统的系统工程方面是很有价值的。理解事物如何通信、如何设置、保护、操作。但也不要过度。你不需要成为一个理解所有RFC规范的IP专家。你需要的可能比你滥用它所需的要多。你需要足够的知识来使用它和滥用它。
此外,要明白你可以采取分阶段的方法。你不需要为了进行Web应用程序测试而成为BGP路由专家。如果你是的话当然没坏处,但当你准备好扩展视野,深入研究安全审计的其他方面时,你仍然可以学习它。对你设定的目标要现实,并尝试准确地确定达到目标所需的先决条件。如果你不确定,征求多方意见,不要害怕学得太多而不是不够。
如何学习?
学习新事物有许多方法,其中一些方法相当个人化(也就是说:它们只对你们中的一些人有效,对另一些人无效)。有些人能够通过阅读书籍或博客文章来学习新事物。有些人需要将事物可视化,而另一些人需要别人在视频或面对面的环境中解释事物。每种方法论都有解决方案。你可以购买书籍或在线阅读出版物。你可以参加课程(在线或面对面),并且可以找到许多在线挑战来练习你的新技能。
只要明白什么方法对你最有效,以便相应地调整策略,这些方法都没有错。所有这些学习方法的共同点是需要实践。自己尝试(有指导或无指导)将使记忆更容易,并最终将知识转化为理解和经验。
无论如何,建立一个虚拟实验室环境可能非常有用。如今,虚拟化技术可用于大多数常见平台,它价格低廉/免费,并且提供了很大的灵活性。VirtualBox、VMWare、Parallels、Xen、Hyper-V只是几个例子。
虽然这不是万能的建议,但通过安装一个Windows和一个*Nix/Linux系统,你会走得很远。当然,理解如何管理和操作这些系统是根本重要的。你不会想把时间花在与本应支持你学习经验的工具作斗争上。
“喂食”
“喂食”听起来像是我们对婴儿做的事,对吧?如果你问有经验的人“喂食”是对是错,我打赌他们中的大多数人会告诉你这是不好的。我认为答案不是非黑即白的。这要看情况。
首先,我们都曾被“喂食”过。(至少我们中的大多数人)。这就是我们父母在我们不能自己吃饭时做的事。这就是老师在你完全对某物陌生时做的事。这就是我们应该做来让人们走上正确道路的事。我们都被告知某些事情,以便我们练习、变得更好,并进入下一个阶段。在支持性地激励和弃人于不顾之间有一条细微的界限。
在《领导力与一分钟经理——通过情境领导力II提高效率》中,Ken Blanchard解释了四种不同的“发展水平”。其中一个水平被定义为高意愿、低能力。这可能正是你现在所处的位置。你对学习新事物相当兴奋,但你不知道从哪里开始。对于这样的情况,一些“喂食”可能是有用的。这并不意味着别人会为你做所有艰苦的工作,但仅仅告诉你去“自己想办法”,而不给出明确的指示或提示,也是没有用的。一旦你学到更多(变得更有能力),你会发现还有更多东西要学。此时,你可能会发现自己变得不那么投入,因为你开始意识到前面还有很长的路要走(这可能会相当令人沮丧)。这也是正常的。在这一点上,“喂食”没有帮助。在这种情况下,指导更合适。提出正确的问题将迫使人们思考、应用他们已经掌握的知识,并寻找答案。如果他们在一切尝试之后仍然卡住,无法自己找到答案,也许现在是时候退一步,寻求一些详细的帮助了。所以——在对“喂食”持否定态度时请谨慎。具体情况(发展水平)决定了它是否是正确的方法。
还有其他吗?
不,真的没有了。谢谢提问。是时候开始描绘将成为你旅程的树状图了。
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_&_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. 别做傻事
除非你在攻击自己的系统,或者你已经获得了适当的权限,否则攻击一个系统(在网络、本地、物理上等)是一种犯罪。别做傻事。