Skip navigation.

CSC's personal space

BY CSC

Telnet高级入侵详细解析

什么是Telnet
对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。

Telnet被入侵者用来做什么

(1)Telnet是控制主机的第一手段

在前几节介绍过,如果入侵者想要在远程主机上执行命令,需要建立IPC$连接,然后使用net time命令查看系统时间,最后使用at命令建立计划任务才能完成远程执行命令。虽然这种方法能够远程执行命令,但相比之下,Telnet方式对入侵者而言则会方便得多。入侵者一旦与远程主机建立Telnet连接,就可以像控制本地计算机一样来控制远程计算机。可见,Telnet方式是入侵者惯于使用的远程控制方式,当他们千方百计得到远程主机的管理员权限后,一般都会使用Telnet方式进行登录。

(2)用来做跳板

入侵者把用来隐身的肉鸡称之为“跳板”,他们经常用这种方法,从一个“肉鸡”登录到另一个“肉鸡”,这样在入侵过程中就不会暴露自己的IP地址,这一过程将在第5章中详细介绍。

(3)关于NTLM验证

由于Telnet功能太强大,而且也是入侵者使用最频繁的登录手段之一,因此微软公司为Telnet添加了身份验证,称为NTLM验证,它要求Telnet终端除了需要有Telnet服务主机的用户名和密码外,还需要满足NTLM验证关系。NTLM验证大大增强了Telnet主机的安全性,就像一只拦路虎把很多入侵者拒之门外。

(4)使用Telnet登录

登录命令:telnet HOST [PORT]

断开Telnet连接的命令:exit

成功地建立Telnet连接,除了要求掌握远程计算机上的账号和密码外,还需要远程计算机已经开启“Telnet服务”,并去除NTLM验证。也可以使用专门的Telnet工具来进行连接,比如STERM,CTERM等工具。

Telnet典型入侵

(1)Telnet典型入侵步骤

步骤一:建立IPC$连接。其中sysback是前面建立的后门账号。

步骤二:开启远程主机中被禁用的Telnet服务。

步骤三:断开IPC$连接。

步骤四:去掉NTLM验证。如果没有去除远程计算机上的NTLM验证,在登录远程计算机的时候就会失败。

不过入侵者会使用各种方法使NTLM验证形同虚设。解除NTLM的方法有很多,下面列出一些常用的方法,来看看入侵者如何去除NTLM验证。

方法一

首先,在本地计算机上建立一个与远程主机上相同的账号和密码。

然后,通过“开始”→“程序”→“附件”找到“命令提示符”,使用鼠标右键单击“命令提示符”,然后选择“属性”,打开后如图所示

在“以其他用户身份运行(U)”前面“打钩”,然后单击“确定”按钮。接着,仍然按照上述路径找到“命令提示符”,用鼠标左键单击打开,得到如图所示对话框,键入“用户名”和“密码”。

单击“确定”按钮后,得到MS-DOS界面,然后用该MS-DOS进行Telnet登录,如图所示。

键入“telnet 192.168.27.128”命令并回车后,在得到的界面中键入“y”表示发送密码并登录。

远程主机为Telnet终端用户打开的Shell,在该Shell中输入的命令将会直接在远程计算机上执行。

比如,键入“net user”命令来查看远程主机上的用户列表,如图所示。


方法二

该方法使用工具NTLM.EXE来去除NTLM验证。首先与远程主机建立IPC$连接,然后将NTLM.EXE拷贝至远程主机,最后通过at命令使远程计算机执行NTLM.EXE。

计划任务执行NTLM.EXE后,便可键入“telnet 192.168.27.128”命令来登录远程计算机。

在该登录界面中键入用户名和密码,如果用户名和密码正确,便会登录到远程计算 机,得到远程计算机的Shell。

另外,还可以使用与opentelnet.exe相配套的程序resumetelnet.exe来恢复远程主机的NTLM验证,命令格式为“ResumeTelnet.exe \\\\server sername password”。

resumetelnet.exe关闭了目标主机的Telnet服务,恢复了NTLM验证。

从前面的介绍可以看出,即使计算机使用了NTLM验证,入侵者还是能够轻松地去除NTLM验证来实现Telnet登录。如果入侵者使用23号端口登录,管理员便可以轻易地发现他们,但不幸的是,入侵者通常不会通过默认的23号端口进行Telnet连接。那么入侵者究竟如何修改Telnet端口,又如何修改Telnet服务来隐蔽行踪呢?下面举一些常见的例子来说明这一过程,并介绍一下完成这一过程所需要的工具。

è X-Scan:用来扫出存在NT弱口令的主机。

è opentelnet:用来去NTLM验证、开启Telnet服务、修改Telnet服务端口。

è AProMan:用来查看进程、杀死进程。

è instsrv:用来给主机安装服务。

(1)AProMan简介

AproMan以命令行方式查看进程、杀死进程,不会被杀毒软件查杀。举个例子,如果入侵者发现目标主机上运行有杀毒软件,会导致上传的工具被杀毒软件查杀,那么他们就会要在上传工具前关闭杀毒防火墙。使用方法如下:

c:\\AProMan.exe -a 显示所有进程

c:\\AProMan.exe -p 显示端口进程关联关系(需Administrator权限)

c:\\AProMan.exe -t [PID] 杀掉指定进程号的进程

c:\\AProMan.exe -f [FileName] 把进程及模块信息存入文件

(2)instsrv简介

instsrv是一款用命令行就可以安装、卸载服务的程序,可以自由指定服务名称和服务所执行的程序。instsrv的用法如下。

安装服务:instsrv <服务名称> <执行程序的位置>

卸载服务:instsrv <服务名称> REMOVE

