0

現在、セキュリティ監査で Windows パスワード ハッシュを抽出するプロセスを簡素化する作業を行っています。個人的には、監査を行うときに、復元されたユーザーとそのパスワードのリストを生成するプロセスを簡単にしたいと考えています。大量のデータを比較して生成しようとしている他の人にも役立つと思います。

要点は次のとおりです。

Windows システム ファイルからすべてのデータを抽出するときは、単純化して user:hash という形式にします。このハッシュは、「a87f3a357d73085c45f9416be5787e86」などの NTLM ハッシュです。

次に、oclHashcat を使用して、ハッシュのクラックを試みます。それが辞書であろうとブルート フォースであろうと、問題ではありません。復元されたすべてのハッシュの出力を生成しますが、Hashcat は hash:password の形式で生成します。

ここに私の問題と入力が必要なものがあります.2つの入力ファイルを指定して、出力を user:password として生成したいと考えています。何百ものハッシュを持つことができますが、復元されたパスワードは数個しかないことを考えると、リストを並べ替えようとしても意味がありません。

どのデータ構造が最もメリットがあるかわかりません。配列は、大きなテーブルには非効率的すぎました。私はシリアライゼーションを調べ、ハッシュ マップとハッシュ テーブルの使用を調査してきました。ハッシュのサイズを考えると、これらの方法のいずれかを実装する運がなかったか、実装が間違っています。

現在、私は次のようにプログラムを実行しています:

program [user:hash file] [hash:password file] -o [user:password output]

そして、私は効果的にプログラムを次のように実行しようとしています(簡単に):

Load Files

// user:hash file
For each line, split by ':' delimiter
 before delimiter = table1.user
 after delimiter = table1.hash

// hash:password file
For each line, split by ':' delimiter
 before delimiter = table2.hash
 after delimiter = table2.password

// generate user:password file
Check each entry of table1 vs table2
 if table1.hash = table2.hash
  table1.user =  output.user
  table2.password = output.password
  print to output "output.user:output.password"

各行をトレースし、必要なデータを簡単にトレースできるデータ構造に抽出するための効率的な方法を見つけようとしているだけです。

何か明確にする必要がある場合は、お知らせください。どんな助けでも大歓迎です!

4

2 に答える 2

1

私は自分のデータ構造に対してこれを行います

std::map<std::string,std::string> hash_user_map;

表 1 のすべてのユーザーとハッシュを調べる必要はありません

For each user in table1
hash_user_map[table1.hash] = table1.user;

table2 のハッシュを使用してクラックされたすべてのパスワードを調べる必要はありません

std::string user = hash_user_map[table2.hash];
std::cout << user << ":" << table2.password << "\n;
于 2012-11-28T22:56:43.670 に答える
0

シェル スクリプトを使用することにし、関連付けられた配列を使用して必要なデータを一致させました。

注: このプログラムのほとんどは、ハッシュ ファイルのフォーマット方法を扱います。スクリプトのコメントを見てください。

#!/bin/bash
# Signus
# User-Password Hash Comparison Tool v1.0
# Simple utility that allows for the comparison between a file with a 'user:hash' format to a separate file with a 'hash:password' format. The comparison matches the hashes and returns an output file in the format 'user:password'

# Example of 'user:hash' -> george:c21cfaebe1d69ac9e2e4e1e2dc383bac
# Example of 'hash:password' -> c21cfaebe1d69ac9e2e4e1e2dc383bac:password
# 'user:hash' obtained from creddump suite: http://code.google.com/p/creddump/
# Note: Used custom 'dshashes.py' file: http://ptscripts.googlecode.com/svn/trunk/dshashes.py
# 'hash:password' obtained from ocl-Hashcat output

usage="Usage: $0 [-i user:hash input] [-t hash:password input] [-o output]"

declare -a a1
declare -a a2
declare -A o

index1=0
index2=0
countA1=0
countA2=0
matchCount=0

if [ -z "$*" ]; then
  echo $usage
    exit 1
fi

if [ $# -ne 6 ]; then
    echo "Error: Invalid number of arguments."
    echo $usage
    exit 1
fi

echo -e
echo "---Checking Files---"
while getopts ":i:t:o:" option; do
    case $option in
        i) inputFile1="$OPTARG"
        if [ ! -f $inputFile1 ]; then
            echo "Unable to find or open file: $inputFile1"
            exit 1
        fi
        echo "Reading...$inputFile1"
        ;;
        t) inputFile2="$OPTARG"
        if [ ! -f $inputFile2 ]; then
            echo "Unable to find or open file: $inputFile2"
            exit 1
        fi
        echo "Reading...$inputFile2"
        ;;
        o) outputFile="$OPTARG"
        echo "Writing...$outputFile"
        ;;
        [?]) echo $usage >&2
            exit 1
        ;;
    esac
done
shift $(($OPTIND-1))


#First read the files and cut each line into an array
echo -e
echo "---Reading Files---"
while read LINE
do
    a1[$index1]="$LINE"
    index1=$(($index1+1))
    countA1=$(($countA1+1))
done < $inputFile1
echo "Read $countA1 lines in $inputFile1"

while read LINE
do
    a2[$index2]="$LINE"
    index2=$(($index2+1))
    countA2=$(($countA2+1))
done < $inputFile2
echo "Read $countA2 lines in $inputFile2"


#Then cut each item out of the array and store it into separate variables
echo -e
echo "Searching for Matches..."
for (( j=0; j<${#a2[@]}; j++ ))
do
    hash2=$(echo ${a2[$j]} | cut -d: -f1)
    pword=$(echo ${a2[$j]} | cut -d: -f2)

    for (( i=0; i<${#a1[@]}; i++ ))
    do
        us=$(echo ${a1[$i]} | cut -d: -f1)
        hash1=$(echo ${a1[$i]} | cut -d: -f2)

        if [ "$hash2" = "$hash1" ]; then
            matchCount=$(($matchCount+1))
            o["$us"]=$pword
            echo -e "Match Found[$matchCount]: \t Username:$us  \t  Password:$pword" 
            break
        fi

    done
done

echo -e "Matches Found: $matchCount\n" >> $outputFile
for k in ${!o[@]}
do
    echo -e "Username: $k  \t  Password: ${o[$k]}" >> $outputFile
done
echo -e "\nWrote $matchCount lines to $outputFile"

unset o
于 2013-01-31T07:44:52.313 に答える