LessPass 无状态密码推导
LessPass 是一个无状态密码管理器。它不依赖本地密码库,而是根据固定输入参数确定性生成密码:只要 site、login、master password、counter 和字符集 profile 一致,任何机器上生成的结果都会一致。
在渗透测试里,LessPass 本身不是漏洞;真正的问题是 LessPass 输入参数泄露。如果前端 JavaScript、配置文件、备份文件或笔记里同时泄露了 site、login、master password 等关键字段,攻击者就可以离线生成目标密码。
关键输入参数
| 参数 | 说明 | 常见默认值 |
|---|---|---|
site | 站点名 / 服务名,是生成密码的输入之一 | 目标域名或自定义名称 |
login | 登录用户名 | 用户名或邮箱 |
master password | 主密码,最敏感的输入 | 无默认值 |
counter | 密码轮换计数器 | 1 |
length | 生成密码长度 | 16 |
| 字符集 | 是否包含小写、大写、数字、符号 | 默认全开 |
默认情况下,LessPass CLI 会生成长度为 16 的密码,并启用小写、大写、数字和符号。参数不同,生成结果就不同。
安装与运行
Kali / Debian 推荐:临时 venv
Kali 新版本启用了 Python externally managed environment 保护,直接 python3 -m pip install --user lesspass 可能被拦截。靶场复现时,临时 venv 更干净:
python3 -m venv /tmp/lesspass-venv
/tmp/lesspass-venv/bin/python -m pip install --quiet lesspass
/tmp/lesspass-venv/bin/lesspass --help
清理:
rm -rf /tmp/lesspass-venv
pipx
如果系统已经安装 pipx,可以直接运行:
pipx run lesspass --help
pip 用户安装
普通 Python 环境可用:
python3 -m pip install --user lesspass
lesspass --help
常用命令
基础格式:
lesspass SITE LOGIN MASTER_PASSWORD
指定长度:
lesspass example.com alice 'MasterPasswordHere' --length 20
指定 counter:
lesspass example.com alice 'MasterPasswordHere' --counter 2
不使用符号:
lesspass example.com alice 'MasterPasswordHere' --no-symbols
只生成数字密码:
lesspass example.com alice 'MasterPasswordHere' -d --no-lowercase --no-uppercase --no-symbols --length 8
GameShell5 案例
GameShell5 中,前端静态资源泄露了 LessPass 所需的关键输入:
| 参数 | 值 |
|---|---|
site | shell-shockers.dsz |
login | noob |
master password | aBcDeFgHiJkLmNoP |
counter | 1 |
length | 16 |
| 字符集 | 小写 + 大写 + 数字 + 符号 |
用 PyPI 的 lesspass 包生成密码:
python3 -m venv /tmp/lesspass-venv
/tmp/lesspass-venv/bin/python -m pip install --quiet lesspass
/tmp/lesspass-venv/bin/lesspass "shell-shockers.dsz" "noob" "aBcDeFgHiJkLmNoP"
输出:
&"0isY/n~(=\G>Ui
随后可用于 SSH 初始访问:
sshpass -p '&"0isY/n~(=\G>Ui' ssh noob@192.168.1.110
完整过程见:HackMyVM GameShell5 通关记录。
前端静态资源线索
LessPass 线索不一定直接写在 HTML 正文里。靶场中可以按这个顺序检查前端资源:
| 位置 | 关注点 |
|---|---|
script.js | site、login、masterPass、counter 等变量名 |
| 混淆 JavaScript | 本地执行后追加 JSON.stringify() 输出关键变量 |
style.css | data URI 图片、注释、隐藏 class 名 |
| 图片 alpha 通道 | 可能把提示文字藏在透明度通道里 |
robots.txt | 被禁止抓取的 JS / CSS 可能反而是提示 |
GameShell5 中,script.js 泄露了 LessPass 输入参数,style.css 内嵌的 data URI PNG 又通过 alpha 通道显示 LessPass 标志,两边合起来才完成线索闭环。
渗透测试判断思路
看到疑似 LessPass 参数时,可以按这个顺序判断:
- 字段是否同时出现
site、login、master password或相似命名。 - 页面、CSS、图片隐写、注释或备份文件里是否出现
LessPass标志。 - 目标是否使用默认参数:
counter=1、length=16、字符集全开。 - 生成结果是否能用于 SSH、Web 登录、后台登录或服务认证。
- 如果失败,尝试调整
site、用户名大小写、counter 和字符集。
LessPass 的特点是离线可验证:一旦输入参数完整,不需要在线爆破,也不需要碰撞密码。
防御建议
- 不要把
master password或派生密码输入参数放在前端资源中。 - 不要在 JavaScript、CSS、HTML 注释、备份文件、日志或截图中泄露 LessPass profile。
- 如果主密码疑似泄露,应视为相关站点密码全部失效,立即轮换。
- 对管理后台、SSH、VPN 等入口启用 MFA,降低单一密码泄露的影响。
- 生产环境建议使用可审计、可轮换、可集中管理的密码库或密钥管理系统。