还有另一款优秀的远程服务管理工具SC。它属于命令行工具,可以在本地对远程计算机上的服务进行查询、启动、停止和删除。它的用法很简单,这里不作介绍了。下面通过实例来介绍入侵者如何实现Telnet登录并留下Telnet后门的过程。

步骤一:扫出有NT弱口令的主机。在X-Scan的“扫描模块”中选中“NT-SERVER弱口令”,如图所示。

然后在“扫描参数中”指定扫描范围为“192.168.27.2到192.168.27.253”,如图2所示。

等待一段时间后。

步骤二:用opentelnet打开远程主机Telnet服务、修改目标主机端口、去除NTLM验证。

无论远程主机是否开启“Telnet服务”,入侵者都可以通过工具opentelnet来解决。比如,通过“opentelnet \\\\192.168.27.129 administrator "" 1 66”命令为IP地址为192.168. 27.129的主机去除NTLM认证,开启Telnet服务,同时又把Telnet默认的23号登录端口改成66号端口。

步骤三:把所需文件(instsrv.exe、AProMan.exe)拷贝到远程主机。

首先建立IPC$,然后通过映射网络硬盘的方法把所需文件拷贝、粘贴到远程计算机的c:\\winnt文件夹中。


步骤四:Telnet登录。

在MS-DOS中键入命令“telnet 192.168.27.129 66”来登录远程主机192.168.27.129。

步骤五:杀死防火墙进程。

如果入侵者需要把类似木马的程序拷贝到远程主机并执行,那么他们会事先关闭远程主机中的杀毒防火墙。虽然这里没有拷贝类似木马的程序到远程主机,但还是要介绍一下这一过程。当入侵者登录成功后,他们会进入到c:\\winnt目录中使用AProMan程序。首先通过命令AProMan –A查看所有进程,然后找到杀毒防火墙进程的PID,最后使用AProMan –t [PID]来杀掉杀毒防火墙。

步骤六:另外安装更为隐蔽的Telnet服务。

为了事后仍然能登录到该计算机,入侵者在第一次登录之后都会留下后门。这里来介绍一下入侵者如何通过安装系统服务的方法来让Telnet服务永远运行。在安装服务之前,有必要了解一下Windows操作系统是如何提供“Telnet服务”的。打开“计算机管理”,然后查看“Telnet服务”属性。

在“Telnet的属性”窗口中,可以看到其中“可执行文件的路径”指向“C:\\WINNT\\ SYSTEM32\\tlntsvr.exe”。可见,程序tlntsvr.exe就是Windows系统中专门用来提供“Telnet服务”的。也就是说,如果某服务指向该程序,那么该服务就会提供Telnet服务。因此,入侵者可以自定义一个新服务,将该服务指向tlntsvr.exe,从而通过该服务提供的Telnet服务登录,这样做后,即使远程主机上的Telnet服务是被禁用的,入侵者也可以毫无阻碍的登录到远程计算机,这种方法被称之为Telnet后门。下面就介绍一下上述过程是如何实现的。首先进入instsrv所在目录。

然后使用instsrv.exe建立一个名为“SYSHEALTH”的服务,并把这个服务指向C:\\WINNT z\\SYSTEM32\\tlntsvr.exe,根据instsrv.exe的用法,键入命令“instsrv.exe SYSHEALTH C:\\WINNT\\SYSTEM32\\tlntsvr.exe”。

一个名为“SYSHEAHTH”的服务就这样建立成功了。虽然从表面看上去该服务与远程连接不存在任何关系,但是实际上该服务是入侵者留下的Telnet后门服务。

通过“计算机管理”可以看到该服务已经添加在远程计算机上。入侵者一般会把这个服务的启动类型设置成“自动”,把原来的“Telnet服务”停止并禁用。

通过验证可知,虽然远程主机上的Telnet服务已经被停止并禁用,但入侵者仍然能够通过Telnet来控制远程主机。通过这些修改,即使管理员使用“netstat –n”命令来查看开放端口号也看不出66端口正在提供Telnet服务。

另外,这里顺便介绍一下netstat –n命令。该命令用来查看本地机当前连接情况,如图所示。其中,“Proto”列为当前连接的协议类型,如TCP协议和UDP协议。“Local Address”列为本地主机的IP地址,从图可见,本地主机有两个IP地址,分别为“192.168.0.2”和“192.168.27.1”。“Foreign Address”列为远程主机IP地址。“State”列为当前连接状态,其中包括ESTABLISHED(已经建立),TIME_WAIT(等待),SYN_SENT(正在连接)等状态。

常见问题与解答

1.问:虽然获得远程主机的用户名和密码,但是使用opentelnet连接的时候失败,如图所示,为什么?

答:根据返回的错误号“53”可知,目标主机没有启动Server服务,或者没有开放IPC$。

2.问:如何才能抵御Telnet入侵?

答:

保证账号密码的强壮性,防止被暴力破解。

禁用Telnet服务。

由于opentelnet是通过IPC$来实现的,所以关闭IPC$也可以防止一些情况的发生。

安装网络防火墙。

5分钟编写一个ASP论坛

