记一次有授权渗透测试

对一个后台登录网站的测试,最后成功拿到root权限。

信息收集

打开目标站点,发现是一个后台登陆页面,因为没有发现前台0.0,后台界面如下:

1578131100356

经过对后台网站的指纹识别,后端语言为PHP,并且为Laravel框架,这时感觉注入可能没戏了,一般框架会提供PDO 参数绑定来保护应用程序免受 SQL 注入的攻击,当时有考虑进行弱口令爆破,当实在没有办法了再考虑这种方法吧。

1578130868113

因为目标网址不算什么大型网址,应该不会使用CDN,直接nslookup看下ip地址:

1578131554613

进行全端口扫描:

1578131744536

通过扫描结果可以发现,除了正常的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。

如何利用?

  1. VirtualMachine/IDSizes 确定了能够被JVM处理的数据包的大小.
  2. ClassType/InvokeMethod 允许你唤起一个静态函数
  3. ObjectReference/InvokeMethod 允许你唤起JVM中一个实例化对象的方法;
  4. StackFrame/(Get|Set) 提供了线程堆栈的pushing/popping的功能;
  5. Event/Composite强制JVM执行此命令的行为,此命令是调试需要的密钥。这个事件能够要求JVM按照其意愿设置断点,单步调试,以及类似与像GDB或者WinGDB的方式一样进行调试。JDWP提供了内置命令来将任意类加载到JVM内存中并调用已经存在和/或新加载的字节码。

漏洞利用

先在公网的服务器上进行端口监听,来进行反弹shell:

直接使用网上已存在的exp进行命令执行,执行的代码经过base64加密,并且成功执行:

此时公网的服务上监听到反弹过来的shell,但权限比较低,这并不是我想要的,接下来尝试进行提权操作:

SUID提权

先从最简单的提权操作尝试,查看下当前用户可以执行的具有root权限的命令,结果发现了一个大大的惊喜,当前用户可执行service命令,并无需密码。

使用service命令进行提权,并成功提升为root权限:

因为拿到root权限就可以了,所以没有进行权限维持以及后渗透的相关操作。

进入后台

当时没有截图,所以口述下0.0

拿到shell后读取下数据库的相关配置文件,找到了数据库密码成功读取到相关数据,但后台的密码经过了md5加密,在破解网站上破解无果,后来伪造了一条数据并插入了数据库,最后成功进入到了后台。

Author: Sys71m
Link: https://www.sys71m.top/2019/09/15/记一次有授权渗透测试/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.