Linuxでパスワードを確認するには?

Linuxでパスワードを確認するには?

与えられたプレーンテキストのパスワードが/etc/shadowの暗号化されたパスワードと同じであることをLinuxのコマンドラインで確認したいと思います。

(ネットワークユーザーを認証するにはこれが必要です。組み込みLinuxを実行しています。)

/etc/shadow ファイル自体にアクセスできます。

ベストアンサー1

awkを使用すると、暗号化されたパスワードを簡単に抽出できます。その後、プレフィックスを抽出する必要があります$algorithm$salt$(システムがレガシーDESを使用していないと仮定します。レガシーDESは今や無差別攻撃を可能にするため、使用されなくなりました)。

correct=$(</etc/shadow awk -v user=bob -F : 'user == $1 {print $2}')
prefix=${correct%"${correct#\$*\$*\$}"}

パスワードを確認するためのデフォルトのC関数は次のとおりです。cryptただし、これにアクセスできる標準のシェルコマンドはありません。

コマンドラインからPerlシングルライナーを使用してcryptパスワードを呼び出すことができます。

supplied=$(echo "$password" |
           perl -e '$_ = <STDIN>; chomp; print crypt($_, $ARGV[0])' "$prefix")
if [ "$supplied" = "$correct" ]; then …

これは純粋なシェルツールでは実行できないため、Perlが利用可能な場合はPerlでもすべての操作を実行できます。 (またはPython、Rubyなど、この関数を呼び出すことができるすべての利用可能なツール。crypt)警告、テストされていないコード。

#!/usr/bin/env perl
use warnings;
use strict;
my @pwent = getpwnam($ARGV[0]);
if (!@pwent) {die "Invalid username: $ARGV[0]\n";}
my $supplied = <STDIN>;
chomp($supplied);
if (crypt($supplied, $pwent[1]) eq $pwent[1]) {
    exit(0);
} else {
    print STDERR "Invalid password for $ARGV[0]\n";
    exit(1);
}

Perlのない組み込みシステムでは、小さな専用Cプログラムを使用します。警告、ブラウザに直接入力しましたが、コンパイルを試していませんでした。これは安定した実装ではなく、必要な手順を説明するためのものです。

/* Usage: echo password | check_password username */
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <shadow.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
    char password[100];
    struct spwd shadow_entry;
    char *p, *correct, *supplied, *salt;
    if (argc < 2) return 2;
    /* Read the password from stdin */
    p = fgets(password, sizeof(password), stdin);
    if (p == NULL) return 2;
    *p = 0;
    /* Read the correct hash from the shadow entry */
    shadow_entry = getspnam(username);
    if (shadow_entry == NULL) return 1;
    correct = shadow_entry->sp_pwdp;
    /* Extract the salt. Remember to free the memory. */
    salt = strdup(correct);
    if (salt == NULL) return 2;
    p = strchr(salt + 1, '$');
    if (p == NULL) return 2;
    p = strchr(p + 1, '$');
    if (p == NULL) return 2;
    p[1] = 0;
    /*Encrypt the supplied password with the salt and compare the results*/
    supplied = crypt(password, salt);
    if (supplied == NULL) return 2;
    return !!strcmp(supplied, correct);
}

もう一つのアプローチsulogin。実際に可能であれば、Webアプリケーションを通過する準備をすることをお勧めしますsu -c somecommand username。ここで難しいのは、パスワードを提供することですsu。端末をシミュレートする一般的なツールは次のとおりです。予想されるしかし、これは組み込みシステムへの大きな依存関係です。また、suBusyBoxでは、多くの目的でBusyBoxバイナリがsetuidルートである必要があるため、省略されることが多いです。しかし、そうすることができれば、セキュリティの面で最も信頼性の高い方法です。

おすすめ記事