Wker_SearchEngineScanVlun FrameWork V1.1
__ __ __
/ \ / \ | __ ___________
\ \/\/ / |/ // __ \_ __ \
\ /| <\ ___/| | \/
\__/\ / |__|_ \\___ >__|
\/ \/ \/
前两天写完这个框架之后,本来以为工具应该没有什么可以弥补的了,但是前两天我尝试着去放在实际的环境中测试了一下,发现还是有一些不足的地方,所以这里我在这里总结一下。
- 程序访问的速度收到了严重的限制,因为单线程的原因,所以一晚上测试了一下,谷歌加上百度一共跑了一百来页,单个SQL漏洞才跑出来三十几个,这个和我之前想的差别太大了。
- 程序扩展性还是不够,因为我们有的时候是需要用户输入的不只是搜索内容,例如fofa,钟馗都是需要输入账号和密钥的,并且漏洞检的时候我们很有可能会让用户进行选择一些方式之类的。
- 所谓的插件更新如果只是在我的博客进行实在是不太现实的,因为大家还是喜欢可以使用软件进行更新。
这个就是我在测试的过程中发现的一些不足之处,所以我重新的修补了一下这个框架的不足之处,这里重新给大家分享一下。
多线程问题
这个问题我已经修补了,在1.1版本的时候我已经将原本的单线程改为多线程,线程个数是由搜索引擎插件进行改变的,其实是搜索引擎插件一个页面返回了多少个链接我就会开启几个线程,每一个链接我会给她一个线程去检测用户选择的漏洞插件。
核心代码:
for(int tmpLink=0;tmpLink<LinkArray.GetSize();tmpLink++)
{
global_CriticalSection.Lock();
tmpDLgStruct* dlgStruct = new tmpDLgStruct;
dlgStruct->dlg = pParam;
dlgStruct->Link = LinkArray.GetAt(tmpLink);
dlgStruct->VlunFunArray = &VlunFunArray;
global_CriticalSection.Unlock();
AfxBeginThread(SubWorkEngine,(LPVOID)dlgStruct);
}
对结构体的析构我放在了SubThread中,并且我会实时更新当前线程的状态,以及程序的进度:
程序的特殊信息的捕获
这是一个比较关键的一个缺陷,因为现在的小青年都是比较喜欢使用fofa,shodan,钟馗的,所以我也特意的增加了一个插件函数。
extern "C" BOOL initPlugin(int Version)
这个是我在加载DLL的时候会调用的,其实一开始我是想使用DLL的Main函数代替这个函数的,但是后来想想还是加上去的,这样比较好办,并且我发现一个不知道什么的原因,有知道的可以和我说一下,就是:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
这个与DLL的Main函数抵触,按理说我我去除了_USRDLL
这个预处理器应该是可以使用我们自定的Main函数的,但是当我加上上面的这个宏之后还是会出现Main函数重定义的问题,所以我只能重新定义了一导出函数,这个函数有一个参数,这个参数其实是当前程序的版本号,用来给插件作者一个提示的,用来校验插件一框架的版本是否一致。
实例
可能说到这里大家还是不知道特殊信息的一个作用点,这里给大家展示一下。
首先我们在使用fofa和钟馗的时候,我们是需要两个特殊的值进行身份验证。
在说明之前我先说一下,我已经把fofa和钟馗的插件已经写出来了,shodan的我现在还没写。
我们在选择是用钟馗之类的插件的时候我们时候,当我们选择了策略之后,程序会弹出对话框。
我们还是先正常的生成一个扫描策略:
生成之后我们选择策略,双击策略之后我们就会看到:
我们输入我们的账号密码,点击确认。
就可以扫描了。
当然fofa也是一样的。
可以给大家看下核心代码:
extern "C" BOOL GetLink(CString SearchValue,int page,CStringArray *ResultLink)
{
/*
fofa
CString url;
ResultLink->RemoveAll();
url.Format("http://fofa.so/api/v1/search/all?email=%s&key=%s&qbase64=%s&size=10&page=%d&full=true",m_email,m_api,base64encode(SearchValue,SearchValue.GetLength()),page);
CHttpVist WebVist;
CStringArray tmp;
CString Hearder;
CString Result = WebVist.GetData(url,&tmp,Hearder);
CStringArray *tmpArray = new CStringArray;
BetweenEx(Result,"[\"","\",",*tmpArray);
CString Shttp;
Shttp.Format("http");
for(int i=0;i<tmpArray->GetSize();i++)
{
CString tmphttp = tmpArray->GetAt(i).Left(4);
if (tmphttp.Compare(Shttp) == 0)
{
ResultLink->Add(tmpArray->GetAt(i));
}else
{
tmphttp.Format("http://%s",tmpArray->GetAt(i));
ResultLink->Add(tmphttp);
}
}
*/
//钟馗
ResultLink->RemoveAll();
CString url;
url.Format("https://api.zoomeye.org/web/search?query=%s&page=%d",SearchValue,page);
CHttpVist WebVist;
CString Hearder;
CString result= WebVist.GetData(url,&TokenHeader,Hearder);
CStringArray tmpArray;
BetweenEx(result,"\"site\": \"","\",",tmpArray);
for (int i=0;i<tmpArray.GetSize();i++)
{
CString tmphttp;
tmphttp.Format("http://%s",tmpArray.GetAt(i));
ResultLink->Add(tmphttp);
}
return TRUE;
}
extern "C" BOOL initPlugin(int Version)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CGetAPIDlg dlg;
dlg.DoModal();
//m_email = dlg.m_Email;
//m_api = dlg.m_Api;
CHttpVist WebVist;
CString PostData;
CStringArray tmpHeader;
CString Hearder;
PostData.Format("{\"username\": \"%s\", \"password\": \"%s\"}",dlg.m_Email,dlg.m_Api);
CString result= WebVist.PostData("https://api.zoomeye.org:443/user/login",PostData,&tmpHeader,Hearder);
CStringArray tmp;
BetweenEx(result,"access_token\": \"","\"}",tmp);
CString token;
token.Format("Authorization: JWT %s",tmp.GetAt(0));
TokenHeader.Add(token);
return TRUE;
}
实现钟馗搜索和fofa搜索的核心代码(注释的fofa的,没有注释的钟馗的),因为我导入jsoncpp有点麻烦,所以我就直接取出来了,因为我们只需要链接。
对了,还有一点,就是在之前我的http访问的类不能访问https,因为我之前一直是强制降级http操作,但是发现钟馗的身份验证比较严格,是需要https进行操作的,所以我就把我的https类进行了一下修改,修改部分:
if (dwServiceType == AFX_INET_SERVICE_HTTP )
{
pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
}else if(AFX_INET_SERVICE_HTTPS == dwServiceType)
{
pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, 1, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD |
INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID);
}
其实还有一个就是在我开发SQL注入的插件的时候发现,如果我只是单纯的进行前后缀闭合SQL语句,效率是非常的低,愿意是这个样子的,我需要进行一个前缀对应多个后缀,这样我有好多闭合的前缀,这样形成的笛卡儿积是一个相对比较大的集合,但是往往这些前缀并不是非常理想,所以我就需要提供给用户一个快速扫描,就是不需要检测这些前后缀,速度很快,当你们使用SQL注入插件的时候会发现:
其实和搜索引擎插件一样并且导出函数也是一样的,只是给了一个界面的操作。
在线更新插件
发现这个东西是很有必要的,所以我就开发了在线更新。
其实是我放了一个工具在程序的根目录下:
这个程序是用来在线更新,更新的插件会放在制定插件的,我们通过
进行打开程序,大家会看到:
我们选择好插件之后我们就可以点击下载了。
下载插件的时候需要先选中插件!
这个样子我们就成功更新了我们的插件。
其实所有的插件都在我的服务器中。
其他更新
插件的话呢更新了一部分,比如谷歌镜像(不需要挂代理),并且修复了很多插件的小bug,使用起来会比较流畅一些。
插件更新的话呢,如果发现无法打开更新插件的工具,那只有一个可能,就是我的服务器到期了。。。