Mix谈如何打造超级黑客

来源:岁月联盟 编辑:zhuzhu 时间:2010-02-13

什么是黑客

在日本出版的《新黑客字典》中,对黑客是这样定义的:“喜欢探索软件程序并从中增长了其个人才干的人。他们不像绝大多数电脑使用者那样,只规规矩矩地了解别人指定的狭小的一部分知识”。在Open Source(开放源代码)旗手ERIC。S。RAYMOND的《The New Hacker‘s Dictionary》一文中,对“Hacker”的解释包括了下面几类人:

一:那些喜欢发掘程序系统内部实现细节的人,在这种发掘过程中,他们延伸并扩展着自己的能力,这和只满足于学习有限知识的人是截然不同的
二:那些狂热地沉浸在编程乐趣的人,而且,他们不仅仅是在理论上谈及编程
三:一个高超的程序设计专家
四:一个喜欢智力挑战的,并创造性地突破各种环境限制的人
五:一个恶意的爱管闲事的家伙,他试图在网络上逡巡溜达的同时发现一些敏感的信息
对最后一类人,ERIC。S。RAYMOND赋予其更恰当的一个称谓,那就是“Cracker”,有就是我们常说的“骇客”,指那些乐于破坏的家伙。当他们在给这个社会制造着麻烦和噱头的同时,就只能被冠以“骇客”之名。正是因为“骇客”的存在,纯正而古老的黑客精神才愈来愈被人曲解,但在真正崇尚黑客精神的一类人眼里,“骇客”与“黑客”是如此的泾渭分明,不可混淆!更有甚者,有些黑客们说:在黑客界,斗争只存在于“黑客”和“骇客”之间!

黑客群体有自己特有的一套行为准则(the hacker ethic)美国学者史蒂夫。利维在其著名的《黑客电脑史》中所指出的黑客道德准则(the hacker ethic)就是对其最深刻的表述:

(1),通往电脑的路不止一条
(2),所有的信息都应当是免费共享的
(3),一定要打破电脑集权
(4),在电脑上创造的是艺术和美
(5),计算机将使生活更加美好

可以看出,“黑客道德准则”正是这个独特的文化群体一直心照不宣地遵循着的“江湖规矩”,以这种“江湖规矩”作为参照,黑客们的行为特征也就清晰地呈现给我们了!

一,热衷挑战
黑客们多数都有很高的智慧,至少在某些方面表现突出。他们喜欢挑战自己的能力,编写高难度程序,破译电脑密码给他们带来了神气的魔力,认为运用自己的智慧和电脑技术去突破某些著名的防卫措施森严的站点是一件极、富刺激性和挑战性的冒险活动。

二,崇尚自由
黑客文化首先给人的突出感觉就是一种自由不羁的的精神。黑客如同夜行的蝙蝠侠,任意穿梭在网络空间中。黑客在电脑虚拟世界发挥着自己的极致的自由。

他们随意登录在世界各地的网站,完成着现实生活中无法企及的冒险旅程,实现着个人生命的虚拟体验。正是这种对自由的体验,使黑客如同吸毒上瘾一样,对网络入侵乐此不疲

三,主张信息共享黑客们认为所有的信息都应当是免费的和公开的,认为计算机应该是大众的工具,而不应该只为有钱人私有。信息应该是不受限制的,它属于每个人,拥有知识或信息是每个人的天赋权利。

四,反叛精神
黑客文化带有某种反叛世界的倾向,黑客们蔑视传统,反抗权威,痛恨集权,其行为模式以深深烙上了无政府主义的印记。互联网的一个显著特点是平等和共享,对于在网络中存在的许多禁区,黑客们认为是有违网络特征的,他们希望建立一个没有权威,没有既定程序的社会,所以他们一般都喜欢与传统,权威和集权做永无休止的斗争

