CCPROXY漏洞利用
CCProxy是一款非常流行的下载量最大的的国产代理服务器软件,其CCProxy 6.2版本存在一个栈溢出漏洞,可以通过此漏洞进行shellcode攻击,以下是学习过程的一个小记录吧 : )
1.找到并定位溢出点
- 使用ping命令加一个超长的字符串加一个主机名,代理端会返回Host not found。
- 当输入的字符串足够长时(比如2000个a),软件就会溢出奔溃,通过二分法尝试,发现ping后最多接1009个字符,第1010字符开始溢出,并且前四字节无用,如下图,当输入1013个a字符时,此时就有一个字符a溢出到了EIP的地址中
- 然后使用OD观察EIP被溢出填充的过程,首先使用查找找到Host not found所在的语句,然后设置内存访问断点(硬件执行断点断不下来)。
- 然后执行ping加超长字符串(比如2000个字符a),成功在Host not found处断了下来。然后单部跳过往下执行到retn 0xc 指令,此时将要EIP = [ESP],ESP = ESP + 0xc+0x4。
- 执行retn 0xc指令,果然如分析的那样,所以我们只需要将堆栈段0x011766F8填充成我们希望执行的EIP指令地址即可,这里使用jmp esp,所以我们希望填充0x7FFA4512,于是就会执行jmp esp,紧接着就会跳转到0x01176700,我们只需要将我们的shell code填到此处就可以。
2.完成基本的添加用户Shellcode
- 然后开始编写shellcode,其实shellcode非常简单,想要在目标主机上创建一个用户,命令就是system(“net user 用户名/add”),该函数就在windows的msvsrt.dll动态链接库中,于是我们编写如下一份C语言代码。
1 |
|
- 然后反汇编得到汇编代码,然后查看查看汇编代码对应的机器码(使用memory窗口查看),然后保存我们得到的shellcode,为后续使用做准备。
- 执行完上述程序后可以发现成功的添加了一个a用户。
3.利用缓冲区溢出执行ShellCode
1.我们首先需要执行jmp esp指令,所以我们填入的1013~1016字节应该填入FFA4512,然后就会执行JMP ESP,然后就会跳转到第1013+0xc+0x4字节处处执行,但是我们的shellcode需要放在第5个字节到1012个字节之间(因为CCPROXY有一个字符串覆盖操作,会将第5个字节到1012字节复制到1013+0xc+0x4字节处),由于shellcode许多都是不可见字符,不能手动执行,于是我们编写如下的C语言代码(最好使用cpp,否则会有一堆错误)。
1 |
|
- 然后运行CCPROXY,再执行刚刚编写的代码,发现CCPROXY成功溢出奔溃,并且计算成功添加了一个账户a(事先已经删除账户a的情况下)
- 然后使用OD再Host not found处设置断点分析整个过程,可以看到此时esp处存放着JMP ESP指令地址,并且shellcode恰好就好[esp+0xc+0x4]的位置(shellcode是从5~1013字节复制过来的)。
- 执行retn 0xc指令,成功跳转到JMP ESP指令,并且此时ESP = ESP+0xc+0x4
- 然后通过JMP ESP就成功跳转到了shellcode,完成添加用户的操作。
4.实现一个具备远程连接控制功能的ShellCode
- 要实现远程连接,我们可以使用vmic命令完成,也是通过system()函数进行运行DOC命令,我们需要使用的wmic命令如下:
1 | 开启远程桌面控制:wmic PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 |
- 然后我们就只需要将命令转化为硬编码,写入到汇编代码中即可,如下就是上述命令转化为ASCII码值的结果,共87个字符,所以我们需要从ebp-0x58开始填写。
1 | 0x77,0x6d,0x69,0x63,0x20,0x50,0x41,0x54,0x48,0x20,0x77,0x69,0x6e,0x33,0x32,0x5f,0x74,0x65,0x72,0x6d,0x69,0x6e,0x61,0x6c,0x73,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x65,0x74,0x74,0x69,0x6e,0x67,0x20,0x57,0x48,0x45,0x52,0x45,0x20,0x28,0x5f,0x5f,0x43,0x6c,0x61,0x73,0x73,0x21,0x3d,0x22,0x22,0x29,0x20,0x43,0x41,0x4c,0x4c,0x20,0x53,0x65,0x74,0x41,0x6c,0x6c,0x6f,0x77,0x54,0x53,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x73,0x20,0x31 |
- 然后修改shellcode,修改为我们上述的shellcode,注意需要抬高栈顶,否则装不下shellcode。
1 |
|
- 获得汇编机器码,然后调式状态下反汇编,获取汇编代码。
1 | 55 8B EC 33 FF 57 83 EC 60 36 |
- 然后修改注入程序的shell部分,其余代码部分同上。
1 |
|
- 然后将上述然后运行CCPROXY,再执行刚刚编写的代码,发现CCPROXY成功溢出奔溃,并且开启了远程服务。