吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8580|回复: 60
上一主题 下一主题
收起左侧

[其他原创] 【shell】压缩包密码暴破脚本

[复制链接]
跳转到指定楼层
楼主
hoochanlon 发表于 2023-4-19 17:52 回帖奖励

昨天在讨论区打草稿写了个Windows借助7z工具暴破rar的批处理脚本,今天这次就写了个shell的。这篇帖子仅适用于Mac平台,只关心Windows的坛友可以看 【讨论】一步步手撸一个压缩包密码爆破的批处理脚本,毕竟Windows是多数,我自己也经常用。

本来一开始是打算用python的,但一想python写保存路径,到最后还是放弃了,因为python的目录写法,终究逃不掉 Windows c:/xxx/、Mac  ~/xxxx/ ,这就造成了平台上的不适配,那我还不如索性写两份体验体验。

谈谈这次遇到的小问题,主要问题其实在注释上已经说明了,不过还是单拿出了,方便观看与讨论:

  • 发现 brew install p7zip > /dev/null 2>&1 运行效率较低,也算是个无心之举。跑代码测试的时候,我发现这种写法,明显感觉比if慢好多,所以就pass掉了。
  • 在Mac上,7z并不支持验证rar压缩包密码;Mac下面的rar,也不支持zip的密码验证。这个是p7zip与rar(两者都是 brew 安装)的实验结论。
  • 密码暴破没成功,没有输出echo,主要是自己逻辑上出现了问题:break之后又执行了常规的输出,定位代码处# echo "$?",需要外部使用变量来固化状态值,再做判断(类似批处理的延迟变量)。

细节方面就是:dos2unix,关于LF格式和CRLF格式的TXT文件了,统一处理,问题不大。

代码本地测试效果

在线测试效果图,顺带还发现了个有趣的现象:特权提升的$username,由自己的本地用户名,变成了“root”

与Windows版本的效果

整体来说,由于系统的差异明显,以及batch、shell的实现各有差异,殊途同归了,算是。可以粗糙理解为类似《富士山下》、《爱情转移》粤语歌与普通话的两种唱法。

附源码:https://github.com/hoochanlon/ihs-simple/blob/main/d-shell/7z_rar_sensei.sh

# 实验
## brew install p7zip > /dev/null 2>&1 运行效率较低,大概有2~3秒不等,if算了
## 在Mac上,7z并不支持验证rar压缩包密码;Mac下面的rar,也不支持zip的密码验证。
## 网上txt为CRLF的问题,dos2unix搞定。
## 密码没找到,没输出,排查问题如下:
### $0 用于存储上一个命令的退出状态。当一个命令成功执行时,它的退出状态为 0,否则为非零值。
### 直接不在外层初始化flag,容易算数异常,推测是作用域问题。

# 缺什么就安装什么
[ ! -e $(which rar) ] && brew install rar
[ ! -e $(which 7z) ] && brew install p7zip
[ ! -e $(which dos2unix) ] && brew install dos2unix

# 不存在就下载密码本
if [ ! -f ~/Downloads/rarpasswd.txt ]; then
    curl -o ~/Downloads/rarpasswd.txt https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/ihs-simple/main/d-txt/rarpasswd.txt
fi

# 保存密码本为基本路径格式
# 无法输出用户名 // ,储存变量结果后,再输出 /Users/<用户名> 正常。
username=$USER
passwd_txt="/Users/$username/Downloads/rarpasswd.txt"
# CRLF文本换成LF文本
dos2unix $passwd_txt >/dev/null 2>&1

# has_passwd_rar="/Users/chanlonhoo/Desktop/BlackFell.zip"
echo -e "\n"
read -p "将压缩包文件拖入到终端: " has_passwd_rar

# 打上flag,保存break状态码,固化存储。
found_passwd_tag_num=0

unrar_passwd_find() {
    # 遍历密码文件中的每一行密码
    while read password; do
        # 尝试使用当前密码解压缩压缩包
        unrar t -p$password "$has_passwd_rar" >/dev/null 2>&1

        # 检查解压缩命令的退出码
        if [ $? -eq 0 ]; then
            # 如果退出码为 0,说明密码正确,输出提示信息并退出循环
            echo -e "\n密码是: $password \n"
            # flag
            found_passwd_tag_num=1
            break
        fi
    done <$passwd_txt
    # echo "$?"

    if [ $found_passwd_tag_num -ne 1 ]; then
        echo -e "\n没找到正确的密码。\n"
    fi

}

7z_passwd_find() {
    # 遍历密码文件中的每一行密码
    while read password; do
        # 尝试使用当前密码解压缩压缩包
        7z t -p$password "$has_passwd_rar" >/dev/null 2>&1

        # 检查解压缩命令的退出码
        if [ $? -eq 0 ]; then
            # 如果退出码为 0,说明密码正确,输出提示信息并退出循环
            echo -e "\n密码是: $password \n"
            # flag
            found_passwd_tag_num=1
            break
        fi
    done <"$passwd_txt"

    if [ $found_passwd_tag_num -ne 1 ]; then
        echo -e "\n没找到正确的密码。\n"
    fi

}

