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
提取特征那段讲得挺细的
广东省广州市 52F
那误报得手动筛多久啊
泰国 53F
伪装成jpg这招现在居然还在用,绝了
河南省洛阳市 54F
yargen这工具之前用过,白名单库下载是真的慢
缅甸 B1
@ 怀表匠 同感,第一次跑等得黄花菜都凉了