STRUTS2的getClassLoader漏洞利用
在struts2任何一个action运行之前,一旦接受到用户提交参数xx=zzzzz时,就由Ognl负责调用对应的当前action的setXxx方法,至于set方法到底是干什么的,其实不重要,里面的逻辑也不重要,我们只关注这个方法调用了,参数传递了。这种对属性的改变,有时候是可以很大程度的影响后续复杂逻辑。
Object是java的基础类,所有的class生成的对象,都会继承Object的所有属性和方法,因此当前action无论是什么代码,必须有Object自带的getClass方法,这个方法会返回一个Class对象,Class对象又一定会有getClassLoader方法,最终在每个action都可以
上传webshell的可能性研究
多次的远程代码执行漏洞洗礼,我一直在脑海里模拟“ServletContext被控制了,这次能干什么”,究竟有哪些路线,可以通往代码执行的领域。
比如:Struts2会去servletContext里取到一个值,然后把它作为Ognl执行掉。这个太简单了,我自己都不信。
Ognl的Context树形结构
servletContext被转换成Map,变成了图中的application子项,这个位址很尴尬,如果是上一层Node,从上到下找到value Stack,确实有实现这个思路的可能,但现在看来,这条路断了,它不支持找到父节点。
任何一个Action的classLoader都是org.apache.catalina.loader.WebappClassLoader,这是漏洞的源头。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在struts2任何一个action运行之前,一旦接受到用户提交参数xx=zzzzz时,就由Ognl负责调用对应的当前action的setXxx方法,至于set方法到底是干什么的,其实不重要,里面的逻辑也不重要,我们只关注这个方法调用了,参数传递了。这种对属性的改变,有时候是可以很大程度的影响后续复杂逻辑。
Object是java的基础类,所有的class生成的对象,都会继承Object的所有属性和方法,因此当前action无论是什么代码,必须有Object自带的getClass方法,这个方法会返回一个Class对象,Class对象又一定会有getClassLoader方法,最终在每个action都可以
上传webshell的可能性研究
多次的远程代码执行漏洞洗礼,我一直在脑海里模拟“ServletContext被控制了,这次能干什么”,究竟有哪些路线,可以通往代码执行的领域。
比如:Struts2会去servletContext里取到一个值,然后把它作为Ognl执行掉。这个太简单了,我自己都不信。
Ognl的Context树形结构
servletContext被转换成Map,变成了图中的application子项,这个位址很尴尬,如果是上一层Node,从上到下找到value Stack,确实有实现这个思路的可能,但现在看来,这条路断了,它不支持找到父节点。
任何一个Action的classLoader都是org.apache.catalina.loader.WebappClassLoader,这是漏洞的源头。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
控制端获取当前已经上线主机信息接口:/getlive
控制端要得到当前主机存活信息就要构造如下请求信息
请求头:
{"pwd":密码加密后MD5值}
身份验证成功后即可如图得到响应的信息
控制端向服务器发布任务接口:/addtask
该接口依赖 ./lib/baseser.py 中的 add_task() 方法
当控制端发送下发任务请求时,该接口会检查控制端的密码,然后根据控制端提供木马唯一ID进行ID合法性校验,校验成功后就会将 cmd 里密文进行解密后与该木马的唯一ID进行绑定,木马请求下载 Payload 时就根据其自身的ID获取对应的任务
控制端要构造如下请求头
{"pwd":MD5加密的密码,"key":木马唯一身份ID,"cmd":base64密文}
base64密文:{"sleeptime": "", "cdm": "你要执行的命令"}
成功则响应状态码为 200
响应正文:{"info":发布成功或失败的提示信息}
处理控制端要删除某台上线主机的接口:/killhost
该接口依赖 ./lib/baseser.py 中的 del_host_info() 方法
当控制端请求该接口时,首先会校验控制端提供的密码是否合法,然后校验提供的木马唯一ID值是否合法,校验成功后,就会根据其提供的木马的唯一ID值来清除服务器存储的木马的唯一ID值和其ID绑定的 AES 秘钥
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
控制端要得到当前主机存活信息就要构造如下请求信息
请求头:
{"pwd":密码加密后MD5值}
身份验证成功后即可如图得到响应的信息
控制端向服务器发布任务接口:/addtask
该接口依赖 ./lib/baseser.py 中的 add_task() 方法
当控制端发送下发任务请求时,该接口会检查控制端的密码,然后根据控制端提供木马唯一ID进行ID合法性校验,校验成功后就会将 cmd 里密文进行解密后与该木马的唯一ID进行绑定,木马请求下载 Payload 时就根据其自身的ID获取对应的任务
控制端要构造如下请求头
{"pwd":MD5加密的密码,"key":木马唯一身份ID,"cmd":base64密文}
base64密文:{"sleeptime": "", "cdm": "你要执行的命令"}
成功则响应状态码为 200
响应正文:{"info":发布成功或失败的提示信息}
处理控制端要删除某台上线主机的接口:/killhost
该接口依赖 ./lib/baseser.py 中的 del_host_info() 方法
当控制端请求该接口时,首先会校验控制端提供的密码是否合法,然后校验提供的木马唯一ID值是否合法,校验成功后,就会根据其提供的木马的唯一ID值来清除服务器存储的木马的唯一ID值和其ID绑定的 AES 秘钥
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1
越权
首先使用功能点添加一次申报,点击编辑,抓包
可以看到是使用id控制返回的数据的
服务端没有进行鉴权,修改id可返回其他用户的数据,其他接口也是一样
越权删除.还是在提交申报那里,添加文件,抓包
并没有返回文件路径,但返回了id,所以要配合刚才的越权接口使用
成功解析
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
首先使用功能点添加一次申报,点击编辑,抓包
可以看到是使用id控制返回的数据的
服务端没有进行鉴权,修改id可返回其他用户的数据,其他接口也是一样
越权删除.还是在提交申报那里,添加文件,抓包
并没有返回文件路径,但返回了id,所以要配合刚才的越权接口使用
成功解析
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
👍1
LDAP概述
对于那些并不熟悉Lightwieght Directory Access Protocol (LDAP)人来讲,它大概像是一个目录信息。虽然LDAP在很多平台被使用,但在windows的域环境中它却是 Active Directory Services (ADS)的核心,ADS负责windows域的认证和授权,但也储存了大量的信息,这些信息包括但不限于域用户,计算机用户,域用户组,安全策略和软件更新。每一个对象都有多种属性与之关联,并且其中大部分的属性都可以通过LDAP查询。比如每一个用户都有一个”Created”的属性包含了账号创建时间。同样的每一个账户都有一个” ServicePrincipleName”属性,这也是本文接下来的重点。
微软的文档中是这样陈述的:”ServicePrincipleName(SPN)是客户端用来唯一标识一个服务实例的名称”,在略读后发现这大概为了便利widnows域中的Kerberos认证,但我们可以用它来做一些其他的事,对于我们来说,多值的ServicePrincipleName是很方便的。因为在Active Directory中任何一个用户和计算机对象都储存了账户在域中的运行的服务信息。所以这就可以很方便的定位像IIS、SQL Server,及LDAP。同样也可以很方便的查询到对应的用户在哪里登陆(比如域管理员)。这相对来说要简单些,因为SPN有一个标准化的命令约定。SPN格式为SERVICE/HOST,但有时也会包含端口像 SERVICE/HOST:PORT。 比如,如果一个域用户曾在acme.com域中运行DNS和SQL Server服务
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
对于那些并不熟悉Lightwieght Directory Access Protocol (LDAP)人来讲,它大概像是一个目录信息。虽然LDAP在很多平台被使用,但在windows的域环境中它却是 Active Directory Services (ADS)的核心,ADS负责windows域的认证和授权,但也储存了大量的信息,这些信息包括但不限于域用户,计算机用户,域用户组,安全策略和软件更新。每一个对象都有多种属性与之关联,并且其中大部分的属性都可以通过LDAP查询。比如每一个用户都有一个”Created”的属性包含了账号创建时间。同样的每一个账户都有一个” ServicePrincipleName”属性,这也是本文接下来的重点。
微软的文档中是这样陈述的:”ServicePrincipleName(SPN)是客户端用来唯一标识一个服务实例的名称”,在略读后发现这大概为了便利widnows域中的Kerberos认证,但我们可以用它来做一些其他的事,对于我们来说,多值的ServicePrincipleName是很方便的。因为在Active Directory中任何一个用户和计算机对象都储存了账户在域中的运行的服务信息。所以这就可以很方便的定位像IIS、SQL Server,及LDAP。同样也可以很方便的查询到对应的用户在哪里登陆(比如域管理员)。这相对来说要简单些,因为SPN有一个标准化的命令约定。SPN格式为SERVICE/HOST,但有时也会包含端口像 SERVICE/HOST:PORT。 比如,如果一个域用户曾在acme.com域中运行DNS和SQL Server服务
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
👍1
木马生成
在attack->packages中找到windows木马生成
Listener选择我们刚才创建的(有两个,选择有DNS的那个),输出的有exe,带服务的EXE,dll等。(我测试过连接方式以DNS生成的DLL木马能过掉很大一部分杀毒软件)
我们把生成的DNS.EXE放到虚拟机中运行。
走的是DNS。
回到Cobalt Strike打开beacons管理器发现有一个服务端响应了我们
右键是管理菜单,选择sleep设置相应的时间,然后选择interact来到操作界面
首先来设置的是传输的模式,有dns、dns-txt,http,smb四种,我们这里用的是DNS就在dns、dns-txt中选择把,前者传送的数据小后者传送的数据多 这里我设置为mode dns-txt(这里可以用TAB补齐命令的)
键入help可以看到支持的命令
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在attack->packages中找到windows木马生成
Listener选择我们刚才创建的(有两个,选择有DNS的那个),输出的有exe,带服务的EXE,dll等。(我测试过连接方式以DNS生成的DLL木马能过掉很大一部分杀毒软件)
我们把生成的DNS.EXE放到虚拟机中运行。
走的是DNS。
回到Cobalt Strike打开beacons管理器发现有一个服务端响应了我们
右键是管理菜单,选择sleep设置相应的时间,然后选择interact来到操作界面
首先来设置的是传输的模式,有dns、dns-txt,http,smb四种,我们这里用的是DNS就在dns、dns-txt中选择把,前者传送的数据小后者传送的数据多 这里我设置为mode dns-txt(这里可以用TAB补齐命令的)
键入help可以看到支持的命令
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1
进行渗透测试的过程中,往往会遇到数据包、响应包是加密的情况。如果选择放弃,就失去了一次可能渗透成功的机会。不过burpsuite里面有一个插件可以完美解决这个问题,就是autoDecoder,他可以实现内置的自动加解密,和自定义的加解密,已经给出框架,我们写加解密实现即可
然后将测试的数据包放入,点击解密和加密,发现解码、编码都成功,证明可以正常使用。
自带加解密算法使用
请求包解密,响应包不解密 和 全文本加密
算法为DES/CBC/PKCS5Padding算法,密钥为f0ngtest,iv为f0ngf0ng
请求体为
I9z1fsH5QQ2NUbJi/7a8lw==
自带算法加解密模块设置
加解密如下,需要在响应包哪里设置null,表示为空,即不使用解密。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
然后将测试的数据包放入,点击解密和加密,发现解码、编码都成功,证明可以正常使用。
自带加解密算法使用
请求包解密,响应包不解密 和 全文本加密
算法为DES/CBC/PKCS5Padding算法,密钥为f0ngtest,iv为f0ngf0ng
请求体为
I9z1fsH5QQ2NUbJi/7a8lw==
自带算法加解密模块设置
加解密如下,需要在响应包哪里设置null,表示为空,即不使用解密。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1👍1