Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从ceph对象中提取RBD中的指定文件

从ceph对象中提取RBD中的指定文件

作者头像
用户2772802
发布于 2018-08-06 01:44:36
发布于 2018-08-06 01:44:36
6.3K00
代码可运行
举报
文章被收录于专栏:磨磨谈磨磨谈
运行总次数:0
代码可运行

前言

之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应该很难找到对应关系,最近看到小胖有提出这个问题,那么就再次尝试了,现在就是把这个实现方法记录下来 这个提取的作用个人觉得最大的好处就是一个rbd设备,在文件系统层被破坏以后,还能够从rbd提取出文件,我们知道很多情况下设备的文件系统一旦破坏,无法挂载,数据也就无法读取,而如果能从rbd中提取出文件,这就是保证了即使文件系统损坏的情况下,数据至少不丢失

本篇是基于xfs文件系统情况下的提取,其他文件系统有时间再看看,因为目前使用的比较多的就是xfs文件系统

本篇也回答了一个可能会经常被问起的问题,能告诉我虚拟机里面的文件在后台存储在哪里么,看完本篇就知道存储在哪里了

XFS文件系统介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# mkfs.xfs -f /dev/rbd0p1 warning: device is not properly aligned /dev/rbd0p1
meta-data=/dev/rbd0p1            isize=256    agcount=9, agsize=162816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0data     =                       bsize=4096   blocks=1310475, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0

XFS文件系统采取是AG管理的,每个AG维护自己的inode和数据,所以XFS文件系统是一种很容易扩展的文件系统,本篇里面主要用到的命令是xfs_bmap这个命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /etc/fstab/etc/fstab:
 EXT: FILE-OFFSET      BLOCK-RANGE        AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          26645424..26645431  1 (431024..431031)     8 00000

一个文件最小就是8个block(512b),也就是4k,这个因为上面默认的xfs的格式化就是data bsize=4K,这个值可以自行调整的,本篇尽量用默认常规的参数来讲例子

查看man xfs_bmap这个命令可以看到:

Holes are marked by replacing the startblock..endblock with hole. All the file offsets and disk blocks are in units of 512-byte blocks, no matter what the filesystem’s block size is.

意思是这个查询到的里面的计数单位都是512-byte,不管上层设置的block大小是多少,我们知道文件系统底层的sector就是512-byte,所以这个查询到的结果就可以跟当前的文件系统的sector的偏移量联系起来,这里强调一下,这个偏移量的起始位子为当前文件系统所在分区的偏移量,如果是多分区的情况,在计算整个偏移量的时候就要考虑分区的偏移量了,这个会在后面用实例进行讲解的

rbd的对象是不清楚内部分区的偏移量,所以在rbd层进行提取的时候是需要得到的是分区当中的文件相对整个磁盘的一个sector的偏移量

rbd的对象结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd ls|grep datarbd_data.25a636b8b4567.00000000000009ff
rbd_data.25a636b8b4567.00000000000001dd
rbd_data.25a636b8b4567.0000000000000000rbd_data.25a636b8b4567.000000000000009f
rbd_data.25a636b8b4567.0000000000000459rbd_data.25a636b8b4567.000000000000027e
rbd_data.25a636b8b4567.00000000000004ff
rbd_data.25a636b8b4567.000000000000027c
rbd_data.25a636b8b4567.000000000000027d
rbd_data.25a636b8b4567.0000000000000001rbd_data.25a636b8b4567.000000000000013e
rbd_data.25a636b8b4567.00000000000003ba
rbd_data.25a636b8b4567.000000000000031b
rbd_data.25a636b8b4567.00000000000004f8

rbd被xfs格式化以后会产生一些对象,这些对象是以16进制名称的方式存储在后台的,也就是rbd大小一定的情况下对象数目是一定的,也就是名称也是一定的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# parted -s /dev/rbd0 unit s printModel: Unknown (unknown)
Disk /dev/rbd0: 20971520s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start      End        Size       File system  Name     Flags 1      1953s      10485759s  10483807s  xfs          primari 2      10485760s  20963327s  10477568s               primari

