用Wireshark抓包来揭开ftp client GG和ftp server MM的勾搭内容并用C代码来简要模拟实现W

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

      前面, 我们玩过http, 颇有点意思, 在本文中, 我们继续来玩ftp(file transfer protocol).   http和ftp都是建立在tcp之上的应用层协议, 无论他们怎么包装, 怎么装bigger, 最终还是基于tcp端到端传输的。本文主要分为两个部分: 一. 用Wireshark抓包来揭开ftp client GG和ftp server MM的勾搭内容。二.用C代码来简要模拟实现Windows自带的ftp client. 

 

      说明, 本文中的实验, 我用了两台电脑, 分别是pc1(192.168.1.100)和pc2(192.168.1.102). 其中, pc1做客户端(ftp client GG), pc2做服务端(ftp server MM)。  好吧, 开启两台电脑的电源按钮吧,  来玩ftp。


       一. 用Wireshark抓包来揭开ftp client GG和ftp server MM的勾搭内容

       1. 在pc2上开启ftp server MM, 设置用户名为1, 密码为1. 我们在pc2的cmd中执行netstat -nao | findstr 21 可以看到, pc2开启了21端口的监听。 在ftp server MM对应的目录下创建a.txt和b.txt两个文件。(ftp server MM的搭建方法请参考我之前的博文:http://blog.csdn.net/stpeace/article/details/38026285)

       2. 在pc1上进行wireshark抓包, 并打开cmd, 依次执行如下命令, 得到结果为:

C:\Documents and Settings\Administrator>ftp 192.168.1.102
Connected to 192.168.1.102.
220 欢迎访问 Slyar FTPserver!
User (192.168.1.102:(none)): 1
331 Please specify the password.
Password:
230 Login successful.
ftp>
ftp>
ftp> dir
200 Port command successful.
150 Opening ASCII mode data connection for directory list.
-rwx------ 1 user group              0 Apr 16 23:04 a.txt
-rwx------ 1 user group              0 Apr 16 23:04 b.txt
226 Transfer complete
ftp: 收到 118 字节,用时 0.01Seconds 7.87Kbytes/sec.
ftp>


    我们首先执行ftp 192.168.1.102, 此时ftp client GG与ftp server MM建立tcp连接, 然后输入用户名和密码进行认证。 认证通过后, 最后用dir命令来查询ftp server MM中有什么东东, 结果看到了a.txt和b.txt文件

     3. 我们将抓包文件保存下来(port.cap), 进行分析, 截图如下:


     4.  第1.2个包很简单, 住pc1发的arp广播, 主要是去找192.168.1.102这台电脑(pc2)的mac, 第3个包就表明成功获取了pc2的mac地址, 有了mac才能通信啊。

     5.  实际上, 上述的arp操作是由ftp 192.168.1.102触发的, 其实ftp 192.168.1.102的更重要用途是与ftp server MM建立tcp连接通道。第4, 5, 6个包就是传说中的三次握手协议, 太重要太基础, 故不多说。

     6. 第7-14个包主要用户ftp client GG与ftp server MM之间的用户名和密码认证, 约妹子, 要获得妹子的验证和认可, 也是理所当然的了。

     7. 当我们执行dir命令时,会触发后续所有的包。 第15个包是ftp client GG向ftp server MM发送PORT 192,168,1,100,7,220命令, 并对ftp server MM说: 你待会儿要主动跟我连接我, 建立数据传输的tcp通道(第二个tcp通道), 我监听地址是192.168.1.100上的 (7*256+220) 端口, 并意犹未尽地暗示: 你这个ftp server MM要主动一点来联系我, 我就在刚才的那个ip和port处等你, 不见不散。 此时ftp server GG端开始监听(7*256+220)这个端口, 等待ftp server MM主动上钩。 第16个包是ftp server MM的回应, 意思是在说: 好的, 我一定会去那个地点那个端口找你。

    8.  第17个包是ftp client GG发送的dir请求, 意思是询问ftp server MM: 请问你家产有多少?

    9.  第18个包是ftp server MM的回应, 仿佛在说: 我已经知道你在问什么问题了, 我待会儿会在我们之前约定的地点告诉你(第二个临时的tcp通道)。

    10.  好,到此为止, ftp client GG和ftp server MM的第一轮勾搭暂时告一段落。注意, 是暂时告一段落, 不是终止, 你看看, 根本没有挥手byebye的收据包啊。

    11.  好, ftp client GG和ftp server MM的第二轮勾搭正式开始, 只不过, 这次, ftp server MM开始骚动了, 主动到照预约的地点去上钩, 请看第19-21个包, 这就是第二轮勾搭的三次握手协议。

    12.  我们来一起仅仅地盯住第22个包, 这次, ftp server MM要在刚刚建立的tcp通道(第二个临时的tcp通道)上来传输数据了, 别忘了, ftp client GG在第一轮勾搭中问过ftp server MM家有多少财产, 这次, ftp server MM该说实话了, 财产肯定会涉及到隐私啊, 所以用新的tcp通道来回馈。 展开第22个包, 我们看到ftp server MM终于不再矜持了, 把自己的家产和盘托出, 通信内容为:

-rwx------ 1 user group              0 Apr 16 23:04 a.txt
-rwx------ 1 user group              0 Apr 16 23:04 b.txt

     13. 我们看到, 其实, ftp serve MM家里也没有多少财产, 只有可怜巴巴的a.txt和b.txt两个空空的文件。

     14. 后续的23-29个包无非就是一些挂电话的过程(关闭第二个临时的tcp通道), 说byebye了, 可以清晰看到有断开socket的过程。 值得注意的是第28个包, ftp server MM非常贴心地说: 我已经说说完了, 财产就这么多, 接下来你开着办吧。

     15. 请注意, 到此为止, ftp client GG和ftp server MM的在第二个tcp通道上已经断开了, 但是在第一个tcp通道上仍然保持着联系。 后续如果ftp client继续执行其他请求命令, 比如探探三围啊, 他自身又会重新开启新的随机端口进行监听, 并把这个随机端口又一次告诉ftp server MM, 让ftp server MM来发起第三次临时tcp连接。 同理, ftp server MM会在第三个tcp通道上吧三围数据告诉给ftp client GG, 随后第三个临时的tcp通道也会被拆除。 不变的是, 第一个tcp通道依然在那里紧紧相连。

     总结: 以上就是ftp的主动模式。 第一个“永久”tcp通道主要用来传递请求命令, 是ftp client GG主动去勾引ftp server MM, 后续的第二/三/四...个临时tcp通道主要用来传数据, 而且是ftp server MM主动上钩。所谓的ftp主动模式, 是指ftp server MM主动。


      二.用C代码来简要模拟实现Windows自带的ftp client.

      到此为止, 对tcp主动模式应该有了比较通透的理解了, 现在我们尝试来用C代码简要模拟一下上述过程, 模拟ftp client GG的代码如下:

// 我花了较长时间调试, 如果要转载, 请注明本博客地址, 尊重版权// 博客地址:http://blog.csdn.net/stpeace/article/details/45100687#include <stdio.h>#include <string.h>#include <winsock2.h>  // winsock接口#pragma comment(lib, "ws2_32.lib") // winsock实现库// 缓冲区长度#define LEN (1024 + 1)  SOCKET g_ctrlSocket = 0// ftp client端负责在"命令控制tcp通道"上通信的socketSOCKET g_listenSocket = 0// ftp client端负责监听的socketSOCKET g_dataSocket = 0// ftp client端负责在"数据传输tcp通道"上通信的socket// 创建"命令控制tcp通道"的通信socketint createCtrlSocket(){ g_ctrlSocket = socket(AF_INET, SOCK_STREAM, 0); return 0;}// 获取ftp server 在"命令控制tcp通道"上返回的信息int getCmdResFromFtpServer()char szRecvBuf[LEN] = {
   0}; int nRet = recv(g_ctrlSocket, szRecvBuf, sizeof(szRecvBuf) - 1, 0); if(nRet < 0) {  printf("recv error\n");  return -1; } if(0 == nRet) {  printf("connection has been closed by ftp server");  return -1; } printf("%s", szRecvBuf);  return 0;  }// 建立"命令控制tcp通道"int connectFtpServer<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值