五,破坏心理
黑客们要在网络空间来去自如,蔑视权威,就必然夹带着某些破坏行动。只有突破计算机和网络的防护措施才能随意登录站点,只有颠覆权威设置的程序才能表示反抗权威,也只有摧毁网络秩序才能达至人人平等的信息共享目标。当然,由于心理动机不同,不同黑客行为的破坏程度也是有所区别的!
这样一种独特的黑客文化,必然孕育出黑客群体所读有的文化态度!
(1)这个世界不断涌现出许多迷人的问题等待人们去解决
(2)一个问题不应该重复地解决两次
(3)无聊而乏味的工作是可恶的
(4)自由是美好的,黑客们需要的是自由协作和信息共享,而不是专制和所谓的权威
(5)态度并不能成为能力的替代品,想成为黑客,只有态度是不够的,更重要的是,还在于努力工作,倾心奉献,钻研和实践!

我写这个并不是因为我已经厌倦了一遍又一遍地回答同样的问题,而是考虑到这确实是一个有意义的问题,其实很多人(90%)确实需要问这个问题而没有问!

我被问了很多次有关安全领域的问题,比如,什么编程语言你最推崇?应该读什么书作为开始?总而言之,就是如何安全领域内成为一个有影响的人。既然我的答案和一般的答案有所不同,我打算把我的看法说出来!

-------------------------------------------
从哪里开始?
-------------------------------------------

我的观点可能和一般的看法不同,如果你刚刚起步,我建议你不要从Bugtrap,Technotronic,Roo
tshell等站点开始。没错!不要从那里开始(尽管它们是很好的站点,而且我的意思并不是说不要去访问这些站点)原因非常简单。如果你认为你通晓“安全”,就是知道最新的漏洞,到头来你将会发现自己一无所获我同意,知道什么地方有漏洞是十分必要的,但是这些并不能够为你的高手之路打下坚实的基础。

比如,你知道RDS是最新的漏洞,知道如何下载并使用对这个漏洞进行利用的Script工具,知道如何修补这个漏洞(也许,很多人只知道如何攻击,并不知道如何防范),可是,3个月后,补丁漫天飞舞,这个漏洞已经不存在了。。。。。现在你的那些知识还有什么用?而且你可能根本没有理解对漏洞的分析!你应该学习的知识是什么?是分析?还是攻击手段?这是我想要再次强调的,人们可能没有注意,已经有很多人认为他们只要知道最新的漏洞就是安全QQ:9750406专家,NO!所有他们知道的只不过是“漏洞”,而不是“安全”例如,你知道有关于phf的漏洞,showcode.asp的漏洞,但是你知道它们为什么会成为GGI漏洞的吗?你知道如何编一个安全的 通用网关程序吗?你会根据一个GGI的状态来判断它有可能有哪些漏洞或哪方面的漏洞吗?或者,你是不是只知道这些GGI有漏洞呢?所以,我建议你不要从漏洞开始,就当它们不存在(你知道我的意思),你真正需要做的是从一个普通用户开始。

---------------------------------------------
做一个用户
---------------------------------------------
我的意思是你至少要有一些基本的常规的知识。例如:你如果要从事Web Hacking,你是否连浏览器都不会用?你会打开Netscape,打开IE?很好!你会输入姓名,你知道HTML是网页,很好,你要一直这样下去,变成一个熟练的用户。你会区别ASP和GGI是动态的,什么是PHP?什么是转向,COOKIES,SSL?你要知道任何一个普通用户可能接触到的关于Web事物。不是进攻漏洞,仅仅是使用。没有这些基础(也许是枯燥的)知识你不可能成为高手,这里没有什么简捷

好!现在你知道这里的一切了,你用过了。在你Hack Unix之前至少要知道如何Login,Logout,如何
使用Shell命令,如何使用一般的常用程序(MAIL,FTP,WEB,LYNX等)。
要成为一个管理员,你需要掌握如下基本的操作

