- 关于Yak
- 如何安装Yak语言环境
- 如何编写端口扫描工具
当小CV刚开始接触到Yak语言时,对它不屑一顾,就这?什么安全语言,能比得上Python和Go?然后抱着怀疑的态度去学习,刚开始学的时候,不是吧,写扫描器就几行代码,内置函数库这么香的吗?然后在学习Yak的路上渐行渐远。
好了正规介绍一下Yak(官网:https://www.yaklang.io/),引用一下官网的介绍:
Yak 是一门纯 Golang 的嵌入式语言,是一门纯 Golang 实现的基于反射特性的语言,语法在一定程度上保留了 Golang 的风格,甚至可以实现 Golang 语言的对象无缝开放给 Yak 使用的功能。
Golang 的一些令人惊叹的特性我们在 Yak 中也可以找到实现,比如大家熟悉或者有所耳闻的 go func() {} (),defer 关键字,chan 等。
在保留这些优秀功能的同时,我们极大的简化了 Golang 的语法,移除了静态类型的特性,移除了严格的语法检查,这是一门动态强类型语言,同时,我们也尽力兼容了一些动态语言常见的使用场景。
最令人激动的其实是我们在语言内置了各种安全从业人员需要的安全扫描工具和前无古人的模糊测试模块。我们希望 Yak 对与安全从业人员是相当友好的,10 分钟即可上手!如果你熟悉 Golang 和 Python,我相信 Yak 一定也是你将会非常喜爱的胶水语言。yak 每行结尾不需要加分号,当然加了也没关系
win环境下打开cmd(以管理员身份运行),输入以下代码
powershell (new-object System.Net.WebClient).DownloadFile('https://yaklang.oss-cn-beijing.aliyuncs.com/yak/latest/yak_windows_amd64.exe','yak_windows_amd64.exe') && yak_windows_amd64.exe install && del /f yak_windows_amd64.exe
这样就是已经安装成功了
如果需要用到yak语言中的SYN扫描技术。如果安装过nmap,则不需要进行处理;如果出现了依赖缺失,可以访问nmap官网:https://nmap.org/npcap/dist/npcap-1.50.exe
MacOS环境,直接执行以下命令:
bash <(curl -sS -L http://oss.yaklang.io/install-latest-yak.sh)
如果需要用到yak语言中的SYN扫描技术。如果安装过nmap,则不需要进行处理;如果出现了依赖缺失,可以输入命令:
brew install libpcap
别问为啥没MacOS的安装截图,小CV家境贫寒,买不起T_T
Linux环境,直接执行以下命令:
bash <(curl -sS -L http://oss.yaklang.io/install-latest-yak.sh)
这样就是Linux环境下Yak安装成功
Linux 平台的 Yak 是通过静态编译的,一般来说是不需要额外安装 libpcap,但是如果静态编译版本出现了问题,导致 Yak 引擎不可用,可下载"非静态编译"版本使用。“非静态编译” 版本需要通过安装apt install libpcap 来解决libpcap.so缺失的问题。
如何编写端口扫描工具首先,找到servicescan()函数,了解函数中需要填写的值,servicescan(扫描目标,端口号,额外参数),当然这个额外参数可以不用填写,但是如果大佬们准备深入研究Yak语言的话,建议从各个额外参数入手,毕竟别人写了功能函数库,我们也需要明白内置函数库的逻辑结构和配置接口
result,err = service.Scan("www.baidu.com","1-100,443,8080")
die(err)//出现错误终止程序
这样我们就已经调用了函数,那么怎么输出呢,做变量接受输出。
for func := range result {
if func.IsOpen() {
println(func.String())
}
}
这样,输出做完了,大佬们肯定会想,没有参数接受输入的值,怎么能叫工具,别着急,它来了!
//www.baidu.com和1-100,443,8080写两个参数进行接受
targets := cli.String("target")//接受参数值为target
ports := cli.String("ports", cli.setDefault("1-100,80,443,8080"))//接受参数值为ports,默认值为1-100,80,443,8080
一个简单的端口扫描工具就做好了,不是吧,阿sir,这么简单。对,就是这样简单,综合代码:
targets := cli.String("target")
ports := cli.String("ports", cli.setDefault("1-100,443,8080"))
result,err = servicescan.Scan(targets, ports)
die(err)
for f := range result {
if f.IsOpen() {
println(f.String())
}
}
大佬们可能不信,上截图!
最后,可以关注公众号“乌托邦安全团队”,小CV和团队的大佬们会持续进行技术分享文章。
觉得文章有帮助的师傅们记得点个关注点个赞,能转发的话小CV感激不尽,但是也请师傅们保证文章的完整性。



