对一个后台登录网站的测试,最后成功拿到root权限。
信息收集
打开目标站点,发现是一个后台登陆页面,因为没有发现前台0.0,后台界面如下:
经过对后台网站的指纹识别,后端语言为PHP,并且为Laravel
框架,这时感觉注入可能没戏了,一般框架会提供PDO 参数绑定来保护应用程序免受 SQL 注入的攻击,当时有考虑进行弱口令爆破,当实在没有办法了再考虑这种方法吧。
因为目标网址不算什么大型网址,应该不会使用CDN,直接nslookup
看下ip地址:
进行全端口扫描:
通过扫描结果可以发现,除了正常的80端口外,还开放了8000,8009,8080,发现8000端口存在jdwp
服务。
JDWP的利用
参考知道创宇Paper:
1 | https://paper.seebug.org/933/ |
什么是JDWP?
JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。比如在 Sun 公司提供的实现中,它提供了一个名为 jdwp.dll(jdwp.so)的动态链接库文件,这个动态库文件实现了一个 Agent,它会负责解析前端发出的请求或者命令,并将其转化为 JVMTI 调用,然后将 JVMTI 函数的返回值封装成 JDWP 数据发还给后端。
为什么会开启?
JDWP
是JAVA的一个调试协议。本质上我们通过IDEA
或者eclipse
通过断点的方式调试JAVA应用时,使用的就是JDWP
。在什么时候会使用到JDWP
这种协议呢?比如你在线上跑了一个应用,但是这个问题只有在线上才会出现问题,那么这个时候就必须开启远程调试功能了,此时就有可能被攻击者利用RCE。
如何利用?
VirtualMachine/IDSizes
确定了能够被JVM处理的数据包的大小.ClassType/InvokeMethod
允许你唤起一个静态函数ObjectReference/InvokeMethod
允许你唤起JVM中一个实例化对象的方法;StackFrame/(Get|Set)
提供了线程堆栈的pushing/popping的功能;Event/Composite
强制JVM执行此命令的行为,此命令是调试需要的密钥。这个事件能够要求JVM按照其意愿设置断点,单步调试,以及类似与像GDB
或者WinGDB
的方式一样进行调试。JDWP提供了内置命令来将任意类加载到JVM内存中并调用已经存在和/或新加载的字节码。
漏洞利用
先在公网的服务器上进行端口监听,来进行反弹shell:
直接使用网上已存在的exp进行命令执行,执行的代码经过base64加密,并且成功执行:
此时公网的服务上监听到反弹过来的shell,但权限比较低,这并不是我想要的,接下来尝试进行提权操作:
SUID提权
先从最简单的提权操作尝试,查看下当前用户可以执行的具有root权限的命令,结果发现了一个大大的惊喜,当前用户可执行service
命令,并无需密码。
使用service
命令进行提权,并成功提升为root权限:
因为拿到root权限就可以了,所以没有进行权限维持以及后渗透的相关操作。
进入后台
当时没有截图,所以口述下0.0
拿到shell后读取下数据库的相关配置文件,找到了数据库密码成功读取到相关数据,但后台的密码经过了md5加密,在破解网站上破解无果,后来伪造了一条数据并插入了数据库,最后成功进入到了后台。