学ASP朋友的。。给大家分享个好东西 真NB..佩服ing ..... 大家在网上看到各种各样的ASP论坛是不是觉的做论坛很难呢,其实我们用简单的ASP语句就完全可以完成一个属于自己的论坛。下面我教大家如何用ASP来打造一个属于自己的论坛,自己的东西毕竟用起来爽吗。 同时,再复杂的论坛的写成也离不开下面的基本步骤,大家仔细看了。 一、建立文件! 最简单的论坛也要有几个必要的文件,就是: 1、数据库,用来储存发表的帖子!-------命名为:bbs.mdb 2、有数据库就必须连接数据库,该文件用来连接数据库:----命名为:conn.asp 3、发表帖子的文件----命名为:say.asp 4、保存发表帖子内容的文件-----命名为:save.asp 5、显示帖子标题的文件------命名为:index.asp 6、显示帖子内容的文件,即点击标题后所进入的页面-----命名为:show.asp 建立文件是可以先建立文本文档,他的格式为"文件名.txt",我们只需把它改为"文件名.asp" 二、各文件的主要内容 1、bbs.mdb 打开这个数据库,建立一个表,命名为bbs 该表中有几个字段: id(自动给帖子编号),他的数据类型设为“自动编号” name(用来储存发表的作者),数据类型为“文本” title(用来储存帖子的主题),数据类型为“文本” body(用来储存帖子的内容),数据类型为“备注” 2、conn.asp 源代码为: <% Server.scriptTimeout="10" connstr="DBQ="+server.mappath("═bbs═.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};" set conn=Server.CreateObject("ADODB.connection") conn.open connstr %> 这个文件就是这样,代码内容大家就自己研究,这个我也不知道怎么说才好! 3、say.asp 源代码为: <form method="POST" action="save.asp">

大名:<input type="text" name="name" size="20">

标题:<input type="text" name="title" size="91">

内容:

<textarea rows="11" name="body" cols="97"></textarea>

 

<input type="submit" value="提交" name="B1"><input type="reset" value="重置" name="B2">

</form> 大家应该看得懂的,这个根本就是html语法,对的,根本就是,这个只是发表的界面 不过要注意这一句<form method="POST" action="save.asp">,他把用户所填的内容发送至save.asp这个文件,下面就看save.asp这个文件吧! 4、save.asp 源代码: <%name=Replace(Request.Form("name"),"'","''") title=Replace(Request.Form("title"),"'","''") body=Replace(Request.Form("body"),"'","''") %> <%if name="" or title="" or body="" then%> 请后退填写完整资料,你才能发表帖子! <%else%> <%set savebbs=conn.execute("insert into bbs(name,title,body)values('"&name&"','"&title&"','"&body&"')")%> 发表成功!查看帖子 <%end if set savebbs=nothing %> 第一句:,意思是插入conn.asp文件,即与数据库进行连接! asp语句必须用<% %>这个格式包含起来,而插入文件的语句就不用, 接下来几句: name=Replace(Request.Form("name"),"'","''") title=Replace(Request.Form("title"),"'","''") body=Replace(Request.Form("body"),"'","''") “Replace(Request.Form("name"),"'","''")”意思是接收表单中名为name的文本框发来的数据, 而“name=Replace(Request.Form("name"),"'","''")”则是把发来的数据储存在name变量中, 如果你这样:“abc123=Replace(Request.Form("name"),"'","''")” 就是把表单中名为name的文本框发来的数据储存在abc123变量中 接着:if name="" or title="" or body="" then 判断name、title和body变量中是否没有填写内容,即为"",如果这样,就执行这一语句: “请后退填写完整资料,你才能发表帖子!” 该语句属于html语法,大家都看得懂的! "<%else%>"就是说“当if……then不成立(即是说所有内容都已经填写)”,就执行语句: “<%set savebbs=conn.execute("insert into bbs(name,title,body) values('"&name&"','"&title&"','"&body&"')")%> 发表成功!查看帖子” "set save=conn.execute"属于固定的语句,不过savebbs可以自己修改,"="后面的就难解释了: insert into bbs(name,title,body)意思是向名为bbs的表(在建立数据库时已经建立的表) 中的name,title,body字段插入,插入什么呢?看接下的values('"&name&"','"&title&"','"&body&"')") values是“值”的意思 就是插入向量name,title,body,向量用格式'"&name&"'表示 最后:end if就是结束if……then set savebbs=nothing可以说是关闭掉: set savebbs=conn.execute("insert into bbs(name,title,body) values('"&name&"','"&title&"','"&body&"')") 5、index.asp 源代码: 发表帖子

作者 主题

<%i=1 set showbbs=conn.execute("select*from bbs order by id desc") do while not showbbs.eof %>
<%=showbbs("name")%>  "><%=showbbs("title")%>

<%i=i+1 if i>50 then exit do showbbs.movenext Loop showbbs.Close set showbbs=nothing %> 这个文件就不一句一句的讲了 主要讲精华部分: set showbbs=conn.execute("select*from bbs order by id desc") 意思是:向数据库中的bbs数据表查询数据,并以id排顺序, 还有这么一句:<%=showbbs("name")%> 就是显示数据表中的name字段的数据,这里的showbbs就是set showbbs=……中的showbbs 代码中的i=1和i=i+1 if i>50 then exit do showbbs.movenext Loop showbbs.Close set showbbs=nothing 这几句属于循环语句,这里就不理他,理解了也不太好用,因为他只显示50张贴子! if i>50 then exit do中的50可以修改 但我们做论坛必须把帖子分页,又因为分页这个语句太复杂,我想就不讲了,等这一个弄懂了才来弄 还有一句很有用的: "><%=showbbs("title")%> 里面的超连接:show.asp?id=<%=showbbs("id")%>,注意:这里的超连接把帖子的id包含了, 等一下在show.asp文件中就有用了 5、show.asp 源代码: <%id=request.querystring("id")%> <%set show=conn.execute("select*from bbs where id="&id&"")%> 回到首页
发表帖子

作者:<%=show("name")%> 主题:<%=show("title")%>

内容:
<%=show("body")%>
<%set show=nothing%> 劲语句---精华语句: id=request.querystring("id") 在讲解index.asp文件的后面已经说到:show.asp?id=<%=showbbs("id")这一句, id=request.querystring("id")就是把地址栏中的id的值读取下来, 因为index.asp文件中的超连接点击后,地址栏就为http://…………/show.asp?id=数字, 所以show.asp使用id=request.querystring("id")语句把数字读取下来 于是接着使用:set show=conn.execute("select*from bbs where id="&id&"") 向数据表查询id为这时读取下来的数字的帖子,即where id="&id&" 最后<%set show=nothing%> 好了,一个简单的论坛就这样完成了,挂在我们自己的ASP空间上去试试

网络监听攻击技术



前言:

  在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,从而进行攻击。网络监听在网络中的任何一个位置模式下都可实施进行。而黑客一般都是利用网络监听来截取用户口令。比如当有人占领了一台主机之后,那么他要再想将战果扩大到这个主机所在的整个局域网话,监听往往是他们选择的捷径。很多时候我在各类安全论坛上看到一些初学的爱好者,在他们认为如果占领了某主机之后那么想进入它的内部网应该是很简单的。其实非也,进入了某主机再想转入它的内部网络里的其它机器也都不是一件容易的事情。因为你除了要拿到他们的口令之外还有就是他们共享的绝对路径,当然了,这个路径的尽头必须是有写的权限了。在这个时候,运行已经被控制的主机上的监听程序就会有大收效。不过却是一件费神的事情,而且还需要当事者有足够的耐心和应变能力。主要包括:

1. 数据帧的截获
2. 对数据帧的分析归类
3. dos攻击的检测和预防
4. IP冒用的检测和攻击
5. 在网络检测上的应用
6. 对垃圾邮件的初步过滤

研究的意义:

  1)我国的网络正在快速发展中,相应的问题也就显现出来,网络管理及相应应用自然将越发重要,而监听技术正是网络管理和应用的基础,其意义当然重要,放眼当前相关工具linux 有snort tcpdump ,snift 等,window 有nexray, sniffer等五一不是国外软件,随着中国网络的发展,监听系统必将大有用武之地,因此监听技术的研究已是时事的要求。

  2)为什么选择linux 作为环境?中国入世,各种针对盗版的打击力度和对于正版软件的保护力度都将大大加强,windows的盗版软件随处可见的现象将会一去不返,面对这样的情况,大部分的公司只有两种选择:要么花大价钱向微软购买正版软件,要么是用自由操作系统linux,特别是重要部门,如国家机关,政府部门,难道要把自己的办公系统操纵在国外大公司手里?北京的政府办公系统已经转用红旗linux,而且linux的界面也在不但的改进,更加友好易操作,我们有理由相信.linux将在我国大有作为,这也是研究Linux 下网络监听的原因。

