这个很多比赛都遇到暴力破解这个比较蛋疼的问题,比较常见的是POST提交的暴力破解。这个暴力破解主要依靠三部分,工具,字典,网速。最后一条得听天命,不过前两条还是可以认为努力的。
字典生成
这种东西需要自己写一个东西生成。为了图方便,我只写了一个N个单词的排列组合
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
struct node {
string s;
long sta;
};
string wordList[] = {"ILoveyou","812","wdxl","verymuch"};
int wordNum=4;
int maxLength=20;
queue<node> v;
map<string,int> m;
node t,tt;
int leng;
bool b;
void pushWord(){
leng=v.size();
for (int i=0;i<leng;i++){
t=v.front();
v.pop();
for (int j=0;j<wordNum;j++){
if (!(t.sta>>j & 1)){
tt.s = t.s+wordList[j];
tt.sta = t.sta | (1<<j);
if (tt.s.length()<=maxLength)
v.push(tt);
}
}
}
}
void outPrint(){
m.clear();
for (int i=0;!v.empty();i++){
if (m[v.front().s]==0){
cout<<v.front().s<<endl;
m[v.front().s]=1;
}
v.pop();
}
}
void doWord(int x){
t.s="";
t.sta=0;
v.push(t);
for (int i=0;i<x;i++)
pushWord();
outPrint();
}
int main()
{
//freopen("word.txt","w",stdout);
doWord(2);
return 0;
}
当然这样是不够的,比如有的时候密码会把you换成y0u,日期会有 08-01 08/01 @0801 等多种形式,字符之间会不会有特殊符号,单词开头是否大写,等等等等~
这样很多的假设,其实是不利于密码字典的生成的~,因为这样生成的字典会过于冗余。在字典生成的时候,我们通常先生成最简单的字典,然后在加上各种规则,
实现字典各种情况的扩充。比如Burp就实现了这种规则。
辅助工具
BURP
这里推荐一个工具就是burp,他在暴力破解这方面还是比较强的大。
具体教程网上比较多,就不细讲了,这里主要来讲一下它的暴力破解方面的应用。
Attack type
burp每监听一个包,都可以发送到Intruder这个模块中,他有Sniper Battering ram Pitchfork Cluster bomb这四种模式。
sniper是针对单一Payload Position 应用 单一 payload
Battering ram 是针对多个 Payload Postions 应用 单一 payload
Pitchfork 是针对多个payload Postions 应用多个 payloads 以线性模式调用payloads
Cluster bomb 是针对多个payload Postions 应用多个 payloads 会尝试所有payloads的组合
Payloads
payloads的设置也有比较多,灵活运用的话就可以生成比较好的字典了~
其中有几个是基于Simple List的,就是在其基础上加个小功能。
Custom iterator 和Cluster bomb 类似。
Character substitution 这个是一个比较有用的选项,支持把一个字符替换成另外一个字符,比如外国人喜欢 t=7 s=5 o=0 之类的。
Case modification 一个大小写装换的枚举。
有几个是暴力破解的时候要用到的
Numbers 顾名思义就是数字的枚举啦~
Dates 顾名思义就是日期的枚举啦~
Brute forcer 顾名思义就是暴力枚举所有字符啦~
Payoad Processing
这个就是对上面的payload,做一些小修正~功能比较简单,就是字面意思。
hydra
beini(奶瓶)
搞定验证码
这里比较蛋疼,不仔细研究了。有一个工具cintruder貌似可以。