# 判断文件名后缀是否包含rar
if [[ ${has_passwd_rar##*.} == "rar" ]]; then
    unrar_passwd_find
else
    7z_passwd_find
fi

免费评分

参与人数 5吾爱币 +9 热心值 +5 收起 理由
hby681830 + 1 + 1 热心回复!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
vnightray + 1 + 1 谢谢@Thanks!
daoye9988 + 1 + 1 谢谢@Thanks!
sorryzzital + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| hoochanlon 发表于 2023-4-19 18:20 |楼主
ggDarling 发表于 2023-4-19 18:12
密码爆破还有好长的路走,密码爆破的相关软件用的不太多,因为经常遇到汉字密码等复杂密码,基本上等于无解 ...

我基本上就应付软件下载网站的密码,或是自己有时候胡乱敲的、开脑洞输的密码。写这个的原因也是方便自己跨平台
推荐
jidesheng6 发表于 2023-4-19 19:17



其实还有个小提示,如果是普通的bash,其实写脚本有个建议的习惯就是在开头加上`set -eu`,当时也是在知乎那边看到的,这个命令具体干啥的忘记了,但是他们有过一种场景:

传递的变量刚好为空,但是他们需要删除一个目录下子目录的全部内容,由于那个变量变成空了,也就是某变量为`abc=/test`;这时候`abc`为空,删除的目录原本是`/home/user/debug$abc`;置空以后就变成了`/home/user/debug`,然后数据全部没了,不过好在没什么东西,后面他们就加上了`set -eu`这个参数,在某个变量为空的时候脚本会执行强制报错,取消执行;现在都养成习惯了;





不过多说一句,感觉写bash脚本的时候还是挺烦的,很多东西组合起来以后维护其实没有那种真正的编程语言好维护,就比如这个计算linux内存,然后设置一个mysql的inno buffer的一段代码,感觉写起来挺累人,可能是我太菜了



4#
ggDarling 发表于 2023-4-19 18:12
密码爆破还有好长的路走,密码爆破的相关软件用的不太多,因为经常遇到汉字密码等复杂密码,基本上等于无解,但是楼主的分享还是令人惊喜!
5#
jidesheng6 发表于 2023-4-19 19:07
sudo特权提升,也许是因为sudo在执行的时候其实是把你的环境变量清空了,你可以试试用-E参数保留环境变量,不过这是我的猜测。
6#
涛之雨 发表于 2023-4-19 19:13
提一嘴python的跨平台,可以用os.path或者pathlib模块规范化路径
7#
 楼主| hoochanlon 发表于 2023-4-19 19:18 |楼主
jidesheng6 发表于 2023-4-19 19:07
sudo特权提升,也许是因为sudo在执行的时候其实是把你的环境变量清空了,你可以试试用-E参数保留环境变量, ...

感谢分享,貌似不太行,不过我先留做观察吧。

catch2023-04-19 19.17.16.png (234.9 KB, 下载次数: 3)

catch2023-04-19 19.17.16.png
8#
 楼主| hoochanlon 发表于 2023-4-19 19:21 |楼主
涛之雨 发表于 2023-4-19 19:13
提一嘴python的跨平台,可以用os.path或者pathlib模块规范化路径

相见恨晚啊,一直都不知道,好长时间都没注意过。
9#
jidesheng6 发表于 2023-4-19 19:24
涛之雨 发表于 2023-4-19 19:13
提一嘴python的跨平台,可以用os.path或者pathlib模块规范化路径

在目前的国产涉密专用机上面,python无法使用,甚至bash都无法使用,bash还有办法来通过<<和source另类调用,但是python直接就不行,所有的脚本和安装包都需要做一次签名验证才可以,而且必须达成rpm/deb包来释放那些脚本文件,不过楼主这个应该没考虑这些,我看到bash的第一反应就是还挺好的,因为有些大佬没接触过涉密专用机,可能想不到这边去

点评

涉密专用机就要有觉悟,老老实实的遵守规则就完事了 安全性和便利性本来就是互相制约的(比如两步验证。。。) 我说的是普通的设备,不过看到楼主的回复,应该也不是涉及到这种设备  详情 回复 发表于 2023-4-19 19:34
10#
 楼主| hoochanlon 发表于 2023-4-19 19:29 |楼主
jidesheng6 发表于 2023-4-19 19:17
其实还有个小提示,如果是普通的bash,其实写脚本有个建议的习惯就是在开头加上`set -eu`,当时也是 ...

谢谢分享,一直没注意过 set -eu ,看网站命令,组合来解释是来做调试用的 。

https://ss64.com/osx/set.html

这网站比我终端,man set 看得还清楚。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-27 14:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表