关于Linux下网络监听技术主要有两个要点:

  1)如何尽可能完整的截取网络上的数据帧,因为以太网上每时每刻都可能有信息传递,而且根据以太网的规模不同网络上的信息量也变化不大,所以截取数据帧不仅要保证数据帧的完整,而且还要考虑到如何才能减少漏截取数据帧。

  2)就是对截取的数据帧的过滤分析,所谓监听当然要“听”得懂才行,所以把截取的数据帧翻译成我们能用的数据,监听才算成功。

网络监听的原理

  Ethernet协议的工作方式是将要发送的数据包发往连接在一起的所有主机。在包头中包括有应该接收数据包的主机的正确地址,因为只有与数据包中目标地址一致的那台主机才能接收到信息包,但是当主机工作在监听模式下的话不管数据包中的目标物理地址是什么,主机都将可以接收到。许多局域网内有十几台甚至上百台主机是通过一个电缆、一个集线器连接在一起的,在协议的高层或者用户来看,当同一网络中的两台主机通信的时候,源主机将写有目的的主机地址的数据包直接发向目的主机,或者当网络中的一台主机同外界的主机通信时,源主机将写有目的的主机IP地址的数据包发向网关。但这种数据包并不能在协议栈的高层直接发送出去,要发送的数据包必须从TCP/IP协议的IP层交给网络接口,也就是所说的数据链路层。网络接口不会识别IP地址的。在网络接口由IP层来的带有IP地址的数据包又增加了一部分以太祯的祯头的信息。在祯头中,有两个域分别为只有网络接口才能识别的源主机和目的主机的物理地址这是一个48位的地址,这个48位的地址是与IP地址相对应的,换句话说就是一个IP地址也会对应一个物理地址。对于作为网关的主机,由于它连接了多个网络,它也就同时具备有很多个IP地址,在每个网络中它都有一个。而发向网络外的祯中继携带的就是网关的物理地址。

  Ethernet中填写了物理地址的祯从网络接口中,也就是从网卡中发送出去传送到物理的线路上。如果局域网是由一条粗网或细网连接成的,那么数字信号在电缆上传输信号就能够到达线路上的每一台主机。再当使用集线器的时候,发送出去的信号到达集线器,由集线器再发向连接在集线器上的每一条线路。这样在物理线路上传输的数字信号也就能到达连接在集线器上的每个主机了。当数字信号到达一台主机的网络接口时,正常状态下网络接口对读入数据祯进行检查,如果数据祯中携带的物理地址是自己的或者物理地址是广播地址,那么就会将数据祯交给IP层软件。对于每个到达网络接口的数据祯都要进行这个过程的。但是当主机工作在监听模式下的话,所有的数据祯都将被交给上层协议软件处理。

  当连接在同一条电缆或集线器上的主机被逻辑地分为几个子网的时候,那么要是有一台主机处于监听模式,它还将可以接收到发向与自己不在同一个子网(使用了不同的掩码、IP地址和网关)的主机的数据包,在同一个物理信道上传输的所有信息都可以被接收到。

  在UNIX系统上,当拥有超级权限的用户要想使自己所控制的主机进入监听模式,只需要向Interface(网络接口)发送I/O控制命令,就可以使主机设置成监听模式了。而在Windows9x的系统中则不论用户是否有权限都将可以通过直接运行监听工具就可以实现了。

  在网络监听时,常常要保存大量的信息(也包含很多的垃圾信息),并将对收集的信息进行大量的整理,这样就会使正在监听的机器对其它用户的请求响应变的很慢。同时监听程序在运行的时候需要消耗大量的处理器时间,如果在这个时候就详细的分析包中的内容,许多包就会来不及接收而被漏走。所以监听程序很多时候就会将监听得到的包存放在文件中等待以后分析。分析监听到的数据包是很头疼的事情。因为网络中的数据包都非常之复杂。两台主机之间连续发送和接收数据包,在监听到的结果中必然会加一些别的主机交互的数据包。监听程序将同一TCP会话的包整理到一起就相当不容易了,如果你还期望将用户详细信息整理出来就需要根据协议对包进行大量的分析。Internet上那么多的协议,运行进起的话这个监听程序将会十分的大哦。

  现在网络中所使用的协议都是较早前设计的,许多协议的实现都是基于一种非常友好的,通信的双方充分信任的基础。在通常的网络环境之下,用户的信息包括口令都是以明文的方式在网上传输的,因此进行网络监听从而获得用户信息并不是一件难点事情,只要掌握有初步的TCP/IP协议知识就可以轻松的监听到你想要的信息的。前些时间美籍华人China-babble曾提出将望路监听从局域网延伸到广域网中,但这个想法很快就被否定了。如果真是这样的话我想网络必将天下大乱了。而事实上现在在广域网里也可以监听和截获到一些用户信息。只是还不够明显而已。在整个Internet中就更显得微不足道了。

