linux下的恶意软件多为sh脚本,且由于使用的命令大同小异(均为下载文件、运行进程、创建定时任务、写ssh后门等操作),经常难以分辨恶意sh脚本是属于哪个病毒家族的。
遇到这种情况,使用yara规则对恶意脚本进行检测分类是个不错的选择,本文将介绍如何借助yargen实现对linux恶意脚本特征的半自动化提取。
关于yargen
yargen是一个自动化提取yara规则的工具,可以提取strings和opcodes特征,其原理是先解析出样本集中的共同的字符串,然后经过白名单库的过滤,最后通过启发式、机器学习等方式筛选出最优的yara规则,项目地址:https://github.com/Neo23x0/yarGen。

下面以8220黑客团伙(StartMiner)的恶意脚本进行演示:
如何提取其yara规则?
首先需要收集该家族每次变种的样本,如下,该家族从2018年8月到现在一直在更新,其特点是脚本大部分都伪装成.jpg后缀。

yargen的用法很简单,-m参数,加上样本集的目录就行了,第一次运行yargen的话可能会比较久,因为它要下载更新白名单库。

运行过程中,yargen会显示提取的特征数详情,其中我们要关注的是SUPER rules,这些规则代表的是泛规则,可以匹配家族的多个样本。

生成的文件yargen_rules.yar在yargen.py的同目录下,打开滑到Super Rules的地方,即是泛规则,规则的名字代表着能匹配哪些样本,如下第一个rule _logo8_jpg_hehe_0,代表匹配脚本logo8.jpg及hehe.sh。

不过也不是Super Rules里所有规则都要关注,主要聚焦看匹配数最多的规则,如下我会关注rule _cr_logo8_jpg_2start_jpg_2start_jpg_3start_jpg_1规则,及rule _cr_cr_logo8_jpg_logo8_jpg_2start_jpg_2start_jpg_2start_jpg_2start_jpg_3start_jpg_3start_jpg_3规则。
yargen虽然能自动化提取字符串特征很方便,但工具难免会有误报,必须得自己人工筛选一遍,如下,先看rule _cr_logo8_jpg_2start_jpg_2start_jpg_3start_jpg_1规则,我挑选了红框中5个比较特别的字符串,其他一些WGET、download、sleep等字符串可能会存在误报场景,我就不考虑了。

再看rule _cr_cr_logo8_jpg_logo8_jpg_2start_jpg_2start_jpg_2start_jpg_2start_jpg_3start_jpg_3start_jpg_3规则,由于其匹配的样本数多,自然的特征项就比较少,我选取了如下2个特征。

筛选出如上特征后,需要查看字符串在脚本中对应的位置,以确认该特征是否为黑客独特的脚本编写习惯。如下图以echo “*”为例,发现黑客在编写echo语句时都喜欢在开头加个大写首字母,且延续了好几个变种,这个可以作为特征。

再看”case $sum in”规则,该语句用于判断文件MD5,也是黑客的一个脚本编写习惯,延续了几个变种。

除此之外,还发现脚本里都有f2=”*”的变量声明,也可以作为特征。

以及judge函数名。

接着提取脚本中的域名/IP作为特征,因为黑客在新的变种中有可能复用旧的C&C。

最后优化后的规则如下,主要为3类字符串,语法特征、变量特征、ioc特征,根据不同的比重编写condition,其中ioc相当于硬性指标,只要出现任意1个就可以直接确认该脚本为8220/StartMiner家族。

验证:对该规则进行测试,测试样本均能检出。

Linux脚本基本不会进行混淆,且均是字符串,使用yargen进行自动化提取有其优势,可以大大提高提取特征的效率,大家可以尝试使用该方法来提取其他家族的yara特征。另外,每个安全研究员提取的yara都不一样,风格不一,需要进行大量样本的测试,来不断优化yara规则的质量。
参考链接:

