前言

这次就是靶场系列的最后一篇了,这段时间学习这个系列的知识,感觉确实学到很多东西。现在做一下总结吧。


一、综合环境——低难度

tip:emmm,与之前重复的内容这里就不再提了,主要记录下思路。

使用nikto和dirb等工具探测过后,发现了以下敏感页

login.php
index.php
config.php

其中login.php是个登录页面。没有信息,先查看源码(其实我先尝试了弱口令,但是没有成功,还是乖乖的看源码)
在源码的最后发现了javascript的代码

function control(){
	var user = document.getElementById("user").value;
    var pwd = document.getElementById("pwd").value;

	var str=user.substring(user.lastIndexOf("@")+1,user.length);
    
    if((pwd == "'")){
		alert("Hack Denemesi !!!");
		
    }
	else if (str!="btrisk.com"){
		alert("Yanlis Kullanici Bilgisi Denemektesiniz");
	
	}	
	else{
		
      document.loginform.submit();
    }
}

审计这段代码:substring和lastIndexOf都是截取字符串的两个函数,首先来了解一下这两个函数。
substring()
m0re
注意:如果start传入的参数比stop的参数大的话,该函数会自动调换start和stop的位置。参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。
下面是一个栗子:

string start = null;
string stop = null;
string str = "abcdefg";
start = str.Substring(0, 1);//从第一个开始截取,共截取一位
stop = str.Substring(str.Length - 1, 1);//从最后一个开始截取,共截取一位
Response.Write(qian + "***" + hou);

输出结果:a***g
lastIndexOf()
作用:可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索
m0re
注意:lastIndexOf() 方法对大小写敏感!
如果要检索的字符串值没有出现,则该方法返回 -1。

string str = "m0re";
str = str.Substring(0, str.LastIndexOf("r"));
Response.Write(str);

截取r前面的字符串,输出为m0
OK,这下再看代码就可以理解了。
1、首先lastIndexOf()先在user中查询@的位置,然后从其位置的后一位开始,到user的总长度这个范围内,substring函数起作用,截取字符串str。
2、继续,pwd不等于',猜测可能是防万能密码的吧。或者是绕过SQL注入。
3、str要等于btrisk.com
m0re
然后进来一个页面,闹了半天没发现什么,最后才知道是姿势错了。不过也没白折腾。有学到新知识。
正确的姿势:
对登录框进行fuzz测试,kali的wordlists下有字典,可以直接利用,抓包发送到 Intruder模块
m0re
载入字典进行fuzz测试
直接测试成功,看到response页面有内容,去字典中找到这个payload进行登录。
m0re
用户名:@btrisk.com密码:' or 1=1#

m0re
这才是正确的界面。
然后就是文件上传,基础漏洞。进行测试,只能传图片。
m0re
鉴于不知道是验证方式是什么,所以都测试一遍。先设置好代理,测试发现是前端检测。
使用burpsuite绕过前端检测,或者使用%00截断绕过。
只需要简单的修改后缀就可以了,其他的验证就没有了。
尝试可以进行绕过,就制作一个反弹shell,然后监听获取权限就OK了。
重复步骤。
然后得到一个www-data用户的权限,尝试提权,发现sudo -l返回的是

sudo: unable to resolve host BTRsys1
sudo: no tty present and no askpass program specified

没见过这样的,先放在一边。但是可以查看配置文件,之前扫描出来一个config.php,但是访问没有任何信息,这里可以cat一下源码。

<?php
/////////////////////////////////////////////////////////////////////////////////////////
$con=mysqli_connect("localhost","root","toor","deneme");
if (mysqli_connect_errno())
  {
  echo "Mysql Bağlantı hatası!: " . mysqli_connect_error();
  }
/////////////////////////////////////////////////////////////////////////////////////////
?>

数据库root用户的密码是toor
连接数据库前,先优化一下终端,因为数据库输入密码时,是读取键盘记录的,而shell是无法完成的,所以还是先进行优化一下终端。
然后进入数据库,进行遍历,查看到用户名密码,尝试提权su - root
使用密码asd123***

m0re
最后得到flag。

二、综合环境——较高难度

这个其他没什么可记录的,就一点——内核提权

searchsploit ubuntu 4.4.0

m0re
复制到桌面进行编译,

root@kali:~/Desktop# gcc 41458.c -o rootshell
root@kali:~/Desktop# ls
41458.c  rootshell

然后利用meterpreter的upload命令将rootshell上传并加权,进行chmod命令时,需要在反弹shell中执行,
赋予rootshell以777权限后执行文件就可以提权成功了。

./rootshell

总结

涉及知识点:代码审计、fuzz测试、万能密码、文件上传、弱口令、内核提权

CTF靶场系列就算完工了,还要继续努力鸭。