监听的协议分析

  我们的研究从监听程序的编写开始,用Linux C语言设计实现 ,系统的程序模块及其相互关系如下图所示:

以太网上数据帧的监听剖析

  以太网上的数据帧主要涉及Tcp/ip协议,针对以下几个协议的分析:IP,ARP,RARP,IPX,其中重点在于ip和 arp协议,这两个协议是多数网络协议的基础,因此把他们研究彻底,就对大多数的协议的原理和特性比较清楚了。 由于各种协议的数据帧个不相同,所以涉及很多的数据帧头格式分析,接下来将一一描述。

  在linux 下监听网络,应先设置网卡状态,使其处于杂混模式以便监听网络上的所有数据帧。然后选择用Linux socket 来截取数据帧,通过设置socket() 函数参数值,可以使socket截取未处理的网络数据帧,关键是函数的参数设置,下面就是有关的程序部分:


if ( ( fd=socket (AF_INET, SOCK_PACKET,htons(0x0003)))<0)
{perror (“can get SOCK_PACKET socket
”);
exit(0);
}

  AF_INET=2 表示 internet ip protocol

  SOCK_PACKET=10 表示 截取数据帧的层次在物理层,既不作处理。

  Htons(0x0003)表示 截取的数据帧的类型为不确定,既接受所有的包。

  总的设定就是网卡上截取所有的数据帧。这样就可以截取底层数据帧,因为返回的将是一个指向数据的指针,为了分析方便,我设置了一个基本的数据帧头结构。


Struct etherpacket
{struct ethhdr eth;
struct iphdr ip;
struct tcphdr tcp;
char buff[8192];
} ep;

  将返回的指针赋值给指向数据帧头结构的指针,然后对其进行分析。以下是有关协议的报头:ethhdr 这是以太网数据帧的mac报头:


--------------------------------------------------------
|48bit 目的物理地址 | 48bit 源物理地址 | 16bit 协议地址|
--------------------------------------------------------

相应的数据结构如下


struct ethhdr
{
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
unsigned short h_proto;
}

  其中h_dest[6]是48位的目标地址的网卡物理地址,h_source [6] 是48位的源地址的物理网卡地址。H_proto是16位的以太网协议,其中主要有0x0800 ip,0x8035.X25,0x8137 ipx,0x8863-0x8864 pppoe(这是Linux的 ppp),0x0600 ether _loop_back ,0x0200-0x0201 pup等。Iphdr 这是ip协议的报头:

  由此可以定义其结构如下:


struct iphdr
{
#elif defined (_LITTLE_ENDIAN_BITFIELD)
_u8 version :4,
#elif defined (_BIG_ENDIAN_BITFIELD)
_u8 version:4,
ihl:4;
#else
#error "Please fix"
#endif
_u8 tos;
_16 tot_len;
_u16 id;
_u16 frag_off;
_u8 ttl;
_u8 protocol;
_u16 check;
_u32 saddr;
_u32 daddr;
};

  这是Linux 的ip协议报头,针对版本的不同它可以有不同的定义,我们国内一般用BIG的定义,其中version 是ip的版本,protocol是ip的协议分类主要有0x06 tcp.0x11 udp,0x01 icmp,0x02 igmp等,saddr是32位的源ip地址,daddr是32位的目标ip地址。

相应的数据结构:


struct arphdr
{
unsigned short int ar_hrd;
unsigned short int ar_pro;
unsigned char ar_hln;
unsigned char ar_pln;
unsigned short int ar_op;
#if 0
unsigned char _ar_sha[ETH_ALEN];
unsigned char _ar_sip[4];
unsigned char _ar_tha[ETH_ALEN];
unsigned char _ar_tip[4];
#end if
};

  这是linux 的arp 协议报头,其中ar_hrd 是硬件地址的格式,ar_pro协议地址的格式,ar_hln是硬件地址的长度,ar_pln时协议地址的长度,ar_op是arp协议的分类0x001是arp echo 0x0002 是 arp reply.接下来的分别是源地址的物理地址,源ip地址,目标地址的物理地址,目标ip地址。

