星期四, 一月 25, 2007

破解交换机密码地全部过程

破解交换机密码地全部过程

交换机和路由器都需要有一定的安全保证,也就是说要及时为他们配置合理的密码,那么如果这个密码忘记了怎么办呢?笔者就遇到过这么一次,由于岗位调动,以前的网络管理员离开了本部门,却把交换机上设置了密码,而且没有告诉我这个接任的网络管理员。怎么办呢?送回厂商破解又太麻烦了。于是我亲手经历了一次破解密码的过程。

一、网络环境

公司使用实达的3500系列(具体型号是3548)交换机,在交换机上面连接了一台华为2621路由器,通过电信的光纤上网。实际情况这台实达3548交换机被以前的网络管理员设置了密码而没有告诉我。所以破解他的密码成为本篇文章的核心。

二、准备工作

由于整个工作需要断网,毕竟涉及到重新启动交换机等操作,所以选择时间在工作下班后的晚上23点。另外由于破解密码这类操作都必须使用CONSOLE控制台线来设置,所以地点只能是中心机房。笔者找到了实达3548设备的所有相关工具,包括安装说明与CONSOLE控制线等。

三、实战破解密码

根据笔者以往经验实达所有设备的使用和操作命令语句都应该和CISCO设备类似,所以原本以为按照破解CISCO设备密码的步骤就可以轻松搞定。谁知道一上手才发现原来差别还真不小。一般来说CISCO设备都是通过修改配置寄存器configuration register来实现破解密码的操作。在实达交换机中根本不存在配置寄存器configuration register这个概念。通过查询资料才发现,原来实达交换机是使用修改超级终端配置的方法来破解密码的。

第一步:将实达交换机的配套CONSOLE控制线连接到设备的CONSOLE管理接口。

第二步:将CONSOLE控制线的另一断连接到网络管理员调试使用的笔记本的COM串口上。

第三步:进入笔记本系统桌面,点“开始->所有程序->附件->通讯->超级终端”。

第四步:启动系统的超级终端后我们随便为新建立的连接起一个名字。

第五步:在连接设置处的“连接时使用”地方通过下拉菜单选择刚刚使用CONSOLE控制线连接的端口。例如COM1口。

第六步:在COM1属性设置窗口中我们对连接的参数进行配置。一般来说我们正常连接交换机应该采用每秒位数9600,数据位为8,奇偶校验是无,停止位是1,数据流控制是无。不过要是想破解实达交换机的密码的话就需要修改这些数值。将PC超级终端串口速率设成57600,其他和上面写的相同即可。

第七步:使用终端连接到交换机后,再打开交换机的电源,在交换机启动后进行自检时立即按下“ESC”键多次进入交换机的监控模式。终端界面将出现多个选项,包括一些基本的初始化设置。

小提示:

刚开始笔者按照第七步的步骤尝试并没有成功,超级终端界面总是显示很多个“。。。。。”。后来才发现原来交换机必须在超级终端连接后才能加电启动,如果先开交换机再用超级终端连接的话则无法进入监控模式。

第八步:根据菜单提示,将配置文件config.text上传(Upload)至网络管理员使用的笔记本,然后删除交换机上的配置文件Config.text。

第九步:在笔记本上打开刚下载的保存在系统硬盘中的config.text文件,将以下语句

enable secret level 1 5 !E,1u_;C9&-8U0H

enable secret level 15 5 *r_1u_;C3vW8U0H

删除然后保存退出。

第十步:根据交换机监控模式的提示,将笔记本上修改的config.text再下载(Download)到交换机中。

第十一步:重新将笔记本的超级终端串口速率设成9600,其他保持默认参数。交换机加电重启后,进入交换机配置界面,你就会发现我们可以重新配置交换机的密码了,包括远程TELNET的管理密码以及本机的特权密码。此后交换机的密码也将变成你刚刚配置的,而其它配置则保留不变,并不会影响任何使用。

小提示:

在实际使用中笔者发现使用实达3550交换机的监控模式中的上传和下载文件功能并不稳定,经常出现传输失败的提示。所以笔者索性直接在监控模式中将config.text删除,然后重新启动交换机重新配置所有交换机信息。这种情况适用于交换机自身配置不多也不复杂,另外网络管理员也需要对设置语句比较熟悉。

总结

经过本次实战破解交换机密码的操作,笔者再次明白了对于路由交换设备来说,不同厂商操作程序和步骤绝对是不同的,即使命令语句类似但是在其他高级操作上还是大相径庭的。因此本篇文章介绍的所有内容仅仅是针对实达路由器与交换机,如果你遇到的是其他设备则需要采取其他的方法来解决。

黑客非法探取密码的原理及安全防范

一、非法获取Password的原理