------------------------------------------------
成为一个管理员
------------------------------------------------
现在你已经超过了一个普通用户的领域了,进入更复杂的领域,你要掌握更多的知识。例如:Web服务器的类型,与其他的服务器有什么区别?如何去配置它,像这样的知识,你知道得越多句意味着你更了解它是如何工作的?它是干什么的?你理解HTTP协议吗?你的HTTP1.0和HTTP1.1之间的区别吗?WEBDAV是什么?知道HTTP1.1虚拟主机有助于建立你的Web服务器吗?
你需要了解操作系统,例如你从来没有配置过NT,你怎么可能去攻击一个NT服务器呢?你从来没有用过Rdisk,用户管理器,却期望Crack一个管理员的密码,得到用户权限?你想使用RDS,而你在NT下的操作一直用的是图形界面?你需要从管理员提升到一个“超级管理员”,这不是指你有一个超级用户的权限, 而是你的知识要贯穿你的所有领域。很好!你会在图形界面下填加用户,在命令行你也能做到吗?而且, system32里的那些。exe文件都是干什么的?你知道为什么USERNETCTL必须要有超级用户权限?你是不是 从来没有接触过USERNETCTL?不要以为知道如何做到就行了,要尽可能知道得更多,成为一名技术上的领 导者,但是。。。

-------------------------------------------------
你不可能知道所有的事情
-------------------------------------------------

这是我们不得不面队的事实。如果你认为你可以知道所有的事情,你在自欺欺人。你需要做的是选择 一个领域,一个你最感兴趣的一个领域,并进一步学习更多的知识。
要想成为一名熟练的用户,成为一个管理员,成为一名技术上的领导者,直至成为某一个领域中最优 秀的人,不是仅仅学习如何使用Web浏览器,怎样写GGI就行了,你知道HTTP和WEB服务器的原理吗?知道当服务器不正常工作时应该怎样使它工作吗?当你在这个领域内有一定经验时,自然就知道怎样攻击和防御了!

这其实是很简单的道理,如果你知道所有的 关于这方面的知识。那么,你就可以知道安全隐患在哪里?面对所有的漏洞时(新的,旧的,将来的)你自己就能够发现未知的漏洞(你这时已经是一个黑客高手了)你找漏洞可以,但你必须首先了解漏洞的来源。所以,放下你手中的Whisker的拷贝,去学习GGI到底是干什么的?它们是怎么使通过HTTP的Web服务器有漏洞的?很快你就会知道到底Whisker是干什么的了!

编程语言
在所有最近被提及的问题中,最唱听到的就是:“你认为应该学习什么编程语言”我想,这要看具体情况了,如你花费多少时间来学习?你想用这种语言来做什么事?想用多长时间来完成一个程序?这个程序将完成多复杂的任务?

以下有几个选项:

*Visual Basic
一种非常容易学习的语言,有很多关于这方面的书,公开的免费源代码也很多,你应该能够很快地使用它。但是这个语言有一定的局限。它并不像C++那样强大,你需要在Windows下运行它,需要有一个VB的编程环境。想用VB来编写攻击代码或补丁是十分困难的

*C++
也许是最强大的语言了。在所有的操作系统里都存在。在网上有成吨的源代码和书是免费的,包括编程环境。它比VB复杂,掌握它需要花费的时间也比掌握VB长。简单的东西容易学,功能强大的东西理解起来也要困难一些,这需要你自己衡量

*Assembly
也许是最复杂的语言,也是最难学的语言。如果你把它当作自己的初入门语言。那么将会难的你的头要爆裂。但是,先学会了汇编,其余的编程语言也就变得容易多了。市场上的汇编书籍有减少的趋势。不过,汇编知识在某些方面至关重要,比如缓冲溢出攻击。