Tcphdr ip协议的tcp协议报头

以下是相应数据结构:


struct tcphdr
{
u_int16_t source;
u_int16_t dest;
u_int32_t seq;
u_int32_t ack_seq;
# if _BYTE_ORDER == _LITTLE _ENDIAN
u_int16_t resl:4;
u_int16_t doff:4;
u_int16_t fin:1;
u_int16_t syn:1;
u_int16_t rst:1;
u_int16_t psh:1;
u_int16_t ack:1;
u_int16_t urg:1;
u_int16_t res2:2;
#elif _BYTE _ORDER == _BIG _ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#else
#error "Adjust your defines"
#endif
u_int16_t window;
u_int16_t check;
u_int16_t urg_ptr;
};

  这是Linux 下tcp协议的一部分与ip协议相同取BIG,其中source是源端口,dest 是目的端口,seq是s序,ack_seq是a序号,其余的是tcp的连接标志其中包括6个标志:syn表示连接请求,urg 表示紧急信息,fin表示连接结束,ack表示连接应答,psh表示推栈标志,rst表示中断连接。window是表示接受数据窗口大小,check是校验码,urg ptr是紧急指针。

Udphdr 这是udp协议报头


struct udphdr {
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
}

  这是Linux下ip协议中udp协议的一部分,结构很明显 source 源端口,dest目的端口,len udp 长度,check 是校验码。

Icmphdr 这是ip协议的icmp协议的报头


struct icmphdr
{
u_int8_t type;
u_int8_t code;
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo;
u_int32_t gateway;
struct
{
u_int16_t_unused;
u_int16_t mtu;
} frag;
} un;
};

  这是linux下的ip协议中的icmp的协议,这里面主要的是前两项参数,其中type是icmp协议的类型,而code 则是对type类型的再分析。如:type 0x03 是表示unsearchable,这时code的不同表示了不同的unsearchable :0x00表示网络不可寻,0x01表示主机不可寻,0x02表示协议不可寻,0x03表示端口不可寻,0x05表示源路由失败,0x06网络不可知,0x07主机不可知。

Igmphdr 这是ip协议的igmp协议报头


struct igmphdr
{
_u8 type;
_u8 code;
_u16 csum;
_u32 group;
};

  这是Linux下的ip协议中的igmp协议,协议中主要是前面两个属性,Type表示igmp 协议的信息类型,code表示routing code. 然后,将截取的数据帧的地址赋值给定义的结构.由此可根据不同的结构分析数据,得到我们需要的信息.

检测网络监听的方法

  网络监听在上述中已经说明了。它是为了系统管理员管理网络,监视网络状态和数据流动而设计的。但是由于它有着截获网络数据的功能所以也是黑客所惯用的伎俩之一。

检测规则的定义

  监听是为了得到我们需要的网络信息,然而网络中的信息流量可能很大,例如一个拥有百台计算机的网络其一般监听日志是每分钟以MB计算的,从如此大量的数据中找出我们需要的信息是很不容易的,于是我再程序中添加了检测规则的定义,如此用户就可以自己定义检测的规则从大量的数据中找到需要的数据并对其进行操作。关于定义的包括了我们感兴趣的大部分数据包属性:包括了源地址,目的地址,源ip地址,目的ip地址,源端口,目的端口,协议类型,连接标志,数据包数量,时间限制等。

  如我们可定义将源物理地址为172.16.11.148且源端口为25,协议为tcp连接标志为syn的数据存入相关日志文件中,并且在检测中采取链式规则,就是我们可以定义很多的规则而数据将像过流水线一样通过各个规则的检测处理,该功能和现在大多数的入侵检测系统的规则定义相似,有了这种功能使网络监听更具针对性,可以满足不同用户的需要。

一般检测网络监听的方法通过以下来进行:

  网络监听实际上是很难被发现的。因为运行监听程序的主机在进监听的过程中只是被动的接收在以太网中传输的信息,它不会跟其它的主机交换信息的,也不能修改在网络中传输的信息包。这就说明了网络监听的检测是比较麻烦的事情。

  一般情况下可以通过ps -ef或者ps -aux来检测。但大多实施监听程序的人都会通过修改ps的命令来防止被ps -ef的。

  上边提到过。当运行监听程序的时候主机响应一般会受到影响变的会慢,所以也就有人提出来通过响应的速率来判断是否受到监听。如果说当你怀疑网内某太机器正在实施监听程序的话,可以用正确的IP地址和错误的物理地址去ping它,这样正在运行的监听程序就会做出响应的。这是因为正常的机器一般不接收错误的物理地址的ping信息的。但正在进监听的机器就可以接收,要是它的IP stack不再次反向检查的话就会响应的。不过这种方法对很多系统是没效果的,因为它依赖于系统的IP stack。

  另一种就是向网上发大量不存在的物理地址的包,而监听程序往往就会将这些包进行处理,这样就会导致机器性能下降,你可以用icmp echo delay来判断和比较它。还可以通过搜索网内所有主机上运行的程序,但这样做其的难度可想而知,因为这样不但是大的工作量,而且还不能完全同时检查所有主机上的进程。可是如果管理员这样做也会有很大的必要性,那就是可以确定是否有一个进程是从管理员机器上启动的。

  在Unix中可以通过ps –aun或ps –augx命令产生一个包括所有进程的清单:进程的属主和这些进程占用的处理器时间和内存等。这些以标准表的形式输出在STDOUT上。如果某一个进程正在运行,那么它将会列在这张清单之中。但很多黑客在运行监听程序的时候会毫不客气的把ps或其它运行中的程序修改成Trojan Horse程序,因为他完全可以做到这一点的。如果真是这样那么上述办法就不会有结果的。但这样做在一定程度上还是有所作为的。在Unix和Windows NT上很容易就能得到当前进程的清单了。

  还有一种方式,这种方式要靠足够的运气。因为往往黑客所用的监听程序大都是免费在网上得到的,他并非专业监听。所以做为管理员用来搜索监听程序也可以检测。使用Unix可以写这么一个搜索的小工具了。有个叫Ifstatus的运行在Unix下的工具,它可以识别出网络接口是否正处于调试状态下或者是在进听装下。要是网络接口运行这样的模式之下,那么很有可能正在受到监听程序的攻击。Ifstatus一般情况下不会产生任何输出的,当它检测到网络的接口处于监听模式下的时候才回输出。管理员可以将系统的cron参数设置成定期运行Ifstatus,如果有好的cron进程的话可以将它产生的输出用mail发送给正在执行cron任务的人,要实现可以在crontab目录下加****/usr/local/etc/ifstatus一行参数。这样不行的话还可以用一个脚本程序在crontab下00****/usr/local/etc/run-ifstatus。

  一般情况下监听只是对用户口令信息比较敏感一点(没有无聊的黑客去监听两台机器间的聊天信息的那是个浪费时间的事情)。所以对用户信息和口令信息进行加密是完全有必要的。防止以明文传输而被监听到。现代网络中,SSH通信协议一直都被沿用,SSH所使用的端口是22,它排除了在不安全信道上通信的信息,被监听的可能性使用到了RAS算法,在授权过程结束后,所有的传输都用IDEA技术加密。但SSH并不就是完全安全的。因此,总的说来,监听的检测属于安全防范的内容,需要非常综合的知识和技能进行分析设计。