上面可以看到rbd0的sector个数为20971520s 20971520s*512byte=10737418240byte=10485760KB=10240MB sector的大小一定,总rbd大小一定的情况下sector的数目也是一定的,本篇实例的rbd大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rbd info zprbd image 'zp':
    size 10000 MB in 2500 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.25a776b8b4567
    format: 2
    features: layering
    flags: 
    create_timestamp: Sat Jul 22 18:04:12 2017

sector和ceph object的对应关系的查询

这个就像个map一样,需要把这个关系给找到,一个sector的区间对应到object的map,这里我用python写个简单的方法来做查询,也可以自己用其他语言来实现

首先查询到rbd的对象数目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rbd info zprbd image 'zp':
    size 10000 MB in 2500 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.25a776b8b4567
    format: 2
    features: layering
    flags: 
    create_timestamp: Sat Jul 22 18:04:12 2017

处理脚本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim getsecob.py

添加下面内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#! /bin/python# *-* conding=UTF-8 *-*import commands

def main():
    getmap(2500)

def getmap(object):
    sector=int(object)*4096*1024/512
    print "object:"+str(object)
    print "sector:"+str(sector)
    incre=sector/object    for item in range(int(object)):
        a=int(item*8192)
        b=int((item+1)*8192-1)
        print str([a,b])+"  -->  "+"%016x" %itemif __name__ == '__main__':
    main()

其中getmap后面为对象数目 输出是这个形式的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# python getsecob.pyobject:2500sector:20480000[0, 8191]  -->  0000000000000000[8192, 16383]  -->  0000000000000001[16384, 24575]  -->  0000000000000002[24576, 32767]  -->  0000000000000003[32768, 40959]  -->  0000000000000004[40960, 49151]  -->  0000000000000005···

对rbd0进行分区,分区后的结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# parted -s /dev/rbd0 unit s printModel: Unknown (unknown)
Disk /dev/rbd0: 20480000s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start      End        Size       File system  Name     Flags 1      1953s      10240000s  10238048s               primari 2      10248192s  20471807s  10223616s               primari

这个是个测试用的image,大小为10G分成两个5G的分区,现在我们在两个分区里面分别写入两个测试文件,然后经过计算后,从后台的对象中把文件读出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mount /dev/rbd0p1 /mnt1
mount /dev/rbd0p2 /mnt2
cp /etc/fstab /mnt1
cp /etc/hostname /mnt2

首先获取文件在分区上的sector的偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /mnt1/fstab /mnt1/fstab:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          8224..8231        0 (8224..8231)         8 01111

可以得到是(8224..8231)共8个sector 从上面的分区1的start的sector可以知道起始位置是1953,那么相对于磁盘的偏移量就变成了

(8224+1953..8231+1953) = (10177..10184)

这里说下,这个地方拿到偏移量后,直接通过对rbd设备进行dd读取也可以把这个文件读取出来,这个顺带讲下,本文主要是从对象提取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dd if=/dev/rbd0 of=a bs=512 count=8 skip=10177

bs取512是因为sector的单位就是512b 这样就把刚刚的fstab文件读取出来了,skip就是文件的sector相对磁盘的起始位置,count就是文件所占的block数目

继续我们的对象提取方式,上面的(10177..10184)这个我们根据上面那个脚本输出的对象列表来找到对象

[8192, 16383] → 0000000000000001 获取名称,这个因为我的是测试环境,就只有一个匹配,多个image的时候要过滤出对用的rbd的对象,用prifix过滤即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd ls|grep 0000000000000001rbd_data.25a776b8b4567.0000000000000001

下载对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# rados -p rbd get rbd_data.25a776b8b4567.0000000000000001 rbd_data.25a776b8b4567.0000000000000001

根据偏移量计算对象中的偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10177..10184[8192, 16383]  -->  0000000000000001