*perl
一种很不错的语言。它像VB一样容易学习,也像VB一样有局限性。但是它在多数操作平台上都能运行(unix和windows,所以这是它的优势。有很多这方面的书籍而且是完全免费的。你可以用它来制作一些普通的攻击工具,它主要用于一些文本方式的攻击技巧,并不适合制作二进制程序,我想,这是你所有想知道的,有把握的说,C/C++是最佳选择。

-----------------------------------------
推荐的书
-----------------------------------------
另外一个问题是我推荐去读什么书。
我个人手边有以下的几本书作为参考。
Applied Cryptography (Btuce Scheiner)
Linux Application Development (mike johnson and troan)
windows assembly language and systems programming(barry kauler)
perl cookbook (tom chirstiansen and nathan torkington)(o‘reilly)
linux programmer‘s reference (richard petersen)(osborne)
all the o‘reilly ‘pocket reference‘books,which include vi.emacs.python.
perl.pl/sql。nt.javascript.sendmail.tcl/tk.perl/tk
我总是在这些书的一些基本规则里思考。
我的心得是,大部分o‘reilly的书都非常耐读,找一个你感兴趣的领域专心去钻研吧!

远程联线
远程联线是一个不可思议的工具, 它让您超越时空一般的使用远端的电脑系统。有了远程联线, 电脑软硬体资源的分享变得很有效率, 打个比喻来说, 您可以连线载入位於某处的超级电脑(假设您有存取权), 做天体模拟运算, 当结果迅速的产生时, 您可以将资料传送到另一部图形模拟工作站, 由那里产生一份实体模拟图。在这例子中, 您先後用到了一部超级电脑以及一部图形处理工作站, 而您双手真正接触到的, 很可能是一部位於实验室的个人电脑(PC), 可是其他这两台电脑可能在什麽地方也不知道!
是的, 您一点也无须知道, 通过Internet的远程联线工具, 您只需到知道那里有您要的CPU时间,以及应用软件, 如此而已。

远程联线可以应用於跨越时空的环境, 当然也同样适用於办公室区域网络间, 一台电脑模拟成另一台电脑的终端机而连线载入对方系统。

什麽是Telnet?

也许读者们听说过Telnet是一种通讯协定之一, 对於这种说法, 您大可以忽略掉。 读者不妨简单的想, Telnet就是让刚刚以上的说明成为具体可行的一个实际的工具, 也就是说, 我们只是单纯的视Telnet为一个执行远程联线的工具之一, 让一台电脑连线载入另外一部电脑。

记得前面已经提到很多次, 在网络上的应用程式多半是采用Client/Server模式, 用中文来说, 也就是一定有一端是请求端, 请求端执行Telnet请求程式。在主机这一端则有装置有伺服程式来接受连线请求,不过在多半的情况, 主机端则Client与Server两者都有。

远程联线的使用程序与您平常在本地通过电话线或任何其他方式载入一部主机并没有很大不一样, 您在对方主机一定要有一个私人使用帐号, 以及您的通行密码, 这样子您才有办法连线进入该主机系统。细节上请参考下面的示意。另外, 在Internet上, 有相当多的各式各样服务系统也是通过这方式来提供服务, 其中决大部分是免费的服务, 像是Hytelnet、BBS、Gopher及Archie等等就是, 这类系统通常开放有公用帐号, 且无须使用密码。

Telnet在功能上, 是模拟成远端一部电脑系统的终端机, 通过网络连线载入该电脑系统。假如您实验室中有跑DOS的个人电脑, 该电脑也已经连结上校园网络, 您可以请人帮您装设一套NCSA Telnet软件, 之後您就可以做笔者以上所介绍的这些不可思议的事情 (笔者一直都没有吹牛:-) )。
NCSA Telnet是专门为DOS设计的一个请求程式, 至於在Unix机器上, 您就无须担心, 因为Unix是网络的天生好手, 它一出厂就已经具备有Telnet这东西, 而且通常是请求程序与服务程序同时具备。


□ 二. □例:远程联线远端某个主机系统

┌——————————————————————————————————————————┐
│ $ telnet jet.ncic1.ac.cn ← 连线 │
│ Trying 159.226.43.26... │
│ Connected to 159.226.43.26 │
│ Escape character is ‘^]‘. │
│ │
│ SunOS UNIX (sparc4) (连线成功) │
│ │
│ login: feng ←输入账号
password:******* ←输入密码
│ Last login: Thu Dec 30 11:37:17 from 159.226.43.45 │
│ SunOS Release 4.1.1 (sparc15) #1: Tue Nov 12 05:15:31 CST 1996 │
└——————————————————————————————————————————┘
远程联线就是这麽简单, 上面的操作就是一个典型远程联线的应用, 我们应用远程联线的功能,来取用远端某一台主机系统提供的某某公共服务系统, 至於很多商业性服务系统也可以用这方式来连线进入。

