john the ripper

image.png
/* public domain proof-of-concept code by Solar Designer */

#define _XOPEN_SOURCE /* for crypt(3) */
#include <string.h>
#include <unistd.h>

#include "arch.h"
#include "params.h"
#include "formats.h"

#define FORMAT_LABEL            "crypt"
#define FORMAT_NAME            "generic crypt(3)"
#define ALGORITHM_NAME            "?/" ARCH_BITS_STR

#define BENCHMARK_COMMENT        ""
#define BENCHMARK_LENGTH        0

#define PLAINTEXT_LENGTH        72

#define BINARY_SIZE            128
#define SALT_SIZE            BINARY_SIZE

#define MIN_KEYS_PER_CRYPT        1
#define MAX_KEYS_PER_CRYPT        1

static struct fmt_tests tests[] = {
    {"CCNf8Sbh3HDfQ", "U*U*U*U*"},
    {"CCX.K.MFy4Ois", "U*U***U"},
    {"CC4rMpbg9AMZ.", "U*U***U*"},
    {"XXxzOu6maQKqQ", "*U*U*U*U"},
    {"SDbsugeBiC58A", ""},
    {NULL}
};

static char saved_key[PLAINTEXT_LENGTH + 1];
static char saved_salt[SALT_SIZE];
static char *crypt_out;

static int valid(char *ciphertext)
{
#if 1
    int l = strlen(ciphertext);
    return l >= 13 && l < BINARY_SIZE;
#else
/* Poor load time, but more effective at rejecting bad/unsupported hashes */
    char *r = crypt("", ciphertext);
    int l = strlen(r);
    return
        !strncmp(r, ciphertext, 2) &&
        l == strlen(ciphertext) &&
        l >= 13 && l < BINARY_SIZE;
#endif
}

static void *binary(char *ciphertext)
{
    static char out[BINARY_SIZE];
    strncpy(out, ciphertext, sizeof(out)); /* NUL padding is required */
    return out;
}

static void *salt(char *ciphertext)
{
    static char out[SALT_SIZE];
    int cut = sizeof(out);

#if 1
/* This piece is optional, but matching salts are not detected without it */
    switch (strlen(ciphertext)) {
    case 13:
    case 24:
        cut = 2;
        break;

    case 20:
        if (ciphertext[0] == '_') cut = 9;
        break;

    case 34:
        if (!strncmp(ciphertext, "$1$", 3)) {
            char *p = strchr(ciphertext + 3, '$');
            if (p) cut = p - ciphertext;
        }
        break;

    case 59:
        if (!strncmp(ciphertext, "$2$", 3)) cut = 28;
        break;

    case 60:
        if (!strncmp(ciphertext, "$2a$", 4)) cut = 29;
        break;
    }
#endif

    /* NUL padding is required */
    memset(out, 0, sizeof(out));
    memcpy(out, ciphertext, cut);

    return out;
}

static int binary_hash_0(void *binary)
{
    return ((unsigned char *)binary)[12] & 0xF;
}

static int binary_hash_1(void *binary)
{
    return ((unsigned char *)binary)[12] & 0xFF;
}

static int binary_hash_2(void *binary)
{
    return
        (((unsigned char *)binary)[12] & 0xFF) |
        ((int)(((unsigned char *)binary)[11] & 0xF) << 8);
}

static int get_hash_0(int index)
{
    return (unsigned char)crypt_out[12] & 0xF;
}

static int get_hash_1(int index)
{
    return (unsigned char)crypt_out[12] & 0xFF;
}

static int get_hash_2(int index)
{
    return
        ((unsigned char)crypt_out[12] & 0xFF) |
        ((int)((unsigned char)crypt_out[11] & 0xF) << 8);
}

static int salt_hash(void *salt)
{
    int pos = strlen((char *)salt) - 2;

    return
        (((unsigned char *)salt)[pos] & 0xFF) |
        ((int)(((unsigned char *)salt)[pos + 1] & 3) << 8);
}

static void set_salt(void *salt)
{
    strcpy(saved_salt, salt);
}

static void set_key(char *key, int index)
{
    strcpy(saved_key, key);
}

static char *get_key(int index)
{
    return saved_key;
}

static void crypt_all(int count)
{
    crypt_out = crypt(saved_key, saved_salt);
}

static int cmp_all(void *binary, int count)
{
    return !strcmp((char *)binary, crypt_out);
}

static int cmp_exact(char *source, int index)
{
    return 1;
}

struct fmt_main fmt_crypt = {
    {
        FORMAT_LABEL,
        FORMAT_NAME,
        ALGORITHM_NAME,
        BENCHMARK_COMMENT,
        BENCHMARK_LENGTH,
        PLAINTEXT_LENGTH,
        BINARY_SIZE,
        SALT_SIZE,
        MIN_KEYS_PER_CRYPT,
        MAX_KEYS_PER_CRYPT,
        FMT_CASE | FMT_8_BIT,
        tests
    }, {
        fmt_default_init,
        valid,
        fmt_default_split,
        binary,
        salt,
        {
            binary_hash_0,
            binary_hash_1,
            binary_hash_2
        },
        salt_hash,
        set_salt,
        set_key,
        get_key,
        fmt_default_clear_keys,
        crypt_all,
        {
            get_hash_0,
            get_hash_1,
            get_hash_2
        },
        cmp_all,
        cmp_all,
        cmp_exact
    }
};
image.png

修改Makefile中JOHN_OBJS_MINIMAL的依赖

unshadow.o \
unafs.o \
unique.o \
crypt_fmt.o

执行指令

make clean generic

执行John

sudo unshadow /etc/passwd /etc/shadow> shadowfile
./john shadowfile

执行结果

root@ubuntu:/home/user/Downloads/john-1.8.0# ./john shadowfile
Loaded 6 password hashes with 6 different salts (generic crypt(3) [?/64])
test (test)
aaa (aaa)

暴力破解密码,都需要一个足够强大的字典。

John the Ripper的默认密码字典为run目录下的password.lst。
而密码字典的构造就看自己收集信息的能力了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容