山东省济南市 1F
SUPER rules真能打中家族变种?求实测数据
上海市闵行区 2F
我用过yargen,但最后还得手动筛到怀疑人生
上海市 B1
@ 宇宙牧羊人 白名单更新确实慢,但跑一次后续就快了
河北省邢台市 3F
这工具之前试过,生成的规则误报一堆😭
北京市 4F
echo开头大写字母也算特征?黑客真有仪式感
日本 B1
@ FurballFrolic 大写开头确实挺奇怪的,估计是作者的习惯吧。
韩国 5F
f2=”*”这种变量名都能成指纹,离谱…
福建省漳州市 6F
case $sum in那段我见过,居然是同一批人?
韩国 B1
@ 安静观察者 看到case $sum in直接DNA动了,去年挖矿脚本里一模一样
马来西亚 7F
ioc硬匹配是快,但换C&C不就废了
印度 B1
@ BubblegumDream 变量名都能当特征,黑客也太随意了
斯里兰卡 B1
@ BubblegumDream 换C&C确实能绕,但老域名复用太常见了,赌的就是这个惯性
浙江省杭州市 8F
yargen更新白名单慢得要死,等了半小时
江苏省徐州市 9F
这个方法可以试试
韩国 10F
脚本没混淆确实好办,换作Powershell早炸了
韩国 11F
yargen这工具真能节省时间,不用手动提取特征了
印度 B1
@ 司棋 别看宣传图好看,实际落地全是坑
日本 B1
@ 司棋 省时间是真,可筛规则筛到凌晨三点也是真
浙江省台州市 B1
@ 司棋 用过一次,省了不少事儿,不过还是得自己挑挑误报。
北京市 B1
@ 司棋 yargen省时间是真,但筛规则照样熬通宵
日本 B1
@ 司棋 之前跑过一次,内存直接飙到8G,小机器扛不住
湖北省武汉市 B1
@ 司棋 不是说不用就能省事,是省了个寂寞
山东省滨州市 12F
试过其他家族的效果如何?
北京市 13F
写规则最怕误报,人工筛查逃不掉
香港 14F
SUPER rules的误判率高吗?
北京市 B1
@ 猫耳小铺 SUPER rules水得很,得自己扒半天
美国 15F
echo大写这个细节抓得不错
浙江省杭州市 16F
case语句确实常见,好多脚本都有
广东省广州市 B1
@ 松风听雨 case语句满大街都是,光靠这个容易误伤
上海市 17F
yargen生成的规则需要优化多少?
上海市金山区 B1
@ 书卷多情 我们试的时候前两周全在修白名单
云南省临沧市 B1
@ 书卷多情 少说得删七八成生成的规则,剩下的再细调
阿富汗 B1
@ 书卷多情 我们那批样本优化了快一个月才稳定
北京市 B1
@ 书卷多情 节省时间?那是没算上后期调规则的工时
台湾省 B1
@ 书卷多情 优化量看样本集,脏数据多的话得重做一半
天津市 B1
@ 书卷多情 我们组平均每个rule要人工过三遍才敢上线
江西省吉安市 B1
@ 书卷多情 要看误报率接受阈值,要求高就得大改
山东省淄博市 B1
@ 书卷多情 新来的以为点一下就出结果,哪有这么美
北京市 18F
域名硬匹配太容易绕过了
河北省秦皇岛市 B1
@ 小蛇蛇蛇 我也遇到过,换成正则或模糊匹配才靠谱。
香港 B1
@ 小蛇蛇蛇 域名一换就失效,ioc硬匹配有点天真了
北京市 19F
f2=”*”这都能当特征?黑客起名也太懒了吧😂
湖南省长沙市 20F
白名单更新慢就算了,关键还经常漏掉系统命令,误报离谱
北京市 21F
求问下,这种规则在生产环境跑起来性能开销大吗?
广东省佛山市顺德区 22F
之前搞过类似提取,光echo大写就卡了两天,真有人注意这细节
甘肃省兰州市 23F
又是标题党?说半自动,结果八成还得手搓
山东省潍坊市 24F
SUPER rules看着牛,实际跑起来命中一堆正常脚本,裂开
台湾省台中市 25F
脚本没混淆是好事,但下次他们学聪明点咋办?
菲律宾 26F
这方法对付没混淆的脚本还行,但黑客真要加点花活就歇了
日本 27F
f2=”*”都能当特征?笑死,他们变量名是随机按的吧😂
上海市 28F
echo开头大写也算独门标志?感觉有点牵强啊
浙江省杭州市 29F
白名单漏系统命令这事太坑了,刚跑就误报一堆
韩国 30F
case $sum in 这段我上周还在日志里见过,原来是一伙的?
韩国 31F
求问下,规则里ioc权重设多少比较稳?
韩国 32F
SUPER rules看着全,其实水得很,得自己扒半天
山东省济宁市兖州市 B1
@ 数据侠客 这工具看着省事,结果筛规则比写规则还累…
日本 B1
@ 数据侠客 手动筛到凌晨是常态,yargen省时间?笑死😂
日本 B1
@ 数据侠客 生成的SUPER rules十个有八个要砍掉,太虚了
北京市 B1
@ 数据侠客 关键还得看样本质量,垃圾进垃圾出懂吧
台湾省台东县 B1
@ 数据侠客 我上次用它提规则,光去系统命令就干了一整天
湖北省咸宁市 B1
@ 数据侠客 真别信自动生成,最后不都是人兜底
陕西省西安市 B1
@ 数据侠客 说是半自动,结果八成力气花在后期过滤上
湖南省娄底市 B1
@ 数据侠客 super rules匹配数高,但命中的大多是wget这种通用词
湖南省怀化市 B1
@ 数据侠客 还不如自己写个脚本抓特征,至少可控
四川省乐山市 B1
@ 数据侠客 你这话说得太轻描淡写了,“扒半天”根本不够用
上海市 33F
之前搞过StartMiner样本,光那个judge函数就卡了我一天
山东省德州市平原县 34F
又是半自动,最后不还是得手筛到凌晨三点…
澳大利亚 B1
@ 小花伞 上次搞这个熬到凌晨四点,太真实了
北京市 35F
脚本伪装成.jpg这招都用烂了,能不能换点新花样
马来西亚 36F
yargen跑起来内存占用大吗?
北京市 37F
这个工具对新手友好不?
日本 38F
脚本特征提取这块确实头疼
浙江省金华市 39F
白名单库能自己添加吗?
浙江省宁波市 40F
伪装成.jpg这招都用烂了
北京市 41F
规则优化得花不少时间吧
广东省深圳市 42F
ioc硬匹配确实容易被绕过
浙江省 43F
echo开头大写?这细节都能抠出来服了🤔
广东省惠州市 44F
f2=”*”当特征也太离谱了,变量名不都是随手打的?
福建省福州市 45F
白名单更新慢得像蜗牛,还老漏系统命令,裂开
上海市 46F
脚本伪装成.jpg早看吐了,能不能换点新套路
云南省大理州大理市 47F
SUPER rules看着高大上,实际跑起来一堆误报
澳大利亚 48F
yargen这工具用起来还蛮方便的
日本 49F
之前搞过StartMiner,judge函数那段真卡死我了
辽宁省朝阳市 50F
求问生产环境跑这种规则,性能扛得住不?
湖北省天门市 51F
提取特征那段讲得挺细的