gRPC内存马研究与查杀3

前言

前两周看到M01N Team公众号发布的《内存马的攻防博弈之旅之gRPC内存马》,文中介绍了gRPC内存马是如何注入进去并执行命令的,但是由于原文当中只给出靶场的Demo,并未给出利用注入的poc,便借助这篇文章再深入研究一下。

gRPC介绍

了解gRPC之前,就需要引入RPC的设计理念,才能更好的理解gRPC的工作原理。

远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许一台计算上的程序调用另一台计算机上运行的程序,使得程序员无需再做额外的操作。如果是面向对象的场景,也可以称作为远程方法调用,比如熟知的Java RMI(Remote Method Invocation)调用。在这里插入图片描述

而gRPC是由Google开发的一款高性能的开源RPC框架,经常用于微服务之间各种不同语言的程序调用函数和通信,大大的增加了微服务之间的通信效率和平台依赖性。同时gRPC是使用Protocol buffers作为接口定义语言(IDL),可以通过编写的proto文件来定义消息结构体和RPC远程调用函数。

协调的接口是通过proto文件来定义的消息结构,相关文档可以在Reference[1]中找到。再来看看gRPC的接口定义语言Protocol Buffers的工作流程图:在这里插入图片描述

结合后续的案例说明,proto文件定义好之后需要通过生成器生成对应语言的代码,并在项目中使用才可以建立gRPC调用。

案例说明

这里直接用绿盟星云实验室开源的gRPC靶场来研究:https://github.com/snailll/gRPCDemo

首先直接看看他的user.proto是如何定义的

syntax = “proto3”;
package protocol;

option go_package = “protocol”;
option java_multiple_files = true;
option java_package = “com.demo.shell.protocol”;

message User {
int32 userId = 1;
string username = 2;
sint32 age = 3;
string name = 4;
}

service UserService {
rpc getUser (User) returns (User) {}
rpc getUsers (User) returns (stream User) {}
rpc saveUsers (stream User) returns (User) {}
}
可以看到文件中定义了go_package和java_package两个变量,用处是明确指出包的命名空间,防止与其他语言的名称冲突。而java_multiple_files = true 选项则是允许为每个生成的类,生成一个单独的 .java 文件。

定义好了proto文件之后,就可以通过protoc或者maven的插件来生成grpc代码,这里我用的protoc二进制文件和插件protoc-gen-grpc来生成。

protoc下载地址:https://github.com/protocolbuffers/protobuf/releases

protoc-gen-grpc插件下载地址:https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-java/

用下列两个命令生成对应的Java代码文件:

protoc -I=. --java_out=./codes/ user.proto

protoc.exe --plugin=protoc-gen-grpc-java.exe --grpc-java_out=./code --proto_path=. user.proto
这里的grpc插件一定要重新命名为"protoc-gen-grpc-java",不然会显示找不到命令。

之后会在codes文件中生成对象关系的java文件,code文件夹中生成grpc相关的UserServiceGrpc.java文件。

把生成好的Java文件添加到开发的项目中,并新建一个UserServiceImpl类,用来实现grpc的方法。

package com.demo.shell.service;

import com.demo.shell.protocol.User;
import com.demo.shell.protocol.UserServiceGrpc;
import io.grpc.stub.StreamObserver;

/**

  • @author demo

  • @date 2022/11/27
    */
    public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase {
    @Override
    public void getUser(User request, StreamObserver responseObserver) {
    System.out.println(request);
    User user = User.newBuilder()
    .setName(“response name”)
    .build();
    responseObserver.onNext(user);
    responseObserver.onCompleted();
    }

    @Override
    public void getUsers(User request, StreamObserver responseObserver) {
    System.out.println(“get users”);
    System.out.println(request);
    User user = User.newBuilder()
    .setName(“user1”)
    .build();
    User user2 = User.newBuilder()
    .setName(“user2”)
    .build();
    responseObserver.onNext(user);
    responseObserver.onNext(user2);
    responseObserver.onCo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值