将外部模式应用于特定场景
在本步骤中,你将把所学知识应用于一个更实际的场景。你的脚本将不再使用硬编码的基础单词,而是从文件中读取基础单词列表,并为每个单词生成变体。这是一种更强大、更真实的实现方式。
首先,让我们创建一个名为 words.txt 的简单单词列表文件,其中包含几个潜在的基础单词。
echo "admin" > words.txt
echo "user" >> words.txt
echo "guest" >> words.txt
接下来,我们将修改 C 程序以读取此文件。程序需要接受单词列表文件名作为命令行参数。使用 nano 打开 simple_gen.c。
nano simple_gen.c
将代码替换为以下内容。此版本从命令行读取文件名,打开该文件,并为读取的每个单词生成三个密码候选:单词本身、单词后跟 "123",以及单词后跟 "2024"。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <wordlist_file>\n", argv[0]);
return 1;
}
FILE *file = fopen(argv[1], "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
char line[256];
while (fgets(line, sizeof(line), file)) {
// Remove newline character from the end of the line
line[strcspn(line, "\n")] = 0;
// Generate variations for the word
printf("%s\n", line);
printf("%s123\n", line);
printf("%s2024\n", line);
}
fclose(file);
return 0;
}
保存、退出并重新编译程序。
gcc -o simple_gen simple_gen.c
现在,我们必须更新 my_john.conf 文件,将 words.txt 文件名作为参数传递给我们的脚本。让我们为此创建一个名为 MyAdvanced 的新外部模式。使用 nano 打开 my_john.conf。
nano my_john.conf
滚动到文件末尾并添加此新部分。请注意,"words.txt" 如何作为第二个参数传递给 exec 函数。
[List.External:MyAdvanced]
void generate()
{
exec("./simple_gen", "words.txt");
}
保存并退出 nano。最后,测试你的新高级外部模式。
john --stdout --external=MyAdvanced --config=./my_john.conf
输出现在应该是从 words.txt 文件中的单词生成的密码候选列表,并对每个单词应用了指定的变体。
admin
admin123
admin2024
user
user123
user2024
guest
guest123
guest2024
你已成功为 John the Ripper 创建了一个灵活的、由文件驱动的密码生成器。