Botnet BotenaGo代码审计浅析

VSole2023-04-23 09:36:32

先前因某原因进行研究Botnet,本文以僵尸网络BotenaGo中核心代码loader_multi.go为例,对源代码进行代码审计,梳理攻击逻辑。

概述

该框架源代码总共仅包含2891行代码(包括空行和注释)。

注释中提及包含反向shell加载程序和Telnet加载程序,可以根据攻击者的命令创建后门便于下一步攻击行动。

同时,框架包含以下EXP(见下图),其中存在部分CVE漏洞,可以凭借这些EXP针对不同设备或操作系统进行攻击。

另外,引用以下包在后续代码会使用到。

图1 包声明和注释

声明部分

声明包括常量、结构体、变量三个部分。

常量声明

首先是常量声明。

EI_NIDENT、EI_DATA、EE_LITTLE、EE_BIG分别为e_ident[]大小、数据编码、值为小端的EI_DATA标识、值为大端的EI_DATA标识。

EM_ARM、EM_MIPS、EM_AARCH64、EM_PPC、EM_PPC64、EM_SH分别为ELF头中所需运行架构为ARM框架的标识符、ELF头中所需运行架构为MIPS框架的标识符、ELF头中所需运行架构为AARCH64框架的标识符、ELF头中所需运行架构为PowerPC框架的标识符、ELF头中所需运行架构为PPC64框架的标识符、ELF头中所需运行架构为SH框架的标识符。

DVRIP_NORESP、DVRIP_OK、DVRIP_FAILED、DVRIP_UPGRADED为状态码的标识。

echoLineLen用于telnetLoadDroppers函数的dataBuf切片长度。

echoDlrOutFile用于telnetLoader函数的cat命令。

loaderTvtWebTag等Tag类常量用于构造EXP。

loaderDownloadServer、loaderBinsLocation、loaderScriptsLocation属于对C&C服务器的配置。

loaderDownloadServer为包含Bins和SH 文件的C&C服务器远程IP地址,loaderBinsLocation为Bins文件路径,loaderScriptsLocation为SH 文件路径。

图2 常量声明

结构体声明

elfHeader 文件格式头结构体,e_ident[EI_NIDENT]即Magic Number,e_type为类型。

e_machine为运行该程序需要的体系结构,e_version为文件版本。

smapsRegion结构体,成员region用于标识smaps内存所属区域,成员size为进程使用内存空间,rss为int型,pss为Rss中私有的内存页面,成员shared_clean,shared_dirty,private_clean,private_dirty分别为Rss中和其他进程共享的未改写页面、Rss和其他进程共享的已改写页面、Rss中改写的私有页面页面、 Rss中已改写的私有页面页面。

echoDropper结构体用于木马相关的变量使用,成员payload与payload_count。

图3 结构体声明

变量声明

声明了一个time包中的time.Duration类型变量,初始值为30。

声明了两个WaitGroup变量workerGroup、magicGroup。

两个string类型变量mode、doExploit。

集合exploitMap、dropperMap,前者为EXP集合、后者为木马集合。

变量telShells和payloadSent用作计数器,分别为telnet连接的shell数量和发送的payload数量。

后面为各设备的EXP和攻击设置的构造部分。分别为uc、tvt、magic、lilindvr、烽火通信设备、vigor VPN设备、broadcom路由器、宏电IOT设备、Tenda路由器、totlink路由器、zyxel NAS 系统、Alcatel NAS系统、linksys路由器、中兴路由器、NETGEAR路由器、GPON路由器、D-Link路由器。

图4 变量声明1

图5 变量声明2

函数

函数zeroByte

生成字节”0“。函数getStringInBetween获取字符串内容。函数randstr从大小写A到Z中选取生成随机字符串。函数hexToint将hex码转换成int型。

图6 函数1

telnet加载程序模块

telnetLoadDroppers函数

telnetLoadDroppers函数用于Droppers加载部分,遍历路径下文件并读取。

首先短声明变量files,err,值为OpenFile函数的结果,参数分别为打开文件的文件路径、flag、权限码。之后异常处理,如果error就执行continue。声明结构体变量mapval为结构体echoDropper的变量。其中的成员payload_count赋值为0。

循环结构首先声明string型变量echoString,声明databuf按照128字节的byte型数组。声明length,err,值为Read函数的结果,参数为databuf。异常处理:如果error或者length异常,break跳出循环。

循环处理声明echoByte,值为以dataBuf为输入按照\x%02x格式化处理,并且以uint8类型输出。echoString每次填充echoByte。如果payload_count为0,则打印首次输出命令行;如果payload_count不为0,则打印后续输出命令行。最后按照循环次数依次增加payload_count计数器。

回到函数部分,逐次获取文件名执行处理。然后关闭文件流。打印telnetLoadDroppers函数执行结果。

telnetHasPrompt函数

telnetHasPrompt函数用于判断是否包含特殊符号。首先将string类型的buffer作为参数,使用Contains函数进行判断。如果buffer中包含"#"、">"、"$"、"%"、"@"这些特殊符号其中一种,则返回true;如果都不包含,则返回false。

telnetBusyboxShell函数

telnetBusyboxShell函数用于调用busybox中相关命令于该攻击框架。

注:BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 称为 Linux 工具里的瑞士军刀。

其中前三句命令推测用于部分BCM路由器。因为第一句 conn.Write([]byte("sh\r")) 在后续再次出现。

可以看到攻击常用的命令,例如sh,ping,system等等。

infectFunctionComtrend函数

infectFuctionTenda函数用于Comtrend路由器。

根据函数内容判断,EXP为CVE-2020-10173(Comtrend VR-3033 路由器多认证命令注入漏洞)

infectFuctionTenda函数

infectFuctionTenda函数用于Tenda路由器。

根据函数内容判断,EXP为CVE-2020-10987(Tenda AC系列路由器远程命令执行0day漏洞)。

声明一个rdbuf数组,类型为byte。

Main函数

01

一个循环结构执行显示当前加载程序结果。

02

定义dropperMap,分片从echoDropper获取。

03

调用telnetLoadDroppers函数、scannerInitExploits函数。

04

声明li、err,调用net包的Listen声明,根据TCP协议配置监听设置,根据ucRshellPort作为监听端口。recvServ、err,调用net包的Listen,根据TCP协议在本地接收监听的流量,用19412端口接收。

05

循环执行reverseShellUchttpdLoader函数,参数是conn,直到err != nil。根据缓冲区循环执行httpBannerCheck函数,参数是buf,直到err != nil。

06

循环结构。声明reader、input变量,分别为以os.Stdin为参数调用bufio包的NewReader,以reader为参数调用bufio包的NewScanner。

结束语

本文为僵尸网络BotenaGo的代码审计文章,将核心代码loader_multi.go进行了前期分析,预计不定期会跟进,梳理成后续文章。

往期推荐

路由函数声明
本作品采用《CC 协议》,转载必须注明作者和本文链接
从偶遇Flarum开始的RCE之旅
iptable使用详解
2022-12-09 09:10:52
而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。这五个位置被称为五个钩子函数,也叫五个规则链。这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。为了让这些功能交替工作,制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
在重要的生产网中,目标服务器无法外联,而遇到Apache Flink情况下如何写内存马,本文对这一有趣实践过程做了一个记录。但很可惜,笔者找了一圈,没有发现相关的静态变量,无法获取到该路由对象。本文主要围绕如何使用该方法实现 flink 内充马进行讲述。的限制,我们的 agent 需要先落地到系统中,而执行 loadAgent 这一操作的程序我们被称为 starter。
系统安全第40篇文章介绍PowerShell基础知识,希望您喜欢
滥用此工具可能允许将访问密钥和令牌泄露到可能由攻击者拥有的域中,并在 AWS 拥有的域amazonaws.com上使用一种称为域名仿冒的过时技术。设置了特定于语言本地化的参数,以强制语言在整个脚本执行过程中保持统一。checkkey此函数检查文件“ /host/root/.aws/credentials ”。如果文件存在,则通过curl请求将其发送到攻击者的端点。当找到 Weave Scope UI 的可访问实例时,使用curl将相应的 IP 地址和端口泄露到攻击者控制的服务器amazon2aws.com。
最全的Python开发库!
2022-07-01 08:24:52
Web 框架主要用于网站开发,可以实现数据的交互和业务功能的完善。使用 Web 框架进行 网站开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。
监控体系的核心指标
2022-07-31 09:41:04
持续的高或低流量数字可能表明服务可能需要更多资源,或者问题阻止流量正确路由。但是,在大多数情况下,流量率对于帮助了解通过其他信号浮出水面的问题最有用。例如,如果延迟增加超过可接受的水平,能够将该时间范围与流量峰值相关联是有帮助的。流量可用于了解可以处理的最大流量以及服务在不同负载阶段如何降级或失败。因此,一层中的饱和和延迟问题可能与底层中流量或错误测量的显着增加相对应。
从2018年开始,公号君就开始给有关数字贸易协定谈判提供技术支撑工作。目前,中国已经建立了关于数据安全和个人信息保护方面的法律框架,对于数据要素治理的宏观谋划和对新技术新业务的规制,也在紧锣密鼓地开展过程之中。于此同时,中国已经申请加入《全面与进步跨太平洋伙伴关系协定》(CPTPP)和《数字经济伙伴关系协定》(DEPA),这两部协定都是自由化水平较高的贸易协定,展示了中国寻求更加开放的决心。显然,
2021年6月15日,《美国-欧盟峰会声明》发布。其中提到要建立美欧贸易和技术委员会(US-EU Trade and Technology Council, TTC)。按照声明的阐述,“贸易和技术委员会的主要目标将是发展双边贸易和投资关系;避免新的不必要的贸易技术壁垒;协调、寻求共同点,并加强在技术、数字问题和供应链方面的全球合作;支持合作研究和交流;在兼容和国际标准制定方面进行合作;促进监管政策
陈驰 ,2017年加入美团,目前主要负责IDC服务器的检测防御产品研发,完善服务器侧纵深防御体系建设。 杨一 ,2017年加入美团,目前主要负责HIDS主机安全产品研发工作。 胡鑫博 ,2021年加入美团,目前主要负责HIDS Agent的研发。 前言
VSole
网络安全专家