安全方面的考虑

DOS 攻击的检测与预防

  我国还在网络的发展阶段,自然有网络“hacker”、“crack”出现,也正是由于是发展阶段,这些人的攻击手段一般靠一些工具,这些工具一般分为破解性和破坏性,破解性耗时长成功率低,而破坏性的工具较符合这些人的性格故受欢迎,而DOS攻击工具攻击方便,成功率高,一般是“hacker”的首选。

  所谓的DOS攻击是一种拒绝服务攻击,它并不是入侵系统,而只是让系统崩溃,或处于拒绝连接状态,DOS攻击的方法主要是发送大量假的syn包使服务器忙于应答和等待假syn的请求无法对正常的连接作出反应,或发送大量的广播包利用某系系统对一些广播包会产生回应得bug来形成广播风暴阻塞网络,消耗服务器资源达到进攻目的。现在还出现了分布式的DOS攻击工具,它通过控制多台分机同时发送到攻击包,威力巨大,同时,DOS攻击还可能是另一种供给的前奏,这就是IP欺骗攻击(该攻击可以获得ROOT权限,危险系数最高),如果出现了DOS攻击但又不阻塞网络,且攻击目标不起眼,那么这很可能就是一个IP欺或TCP截取的开始,所以DOS攻击是一种破坏力大,效果明显,且暗藏杀机的攻击。

  热而DOS攻击是较容易检测的,其攻击现象明显,攻击特征突出,通过对网络的监听不难发现,如上所述我们已经可以从网络上监听数据帧并能分析他们,于是编写一个程序使用户可以通过定义自己的规范与数据帧比较然后对符合规范的数据作出相应的反应,对于DOS攻击我们可以通过定义一个带有时间限制的规范来检测,如我们可以定义在1秒如出现100个以上的syn数据包为DOS攻击,然后定义处理方法,如MAIL,LOG,SHUTDOWN或与防火墙联动等。

IP冒用的检测与攻击

  网络的飞速发展导致了原有的32位地址协议不能满足飞速扩充的庞大计算机群,。利益不能均分,导致了IP冒用的出现,使网络秩序产生混乱。

  在这里先解释一下ARP协议的应用。ARP协议是将IP地址转换成MAC地址的协议,是局域网数据交流的基础,一台计算机是如何将自己和某一IP地址绑定?首先,一台计算机启动,他将向局域网发送其IP的ARP询问包,这是为了防止IP冲突,如无人回答,其将发送其IP的ARP应答包,向局域网申明绑定其物理地址和ip地址,如果没有在服务器上使用固定的ip/mac表那么没有ip使用权的计算机也可以乘机绑定ip,这就是ip冒用。

  对网络监测的利用可以达到检测ip冒用的出现并对之进行攻击的目的。具体方法是将检测到的arp数据帧中的ip 和 eth 地址取出来与我们建立的对应表比较,如发现ip冒用的情况,则向其发送反向arp包使其网络中断实现攻击,该做法适用于那些无法控制路由器配置,又不想修改网关配置的网络管理。在程序中我采用的是被动式的arp查询,也就是不发arp查询包,可以说出了发攻击包外对网络没有增加另外的负担。

监听技术在网络测试中的应用

  网络监听不只是网络管理的基础,还能应用在网络测试中,现在的网络测试工具大都建立在监听基础上,对监听到的数据帧的种类和数量进行统计,从而实现网络的测试。同理可以使用本监听程序对数据分类统计达到测试网络的作用。

  例如目前较多用到的网络测试:

  1)检测广播包在网络中的负载,即检测广播包在所有包中的比例,只要在程序中比较数据帧中目的地址的物理地址为ff:ff:ff:ff:ff:ff与总帧数的比例就可得知。从而给出了配置VLAN等的数据基础。

  2)检测网络中因冲突产生的坏数据帧的数量,因为共享式以太网采取的CSMA/CD协议,每台计算机发送信号时不能保证没有有其它计算机也在发送信号,而在发现冲突后就停止发送,故会产生一些损坏的数据帧,检测损坏的数据帧在网络数据中的比例是体现网络性能的重要参数,这种检测对于监听程序而言和第一种检测大体相同,只是把统计的数据包改成冲突的数据帧,也就是数据帧大小小于64个字节的数据帧的数量,同理类是网络测试都可以通过监听程序实现,由此我们可以分析出更合适具体情况的布线方法等等。