在Internet, 我们可以发现很多有趣的服务系统, 比方说, 假如您喜欢下棋, 您也找得到一些围棋服务系统, 利用这系统您可以与另外一个人下围棋 ( 注意是对手是「人」, 而您可能不知道对手人在地球的那个角落, 妙哉! ) , 其他像是网络游戏系统(比方MUD)您有时间也可以一试。其他的服务系统像是BBS、IRC及Gopher等等也可以通过Telnet来取得服务。

□ 三. Telnet、Tn3270 浅介

远程联线时, 您只须知道几个Telnet的指令, 大抵如何连线, 如何中途执行本端指令 (您自己主机这一端) , 如何结束连线及万一不得已时使用的中断连线等等。Telnet的使用并没有像FTP有很多独特的操作指令。

不论在DOS或Unix环境, Telnet 都是个非常容易的指令, 您几乎不需要任何学习, 您该知道的顶多只是一开始的连线动作, 以及最後要退出对方系统时的操作程序, 以下笔者只介绍两个指令:

Unix下的telnet与tn3270在操作上几乎是一样的, 所不同者, 只因为所连线对方系统并不一样, 所以操作程序稍稍有异, 所以您要注意的只是, 「遵照」对方系统的要求程序来中断连线即可。举例来说, 您用tn3270连线IBM VM系统时, 「logoff」 (大小写不拘) 就是您结束连线的指令, 您除非不得已, 不要用Unix″kill″指令来结束连线。

在Unix下, 无论telnet或 tn3270, 您都可以按CTRL-] (CTRL 键及] 键同时按, 有时得按两次 ) 暂时回到 telnet/tn3270 环境, 这时您可以执行telnet/tn3270本身的指令, 会出现下面画面。

┌——————————————————————————————————————————┐
│ telnet> ?    ← ? 符号求助 │
│ Commands may be abbreviated. Commands are: │
│ │
│ close close current connection │
│ display display operating parameters │
│ mode try to enter line-by-line or character-at-a-time mode │
│ open connect to a site │
│ quit exit telnet │
│ send transmit special characters (‘send ?‘ for more) │
│ set set operating parameters (‘set ?‘ for more) │
│ status print status information │
│ toggle toggle operating parameters (‘toggle ?‘ for more) │
│ z suspend telnet │
│ ? print help information │
│ telnet> │
│ │
│ toggle toggle operating parameters (‘toggle ?‘ for more) │
│ z suspend telnet │
│ ? print help information │
│ telnet> status ← 查看目前连线状况 │
│ No connection. │
│ Escape character is ‘^]‘. │
│ telnet> z ← 暂时回到本地的shell, 把连线作业放在背景 │
│ │
│ [1] + Stopped telnet │
│ [^C] interrupt. │
│ [^U] kill. │
│ [^/] quit. │
│ [^D] eof. │
│ │
│ $ fg ← 将连线切回前台 (回到telnet) │
│ telnet │
│ │
│ telnet> q ← 中断连线 (不被鼓励使用) │
│ $ │
└——————————————————————————————————————————┘

  另外, 从telnet回到连线, 只须在telnet> 提示符号下按键即可。以上说明同样应用於tn3270, 这里笔者不另外说明。

  最後, 笔者只能告诉您, Telnet本身非常容易操作及了解, 这是为什麽本节没有举很多例子。而 Telnet 所能连线的系统才是您所要认识的, Telnet 可以说只是一个桥梁而已, 您行走过该桥时, 大可不知道该桥是那些工匠或用那些材料造的。

四. Unix rlogin介绍

rlogin是Unix主机间一个远程联线工具程序, rlogin最大的卖点可能是它的8-bit clean连线方式, 也就是说, 万一您想载入远端一部Unix系统, 且使用图形操作界面(比方像中文及图形视窗环境等等), 若您的Telnet
无法提供8-bit clean能力, 您就可以选择rlogin。

$ rlogin 159.226.43.26 -l feng -8 ← 远程联线
fengs Password: ***** ← 该系统询问通行密码读者们可以用″man rlogin″指令查询到更详细的介绍。