1、通过FTP服务的winsockes录制脚本通过服务的winsockes录制脚本测试对象:网闸什么是网闸呢?网闸在GB/T20279-2006信息安全技术网络和终端设备隔离部件安全技术要求中的定义是这样的:“网闸()”该信息安全部件位于两个不同的安全域之间,通过协议转换手段,以信息摆渡方式实现数据交换,且只有被系统明确要求传输的信息可以通过。其信息流一般是通用应用服务。上面提到两个概念协议转换和信息摆渡,下面解释两个概念,此概念出自GB/T20279-2006信息安全技术网络和终端设备隔离部件安全技术要求1) 协议转换在隔离部件中,协议转换的定义是协议的剥离和重建。在所属某一安全域的隔离部件一端
2、,把基于网络的公共协议中的应用数据剥离出来,封装为系统专用协议传递至所属其他安全域的隔离部件的另一端,在将专用协议剥离,并封装成需要的格式。2) 信息摆渡信息交换的一种方式,物理传输信道只在传输进行时存在。信息传输时,信息先由信息源所在安全域的一端传输至中间缓存区域,同是断开中间缓存区域与信息目的所在安全区域的链接;随后接通中间缓存区域与信息目的所在安全区域的传输信道,将信息传输至信息目的所在安全域,同时在信道上物理断开信息源所在安全域与中间缓存区的连接。在任一时刻,中间缓存区域只与一端安全区域连接。测试环境 测试环境说明:1) 上述测试环境中内网的客户端PC通过交换机链接到网闸的内网口,外网
3、服务器通过交换机链接到外网口;2) 内网客户端可以通过网闸的代理访问外网应用服务器;3) 访问过程中内网客户端需要设置代理指向网闸内网IP。4) 在这个测试中假设A安装FTP客户端CuteFTP,D安装FTP服务serV-U6.2.3。测试工具1) LoadRunner8.1.0.4 开发脚本生成负载;2) CuteFTP 7.0 FTP客户端,生成FTP业务流;3) SerV-U6.2 设置FTP服务器破解版(没有并发用户限制),仿真服务;脚本设计1) 客户端通过Socks代理访问FTP服务器,正常流程需要在客户端设置socks代理,然后就可以访问外网的FTP服务器;2) 情况1录制脚本的时
4、候选择FTP协议,直接录制脚本;3) 情况2选择Winsocks协议,录制脚本;4) 在情况2时录制脚本后回放确认是否成功。录制脚本1. FTP协议录制1) 打开LR VUG,选择FTP协议开始录制脚本,程序选择CuteFTP7.0;2) 开始录制,执行用户登录,下载文件,退出;3) 停止录制,查看脚本;结果:在录制完成后,查看脚本,VUG中看到没有录制到脚本,当时茫然,但具体分析一下应该是有问题的,首先客户端发出去的请求是发向socks代理服务器的,而不是直接发给FTP服务器,所以交互的信息都是socket信息;这样当然不能生成FTP协议的脚本,因为VUG不能捕捉到正常的FTP交互信息,而这
5、写信息都被封装在socks协议中;经过分析我放弃了这种方法;2. Winsocks协议录制1) 重新选择winsocks协议,程序选择CuteFTP7.0;2) 开始录制,执行用户登录,下载文件,退出;3) 停止录制,查看脚本,结果:脚本录制成功,脚本回放失败;分析一般情况下winsocks脚本录制完成后都不能直接回放,需要经过关联和调试后才能通过;脚本如下:Action() lrs_create_socket(socket0, TCP, RemoteHost=192.168.2.195:1080, LrsLastArg); lrs_send(socket0, buf0, LrsLastArg
6、); send buf0 3 x05x01x00 lrs_receive(socket0, buf1, LrsLastArg); recv buf1 2 x05x00lrs_send(socket0, buf2, LrsLastArg); send buf2 10 x05x01x00x01 括 x05xbbx00x15lrs_receive(socket0, buf3, LrsLastArg);recv buf3 59x05x00x00x01括x02纮x9e220 Serv-U FTP Server v6.3 for WinSock ready.rnlrs_send(socket0, buf4
7、, LrsLastArg);send buf4 11USER rootrnlrs_receive(socket0, buf5, LrsLastArg);recv buf5 36331 User name okay, need password.rnlrs_send(socket0, buf6, LrsLastArg);send buf6 13PASS 111111rnlrs_receive(socket0, buf7, LrsLastArg);recv buf7 30230 User logged in, proceed.rnlrs_send(socket0, buf8, LrsLastArg
8、);send buf8 5PWDrnlrs_receive(socket0, buf9, LrsLastArg);recv buf9 38257 /d:/FTP1 is current directory.rnlrs_send(socket0, buf10, LrsLastArg);send buf10 6FEATrnlrs_receive(socket0, buf11, LrsLastArg);recv buf11 228 211-Extension supportedrn CLNTrn MDTMrn MDTM YYYYMMDDHHMMSS+-TZ;filenamern SIZErn SIT
9、E PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSGrn REST STREAMrn XCRC filename;start;endrn MODE Zrn MLST Type*;Size*;Create;Modify*;Win32.ea*;rn 211 Endrnlrs_send(socket0, buf12, LrsLastArg);send buf12 8MODE Zrnlrs_receive(socket0, buf13, LrsLastArg);recv buf13 16200 MODE Z ok.rnlrs_send(socket0, buf14, LrsLast
10、Arg);send buf14 8 REST 0rnlrs_receive(socket0, buf15, LrsLastArg);recv buf15 46 350 Restarting at 0. Send STORE or RETRIEVE.rnlrs_send(socket0, buf16, LrsLastArg);send buf16 6 PASVrnlrs_receive(socket0, buf17, LrsLastArg);recv buf17 49 227 Entering Passive Mode (192,168,5,187,5,125)rnlrs_send(socket
11、0, buf18, LrsLastArg);send buf18 6 LISTrnlrs_create_socket(socket1, TCP, RemoteHost=192.168.2.195:1080, LrsLastArg);lrs_send(socket1, buf19, LrsLastArg); send buf19 3 x05x01x00lrs_receive(socket1, buf20, LrsLastArg); recv buf20 2 x05x00lrs_send(socket1, buf21, LrsLastArg); send buf21 10 x05x01x00x01
12、 括 x05xbbx05 lrs_receive(socket1, buf22, LrsLastArg); recv buf22 10 x05x00x00x01 括 x02 纮 x9flrs_receive(socket0, buf23, LrsLastArg);recv buf23 53 150 Opening ASCII mode data connection for /bin/ls.rnlrs_receive(socket1, buf24, LrsLastArg);recv buf24 137 x湞 xce 1 x0exc2 0f x05xd0x1dx89 ; xfc v4层:M硄 x
13、00x0e Q1Q橵斲搾 x01 盓|y xfex7f 磄S x0ex00 cf&化3 xbe !渿 x17 嗔! x11xc3x1dx0f 銦2应倆跻 钊M穔峠j絇膇6p鰵磪竐*磒 x88 1鲚G xfbx1e ,ItB xcex06xabx1b 匡 x0f e兼 殶桍7h x1f Y xfc lrs_disable_socket(socket1, DISABLE_SEND); lrs_close_socket(socket1);lrs_receive(socket0, buf25, LrsLastArg);recv buf25 24 226 Transfer complete.rnlrs_
14、send(socket0, buf26, LrsLastArg);send buf26 6 PASVrnlrs_receive(socket0, buf27, LrsLastArg);recv buf27 49 227 Entering Passive Mode (192,168,5,187,5,126)rnlrs_send(socket0, buf28, LrsLastArg);send buf28 13 RETR 31.txtrn lrs_create_socket(socket2, TCP, RemoteHost=192.168.2.195:1080, LrsLastArg);lrs_s
15、end(socket2, buf29, LrsLastArg);send buf29 3 x05x01x00lrs_receive(socket2, buf30, LrsLastArg);recv buf30 2 x05x00lrs_send(socket2, buf31, LrsLastArg);send buf31 10 x05x01x00x01 括 x05xbbx05 lrs_receive(socket2, buf32, LrsLastArg);recv buf32 10 x05x00x00x01 括 x02 纮 xa0lrs_receive(socket0, buf33, LrsLa
16、stArg);recv buf33 63 150 Opening ASCII mode data connection for 31.txt (26 Bytes).rnlrs_receive(socket2, buf34, LrsLastArg);recv buf34 22 x x9c +扇,V x00 遭 x12x85x12 d x0ex00 佋ti lrs_disable_socket(socket2, DISABLE_SEND); lrs_close_socket(socket2);lrs_receive(socket0, buf35, LrsLastArg);recv buf35 24
17、 226 Transfer complete.rn return 0;脚本分析1) 在上述脚本中建立了三个Socket,分别是Socket0;socket1和socket2,其中Socket0负责FTP命名链的交互,Socket1和Socket2完成了两次数据链的交互;2) Buf0到Buf7完成了FTP用户的登录过程;Buf8-Buf18完成了FTP的一些命令:PWD、PEAT等命令;3) 然后创建Socket1,完成数据的下载;4) 数据下载完成后Socket1关闭: lrs_disable_socket(socket1, DISABLE_SEND); lrs_close_socket(s
18、ocket1);5) 下面有重新建立了一个Socket2下载另外的数据完成后关闭lrs_disable_socket(socket2, DISABLE_SEND);lrs_close_socket(socket2);6) 看到脚本的尾部,没有发现Socket0的关闭语句,这种情况在VUG中调试脚本的时候是没有问题的,但是,如果都用户并发运行就会出现Socket冲突的问题,所以我们首先加上Socket0关闭的语句;参考Socket1的关闭语句就可以:lrs_disable_socket(socket0, DISABLE_SEND);lrs_close_socket(socket0);7) 回放一
19、下脚本,发现出错了,不要着急,中心按照录制脚本的步骤,录制一个相同操作的脚本;8) 比较原来的脚本和新录制的脚本,看看有什么不同,哈哈发现了几处不同,但是很多都是Rec的,这个应该不是关键的地方,因为收到的信息一般影响不是很大,所以继续寻找,被我找到了吧,在看看下面的比较结果:从上图中我看到Send Buf21 的值不同,并且好像是有一位不同,但是我还是茫然,为什么会不同呢,这个值又是从什么地方来的内,在看看上边那个Recv Buf 17 ,小样原来问题在这里,这个BUF 21中的这个x05xbbx0exd7串,是由Buf17中的数据变化而来的,Buf17 227 Entering Passi
20、ve Mode (192,168,5,187,14,215)rn看看215的16进制是不是d7,14的16进制是不是0e,终于被我找到了,那就把它动态的替换了吧(学名关联);9) 关联int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);这个函数的意思是,在Buf中查找一个字符串,然后保存到一个LR变量中;有了他我们就好办了,看看下面的语句:lrs_receive(socket0, buf17,Flags= MSG_PEEK,LrsLastArg);lrs_s
21、ave_param(socket0, NULL, param2, 41, 3);lrs_save_param(socket0,NULL, param1, 44, 3);10) 变量变换但是又遇到一个问题,通过这两个函数取出来的值是两个10进制的数,比如上面的例子取出来的值,param2=14,param1=215;但是我们需要的值是16进制的,所以还需要变化一下,看下面的函数;n=atoi(lr_eval_string();/将LR变量变化为整型付给C语言变量n;m=atoi(lr_eval_string();/将LR变量变化为整型付给C语言变量m;sprintf(pam,x05xbbx0%x
22、x%x,m,n);/将得到的字符串保存到字符串变量pam中;lr_save_string (pam,param);/将字符串C语言变量转换为LR变量Param11) 增加一个标志经过上面的操作这个脚本可以成功回放了,但是还是会出现一些recv Buf时等待的问题,这是因为每次返回的值的字节数肯能不同;怎么解决这个问题呢,查找帮助后,需要在函数中增加一个标志:Flags= MSG_PEEK;这个标志表示不对Buf大小进行检查,如下所示:lrs_receive(socket0, buf17,Flags= MSG_PEEK,LrsLastArg);最终脚本Action() /*通过Sockes代理运
23、行Ftp协议 作者:质量检测部 李刚*/ int n,m; char pam20; lrs_create_socket(socket0, TCP, RemoteHost=192.168.2.195:1080, LrsLastArg); lrs_send(socket0, buf0, LrsLastArg); lrs_receive(socket0, buf1, LrsLastArg); lrs_send(socket0, buf2, LrsLastArg); lrs_receive(socket0, buf3, LrsLastArg); lrs_send(socket0, buf4, LrsL
24、astArg); lrs_receive(socket0, buf5, LrsLastArg); lrs_send(socket0, buf6, LrsLastArg); lrs_receive(socket0, buf7, LrsLastArg); lrs_send(socket0, buf8, LrsLastArg); lrs_receive(socket0, buf9, LrsLastArg); lrs_send(socket0, buf10, LrsLastArg); lrs_receive(socket0, buf11, LrsLastArg); lrs_send(socket0,
25、buf12, LrsLastArg); lrs_receive(socket0, buf13, LrsLastArg); lrs_send(socket0, buf14, LrsLastArg); lrs_receive(socket0, buf15, LrsLastArg); lrs_send(socket0, buf16, LrsLastArg); lrs_receive(socket0, buf17,Flags= MSG_PEEK,LrsLastArg); lrs_save_param(socket0, NULL, param2, 41, 3); lrs_save_param(socke
26、t0,NULL, param1, 44, 3); n=atoi(lr_eval_string(); m=atoi(lr_eval_string(); sprintf(pam,x05xbbx0%xx%x,m,n); lr_save_string (pam,param); lrs_send(socket0, buf18, LrsLastArg); lrs_create_socket(socket1,TCP,RemoteHost=192.168.2.195:1080, rsLastArg); lrs_send(socket1, buf19, LrsLastArg); lrs_receive(sock
27、et1, buf20, LrsLastArg); lrs_send(socket1, buf21, LrsLastArg); lrs_receive(socket1, buf22,Flags= MSG_PEEK, LrsLastArg); lrs_receive(socket0, buf23,Flags= MSG_PEEK, LrsLastArg); lrs_receive(socket1, buf24, LrsLastArg); lrs_disable_socket(socket1, DISABLE_SEND); lrs_close_socket(socket1); lrs_receive(
28、socket0, buf25,Flags= MSG_PEEK, LrsLastArg); lrs_send(socket0, buf26, LrsLastArg); lrs_receive(socket0, buf27,Flags= MSG_PEEK, LrsLastArg); lrs_save_param(socket0, NULL, param2, 41, 3); lrs_save_param(socket0,NULL, param1, 44, 3); n=atoi(lr_eval_string(); m=atoi(lr_eval_string(); sprintf(pam,x05xbbx0%xx%x,m,n); lr_save_string (pam,param); lrs_send(socket0, buf28, LrsLa
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1