基于Go语言的工具免杀
声明
本文版权归原作者所有,未经允许禁止转载。
本篇文章主要针对 Linux,Windows 的话转为 Shellcode 分离加载即可。
背景
Go 语言开发的安全工具越来越多,以至于上传至目标机器可能会被上边 EDR 或者是一些 Agent 扫描到,然后告警,比如主流云厂商基本上如果有些工具落地的话会发送短信,比较危险,因此必须要做一层免杀,起码确保工具落地不会告警。
免杀思路
利用 burrowers/garble: Obfuscate Go builds 这个库对工具进行混淆,以及 UPX 缩小体积,至于 UPX,个人建议还是加一下,不然体积会比较大,目前的 Linux 上的 UPX 查杀还没那么严重,基本上是针对特定的木马比如勒索、扫描工具的一些特征。
通用方式
注意
一般情况下,建议使用低版本的 Go 版本(⇐1.20),较高的 Go 版本在部分老旧 Linux 上可能会无法运行,除非工具要求高版本 Go。
使用 Dockerfile 构建一个带有 garble 以及 musl-gcc 的环境,部分程序要求 CGO,选用 musl-gcc 可以避免 glibc 的版本兼容,要注意 garble 的版本兼容,查看对应 go.mod:
https://pkg.go.dev/mvdan.cc/garble@v0.10.1?tab=versions
https://github.com/burrowers/garble/blob/v0.10.1/go.mod
FROM golang:1.20.14-bullseye
ENV GOPROXY="https://mirrors.aliyun.com/goproxy/,direct"
ENV MUSL_PATH=/opt/musl
ENV PATH="$MUSL_PATH/x86_64-linux-musl-cross/bin:$MUSL_PATH/aarch64-linux-musl-cross/bin:/opt/upx:${PATH}"
ENV CC_x86_64_w64_mingw32=x86_64-linux-musl-gcc
ENV CC_aarch64_linux_musl=aarch64-linux-musl-gcc
RUN sed -i 's/deb.debian.org/mirrors.tencent.com/g' /etc/apt/sources.list && \
sed -i 's/security.debian.org/mirrors.tencent.com/g' /etc/apt/sources.list && \
apt update -y && \
apt install xz-utils -y && \
mkdir -p $MUSL_PATH /opt/upx && \
curl -L "https://gh-proxy.com/https://github.com/yinsel/musl-cross/releases/download/musl.cc/x86_64-linux-musl-cross.tgz" -o /tmp/amd64-cross.tgz && \
curl -L "https://gh-proxy.com/https://github.com/yinsel/musl-cross/releases/download/musl.cc/aarch64-linux-musl-cross.tgz" -o /tmp/aarch64-cross.tgz && \
tar -xf /tmp/amd64-cross.tgz -C $MUSL_PATH && \
tar -xf /tmp/aarch64-cross.tgz -C $MUSL_PATH && \
rm /tmp/*.tgz && \
curl -L "https://gh-proxy.com/https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz" -o /tmp/upx.tar.xz && \
tar -xf /tmp/upx.tar.xz -C /opt/upx --strip-components=1 && \
rm /tmp/upx.tar.xz && \
go install mvdan.cc/garble@v0.10.1
WORKDIR /root
运行构建,如果构建 arm64,切换架构以及 CC=aarch64-linux-musl-gcc,以 fscan为例:
注意
参数
-tiny不建议和upx混用,会出现无法运行的情况,建议去除-tiny。
# 克隆代码
git clone https://github.com/shadow1ng/fscan
# 进入fscan项目文件夹
cd fscan
# 切换为1.8.4分支
git checkout 1.8.4-bak
# 编译
docker run --rm -v ./:/app -w /app golang:v1.20.14-garble bash -c 'GOARCH=amd64 GOOS=linux CGO_ENABLED=1 CC=x86_64-linux-musl-gcc garble -literals -seed=random build -trimpath -ldflags="-s -w -linkmode=external -extldflags=-static"'
# upx 压缩体积
docker run --rm -v ./:/app -w /app golang:v1.20.14-garble upx fscan
可以用构建好的镜像:
docker run --rm -v ./:/app -w /app crpi-r2ta923g837syaja.cn-hangzhou.personal.cr.aliyuncs.com/redteam-images/golang:v1.20.14-garble bash -c 'GOARCH=amd64 GOOS=linux CGO_ENABLED=1 CC=x86_64-linux-musl-gcc garble -literals -seed=random build -trimpath -ldflags="-s -w -linkmode=external -extldflags=-static"'不使用 CGO:
docker run --rm -v ./:/app -w /app crpi-r2ta923g837syaja.cn-hangzhou.personal.cr.aliyuncs.com/redteam-images/golang:v1.21-garble bash -c 'GOARCH=amd64 GOOS=linux CGO_ENABLED=0; go mod tidy ;garble -literals -seed=random build -trimpath -ldflags="-s -w"'