Edit控件是Windows的一个标准控件,当把其Password属性设为True时,就会将输入的内容屏蔽为星号,从而达到保护的目的。虽然我们看来都是星号,但程序中的Edit控件实际仍是用户输入的密码,应用程序可以获取该控件中的密码,其他应用程序也可以通过向其发送WM_GETTEXT或EM_GETLINE消息来获取Edit控件中的内容。黑客程序正是利用Edit控件的这个特性,当发现当前探测的窗口是Edit控件并且具有ES_PASSWORD属性时,则通过SendMessage向此窗口发送WM_GETTEXT或EM_GETLINE消息,这样Edit框中的内容就一目了然了。

二、黑客软件工作方法

首先要取得当前的窗口,并判断是否是Edit控件,一般多通过鼠标来指定要探测的窗口,例如在WM_MOUSEMOVE消息的响应函数中进行判断,现列举代码片段如下:

//将客户坐标转换成屏幕坐标

ClientToScreen(&point);

//返回一个包含指定屏幕坐标点的窗口

CWnd* pWnd = CWnd::WindowFromPoint(point);

if (pWnd)

{

//获取窗口句柄

HWND hwndCurr = pWnd->GetSafeHwnd();

if ((::GetWindowThreadProcessId (GetSafeHwnd(), NULL)) !=

(::GetWindowThreadProcessId (hwndCurr, NULL)))

{

char lpClassName[255];

//获取类名

if (::GetClassName(hwndCurr, lpClassName, 255))

{

//判断是否是Edit控件

if (0 == m_strWndClass.CompareNoCase("EDIT"))

{

//获取窗口风格

LONG lStyle = ::GetWindowLong(hwndCurr, GWL_STYLE);

//如果设置了ES_PASSWORD属性

if (lStyle & ES_PASSWORD)

{

char szText[255];

//通过掌握的句柄hwndCurr向此控件发送WM_GETTEXT消息

::SendMessage(hwndCurr, WM_GETTEXT, 255, (LPARAM)szText);

//密码已保存在szText中

m_strPassword = szText;

}

}

}

}

}

上述代码中值得注意的有以下几个关键地方:

ClientToScreen(&point);

CWnd* pWnd = CWnd::WindowFromPoint(point);

HWND hwndCurr = pWnd->GetSafeHwnd();

这三句代码可以获取当前鼠标位置所在窗口的窗口句柄,在SendMessage中要用到的。

这便是真正起作用的SendMessage了,其第一个参数指定了要接收消息的窗口句柄,我们已经通过上面的代码获取到了,第二个参数就是让Edit控件返回字符的WM_GETTEXT消息了,并将得到的内容保存在szText中。

三、防范措施

既然我们搞清除了黑客软件普遍采取的手法,那我们自然能制订出一套防范其攻击的措施来。下面我们就要对Password进行保护。从以上分析我们可以看出:Edit控件的漏洞主要在于没有对发送WM_GETTEXT或EM_GETLINE消息者的身份进行检查,只要能找到Edit窗口句柄,任何进程都可获取其内容。所以必须要对发送消息者的身份进行验证,这里给出一种方法来验证发送消息者的身份是否合法:

1.创建新CEdit类

从CEdit继承一个子类CPasswordEdit,申明全局变量g_bSenderIdentity表明消息发送者的身份: BOOL g_bSenderIdentity;

然后响应CWnd的虚函数DefWindowProc,在这个回调函数中进行身份验证:

LRESULTCPasswordEdit:efWindowProc (UINTmessage,WPARAMwParam,LPARAMlParam)

{ //对Edit的内容获取必须通过以下两个消息之一

if((message==WM_GETTEXT)

||(message==EM_GETLINE)) { //检查是否为合法

if(!g_bSenderIdentity)

{

//非法获取,显示信息

AfxMessageBox(_T ("报告:正在试图窃取密码!"));

return 0;

}

//合法获取

g_bSenderIdentity=FALSE;

}

return CEdit:efWindowProc (message,wParam,lParam);

}

2.在数据输入对话框中做些处理

在对话框中申明一个类成员

m_edtPassword:CpasswordEdit m_edtPassword;

然后在对话框的OnInitDialog()中加入下列代码:

m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD,this);

将控制与新类做关联。之后要在对话框的数据交换函数中将身份设为合法:

void CDlgInput:oDataExchange (CDataExchange*pDX)

{ //如果获取数据

//注意:对于CPropertyPage类这里不需要if (pDX->m_bSaveAndValidate)条件

if(pDX->m_bSaveAndValidate)

{

g_bSenderIdentity=TRUE;

}

CDialog:oDataExchange(pDX);

//{{AFX_DATA_MAP(CDlgInput)

DDX_Text (pDX,IDC_EDIT_PASSWORD,m_sPassword); //}}AFX_DATA_MAP

}

这样,Password输入框就拥有了合法身份,会受到保护。

结论

以上的方法仅针对VC程序,对于其他语言如VB、Delphi等语言,需要借助VC做一个Password的ActiveX控件,实现方法与上述方法基本类似。以上程序均用VisualC++6.0编制调试通过。

没有评论:

推广链接