得到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10177-8192=1985dd if=rbd_data.25a776b8b4567.0000000000000001 of=a bs=512 count=8 skip=1985

得到的文件a的内容即为之前文件的内容

准备取第二个分区的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# xfs_bmap -lvp /mnt2/hostname /mnt2/hostname:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL FLAGS   0: [0..7]:          8224..8231        0 (8224..8231)         8 01111

8224+10248192..8231+10248192=10256416..10256423

从磁盘方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# dd if=/dev/rbd0 of=a bs=512 count=8 skip=10256416

从对象方式 10256416..10256423 对应 [10256384, 10264575] → 00000000000004e4 对象偏移量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10256416-10256384=32
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rados -p rbd get 
[root@lab8106 ~]# rados -p rbd get rbd_data.25a776b8b4567.00000000000004e4 rbd_data.25a776b8b4567.00000000000004e4

获取文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lab8106 ~]# dd if=rbd_data.25a776b8b4567.00000000000004e4 of=a bs=512 count=8 skip=32

如果文件比较大的情况,可能出现就是文件是跨对象的,那么还是跟上面的提取方法一样,然后进行提取后的文件进行合并即可

总结

在存储系统上面存储的文件必然会对应到底层磁盘的sector,而sector也是会一一对应到后台的对象的,这个在本文当中得到了验证,所以整个逻辑就是,在文件系统层找到文件对应的sector位置,然后再在底层把sector和对象关系找好,就能从找到文件在对象当中的具体的位置,也就能定位并且能提取了,本篇是基于xfs的,其他文件系统只要能定位文件的sector,就可以在底层找到文件,这个以后会补充其他文件系统进来

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磨磨谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谷歌最新验证系统又双叒被「破解」了,这次是强化学习
对于谷歌浏览器的用户来说,上面这幅画面想必并不陌生。这是谷歌开发的验证码系统 reCaptcha,旨在确认访问者是人还是程序,并防止恶意程序的入侵。
机器之心
2019/04/29
2.6K0
谷歌最新验证系统又双叒被「破解」了,这次是强化学习
CAPTCHAs验证码被人工智能攻破
据《科学》(Science)杂志2017年10月报道,一家名为Vicarious的人工智能公司开发的人工智能算法攻破了被人们广泛使用的CAPTCHAs验证码。 CAPTCHAs(Completely Automated Public Turing Test To Tell Computers and Humans Apart,全自动区分计算机和人类的图灵测试)是目前最常用的一种验证码,通常由一组混乱的字符、波浪线和其他背景噪声组成。例如,在你报名参加一个时事通讯或购买音乐会门票之前,可能会被要求输入这些字符
人工智能快报
2018/03/15
8610
CAPTCHAs验证码被人工智能攻破
谷歌家的验证码怎么了?搞他!
很久没有做爬虫破解类相关的分享了,之前交流群里有朋友提问谷歌系的reCAPTCHA V2 验证码怎么破,因为工作的原因我是很久之后才看到的,也不知道那位朋友后来成功了没有。那今天就来跟大家分享一下 reCAPTCHA V2 的破解。
崔庆才
2020/01/02
4.6K0
手把手使用Python教你破解谷歌(Google)人机验证码—上篇
今天呢,咱们来说一下Google,我们都知道,Google是目前地表最强的搜索引擎了,我们可以借助Google庞大的搜索资源找到一些自己想要的资源,可能是一些收费电影,可能是一些奇门小说,可能是某个角落的种子,不管怎么说,Google搜索还是挺给力的,但是呢,有梯子的我们可能都遇到过,我们搜索的多了,会有下图的这种情况。
Python进阶者
2020/02/19
7.1K1
手把手使用Python教你破解谷歌(Google)人机验证码—上篇
验证码破解全流程实战
验证码,全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试,Captcha。早在上个世纪90年代,为了防止恶意的网络机器人行为,像邮件轰炸、暴力破解密码等,验证码应运而生。
TechLead
2023/10/21
2.6K0
验证码破解全流程实战
黑产用“未来武器”破解验证码,打码小工都哭了
当我们正讨论如何用AI推动产业升级、改变未来生活时,不法分子也在研究AI技术,并通过各种手段非法牟利。近日,腾讯守护者计划安全团队协助警方打掉市面上最大打码平台“快啊答题”,挖掘出一条从撞库盗号、破解验证码到贩卖公民信息、实施网络诈骗的全链条黑产。而在识别验证码这一关键环节,黑产竟已用上AI人工智能技术。该团伙运用AI技术训练机器,极大提升了单位时间内识别验证码的数量,2017年一季度打码量达到259亿次,且识别验证码的精准度超过80%。借此案件,我们也深入研究AI打码平台黑产领域,对其犯罪模式进行剖析。
FB客服
2018/02/28
3.1K0
黑产用“未来武器”破解验证码,打码小工都哭了
2025最新滑块验证码、图形验证码、解决滑块验证码识别的技术方法大全
滑块验证码(Slider Captcha)自上线以来,以其交互性强、用户体验较好而被广泛应用于各类网站和 APP 的登录、注册、支付等关键环节。相比传统文字验证码或图形混淆验证码,滑块验证码能够更有效地区分真人与机器人,降低恶意脚本的通过率。然而,随着技术的发展,滑块验证码也不断被识别与破解。本文将从「生成与验证组件」和「识别与破解工具」两个大类入手,结合多款 GitHub 开源项目,逐一介绍各自的技术栈、实现原理、优缺点,以及实际使用场景与配置要点,并在最后给出综合对比与推荐,帮助技术选型和快速上手。
猫头虎
2025/06/08
2.3K0
模仿黑产破解12306验证码,验证码产品的未来是?
导读:12306验证码,长时间高居反人类产品排行榜第一名(据某网站调查),普通人一次通过率仅8%,人也识别不清的图片就能成功阻挡自动机了吗?谷歌街景验证码完全取自自然环境确保图片的不重复不被爆破,但是面对黑产的巨额利润,又能坚持多久?本文由安全平台部的shisi撰写,试图通过模仿黑产的破解手法去重新思考验证码产品的发展方向。 验证码,人类与机器不平等的对抗 在AI的新时代背景下,破解一款验证码的成本正变的越来越低。 很多时候,看似复杂的谷歌街景、12306验证码、让人望而却步的百万图库,实际并不复杂:
腾讯技术工程官方号
2018/05/11
1.3K0
从谷歌和12306验证码的破解说起,人类与机器不平等的对抗
12306验证码,长时间高居反人类产品排行榜第一名,普通人一次通过率仅8%,人也识别不清的图片就能成功阻挡自动机了吗?谷歌街景验证码完全取自自然环境确保图片的不重复不被爆破,但是面对黑产的巨额利润,又能坚持多久?本文通过仿黑产破解的手法去重新思考验证码产品发展方向
十四君
2019/11/27
1.2K0
Selenium+2Captcha 自动化+验证码识别实战
本文深入探讨了使用Selenium库进行网页自动化操作,并结合2Captcha服务实现ReCAPTCHA验证码的破解。内容涵盖Selenium的基础知识、验证码的分类、2Captcha服务的使用,以及通过实例进行的详细讲解,最后对实践进行总结和优化思考,为读者提供了一条完整的验证码破解实践路线图。
TechLead
2023/10/21
2.1K0
Selenium+2Captcha 自动化+验证码识别实战
Python | 用机器学习搞定数字验证码,还有谁?!
来源:http://www.hi-roy.com/2017/09/19/Python验证码识别
用户1634449
2018/12/18
2.1K0
reCAPTCHA 项目
要说 reCAPTCHA,就要先说一说 CAPTCHA,全称是 Completely Automated Public Turing test to tell Computers and Humans Apart,即全自动区分计算机和人类的图灵测试,也就是通常说的 “验证码”,目的就是要把计算机和人区分开来。在互联网站上,为了防止不安全的、重复暴力的登陆密码破解等操作,需要使用验证码来将机器行为拒之门外。
四火
2022/07/15
7790
reCAPTCHA 项目
字符型图片验证码识别完整过程及Python实现
本文讲述如何通过对比学习算法实现手写数字识别,并使用一个基于SVM的算法进行测试。通过对比不同算法的效果,得出结论:使用基于SVM的算法可以较好地识别手写数字。
用户1170933
2018/01/05
6.3K0
字符型图片验证码识别完整过程及Python实现
使用Python+Tensorflow的CNN技术快速识别验证码
2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 正文共2929个字,17张图,预计阅读时间:8分钟。 近年来,机器学习变得愈加火热,中国选手柯洁与AlphaGo的人机大战更是引起热议。目前,在图像识别和视觉分析研究中,卷积神经网络(CNN)技术的使用越来越多。Tensorflow 是由 Google 团队开发的神经网络模块,短短几年间, 就已经有很多次版本的更新。最近我也在自学Tensorflow,想通过卷积神经网络快速识别整块验证码(不分割字符)。期间也碰到许多
企鹅号小编
2018/01/24
1.5K0
使用Python+Tensorflow的CNN技术快速识别验证码
Google 验证码进化史:我们越来越方便,但也交出了越来越多的隐私
即使现在互联网已经渗透到我们生活的方方面面,但它依然只是现实的物理世界在虚拟的网络空间上按比特信息编码后的投射。
猿哥
2019/07/15
1.3K0
Google 验证码进化史:我们越来越方便,但也交出了越来越多的隐私
用Python机器学习搞定验证码
写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字、字母的组合,国内也有使用汉字的。在这个基础上增加噪点、干扰线、变形、重叠、不同字体颜色等方法来增加识别难度。 相应的,验证码识别大体可以分为下面几个步骤: 灰度处理 增加对比度(可选) 二值化 降噪 倾斜校正分割字符 建立训练库 识别 由于是实验性质的,文中用到的验证码均为程序生成而不是批量下载真实的网站验证码,这样做的好处就是可以有大量的知道明确结果的数据集。 当
小小科
2018/05/02
1.3K0
用Python机器学习搞定验证码
TensorFlow识别字母扭曲干扰型验证码-开放源码与98%模型
转载请附:博文网址: urlteam   ,github 网址:tensorflow_cnn
十四君
2019/11/24
1.6K0
机器人喊话Google:防我?没门!
互联网公司拥有同一个长期性的棘手课题:如何屏蔽自动软件,如何防止机器的恶意注册,如何禁止一系列“非人类用户”的恶意操作等等。Google近些年对于算法研发的热情不减,本月3号,Google推出全新的验
机器人网
2018/04/13
1.3K0
机器人喊话Google:防我?没门!
12306破解!
验证码(CAPTCHA),是一种区分用户是计算机还是人的公共全自动程序。对于研究爬虫来说,这应该是爬虫的“天敌”。
谭庆波
2020/03/13
1.9K0
实现一个简单的Burp验证码本地识别插件
为什么要写一个这个东西呢?虽然现在好多大网站都不用图片验证码了,但是仍然有一部分陈旧的web系统用着一些简单的图片验证码。当遇到带有验证码,而验证码的形式又非常简单的时候,手工测试起来可能太麻烦。我所知道的现有工具中有“PKAV HTTP Fuzzer”可以识别验证码,并做一些fuzz。但是,这款工具本身不提供,自带的识别引擎的训练工具。并且,软件所支持的次时代和和亦思验证码识别系统都是收费的,没有找到干净好用的破解版。因此,萌发了这样一个念头。先给各位放一张成品图片吧!
FB客服
2018/07/30
1.2K0
实现一个简单的Burp验证码本地识别插件
推荐阅读
相关推荐
谷歌最新验证系统又双叒被「破解」了,这次是强化学习
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
加入数据技术趋势交流群
大数据技术前瞻 数据驱动业务实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验