垃圾邮件过滤的初步实现

  垃圾邮件就是过滤到那些我们不想接受的,内容不安全的电子邮件,由于电子邮件的服务特点,使得电子邮件成为当代社会信息传递的便捷途径之一,但同时也有一些人利用这一点发送不安全的危害社会的宣传,于是垃圾邮件过滤就成为了必要,由于当前邮件服务器管理的松懈,随便一个人有台计算机有个IP就可以组建服务器,使得邮件的来源相当复杂,所以要完全过滤不容易,但我们还是可以通过网络监听来实现邮件的初步过滤.

  第一种方法:就是屏蔽某些ip的swtp连接,通过监听程序可以实现这点,如设定规则当源IP地址为****且TCP连接端口为25时就屏蔽连接。

  第二种方法:由于很多电子邮件服务器允许邮件转发(这也是必要的,我们不可能能连接到每一台机),所以通过ip地址不一定可以屏蔽这个用户的邮件他可以通过其他的服务器转发,因此在第一种方法无效的情况下我们可以通过账号来屏蔽服务,由于电子邮件服务器的统一命令要求需要用户在发邮件时申明用户例如:mail from XXX@XXX ,所以我们可以通过监听程序来发现我们不喜欢的用户并屏蔽,这要求我们对数据帧不仅分析报头,还要分析数据,将其与我们设定的字符串比较,如相同,则找到了屏蔽连接.



硬盘还原卡的破解

,

还原卡也称硬盘保护卡,学校等单位采用较多,可以保护硬盘数据不被恶意修改,删除。保护卡是一种硬件芯片,插在主板上与硬盘的MBR协同工作。在说明原理前,我想先提一种技术“BIOS映射地址搬移”。这种技术在前几年,大行其道,但均秘而不喧。诸位以前玩解密的时候可能都用过龚成宾的SIMU97吧。它能在只读的BIOS地址区实现写入,因而能拦截到CALL F000:EC59等调用。这种调用在以软盘为载体的加密方案中,有重要意义,后来为了躲过它,王江民没办法使用了UPD765。不过,根据我的分析UPD765读写软盘时照样可以拦截。刚才提的那种拦截方式的原理是这样的[跟踪所得],通过调用Int15h子功能,其他方法也可以,只要能切入保护模式,切入保护模式后,改掉BIOS所在段的段描述符。这种方法可以实现BIOS段的重定位,当然就可以让它可写入了。用Int13H读软盘时Int13H会调用F000:EC59,这是拦截Int13h 的一种高级手段。其实围绕硬盘保护的加密解密关键就看谁拦截的位置更底层。但对与硬盘保护卡来说,只要恢复Int13的BIOS级中断向量就够了。具体如何破解呢?找到Int13h的原始BIOS中断向量值,填入中断向量表。这样修改以后其他对Int13H 的钩子通常就被绕过了 [有些部份如果觉得简单请跳过看 ^_^]



下面是找Int13入口的方法,我常用的几种:
1。手工运行Debug,最好在纯DOS下:



  Debug
- a100
- xor ax,ax 注意: 前面要加上功能号以选择Int13H内部的流程,避免进入其他不经过原始入口的流程
- int 13
- int3
然后输入t回车,不断的重复,直到显示的地址形如 F000:xxxx。记下这一地址,按q 回车退出。 这里假设了第一个F000:xxxx就是要找的入口,实际上可以在第2,3,4,。。。。出现,要自己判断一下,通常认为就是第一个。
在(0:13H*4)=0:4cH 处填入这个地址。



例如得到的地址是F000:1234



运行debug
-e 0:4c 34 12 00 F0 =======>把得到的原始入口填入Int13H的中断向量表
-q



注意:



填的时候要仔细,填错的话会死机。有些经过针对性处理的机器,要进一步鉴别。如在Int13内部调    用Int1ch. 如果在trace过程中发现如下代码 CMP DL,80[意思是判断是否针对硬盘操作] ,可以尝试修改成不存在的硬盘号,比如改成CMP DL,FF。其他的都不要修改.试试    硬盘可写吗?如果可以的话就万事大吉了。另外,不能在Windows的虚拟DOS窗口中使用这种方法。如果在Windows的虚拟DOS窗口运行的话,请使用下一种方法。




2。Debug
- s F000:0 ffff 80 fa 80 强行搜索BIOS区,通过比较入口代码找到原始入口点



你可能会发现有好几处。根据我的多次破解经验,通常这个地址在F000:8000以后。试验一下: 如果U F000:xxxx地址后发现代码类似
    -u F000:xxxx
PUSHF
CMP DL,80
JZ ....
 .
 .
 .
[有些不是这样,要注意鉴别。]



的话,填入向量表试试。通常破解就完成了。




我曾经发现经过以上中断还原后,仍不能写盘,或者死机的情况。经跟踪发现Int8H,Int 1CH,Int15H等向量对
Int13H进行了向量保护。解决办法:把Int8H,Int1cH,Int15H 也改会原始中断点(也是BIOS中断)。尝试写盘成功
  
如果想获得保护卡密码的话,可以参考以下步骤:



1。找到Int13h原始点设回中断向量表。
2。读出MBR
3,分析读出的MBR,找到密码算区和加密算法
4,推算出密码

January 2010
S M T W T F S
December 2009February 2010
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30