【问题标题】:Shell script password auditingShell脚本密码审计
【发布时间】:2012-09-27 15:04:17
【问题描述】:

我有一个名为 ./testpassword 的二进制文件,语法如下

./testpassword pass PASSWORD_GOES_HERE

如果密码正确输出将是

pass=correct

如果不正确的输出如下

pass=incorrect

我是 linux 和脚本的新手,但在这里的成员的帮助下,制作了一个示例 shell 脚本,如下所示

    cat passwords.txt | while read x ; do echo -n "$x: " && ./testpassword pass $x ;
done

其中密码是 txt 格式的单词表。

这很好用,如果我密切关注终端,我可以看到如下输出(继续单词列表中的每一行)

jordyt: pass=incorrect
dawder: pass=incorrect
LOL12345: pass=incorrect
warcraft: pass=incorrect
solidussnake: pass=incorrect
0005: pass=correct

所以在这种情况下,我知道 0005 是我的密码,我的问题是,是否可以在找到密码时停止程序,或者在某处自动显示密码?如果我要离开屏幕,我会忘记密码是什么,因为屏幕将继续尝试输入密码并向下滚动

我之前的做法是这样的 Shell script password bruteforcing 。它起作用了,因为我可以走开,稍后再回来,看到密码已被破解,然后 ctrl+c 程序,除了它有点冗长的做事方式。在我不得不手动搜索破解密码对应的wordlist中的行号后

【问题讨论】:

    标签: shell passwords


    【解决方案1】:

    您可以将./testpassword pass $x 的执行保存在一个变量中:

    cat passwords.txt | while read x ; do result=`./testpassword pass $x` ; echo -n "$x: $result" ; done
    

    然后,您可以将 $result 与字符串“pass=correct”进行比较,如果它以这种方式找到该字符串,则中断循环:

    if [[ "$result" == *pass=correct ]]; then break; fi
    

    放在一起:

    cat passwords.txt | while read x ; do result=`./testpassword pass $x` ; echo -n "$x: $result" ; if [[ "$result" == *pass=correct ]]; then break; fi ; done
    

    【讨论】:

    • 非常感谢您的回复。我现在想弄清楚
    • 我已经编辑了答案,向您展示如何测试字符串并打破循环
    • 感谢您将其分解得非常清楚。目前我已经测试并且命令成功运行,但是当找到正确的输出时似乎没有中断。它将像往常一样继续执行。我还尝试修改 $result 以指向不正确的密码并且不会中断
    • 好的,我设法通过更改为 result=./testpassword pass $x $x 2>&1 >/dev/null 来破解它。完美的。现在剩下的唯一一件事是输出现在不再逐行向下显示在屏幕上,它们水平移动并且看起来有点混乱
    • 很简单,只要用echo -e这样:echo -ne "$x: $result\n"
    【解决方案2】:

    修改你的testpassword 脚本,让它在成功的情况下返回0,在失败的情况下返回一些其他值。之后,您可以按如下方式重写循环:

    cat passwords.txt | while read x; do
        echo -n "$x: " && ./testpassword pass $x && break
    done
    

    【讨论】:

    • 感谢您的回复。 testpassword 是一个二进制文件。我假设在这种情况下我将无法更改退出代码
    • 在这种情况下,将内部循环替换为 `echo -n "$x: "; res=$(./testpassword pass $x);回声 $res; [“$res”==“通过=正确”] && 中断;完成