当前位置: 首页 > 科技观察

Netty服务被攻击了N次之后,终于抓到了现在这个!

时间:2023-03-12 20:16:48 科技观察

本文转载自微信公众号《程序新视野》,作者为二哥。转载本文请联系程序新视界公众号。前言马上就要过年了,想着完成手头的任务,为过年做准备。没想到Netty服务器又被攻击了。当收到服务器告警(CPUsurgealarm)消息时,才知道对方又发起了攻击。之前都是留给下面的兄弟们去解决。这一次,为了过个好年,我决定自己解决这件事。故事序幕Netty服务在公司算是一个比较边缘化的服务。目前只有一台设备在用,代码是前任技术负责人(已离职)写的。另外,项目已经到了deadline,所以我也没有抽出时间来彻底解决这个问题。当我被攻击时,我没有检查代码。看到疯狂的请求,CPU爆满,日志爆满,我以为是DDoS攻击。采取了临时措施:分离服务器,保证服务受到攻击时不会拖累其他服务;更改了IP和端口;新增被攻击IP黑名单;代码层发现非法请求强行关闭连接;添加日志信息,追踪攻击消息和来源;上报攻击服务IP(上海阿里云);但没过多久,黑客又找上门来了,十个半月来一次攻击,而且似乎知道服务IP和后台代码,似乎阴魂不散。这不,今天被抓了,之前加了日志打印,也拿到了攻击报文的内容,重现了攻击操作。//攻击者第一次尝试的报文8000002872FE1D130000000000000002000186A00001977C0000000000000000000000000000000000000000//攻击者第二次尝试的报文8000002872FE1D130000000000000002000186A00001977C00000000000000000000000000000000上述报文,第一次的报文触发了攻击,第二次的报文没有影响(与正常业务消息格式相同)。下面就带大家分析一下攻击的逻辑和代码中的漏洞。知识储备要了解攻击原理,我们需要对Netty有一定的技术知识。关于Netty是如何实现客户端和服务端代码的,这里就不展开了。你可以看一下实现示例:https://github.com/secbr/netty-all/tree/main/netty-decoder下面重点介绍自定义解码缓冲区和io.netty.buffer.ByteBuf。自定义解码器用于解析消息,消息内容通过ByteBuf进行缓存和传输。上面的攻击报文格式说明黑客已经“猜到”我们传输的内容是基于十六进制的Btye格式(黑客自己都知道)。自定义解码器自定义解码器,只需要继承MessageToMessageDecoder类并实现decode方法即可。示例代码如下所示:publicclassMyDecodereextendsMessageToMessageDecoder{@Overrideprotectedvoiddecode(ChannelHandlerContextctx,ByteBufin,Listout){}}其中解析器在decode方法中处理文本的逻辑。其中,ByteBufin是接收传入消息的容器,Listout是用来输出解析后的结果。我们来看看有bug的代码(已经脱敏):protectedvoiddecode(ChannelHandlerContextctx,ByteBufin,Listout){intreadableBytes=in.readableBytes();while(readableBytes>3){in.skipBytes(2);intpkgLength=in.readUnsignedShort();in.readerIndex(in.readerIndex()-4);if(in.readableBytes()