尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

OneGadget跨平台部署指南:从Ruby环境到漏洞利用的完整配置

OneGadget跨平台部署指南:从Ruby环境到漏洞利用的完整配置 1. 项目概述为什么需要一份详尽的OneGadget部署指南如果你在Linux安全研究、CTF竞赛或者二进制漏洞利用的领域里摸爬滚打过一阵子那么“OneGadget”这个名字对你来说一定不陌生。它不是一个独立的程序而是一个极其高效的Ruby脚本工具专门用于在目标系统的libc.so.6库文件中自动搜索那些能直接执行execve(‘/bin/sh’, NULL, NULL)或类似功能的“一击必杀”gadget地址。简单来说它把我们从手动分析libc、用ROP链辛辛苦苦构造系统调用的繁琐工作中解放了出来堪称堆栈溢出利用的“瑞士军刀”。然而就是这个看似简单的脚本其部署过程却让不少新手甚至是有经验的研究者都踩过坑。问题就出在它的运行环境上——OneGadget本身是一个Ruby脚本它依赖于Ruby环境以及ruby-dev、build-essential等编译工具链。在不同的Linux发行版上包管理器、默认软件源、库文件路径乃至系统架构都存在差异。你可能会在Ubuntu上轻松搞定换到CentOS或Arch Linux上就遇到各种“找不到命令”、“Gem安装失败”、“版本冲突”的报错。更不用说在国产化浪潮下基于ARM架构的嵌入式Linux平台如RV1126或一些定制发行版上环境配置更是步步惊心。因此这份指南的目的就是为你提供一份跨发行版、可复现、带深度原理解析和避坑实录的OneGadget部署手册。我不会只给你一串命令而是会解释清楚每一条命令背后的逻辑为什么在这个发行版上要这样做在另一个发行版上又该如何调整。无论你用的是Ubuntu、Debian、CentOS/RHEL、Fedora、Arch Linux还是国产的Deepin、UOS甚至是嵌入式环境你都能在这里找到对应的、经过验证的配置路径。2. 核心需求解析OneGadget到底依赖什么在开始动手之前我们必须彻底搞清楚OneGadget这个工具链的依赖关系。这能帮助我们在遇到问题时快速定位是哪个环节出了岔子。OneGadget的核心是一个Ruby Gem包。它的安装通常通过gem install one_gadget命令完成。但这背后隐藏着几层依赖第一层Ruby解释器本身。OneGadget是用Ruby写的所以你必须先有一个可用的Ruby环境。这里第一个坑就来了很多Linux发行版自带的Ruby版本可能比较旧比如CentOS 7默认是Ruby 2.0而OneGadget对Ruby版本有最低要求通常需要2.3。直接用系统自带的旧版本可能会导致Gem安装失败或运行时出错。第二层RubyGems和开发工具链。gem是Ruby的包管理器。安装Gem时如果这个Gem包含本地扩展C语言写的部分虽然OneGadget本身是纯Ruby但其依赖的某些Gem可能有就需要编译。这就引出了对ruby-dev或ruby-devel包含Ruby头文件和静态库以及gcc、make等编译工具的需求。没有它们gem install会报关于“mkmf.rb”或“编译扩展”的错误。第三层系统基础库。一些底层库如zlib、openssl的开发版本zlib1g-dev,libssl-dev可能被Ruby的编译或某些Gem的依赖所间接需要。特别是在从源码编译Ruby时这些库至关重要。第四层OneGadget运行时的隐式依赖。OneGadget需要读取和分析ELF格式的libc.so.6文件。它依赖于Ruby的ELFTools这个Gem来解析ELF。而ELFTools是一个纯Ruby的库这算是比较省心的一点意味着我们通常不需要为OneGadget本身准备额外的系统库。所以我们的部署任务本质上就是为目标Linux发行版搭建一个版本合适、功能完整的Ruby环境并确保编译工具链就位最后通过Gem顺利安装OneGadget。3. 通用基础环境准备编译工具链与基础库无论你选择哪种方式安装Ruby一套健全的编译工具链和基础开发库都是必不可少的。这一步可以避免后续无数令人头疼的编译错误。3.1 主流发行版安装命令以下命令需要root权限或使用sudo执行。Debian/Ubuntu及其衍生版如Deepin, Kali Linux:sudo apt update sudo apt install -y build-essential curl git libssl-dev libreadline-dev zlib1g-devbuild-essential元包包含了gcc,g,make等核心编译工具。libssl-dev和zlib1g-dev是编译Ruby特别是其openssl和zlib扩展时经常需要的开发库。RHEL/CentOS/Fedora:# CentOS/RHEL 7/8 sudo yum groupinstall -y Development Tools sudo yum install -y curl git openssl-devel readline-devel zlib-devel # CentOS 8/RHEL 8/Fedora 也可以使用dnf sudo dnf groupinstall -y Development Tools sudo dnf install -y curl git openssl-devel readline-devel zlib-develDevelopment Tools组提供了类似的编译环境。注意包名后缀是-devel而不是-dev。Arch Linux/Manjaro:sudo pacman -Syu --needed base-devel curl git openssl readline zlibbase-devel是Arch系的元包包含了完整的编译工具链。Arch的包通常已经包含了开发文件所以不需要单独的-dev包。实操心得在云服务器或全新的Docker容器中操作时第一步永远是更新软件源索引apt update/yum makecache确保能获取到最新的包信息。特别是在较旧的CentOS系统上默认源可能已经失效需要先配置EPEL等扩展源。3.2 为什么需要这些包一个编译视角的解释让我们深入一点理解这些包的作用。当你从源码编译Ruby时configure脚本会检查系统环境。gcc和make这是将C源代码编译成二进制可执行文件的根本。没有它们一切编译都无从谈起。openssl-develRuby的openssl扩展模块允许Ruby程序进行HTTPS请求、加密解密等操作。虽然OneGadget本身不直接进行网络操作但gem命令在从https://rubygems.org下载Gem时需要这个扩展。如果编译时缺少OpenSSL开发库Ruby的openssl扩展将无法被编译和启用导致gem install可能失败或功能不全。zlib-devel用于数据压缩。同样Ruby的zlib扩展需要它。某些Gem的安装过程或RubyGems本身可能会用到压缩功能。readline-devel为Ruby的交互式控制台IRB提供命令行编辑和历史记录功能。对于我们的使用场景运行脚本不是必须的但安装它可以让Ruby环境更完整避免潜在的配置警告。避坑提示在最小化安装的服务器系统如Ubuntu Server Minimal, CentOS Minimal上这些开发包默认都不会安装。如果你发现gem install时报告“Failed to build gem native extension”十有八九是缺少了对应的开发库。此时根据错误信息中提到的缺失头文件通常是.h文件反向查找对应的-dev或-devel包是解决问题的关键。4. Ruby环境部署策略详解三大路径的选择与实操这是整个部署的核心。我将介绍三种主流方法并分析其优劣和适用场景。4.1 方案一使用系统包管理器安装最快捷但版本受限这是最简单的方法适合想快速上手、对Ruby版本要求不严格或者系统源提供的Ruby版本已经满足OneGadget需求的情况。Debian/Ubuntu:sudo apt install -y ruby ruby-dev安装后可以通过ruby --version检查版本。Ubuntu 20.04 LTS默认提供Ruby 2.7这已经足够新。RHEL/CentOS:# CentOS 7 默认源版本很旧(2.0)不推荐。建议用SCL或方案二。 sudo yum install -y ruby ruby-devel # CentOS 8/Stream sudo dnf install -y ruby ruby-develArch Linux:sudo pacman -S rubyArch的滚动更新通常提供非常新的Ruby版本。优点安装极其简单与系统集成度好管理方便用系统包管理器升级或卸载。缺点版本受发行版仓库限制可能不是最新。特别是RHEL/CentOS系列为了稳定性默认仓库的软件版本往往非常保守。以CentOS 7为例默认的Ruby 2.0.0根本无法运行较新版本的OneGadget。适用场景Ubuntu/Debian较新版本用户、Arch用户或者仅用于测试、且系统版本恰好合适的情况。4.2 方案二使用RVMRuby Version Manager安装推荐灵活隔离RVM是一个成熟的Ruby版本管理工具允许你在同一台机器上安装、管理和切换多个独立的Ruby环境。这是Ruby社区的主流选择。安装RVMRVM的安装通常通过其官方网站的脚本进行。请注意安装脚本可能需要curl或gnupg。# 首先导入RVM的GPG密钥确保下载的脚本可信 gpg --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB # 安装稳定版RVM。这条命令会下载并执行安装脚本。 \curl -sSL https://get.rvm.io | bash -s stable安装完成后你需要重新打开终端或者执行source ~/.bashrc或~/.zshrc取决于你的shell来加载RVM环境变量。使用RVM安装指定版本的Ruby# 列出所有已知的可用Ruby版本 rvm list known # 安装一个特定版本例如3.1.2 rvm install 3.1.2 # 设置为默认使用版本 rvm use 3.1.2 --default # 检查当前使用的Ruby和Gem路径 ruby --version which gem此时gem命令已经指向RVM管理的Ruby环境下的Gem了。优点版本自由可以安装任何官方支持的Ruby版本不受系统仓库限制。环境隔离可以为不同项目创建独立的gemset避免Gem包全局污染和版本冲突。管理方便一键切换Ruby版本升级、卸载都很容易。缺点稍微增加了系统复杂性需要多一步安装RVM和配置shell的步骤。适用场景几乎所有场景尤其是你需要进行Ruby开发或者主机上已有其他Ruby应用怕产生冲突时。这是最通用、最推荐的方案。4.3 方案三使用rbenv安装更轻量的版本管理rbenv是另一个流行的Ruby版本管理工具它比RVM更轻量采用“非侵入式”设计通过修改PATH环境变量来工作而不是像RVM那样重载shell函数。安装rbenv以Ubuntu为例使用Git克隆git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo export PATH$HOME/.rbenv/bin:$PATH ~/.bashrc echo eval $(rbenv init -) ~/.bashrc source ~/.bashrc # 安装 ruby-build 插件它提供了 rbenv install 命令 git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build使用rbenv安装和使用Ruby# 列出所有可安装版本 rbenv install -l # 安装一个版本 rbenv install 3.1.2 # 设置为全局使用版本 rbenv global 3.1.2 # 或者仅在当前目录生效 # rbenv local 3.1.2 # 每次安装新Ruby或Gem后需要运行此命令让rbenv生效 rbenv rehash优点更轻量更符合Unix哲学只做版本管理这一件事行为更可预测。缺点功能上不如RVM丰富比如没有内置的gemset概念需要借助bundler或rbenv-gemset插件安装Ruby版本时可能更慢因为它通常是从源码编译。适用场景喜欢简洁工具链的用户或者系统环境对PATH修改比较敏感的场景。我的选择与建议对于专注于安全研究、CTF且不涉及复杂Ruby多项目开发的用户我推荐方案一如果系统版本够新或方案二RVM。RVM的一站式管理和强大的社区支持能帮你省去很多麻烦。如果你已经是rbenv的用户继续使用它也完全没有问题。绝对不要使用CentOS/RHEL 7默认的Ruby 2.0。5. OneGadget的安装与验证无论你通过上述哪种方案搭建好了Ruby环境安装OneGadget本身的命令都是一样的。但这里有一些细节需要注意。5.1 常规安装与权限问题最直接的安装命令是gem install one_gadget权限陷阱如果你使用的是系统包管理器安装的Ruby方案一并且直接运行上述命令很可能会遇到权限错误ERROR: While executing gem ... (Gem::FilePermissionError) You don‘t have write permissions for the /var/lib/gems/x.x.x directory.这是因为系统级的Ruby的Gem安装目录是受保护的。你有三种选择使用sudo不推荐sudo gem install one_gadget。这将OneGadget安装到系统全局环境。不推荐的原因是可能污染系统Ruby环境且未来卸载或升级需要同样使用sudo。安装到用户目录推荐使用--user-install参数。gem install one_gadget --user-install这会将Gem安装到~/.local/share/gem/ruby/x.x.x或~/.gem/ruby/x.x.x目录下。安装完成后你需要确保该目录下的bin文件夹在你的PATH环境变量中。通常安装后Gem会给出提示例如WARNING: You don‘t have /home/yourname/.local/share/gem/ruby/3.1.0/bin in your PATH.你需要将提示的路径添加到你的shell配置文件~/.bashrc或~/.zshrc中echo export PATH$HOME/.local/share/gem/ruby/3.1.0/bin:$PATH ~/.bashrc source ~/.bashrc使用RVM/rbenv最推荐如果你用的是RVM或rbenv那么gem install命令默认就是在你的用户环境下的不会遇到权限问题也无需--user-install参数。这是版本管理器带来的巨大便利。5.2 安装验证与快速测试安装完成后通过以下命令验证one_gadget --version如果正确输出版本号如1.8.0说明安装成功。让我们做一个快速的功能测试。首先你需要一个libc.so.6文件。可以从你当前系统中拷贝一个# 拷贝系统libc cp /lib/x86_64-linux-gnu/libc.so.6 ./ # 或者使用ldd查找某个二进制文件的libc路径 # ldd /bin/ls | grep libc然后运行OneGadget进行分析one_gadget ./libc.so.6你会看到类似如下的输出列出了在给定libc中找到的所有可能的one-gadget偏移地址及其约束条件0x4f2c5 execve(/bin/sh, rsp0x40, environ) constraints: rsp 0xf 0 rcx NULL 0x4f322 execve(/bin/sh, rsp0x40, environ) constraints: [rsp0x40] NULL 0x10a38c execve(/bin/sh, rsp0x70, environ) constraints: [rsp0x70] NULL这些偏移地址需要加上libc的基地址才能得到在目标进程内存空间中的实际运行时地址。这就是OneGadget的核心输出。6. 跨发行版特定问题与解决方案实录不同的发行版有其独特的“脾气”。下面是我在各类系统上实战部署时遇到的典型问题及解决方法。6.1 Debian/Ubuntu系SSL证书问题问题现象在使用gem install时可能会遇到SSL证书验证错误导致无法从rubygems.org下载。ERROR: Could not find a valid gem ‘one_gadget‘ ( 0), here is why: Unable to download data from https://rubygems.org/ - SSL_connect returned1 errno0 stateerror: certificate verify failed (unable to get local issuer certificate) (https://rubygems.org/specs.4.8.gz)原因分析Ruby的OpenSSL扩展无法找到有效的CA证书包来验证rubygems.org的HTTPS证书。这在一些较旧或最小化安装的系统上可能出现。解决方案更新系统的CA证书包sudo apt update sudo apt install -y ca-certificates如果问题依旧可以尝试指定使用系统证书对于通过RVM/rbenv安装的Ruby# 在安装Ruby时通过配置选项指定 rvm install 3.1.2 --with-openssl-dir/usr --with-openssl-lib/usr/lib --with-openssl-include/usr/include不推荐作为首选临时跳过SSL验证仅用于测试gem install one_gadget --source https://rubygems.org/ -V --clear-sources --ssl-verify-mode 06.2 RHEL/CentOS系旧版本Ruby与SCL核心问题CentOS 7默认的Ruby 2.0.0完全无法使用。解决方案启用Software Collections (SCL)仓库它提供了较新的软件版本而不影响系统默认环境。# CentOS 7 sudo yum install -y centos-release-scl sudo yum install -y rh-ruby30 rh-ruby30-ruby-devel # 安装Ruby 3.0 # 启用SCL环境仅当前会话 scl enable rh-ruby30 bash # 或者在运行命令时直接启用 scl enable rh-ruby30 ‘gem install one_gadget‘ # 也可以将其添加到shell启动文件但要注意可能与其他环境冲突更一劳永逸的方案直接采用前面推荐的RVM方案完全绕过系统自带的陈旧Ruby。6.3 Arch Linux系滚动更新的“甜蜜烦恼”问题Arch的软件包非常新有时会导致Ruby或Gem的依赖出现暂时的兼容性问题。策略使用稳定的Ruby版本通过RVM或rbenv安装一个LTS版本的Ruby如3.1.x而不是使用Arch仓库里最新的边缘版本可以增加稳定性。关注Arch Wiki和论坛在升级系统pacman -Syu后如果one_gadget突然不能用了先去Arch Wiki的Ruby页面和论坛搜索很可能已经有解决方案或临时降级包。6.4 嵌入式/ARM架构平台如RV1126挑战资源受限可能没有标准的包管理器需要交叉编译或直接在设备上从源码构建。部署思路交叉编译Ruby在x86主机上配置交叉编译工具链为ARM目标板编译Ruby。这个过程非常复杂涉及配置--host、--target参数并解决一系列库的依赖。使用Buildroot或Yocto如果目标系统是通过Buildroot或Yocto这类构建系统生成的那么应该在构建系统层面将Ruby和所需的Gem如one_gadget添加为系统包。这是最规范的方式。在设备上直接编译如果性能尚可在板子上直接操作步骤与在PC上类似但需要确保有足够的存储空间和内存。首先通过包管理器如opkg如果系统有或从源码安装编译工具链和依赖库然后使用RVM或从源码编译Ruby。注意从源码编译Ruby在ARM板上可能耗时很长。# 在板子上假设有apt或opkg # 1. 安装基础工具链 # 2. 下载Ruby稳定版源码 wget https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.2.tar.gz tar -xzf ruby-3.1.2.tar.gz cd ruby-3.1.2 # 3. 配置、编译、安装。可能需要指定--disable-install-doc来跳过文档安装节省时间。 ./configure --prefix/usr/local --disable-install-doc make -j$(nproc) # 使用多核编译 sudo make install # 4. 安装gem gem install one_gadget7. 进阶配置与使用技巧安装成功只是第一步高效地使用OneGadget还需要一些技巧。7.1 使用Bundler管理项目依赖可选但推荐如果你经常在多个不同的项目或环境中使用OneGadget或者你的利用脚本本身也是Ruby写的使用Bundler是一个好习惯。Bundler可以确保项目使用特定版本的Gem。首先安装Bundlergem install bundler在你的项目目录下创建一个名为Gemfile的文件没有后缀内容如下source ‘https://rubygems.org‘ gem ‘one_gadget‘然后运行bundle install这会在当前目录下的.bundle或vendor/bundle中安装OneGadget。之后你可以使用bundle exec one_gadget ...来运行确保使用的是本项目指定的Gem环境。7.2 OneGadget常用参数详解除了最基本的one_gadget libc_file它还有一些有用的参数-f或--force: 强制重新构建libc的缓存。如果你分析同一个libc文件OneGadget会缓存结果以加速后续分析。如果libc文件被更新了需要用此参数。-r或--raw: 只输出偏移地址不输出约束条件。方便脚本处理。one_gadget ./libc.so.6 -r # 输出: 0x4f2c5 0x4f322 0x10a38c-b或--build-id: 通过libc的构建IDbuild-id来查找。这在只知道ID而不知道文件路径时有用。--level: 输出信息的详细程度。--level 0只输出偏移--level 1默认输出偏移和约束--level 2会输出更多调试信息。7.3 集成到自动化利用脚本中OneGadget的输出非常适合被Python或Ruby自动化脚本捕获并利用。一个常见的模式是通过漏洞泄露libc的基地址。在本地用OneGadget分析目标libc文件得到gadget偏移。在脚本中计算gadget的实际地址 libc基地址 gadget偏移。构造ROP链将返回地址覆盖为该gadget地址。你可以用shell命令在脚本中调用OneGadget并解析输出# 在Bash脚本中获取第一个gadget地址 offset$(one_gadget ./target_libc.so.6 -r | head -1) echo “One-gadget offset: $offset”或者在Python中import subprocess libc_path ‘./target_libc.so.6‘ # 获取所有gadget偏移 result subprocess.check_output([‘one_gadget‘, ‘-r‘, libc_path], textTrue) offsets [int(addr, 16) for addr in result.strip().split()] # 假设我们泄露的libc基地址是 libc_base # gadget_addr libc_base offsets[0]8. 故障排除与常见问题速查表即使按照指南操作你也可能遇到意外。下表汇总了常见错误及其解决方法问题现象可能原因解决方案gem: command not foundRuby环境未安装或PATH未设置。1. 运行ruby --version确认Ruby已安装。2. 如果使用RVM/rbenv确保shell配置已加载重启终端或source ~/.bashrc。3. 如果使用--user-install确保Gem的bin目录已加入PATH。ERROR: Failed to build gem native extension缺少编译Ruby扩展所需的开发库。1. 确保已安装ruby-dev/ruby-devel包。2. 确保已安装build-essential/Development Tools组。3. 根据错误信息中的缺失头文件如openssl/bio.h安装对应的-dev/-devel包如libssl-dev。SSL_connect certificate verify failedRuby的OpenSSL无法验证HTTPS证书。1. 安装ca-certificates包并更新。2. 对于RVM安装的Ruby尝试重装并指定openssl路径rvm reinstall ruby-3.1.2 --with-openssl-dir/usr。3. 临时使用--ssl-verify-mode 0参数不安全。one_gadget: command not foundOneGadget可执行文件不在PATH中。1. 如果使用--user-install检查安装结束时的警告将提示的路径加入PATH。2. 如果使用RVM/rbenv安装后可能需要运行rbenv rehash或重启终端。3. 尝试使用绝对路径运行如~/.rvm/gems/ruby-3.1.2/bin/one_gadget。运行one_gadget报LoadErrorRubyGem环境损坏或版本冲突。1. 尝试更新RubyGemsgem update --system。2. 尝试重新安装OneGadgetgem uninstall one_gadget然后gem install one_gadget。3. 如果使用系统Ruby考虑使用sudo gem cleanup清理旧版本Gem。分析libc时无输出或报错libc文件不兼容、损坏或架构不符。1. 用file ./libc.so.6确认文件是有效的ELF共享库且架构x86-64, ARM等与你的OneGadget运行环境匹配。2. 确保libc文件是从目标系统或对应架构获取的不能拿x86的libc去分析ARM的漏洞。3. 尝试使用-f参数强制重建缓存。RVM安装Ruby时下载极慢或失败网络连接到ruby-lang.org或相关源不畅。1. 可以考虑使用国内镜像例如通过修改RVM的下载源比较复杂。2. 更简单的方法是先手动下载好Ruby源码包放到~/.rvm/archives/目录下RVM会优先使用本地文件。3. 对于rbenv可以通过设置RUBY_BUILD_MIRROR_URL环境变量来使用镜像。最后分享一个我个人的小习惯在任何一个新的Linux环境无论是虚拟机、容器还是远程服务器上部署工具链时我都会先写一个简单的脚本把从安装编译工具、配置Ruby环境到安装所需Gem的步骤记录下来。这不仅是为了下次复用更是在梳理过程中加深了对各个依赖环节的理解。对于OneGadget这样的工具一次成功的部署意味着你在后续的漏洞利用实践中能把更多精力集中在漏洞本身而不是环境配置上。
返回列表